« VFW视频捕获之尝试快速傅立叶变换 »

形态学运算小结

数学形态学(Mathematical Morphology),是分析几何形状和结构的数学方法,包括膨胀、腐蚀、开、闭等运算。在图像处理里面,用于“保持基本形状,去除不相关特征”——ZwqXin.com

什么意思呢?图像中有一个貌似正方形的区域,然后你通过处理,可以把“貌似”去掉;图像是一个不清晰的指纹,然后你通过处理,也把“不”字去掉;图像中有很多大小不一的圆形区域,然后你通过处理,找出大者祛除小者(去噪)......应用是很多的,但是没有一个完整的范畴,就是很多时候要做某种图像处理实际应用的时候,会想起它吧。

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/image-processing/morphologic-process.html

因为处理的都是二值图像(用来分清目标和背景),因此有必要预先把图片转化为8BIT的二值图像,便于处理操作。我是把黑色像素作为目标区域,白色像素作为背景的(当然可以反相)。

结构元素:

其实就是自己定义的一块像素区域,形态学处理的时候用这个元素与原图像作与或运算,生成结果。

膨胀:

设A为原图像。B为结构元素(C为B的映像,没用),那么D的整块“灰+黑”区域就是新图像了(反映在图像里都是黑像素),可以看到图中用黑色标识的是“膨胀”出来的。它就是把结构元素B的中心(+)分别与原图像A“重合”,然后考虑结构元素里的“中心以外”的像素将在原图像中出现的位置,并与原图像该位置的像素进行0-1值的“或运算”(设黑色为0,白色为1,下同)

腐蚀:

腐蚀的解释与膨胀相同,不过执行的是“与运算”。如图,最终图像是C中的纯黑色部分。由此可见膨胀与腐蚀的关系与不同点。

至于“开”与“闭”,无非是结合膨胀腐蚀的二次操作。前者是先腐蚀后膨胀,后者是先膨胀后腐蚀。要注意的是第一次是用结构元素,第二次则是用结构元素的倒置(相当于矩阵的转置咯,这是为了最后图像的“平衡”,如果两次用同一个的话,结果只会是等同双重“膨胀”或“腐蚀”。注意,概念跟“映像”是不同 di,见下图,元素中心也换位置了):

开运算效果:
- 删除小物体;
–将物体拆分为小物体;
–平滑大物体边界而不明显改变它们的面积;

闭运算效果:
 - 填充物体的小洞;
–连接相近的物体;
–平滑物体的边界而不明显改变它们的面积。

(前者为“开”,后者为“闭”)
[注:以上图片多转自冈萨雷斯那本图像处理的书,老师的教学用PPT中截取]
 
总的操作代码见下。
  1. void MorphologicProcess::BmpProcess8(OperateBMP& image, int Hdis, int Wdis)
  2. {
  3.     GetMinimumStructureElement(MorphElement, LineGrid, StructLineGridX, StructLineGridY);
  4.                               
  5.  
  6.     if(MorphType == MorphErosion)
  7.         MorphDilaEroProcess(image, Hdis, Wdis, MorphErosion);
  8.     else if(MorphType == MorphDilation)
  9.         MorphDilaEroProcess(image, Hdis, Wdis, MorphDilation);
  10.     else if(MorphType == MorphOpen)
  11.     {
  12.  
  13.         MorphDilaEroProcess(image, Hdis, Wdis, MorphErosion);
  14.         GetRotInverseStructureElement();
  15.         GenBinaryMorph(image);
  16.         MorphDilaEroProcess(image, Hdis, Wdis, MorphDilation);
  17.         GetRotInverseStructureElement();
  18.     }
  19.     else if(MorphType == MorphClose)
  20.     {
  21.         MorphDilaEroProcess(image, Hdis, Wdis, MorphDilation);
  22.         GetRotInverseStructureElement();
  23.         GenBinaryMorph(image);
  24.         MorphDilaEroProcess(image, Hdis, Wdis, MorphErosion);
  25.         GetRotInverseStructureElement();
  26.     }
  27. }

在细节上不想多说了。难处不在形态学算法本身,而在“自定义结构元素”(MorphElement)这块,包括它与原图像进行形态学运算时必须要考虑的边界条件处理。有需要的同学可以留言给我[http://www.zwqxin.com]。(当然如果自己连算法怎么样也不懂,只是为了交作业交任务而索要的话,恕不理会- -)

形态学处理 www.zwqxin.com
(原始测试图片,处理对话框)
形态学处理 www.zwqxin.com
(自定义任意的结构元素,约定中间红点为结构元素中心)
形态学处理 www.zwqxin.com
(膨胀,处理结果图片)
形态学处理 www.zwqxin.com
(任意定义新的结构元素,作为腐蚀例子)
形态学处理 www.zwqxin.com
(腐蚀,处理结果图片)

开和闭运算就不截图了,免得一篇日志里图太多。

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/image-processing/morphologic-process.html

  • quote 2.小明
  • 你好能要你的有关这方面的资料参考吗?
    zwqxin 于 2010-7-18 13:40:28 回复
    这种东西还能有什么资料捏,学的时候的PPT……没拷贝~~反正内容也就那样了,随便一本图像处理教本都差不多
  • 2010-7-18 12:31:46 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

IE下本页面显示有问题?

→点击地址栏右侧【兼容视图】←

日历

Search

网站分类

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2008-2013 ZwqXin. All Rights Reserved. Theme edited from ipati.