最近一直在看一些关于图像处理中的图像形态学和图像的局部分割的东西,一直也没时间去整理记录下相关的内容。今天这篇博文中,我们将重点讨论图像形态学中最基本的转换-膨胀和腐蚀。
膨胀和腐蚀能用来做什么?
可以用来做诸如消除噪声、分割出独立的图像元素以及在图像中连接相邻的元素。此外,膨胀可以用于填补凹洞,腐蚀能够消除细的凸起。不过效果很大程度上取决于核的选取。形态学也常被用于寻找图像中的明显的极大值区域或极小值区域以及求出图像的梯度。图像形态学经常在通过阈值化获得的二进制图像中完成,形态学也可以用于灰度图像操作。
【膨胀】
膨胀是指将一些图像(或者是图像中的一部分区域,记做A)与核(记做B)进行卷积。
核可以是任何的形状和大小,它拥有一个单独定义出来的参考点。多数情况下,核是一个小的中间带有参考点的实心正方形或圆盘。核可以看作是模板或者是掩码。膨胀是求局部最大值的操作。核B与图像的卷积,就是计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。下图就直观地给出了膨胀的解释:
【腐蚀】
相比较膨胀来说,腐蚀是膨胀的反操作。腐蚀操作要计算核区域像素的最小值。当核B与图像进行卷积操作时,计算被B覆盖区域的最小像素值,并把这个值放到参考点上。下图直观解释腐蚀的操作:
在OpenCV中均给出了对应的处理函数cvErode()和cvDilate():
void cvErode(
IplImage* src,//源图像
IplImage* dst,//输出结果图像
IplConvKernel* B=NULL,//表示核,默认情况下,所使用的是参考点位于中心的3×3的核
int iterations=1//表示迭代的次数,默认为1
)
void cvDilate(
IplImage* src,
IplImage* dst,
IplConvKernel* B=NULL,
int iterations=1
)
在上面的函数中,我们注意到有个参数 IplConvKernel* B,这个参数表示的是核,在默认情况下,所使用的是参考点位于中心的3×3的核,但是在OpenCV中,给出了任意大小核的创建函数,并对应的释放。
IplConvKernel* cvCreateStructuringElementEx(
int cols,
int rows,//行列表示所构造的矩形大小
int anchor_x,
int anchor_y,//核的封闭矩形内参考点的横纵坐标(x,y)
int shape,//参见下表的取值
int values=NULL
)
//释放
void cvReleaseStructuringElement(IplConvKernel** element)
shape的取值如下:
其实在处理布尔图像和图像掩码时,基本的腐蚀和膨胀通常是足够的,但是有时在处理灰度或者彩色图像时,往往需要一些额外的操作。这样的话就需要更灵活的形态学操作,OpenCV中就给出了更为一般的形态学操作方法。
void cvMorphologyEx(
const CvArr* src,
CvArr* dst,
CvArr* temp,//该数组和源图像同样大小
IplConvKernel* element,
int operation,//这些操作见下表
int iterations=1
)
operation类型如下:
关于其中的开运算、闭运算等,如果感兴趣,可以查阅下这些操作所能产生的图像处理效果。