图像形态学
一、介绍
图像形态学的基本形态转换是膨胀和腐蚀,它们能实现多种功能:例如消除噪声、分割出独立的图像元素以及在图像中连接相邻的元素。形态学也常被用来寻找图像中的明显的极大值区域或极小值区域以及求出图像的梯度。
二、腐蚀和膨胀
1.腐蚀
腐蚀的方法是,拿B的中心点和X上的点一个一个地对比,如果B上的所有点都在X的范围内,则该点保留,否则将该点去掉;右边是腐蚀后的结果。可以看出,它仍在原来X的范围内,且比X包含的点要少,就象X被腐蚀掉了一层。
图1 腐蚀运算
2.膨胀
膨胀的方法是,拿B的中心点和X上的点及X周围的点一个一个地对,如果B上有一个点落在X的范围内,则该点就为黑;右边是膨胀后的结果。可以看出,它包括X的所有范围,就象X膨胀了一圈似的。
图2 膨胀运算
3.函数
在OpenCV中,腐蚀膨胀是利用cvErode( )和cvDilate( )实现的。
void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
src 输入图像.
dst 输出图像.
element 用于腐蚀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
iterations 腐蚀的次数
函数 cvErode 对输入图像使用指定的结构元素进行腐蚀,该结构元素决定每个具有最小值象素点的邻域形状:
dst=erode(src,element): dst(x,y)=min((x',y') in element))src(x+x',y+y')函数可能是本地操作,不需另外开辟存储空间的意思。腐蚀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理
void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
src 输入图像.
dst 输出图像.
element 用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
iterations 膨胀的次数
函数 cvDilate 对输入图像使用指定的结构元进行膨胀,该结构决定每个具有最小值象素点的邻域形状:
dst=dilate(src,element): dst(x,y)=max((x',y') in element))src(x+x',y+y')函数支持(in-place)模式。膨胀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。
4.自定义核
对于腐蚀膨胀的结构核的选择不一定局限于3x3方形的核。可以创建自定义的IplConvKernel核(即我们前提到的“核B”)。这样的核由cvCreateStructuringElementEx ()函数创建,由cvReleaseStructuringElement ()函数释放。
三、开运算和闭运算
1.开运算
先腐蚀后膨胀称为开(open),即OPEN(X)=D(E(X))。让我们来看一个开运算的例子(见图6.16):
图3 开运算
可以看到,原图经过开运算后,一些孤立的小点被去掉了。一般来说,开运算能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点),而总的位置和形状不变。这就是开运算的作用。
2.闭运算
先膨胀后腐蚀称为闭(close),即CLOSE(X)=E(D(X))。让我们来看一个闭运算的例子(见图6.20):
图4 闭运算
原图经过闭运算后,断裂的地方被弥合了。一般来说,闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。这就是闭运算的作用。