灰度图像--形态学处理(腐蚀,膨胀,开、闭运算,顶帽(礼帽),低帽(黒帽),测定腐蚀、测地膨胀,形态学重建)_顶帽 底帽-程序员宅基地

技术标签: 顶帽底帽  测地腐蚀膨胀  Halcon学习  开闭运算  膨胀腐蚀  

				版权声明:本文为博主原创文章,转载请告诉我下,我高兴高兴~					https://blog.csdn.net/u012851419/article/details/78026596				</div>
							            <div id="content_views" class="markdown_views">
						<!-- flowchart 箭头图标 勿删 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<p><img src="https://img-blog.csdn.net/20170919152558134?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg1MTQxOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""> </p>

写这个帖子的原因是在学习灰度图像处理中,发现没有一个博客很系统全面的讲解这些形态学变换,所以为了帮助后来人,特此做此工作,但是能力有限,如果有不对的地方请大家多多批评指正!另外有一些前辈的工作在里面,在后面我会给出引用。

灰度图像与二值图像的形态学变换不尽相同,形态学处理的定义与二值图像有些不同,因为二值图像可以用一系列的二维坐标来表示图像信息,而灰度图需要一个三维坐标表示,而且二值图像中结构元SE是平坦的,没有灰度信息的,但灰度图中,结构元是可以带有第三维信息的,即结构元也是灰度的,这就带来了一些问题,因为二值图像中,形态学的输出结果完全由输入图像产生,但是结构元一旦引入灰度信息,那么输出结果将不再由输入图像唯一确定。所以,一般情况下,结构元都使用平坦的结构元。

腐蚀与膨胀

是形态学的基本操作,在灰度图像中也是如此,在二值图像中腐蚀和膨胀定义为对图像进行translation以后的“与”和“或”的逻辑操作结果,在灰度图像中,为了保存灰度信息,“与”和“或”操作被对应的替换成了“最大值”和“最小值”操作这样就给出了灰度图像中腐蚀和膨胀的操作定义。

直接看矩阵中的操作吧,简单明了。

腐蚀

腐蚀操作这里写图片描述

膨胀

膨胀操作这里写图片描述

开操作与闭操作

与二值图像中的定义相同,开、闭操作也又腐蚀膨胀操作衍生出来的,依旧先腐蚀后膨胀是开操作,先膨胀后腐蚀是闭操作。

开操作

这里写图片描述

闭操作

这里写图片描述

顶帽和低帽变换

这两个变换在翻译的时候有不同的叫法,但是不用管这些啦,毕竟都是一个意思嘛。
顶帽操作和底帽操作是灰度图像所特有的,其原理是开操作将使峰顶消去,具体消去了多少呢,可以用原图减去开操作结果,这样就能得到其消去的部分,而这个过程成为顶帽操作,顶帽就是开操作消去的峰顶,这一部分对应于图像中较亮的部分,也叫白色顶帽。

开运算放大了裂缝或者局部低亮度的区域,所以,从原图中减去开运算后的图,得到的结果突出了比原图轮廓周围的区域更明亮的区域,这个操作与选择的核的大小有关。TopHat运算一般用来分离比邻近点亮一些的斑块,可以使用这个运算提取背景。

同理,底帽操作是用闭操作的结果减去原图就得到被闭操作填充的谷底部分,这一部分对应于图像中较暗的部分,也叫黑色底帽。黑帽运算的结果突出了比原图轮廓周围区域更暗的区域,所以黑帽运算用来分离比邻近点暗一些的斑块。

顶帽

这里写图片描述

低帽

这里写图片描述

测地腐蚀与测地膨胀

测地腐蚀与测地膨胀在二值图像中的操作是将腐蚀与膨胀结果与ground做“与”和“或”操作,与灰度膨胀中膨胀的推广一样,“与”和“或”被取代为最大值和最小值。

//当循环次数为负数时候为形态学重建,为0时候返回原图像,为整数时普通的测地腐蚀
void lhMorpRErode(const IplImage* src,  const IplImage* msk, IplImage* dst, IplConvKernel* se = NULL, int iterations=-1)

{

       assert(src != NULL  && msk != NULL && dst != NULL && src != dst );

       if(iterations < 0)

       {

              //腐蚀重建

              cvMax(src, msk, dst);

              cvErode(dst, dst, se);

              cvMax(dst, msk, dst);

              IplImage*  temp1 = cvCreateImage(cvGetSize(src), 8, 1);

              IplImage*  temp2 = cvCreateImage(cvGetSize(src), 8, 1);

              do

              {

                     cvCopy(dst, temp1);

                     cvErode(dst, dst, se);

                     cvMax(dst, msk, dst);

                     cvCmp(temp1, dst, temp2, CV_CMP_NE);

              }

              while(cvSum(temp2).val[0] != 0);

              cvReleaseImage(&temp1);

              cvReleaseImage(&temp2);

              return;    

       }

       else if (iterations == 0)

       {

              cvCopy(src, dst);

       }

       else

       {

              //普通测地腐蚀 p137(6.2)

              cvMax(src, msk, dst);

              cvErode(dst, dst, se);

              cvMax(dst, msk, dst);

              for(int i=1; i<iterations; i++)

              {

                     cvErode(dst, dst, se);

                     cvMax(dst, msk, dst);

              }

       }

}


 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

http://blog.csdn.net/TonyShengTan/article/details/42426033

				版权声明:本文为博主原创文章,转载请告诉我下,我高兴高兴~					https://blog.csdn.net/u012851419/article/details/78026596				</div>
							            <div id="content_views" class="markdown_views">
						<!-- flowchart 箭头图标 勿删 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<p><img src="https://img-blog.csdn.net/20170919152558134?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg1MTQxOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""> </p>

写这个帖子的原因是在学习灰度图像处理中,发现没有一个博客很系统全面的讲解这些形态学变换,所以为了帮助后来人,特此做此工作,但是能力有限,如果有不对的地方请大家多多批评指正!另外有一些前辈的工作在里面,在后面我会给出引用。

灰度图像与二值图像的形态学变换不尽相同,形态学处理的定义与二值图像有些不同,因为二值图像可以用一系列的二维坐标来表示图像信息,而灰度图需要一个三维坐标表示,而且二值图像中结构元SE是平坦的,没有灰度信息的,但灰度图中,结构元是可以带有第三维信息的,即结构元也是灰度的,这就带来了一些问题,因为二值图像中,形态学的输出结果完全由输入图像产生,但是结构元一旦引入灰度信息,那么输出结果将不再由输入图像唯一确定。所以,一般情况下,结构元都使用平坦的结构元。

腐蚀与膨胀

是形态学的基本操作,在灰度图像中也是如此,在二值图像中腐蚀和膨胀定义为对图像进行translation以后的“与”和“或”的逻辑操作结果,在灰度图像中,为了保存灰度信息,“与”和“或”操作被对应的替换成了“最大值”和“最小值”操作这样就给出了灰度图像中腐蚀和膨胀的操作定义。

直接看矩阵中的操作吧,简单明了。

腐蚀

腐蚀操作这里写图片描述

膨胀

膨胀操作这里写图片描述

开操作与闭操作

与二值图像中的定义相同,开、闭操作也又腐蚀膨胀操作衍生出来的,依旧先腐蚀后膨胀是开操作,先膨胀后腐蚀是闭操作。

开操作

这里写图片描述

闭操作

这里写图片描述

顶帽和低帽变换

这两个变换在翻译的时候有不同的叫法,但是不用管这些啦,毕竟都是一个意思嘛。
顶帽操作和底帽操作是灰度图像所特有的,其原理是开操作将使峰顶消去,具体消去了多少呢,可以用原图减去开操作结果,这样就能得到其消去的部分,而这个过程成为顶帽操作,顶帽就是开操作消去的峰顶,这一部分对应于图像中较亮的部分,也叫白色顶帽。

开运算放大了裂缝或者局部低亮度的区域,所以,从原图中减去开运算后的图,得到的结果突出了比原图轮廓周围的区域更明亮的区域,这个操作与选择的核的大小有关。TopHat运算一般用来分离比邻近点亮一些的斑块,可以使用这个运算提取背景。

同理,底帽操作是用闭操作的结果减去原图就得到被闭操作填充的谷底部分,这一部分对应于图像中较暗的部分,也叫黑色底帽。黑帽运算的结果突出了比原图轮廓周围区域更暗的区域,所以黑帽运算用来分离比邻近点暗一些的斑块。

顶帽

这里写图片描述

低帽

这里写图片描述

测地腐蚀与测地膨胀

测地腐蚀与测地膨胀在二值图像中的操作是将腐蚀与膨胀结果与ground做“与”和“或”操作,与灰度膨胀中膨胀的推广一样,“与”和“或”被取代为最大值和最小值。

//当循环次数为负数时候为形态学重建,为0时候返回原图像,为整数时普通的测地腐蚀
void lhMorpRErode(const IplImage* src,  const IplImage* msk, IplImage* dst, IplConvKernel* se = NULL, int iterations=-1)

{

       assert(src != NULL  && msk != NULL && dst != NULL && src != dst );

       if(iterations < 0)

       {

              //腐蚀重建

              cvMax(src, msk, dst);

              cvErode(dst, dst, se);

              cvMax(dst, msk, dst);

              IplImage*  temp1 = cvCreateImage(cvGetSize(src), 8, 1);

              IplImage*  temp2 = cvCreateImage(cvGetSize(src), 8, 1);

              do

              {

                     cvCopy(dst, temp1);

                     cvErode(dst, dst, se);

                     cvMax(dst, msk, dst);

                     cvCmp(temp1, dst, temp2, CV_CMP_NE);

              }

              while(cvSum(temp2).val[0] != 0);

              cvReleaseImage(&temp1);

              cvReleaseImage(&temp2);

              return;    

       }

       else if (iterations == 0)

       {

              cvCopy(src, dst);

       }

       else

       {

              //普通测地腐蚀 p137(6.2)

              cvMax(src, msk, dst);

              cvErode(dst, dst, se);

              cvMax(dst, msk, dst);

              for(int i=1; i<iterations; i++)

              {

                     cvErode(dst, dst, se);

                     cvMax(dst, msk, dst);

              }

       }

}


 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

http://blog.csdn.net/TonyShengTan/article/details/42426033

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dazhuan0429/article/details/86295842

智能推荐

matlab学习笔记-程序员宅基地

文章浏览阅读165次。加入水印,采用lsb%Name: Chris Shoemaker%Course: EER-280 - Digital Watermarking%Project: Least Significant Bit Substitution% Watermark Embedingclear all;% save start timestart_time=cputime;% read in the co..._[cover_object,map]=imread(file_name);

ipv6无网络访问权限可行解决方案_ipv6无internet访问权限怎么办-程序员宅基地

文章浏览阅读1.6w次。原文地址:http://www.xitongtiandi.net/wenzhang/win10/12654.htmlWin10专业版下ipv6无网络访问权限解决方案(只在win10专业版下做了测试,win7和win8.1待测试)1、首先打开 https://support.microsoft.com/en-us/kb/929852 选择Re-enable IPv6 相关的_ipv6无internet访问权限怎么办

【C程序设计】——程序=算法+数据结构_程序等于数据结构+算法-程序员宅基地

文章浏览阅读3.1k次,点赞32次,收藏37次。而且每次都要直接使用上一步骤的具体运算结果(如2,6,24等),也不方便,应当能找到一种通用的表示方法。由于数值运算往往有现成的模型,可以运用数值分析方法,因此对数值运算的算法的研究比较深入,算法比较成熟。从图中可以看出:“其他”这一部分,包括不能被4整除的年份,以及能被4整除,又能被100整除,但不能被400整除的那些年份(如1900年),它们都是非闰年。:若year能被4整除,不能被100整除,则输出year的值和“是闰年”。因此,上述算法不仅是正确的,而且是计算机能方便实现的较好的算法。_程序等于数据结构+算法

Keil : Error-Flash Download failed Cortex-M4错误解决方案整理(J-Flash擦除下载教程)_error: flash download failed - "cortex-m4-程序员宅基地

文章浏览阅读2.6w次,点赞18次,收藏88次。记录一下碰到的问题解决方法第一步:首先最先要确定的是芯片和设置是否对应!!!!!!!!!第二步:确定芯片和设置对应无误后,再考虑下面的方法Keil : Error-Flash Download failed Cortex-M4错误解决方案整理在开发 nRF51822/nRF52832/nRF52840时候出现如下如下问题:问题: Keil电子下载时候出现 Error: Flash Download failed - "Cortex-M4"的错误,如下图根据官方教程解释如下,还是发现不容易解决,另_error: flash download failed - "cortex-m4

SQL字符串分割成若干列-程序员宅基地

文章浏览阅读313次。在数据库编程中,很多朋友会碰到分割字符串的需求,一般都是分割成一列多行模式,但也有时会需要分割成多列一行的模式,下面我们来看下如何实现这种需求。首先创建一个辅助函数,来得到生成多列的SQL语句:create function toArray(@str nvarchar(1000),@sym nvarchar(10))returns nvarchar(3000)asbe..._sqlserver 字符串分割成多列 小提琴

配置MM32微控制器引脚复用功能_mm32f单片机的bootloader串行口引脚-程序员宅基地

文章浏览阅读1.3k次。配置MM32微控制器引脚复用功能文章目录配置MM32微控制器引脚复用功能IntroductionAlgorithmGPIOx_CR寄存器GPIOx_AFR寄存器GPIOx_CR & GPIOx_AFR寄存器TIMUARTSPI_MASTERSPI_SLAVEI2CCANADCFSMCQSPIDACCOMPSDIOUSBPraticeConclusionIntroduction使用过NXP(FSL)微控制器的开发者在配置引脚复用功能时,直接在PORT模块中,对应引脚的的PCR寄存器的MUX字段_mm32f单片机的bootloader串行口引脚

随便推点

存储过程学习总结-程序员宅基地

文章浏览阅读134次。[color=darkred][size=x-large]存储过程学习总结[/size][/color][size=medium]1、存储过程基本语法:[/size]create procedure sp_name()begin ......end;[size=medium]2、如何调用:[/size]call sp_name();[size=medium]..._存储过程repeatuse near 'end repeat; close curgra;

动态script加载数据-程序员宅基地

文章浏览阅读97次。Neil Fraser文章看得糊里糊涂,e文不是很好...一般我们加载数据会生成一个script标签,在onload事件里remove掉,或者在jsonp回调函数中remove掉script标签,取得数据这样其实script占用的内存并没有释放,必须:for (var prop in jsFile) { delete jsFile[prop];}ie下不能d..._script加载的数据在哪里

Javascript存放位置约束-程序员宅基地

文章浏览阅读77次。JavaScript 程序应该尽量放在 .js 的文件中,需要调用的时候在 HTML 中以 &lt;script src="filename.js"&gt; 的形式包含进来。JavaScript 代码若不是该 HTML 文件所专用的,则应尽量避免在 HTML 文件中直接编写 JavaScript 代码。因为这样会大大增加 HTML 文件的大小,无益于代码的压缩和缓存的使用。&lt;scr..._js里的下载路径怎么做约束

程序员真正的价值_程序员价值-程序员宅基地

文章浏览阅读604次。作者:池建强网址:macshuo.com微信:sagacity-mac问:池老师,我是个不爱互动的人,但是您所有的文章我都看了,非常感谢您的引导,我入手了人生第一台 MBP。现在问题来了,但是找不到更合适的人解答,只能求助于您了,如果您有时间的话。问题是这样的:我有个32bit unix file(开启一个服务进程),在 Mac 上执行时错误提示是:exec f_程序员价值

测试工作总体流程图-程序员宅基地

文章浏览阅读143次。测试工作总体流程图_测试的工作流程

推荐文章

热门文章

相关标签