您的位置:首页 > 其它

图像处理__腐蚀和膨胀_开运算_闭运算

2012-11-17 09:04 274 查看
From: http://www.dakaren.com/index.php/archives/196.htm
一、腐蚀和膨胀

  形态学是一门新兴科学,它的用途主要是获取物体拓扑和结果信息,它通过物体和结构元素相互作用的某些运算,得到物体更本质的形态。它在图像处理中的应用主要是:

  1.利用形态学的基本运算,对图像进行观察和处理,从而达到改善图像质量的目的;

  2.描述和定义图像的各种几何参数和特征,如面积,周长,连通度,颗粒度,骨架和方向性。

  限于篇幅,我们只介绍简单二值图像的形态学运算,对于灰度图像的形态学运算,有兴趣的读者可以看有关的参考书。二值图像基本的形态学运算是腐蚀和膨胀,简单的腐蚀是消除物体的所有边界点的一种过程,其结果是使剩下的物体沿其周边比原物体小一个像素的面积。如果物体是圆的,它的直径在每次腐蚀后将减少两个像素,如果物体在某一点处任意方向上连通的像素小于三个,那么该物体经过一次腐蚀后将在该点处分裂为二个物体。简单的膨胀运算是将与某物体接触的所有背景点合并到该物体中的过程。过程的结果是使物体的面积增大了相应数量的点,如果物体是圆的,它的直径在每次膨胀后将增大两个像素。如果两个物体在某一点的任意方向相隔少于三个像素,它们将在该点连通起来。

  下面给出具体的实现腐蚀和膨胀的函数代码:

////////////////////////////////二值图像腐蚀操作函数

BOOL ImageErosion(BYTE *pData,int Width,int Height)

{//pData为图像数据的指针,Width和Height为图像的宽和高;

BYTE* pData1;

int m,n,i,j,sum,k,sum1;

BOOL bErosion;

if(pData==NULL)

{

AfxMessageBox(“图像数据为空,请读取图像数据”);

return FALSE;

}

//申请空间,pData1存放处理后的数据;

pData1=(BYTE*)new char[WIDTHBYTES(Width*8)*Height];

if(pData1==NULL)

{

AfxMessageBox(“图像缓冲数据区申请失败,请重新申请图像数据缓冲区”);

return FALSE ;

}

memcpy(pData1,pData,WIDTHBYTES(Width*8)*Height);

for(i=10;i<Height-10;i++)

for(j=32;j<Width-32;j++)

{

bErosion=FALSE;

sum=*(pData+WIDTHBYTES(Width*8)*i+j);

if(sum==255)

{

//求像素点八邻域的灰度均值;

for(m=-1;m<2;m++)

{

for(n=-1;n<2;n++)

{

sum1=*(pData+WIDTHBYTES(Width*8)*(i+m)+j+n);

if(sum1==0)

{

*(pData1+WIDTHBYTES(Width*8)*i+j)=0;

bErosion=TRUE;

break;

}

}

if(bErosion)

{

bErosion=FALSE;

break;

}

}

}

}

memcpy(pData,pData1,WIDTHBYTES(Width*8)*Height);

return TRUE;

}

////////////////////////////////////二值图像的膨胀操作

BOOL ImageDilation(BYTE *pData,int Width,int Height)

{

BYTE* pData1;

int m,n,i,j,sum,k,sum1;

BOOL bDilation;

if(pData==NULL)

{

AfxMessageBox(“图像数据为空,请读取图像数据”);

return FALSE;

}

//申请空间,pData1存放处理后的数据;

pData1=(BYTE*)new char[WIDTHBYTES(Width*8)*Height];

if(pData1==NULL)

{

AfxMessageBox(“图像缓冲数据区申请失败,请重新申请图像数据缓冲区”);

return FALSE ;

}

memcpy(pData1,pData,WIDTHBYTES(Width*8)*Height);

for(i=10;i<Height-10;i++)

for(j=32;j<Width-32;j++)

{

bDilation=FALSE;

sum=*(pData+WIDTHBYTES(Width*8)*i+j);

if(sum==0)

{

//求像素点八邻域的灰度值;

for(m=-1;m<2;m++)

{

for(n=-1;n<2;n++)

{

sum1=*(pData+WIDTHBYTES(Width*8)*(i+m)+j+n);

if(sum1==255)

{

*(pData1+WIDTHBYTES(Width*8)*i+j)=255;

bDilation=TRUE;

break;

}

}

if(bDilation)

{

bDilation=FALSE;

break;

}

}

}

}

memcpy(pData,pData1,WIDTHBYTES(Width*8)*Height);

return TRUE;

}
  从上面的说明可以看出,腐蚀可以消除图像中小的噪声区域,膨胀可以填补物体中的空洞。对一个图像先进行腐蚀运算然后再膨胀的操作过程称为开运算,它可以消除细小的物体、在纤细点处分离物体、平滑较大物体的边界时不明显的改变其面积。如果对一个图像先膨胀然后再收缩,我们称之为闭运算,它具有填充物体内细小的空洞、连接邻近物体、在不明显改变物体面积的情况下平滑其边界的作用。通常情况下,当有噪声的图像用阈值二值化后,所得到的边界是很不平滑的,物体区域具有一些错判的孔洞,背景区域散布着一些小的噪声物体,连续的开和闭运算可以显著的改善这种情况,这时候需要在连接几次腐蚀迭代之后,再加上相同次数的膨胀,才可以产生所期望的效果。为了更好的显示出二值图像的处理效果,我们仍旧以图像采集卡获取的汽车图像为处理源图像,下图为处理后的效果:



(a)噪声图


(b)开运算处理
    图一 开运算效果图

  上图中,a图为包含噪声的图像,b图为经过腐蚀膨胀处理后的图像,可以看出,经过上述处理,成功的消除了图像中的噪声点,同时又起到了平滑边缘的作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐