形态学运算

形态学

主要用于记录收集整理的知识。有些理论知识可以参考相关链接。

相关链接:
图像的膨胀与腐蚀、细化 - 公爵女子 - 博客园
http://www.cnblogs.com/slysky/archive/2011/10/16/2214015.html
形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑 -毛星云(浅墨)的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/poem_qianmo/article/details/24599073

数学形态运算,最常见的基本运算有七种,
分别为:腐蚀、膨胀、开运算、闭运算、击中、细化和粗化,它们是全部形态学的基础。
基于形状,将 结构元素 作用于原图得到输出图像。
Q1:是否要求是二值图像?
A1:一般用于二值图像,也可用于灰度图像。
Q2:什么情况下需要用到膨胀腐蚀?
A2:消除噪声;分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域。

1.膨胀

此操作将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积。
内核 B 有一个可定义的 锚点, 通常定义为内核中心点。
进行膨胀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最大像素值提取,并代替锚点位置的像素。显然,这一最大化操作将会导致图像中的亮区开始扩展 (因此有了术语膨胀 dilation )。

2.腐蚀

腐蚀一般可以用来消除噪点,分割出独立的图像元素等。
腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的像素最小值。
进行腐蚀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最小像素值提取,并代替锚点位置的像素

小结:
膨胀腐蚀是一对对偶的运算,公式表示为: ,即X被腐蚀后的补集等于X的补集被B膨胀。 例如:某个图象处理系统用硬件实现了腐蚀运算,那么不必再另搞一套膨胀的硬件,直接利用该对偶就可以实现了。


3.开运算

先腐蚀后膨胀称为开(open)。

一般来说,开运算能够去除孤立的小点,毛刺和小桥(即连通两块区域的小点),而总的位置和形状不变。这就是开运算的作用。要注意的是,如果B是非对称的,进行开运算时要用B的对称集Bv膨胀,否则,开运算的结果和原图相比要发生平移。

4.闭运算

先膨胀后腐蚀称为闭(close)。

一般来说,闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。这就是闭运算的作用。同样要注意的是,如果B是非对称的,进行闭运算时要用B的对称集Bv膨胀,否则,闭运算的结果和原图相比要发生平移。

小结:
开运算和闭运算为对偶运算
即X 开运算的补集等于X的补集的闭运算,或者X 闭运算的补集等于X的补集的开运算。


5.形态学梯度

形态学梯度(Morphological Gradient)为膨胀图与腐蚀图之差。

对二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓。

6.顶帽

顶帽运算(Top Hat)又常常被译为”礼帽“运算。为原图像与上文刚刚介绍的“开运算“的结果图之差。

因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。
顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

7.黑帽

黑帽(Black Hat)运算为闭运算的结果图与原图像之差。

黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。
所以,黑帽运算用来分离比邻近点暗一些的斑块。

8.细化

Opencv函数
IplImage类型
void cvDilate( //膨胀
IplImage* src,
IplImage* dst,
IplConvKernel* B = NULL,
int iterations = 1
);
void cvErode( //腐蚀
IplImage* src,
IplImage* dst,
IplConvKernel* B = NULL, //B即核,下同
int iterations = 1 //如名,迭代次数,下同
);

opencv中实现开运算、闭运算、形态梯度、tophat,blackhat的函数是cvMorphologyEx()
void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp,
IplConvKernel* element, int operation, int iterations=1 );
src
输入图像.
dst
输出图像.
temp
临时图像,某些情况下需要
element
结构元素
operation
形态操作的类型:
CV_MOP_OPEN - 开运算
CV_MOP_CLOSE - 闭运算
CV_MOP_GRADIENT - 形态梯度
CV_MOP_TOPHAT - “顶帽”
CV_MOP_BLACKHAT - “黑帽”
iterations膨胀和腐蚀次数.
函数 cvMorphologyEx 在膨胀和腐蚀基本操作的基础上,完成一些高级的形态变换:
开运算
dst=open(src,element)=dilate(erode(src,element),element)
闭运算
dst=close(src,element)=erode(dilate(src,element),element)
形态梯度
dst=morph_grad(src,element)=dilate(src,element)-erode(src,element)
“顶帽”
dst=tophat(src,element)=src-open(src,element)
“黑帽”
dst=blackhat(src,element)=close(src,element)-src
临时图像 temp 在形态梯度以及对“顶帽”和“黑帽”操作时的 in-place 模式下需要。
需要说明的是,最后一个参数,例如闭运算,iterations=2的时候,
并不是说分别执行2次闭运算,也就是dilate—>erode–>dilate—>erode,
实际的情况是dilate—>dilate–>erode—>erode。
cvMorphologyEx()对于非对称结构图像会发生偏移。
IplConvKernel * cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape, int *value=NULL );
1. IplConvKernel * cvCreateStructuringElementEx(
2. int cols,
3. int rows,
4. int anchor_x,
5. int anchor_y,
6. int shape,
7. int *value=NULL
8. );
参数cols,rows确定了构造的矩形大小。
anchor_x,anchor_y确定了封闭矩形内参考点的横纵坐标。
shape是自定义核的形状,具体为
1.CV_SHAPE_RECT 核是矩形
2.CV_SHAPE_CROSS 核是勺子交叉形
3.CV_SHAPE_ELLIPSE 核是椭圆形
4.CV_SHAPE_CUSTOM 核是用户自定义类型
其释放函数为
1. void cvReleaseStructuringElement( IplConvKernel **element);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值