二值图像轮廓提取的问题
我要将一幅二值图像的轮廓提取出来,在网上找了一种查找黑点周围八个点的方法,如果一个黑点周围八个点都是黑点,那么将该黑点删除。
用该代码完成后发现不能达到目的,程序只能将图像黑色区域变成一道黑一道白的样子,并不能完全将黑色区域内部完全掏空。
我是新手,请大家帮我看看代码。谢谢!!!
int num;//相邻八个点灰度值之和
int nw,n,ne,w,e,sw,s,se;//相邻八个点的灰度值
long i;
long j;//循环变量
unsigned char pixel;//当前点灰度值
for (i = 1;i <m_Height-1;i++)
{
for(j = 1;j < m_Width-1;j++)
{
pixel = (unsigned char)*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3);
//m_lpDibbitsChg是指向源图像的指针,m_Height是图像高度,m_Width是图像宽度,m_bytePerLine是图像每行字节数
if(pixel==(unsigned char)0)//如果当前点为黑点,求其相邻八点的灰度值
{
nw=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i-1)-1)*m_bytePerLine+(j-1)*3);
n=(unsigned char)*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+(j-1)*3);
ne=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i+1)-1)*m_bytePerLine+(j-1)*3);
w=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i-1)-1)*m_bytePerLine+j*3);
e=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i+1)-1)*m_bytePerLine+j*3);
sw=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i-1)-1)*m_bytePerLine+(j+1)*3);
s=(unsigned char)*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+(j+1)*3);
ne=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i+1)-1)*m_bytePerLine+(j+1)*3);
num=nw+n+ne+w+e+sw+s+se;
if(num==0) //说明都是黑点
{
*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3) = (unsigned char)255;
*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3+1) = (unsigned char)255;
*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3+2) = (unsigned char)255; //删除该黑点
}
}
}
}