科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual C 实现二值图像处理

Visual C 实现二值图像处理

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

二值图像是一种简单的图像格式,它只有两个灰度级,即\\\"0\\\"表示黑色的像素点,\\\"255\\\"表示白色的像素点。

作者:刘涛 来源:yesky 2007年10月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
为了实现图像的细化算法,笔者定义了一个细化函数,具体实现代码如下:

BOOL SeneBorderThinning(BYTE *pData,int Width,int Height)
{ //pData为指向图像数据的指针,Width和Height为图像的宽度和高度;
int i,j;
int num;
//细化结束标志;
BOOL Finished;
//各个变量用来存储(i,j)位置的八邻域像素点的灰度;
int nw,n,ne,w,e,sw,s,se;
//细化表;
static int erasetable[256]={
0,0,1,1,0,0,1,1,
1,1,0,1,1,1,0,1,
1,1,0,0,1,1,1,1,
0,0,0,0,0,0,0,1,

0,0,1,1,0,0,1,1,
1,1,0,1,1,1,0,1,
1,1,0,0,1,1,1,1,
0,0,0,0,0,0,0,1,

1,1,0,0,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,

1,1,0,0,1,1,0,0,
1,1,0,1,1,1,0,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,

0,0,1,1,0,0,1,1,
1,1,0,1,1,1,0,1,
1,1,0,0,1,1,1,1,
0,0,0,0,0,0,0,1,

0,0,1,1,0,0,1,1,
1,1,0,1,1,1,0,1,
1,1,0,0,1,1,1,1,
0,0,0,0,0,0,0,0,

1,1,0,0,1,1,0,0,
0,0,0,0,0,0,0,0,
1,1,0,0,1,1,1,1,
0,0,0,0,0,0,0,0,

1,1,0,0,1,1,0,0,
1,1,0,1,1,1,0,0,
1,1,0,0,1,1,1,0,
1,1,0,0,1,0,0,0
};
if(pData==NULL)
{
AfxMessageBox("图像数据为空,请读取图像数据");
return FALSE;
}
Finished=FALSE;
//开始细化;
while(!Finished)
{
Finished=TRUE;
//水平扫描;
for (i=10;i<Height-10;i++)
{
for(j=30;j<Width-30;j++)
{
if(*(pData+WIDTHBYTES(Width*8)*(Height-i-1)+j)==0)
{
w=*(pData+WIDTHBYTES(Width*8)*(Height-i-1)+j-1);
e=*(pData+WIDTHBYTES(Width*8)*(Height-i-1)+j+1);
//判断(i,j)是否是边界点,如是,求该点的八邻域灰度值(0/255),根据各点的权重,计算对应查找表的索引;
if( (w==255)|| (e==255))
{
nw=*(pData+WIDTHBYTES(Width*8)*(Height-i)+j-1);
n=*(pData+WIDTHBYTES(Width*8)*(Height-i)+j);
ne=*(pData+WIDTHBYTES(Width*8)*(Height-i)+j+1);
sw=*(pData+WIDTHBYTES(Width*8)*(Height-i-2)+j-1);
s=*(pData+WIDTHBYTES(Width*8)*(Height-i-2)+j);
se=*(pData+WIDTHBYTES(Width*8)*(Height-i-2)+j+1); num=nw/255+n/255*2+ne/255*4+w/255*8+e/255*16+sw/255*32+s/255*64+se/255*128;
if(erasetable[num]==1)
{
//查表,如果符合条件,将边界点修改为图像的背景;
*(pData+WIDTHBYTES(Width*8)*(Height-i-1)+j)=(BYTE)255;
Finished=FALSE;//再次进行扫描;
j++;
}
}
}
}
}
//垂直扫描;
for (j=30;j<Width-30;j++)
{
for(i=10;i<Height-10;i++)
{
if(*(pData+WIDTHBYTES(Width*8)*(Height-i-1)+j)==0)
{
n=*(pData+WIDTHBYTES(Width*8)*(Height-i)+j);
s=*(pData+WIDTHBYTES(Width*8)*(Height-i-2)+j);
if( (n==255)|| (s==255))
{
nw=*(pData+WIDTHBYTES(Width*8)*(Height-i)+j-1);
ne=*(pData+WIDTHBYTES(Width*8)*(Height-i)+j+1);
w=*(pData+WIDTHBYTES(Width*8)*(Height-i-1)+j-1);
e=*(pData+WIDTHBYTES(Width*8)*(Height-i-1)+j+1);
sw=*(pData+WIDTHBYTES(Width*8)*(Height-i-2)+j-1);
se=*(pData+WIDTHBYTES(Width*8)*(Height-i-2)+j+1); num=nw/255+n/255*2+ne/255*4+w/255*8+e/255*16+sw/255*32+s/255*64+se/255*128;
if(erasetable[num]==1)
{
//查表,如果符合条件,将边界点修改为图像的背景;
*(pData+WIDTHBYTES(Width*8)*(Height-i-1)+j)=(BYTE)255;
Finished=FALSE;//再次进行扫描;
i++;
}
}
}
}
}
}
return TRUE;
}

图三给出了细化处理后的效果图,其中a为原始图像,b为细化处理后的图像。


(a)

(b)
图三 细化效果图
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章