您的位置:首页 > 其它

二值图像的腐蚀运算及其VC实现

2015-11-10 11:10 381 查看

在进行图像预处理与图像边缘检测等过程中,形态学算子是常用的处理方法。本文主要对二值图像腐蚀的定义、原理以及VC下实现方法进行全面总结,并通过图像处理结果对腐蚀操作的功能以及使用场合进行讨论。

1、定义的理解

参考冈萨雷斯的经典教材,对Z空间中的集合A和B,使用B对A进行腐蚀,其定义为:



对其可理解为,对形态学结构元素B进行z平移后,如果结构元素全部包含于集合A中,则z属于腐蚀后的集合。

按照本人的理解,这个定义的意思就是从图像的第一个像素点开始依行遍历全部像素,在每个像素点上,移动结构元素B的中心与其重合,然后判断是否结构元素全部位于集合A内,如果是则该点属于腐蚀后的集合,需要保留这个点,否则对改点取反(按照下面的符号约定,即将改点灰度值设置为0)。

2、约定

1)二值图像中,所有黑色像素的集合是图像完整的形态学描述

2)对于二值化后的图像:黑色表示灰度为0,白色表示灰度为255

3)对于形态学结构元素:黑色代表1,白色表示0

4)值为1的点组成完整的形态学结构元素

3、形态学结构元素的选取

结构元素是形态学处理的基础,因此合理选取结构元素直接影响图像处理的效果和质量。通常来说,结构元素的选择在于其结构元素的形状和尺寸。

对于其形状太说,主要有对称性结构与非对称性结构之分,对于其差别和特点,作者另文详细分析研究。本文主要对基本的腐蚀概念和编程实现进行总结。在实际应用的过程中,应根据待处理图像中感兴趣目标的特性(如几何形状等)来选择形态学结构元素。

4、VC实现灰度图的二值腐蚀

首先贴上代码,然后再进行说明。作者实现的代码如下:

[cpp]
view plaincopyprint?

/*************************************************************************
*
* \函数名称:
* BiErosionAlgorithm()
*
* \输入参数:
* pGrayMat: 二值图像数据
* pErosionMat: 输出的腐蚀图像数据
* width: 图形尺寸宽度
* height: 图形尺寸高度
* nWindows: 腐蚀操作结构元素尺寸,当nWindows=3时,如下:
* 1 1 1
* 1 1 1
* 1 1 1
* \返回值:
* 无
* \函数说明: 实现图像形态学算子-腐蚀
*
************************************************************************/
void CBiErosionDlg::BiErosionAlgorithm(CvMat *pGrayMat, CvMat *pErosionMat, int width, int height, int nWindows)
{
int nSize = (int)(nWindows/2);
for(int i=0; i<height; i++)
{
for(int j=0; j<width; j++)
{
int nFlag = 1; //用于控制循环跳出
for(int m=i-nSize; m<=i+nSize; m++)
{
for(int n=j-nSize; n<=j+nSize; n++)
{
if((m<0)||(m>=height)||(n<0)||(n>=width))
{
nFlag=0; //判断出界问题
break;
}
double nData1 = cvmGet(pGrayMat, m, n);
double nData2 = cvmGet(pGrayMat, i, j);
if((nData1 == 255) || (nData2 == 255))
{
nFlag=0;
break;
}
}
if(nFlag==0)
break;
}
if(nFlag==0)
{
double nData = 255;
cvmSet(pErosionMat, i, j, nData);
}
else
{
double nData = 0;
cvmSet(pErosionMat, i, j, nData);
}
}
}
}

/*************************************************************************
*
* \函数名称:
*   BiErosionAlgorithm()
*
* \输入参数:
*   pGrayMat:      二值图像数据
*	pErosionMat:   输出的腐蚀图像数据
*	width:		   图形尺寸宽度
*	height:		   图形尺寸高度
*	nWindows:	   腐蚀操作结构元素尺寸,当nWindows=3时,如下:
*                                  1    1    1
*                                  1    1    1
*                                  1    1    1
* \返回值:
*   无
* \函数说明:  实现图像形态学算子-腐蚀
*
************************************************************************/
void CBiErosionDlg::BiErosionAlgorithm(CvMat *pGrayMat, CvMat *pErosionMat, int width, int height, int nWindows)
{
int nSize = (int)(nWindows/2);
for(int i=0; i<height; i++)
{
for(int j=0; j<width; j++)
{
int nFlag = 1;     //用于控制循环跳出
for(int m=i-nSize; m<=i+nSize; m++)
{
for(int n=j-nSize; n<=j+nSize; n++)
{
if((m<0)||(m>=height)||(n<0)||(n>=width))
{
nFlag=0;    //判断出界问题
break;
}
double nData1 = cvmGet(pGrayMat, m, n);
double nData2 = cvmGet(pGrayMat, i, j);
if((nData1 == 255) || (nData2 == 255))
{
nFlag=0;
break;
}
}
if(nFlag==0)
break;
}
if(nFlag==0)
{
double nData = 255;
cvmSet(pErosionMat, i, j, nData);
}
else
{
double nData = 0;
cvmSet(pErosionMat, i, j, nData);
}
}
}
}


对程序实现的主要说明如下:

1)选择腐蚀结构元素:本文以下编程实现主要基于最常见的正方形结构元素,其全部像素均为1。所实现的函数BiErosionAlgorithm中最后一个参数用于控制结构元素尺寸。

2)边界处理:由于结构元素有一定的尺寸,因此当结构元素中心移动到图像边缘的若干个像素时,可能有一部分的结构元素超出了图像边界,这是本程序的处理方法是:将图像进行虚拟扩充,扩充的元素灰度值全部填255(根据上文定义,即为无意义的白色像素填充).

3)原始图像的选择:选择了word加粗了的黑体字图片,这样容易对比看出不同参数的腐蚀结果。

5、腐蚀结果分析

顾名思义,腐蚀操作可以使得图像减小“一圈”,同时腐蚀操作能够将图像中较小的细节消除掉(效果与结构元素形状和尺寸有关)。以下是程序运行的结果。



图1 原彩色图



图2 进行灰度化和二值化后的图像



图3 结构元素尺寸为3时的腐蚀结果



图4 结构元素尺寸为5时的腐蚀结果



图5 结构元素尺寸为9时的腐蚀结果
对比图2和图3 可以看出,图2中“腐蚀”右下角的回车符在图3中已经被腐蚀掉;对比不同的结构元素尺寸,可以发现随着元素尺寸的增大,原来的字体逐渐被腐蚀掉了。

6、总结

通过以上定义原理分析以及实现,基本可以对腐蚀操作有一个较好的认识,但作者认为还需要注意一下几点:

1)结构元素可以有多种结构,可以根据使用的要求选取非对称的结构;

2)结构元素相对其中心的反射对源图像的腐蚀与结构元素本身的腐蚀两者结果不一定一致,当结构元素不对称时,需要谨慎考虑。具体的分析可参考文献《第6章 腐蚀,膨胀,细化算法》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: