【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀

其实,膨胀就是求局部最大值的操作。

按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积。

核可以是任何的形状和大小,它拥有一个单独定义出来的参考点,我们称其为锚点(anchorpoint)。多数情况下,核是一个小的中间带有参考点和实心正方形或者圆盘,其实,我们可以把核视为模板或者掩码。

而膨胀就是求局部最大值的操作,核B与图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长。如下图所示,这就是膨胀操作的初衷。

膨胀的数学表达式:

膨胀效果图(毛笔字):

照片膨胀效果图:

1.3 腐蚀

再来看一下腐蚀,大家应该知道,膨胀和腐蚀是一对好基友,是相反的一对操作,所以腐蚀就是求局部最小值的操作。

我们一般都会把腐蚀和膨胀对应起来理解和学习。下文就可以看到,两者的函数原型也是基本上一样的。

原理图:

腐蚀的数学表达式:

腐蚀效果图(毛笔字):

照片腐蚀效果图:

浅墨表示这张狗狗超可爱:D

二、深入——OpenCV源码分析溯源

直接上源码吧,在…\opencv\sources\modules\imgproc\src\ morph.cpp路径中 的第1353行开始就为erode(腐蚀)函数的源码,1361行为dilate(膨胀)函数的源码。

//———————————–【erode()函数中文注释版源代码】—————————- // 说明:以下代码为来自于计算机开源视觉库OpenCV的官方源代码 // OpenCV源代码版本:2.4.8 // 源码路径:…\opencv\sources\modules\imgproc\src\ morph.cpp // 源文件中如下代码的起始行数:1353行 // 中文注释by浅墨 //——————————————————————————————————– void cv::erode( InputArray src, OutputArraydst, InputArray kernel,Point anchor, int iterations,int borderType, constScalar& borderValue ){//调用morphOp函数,并设定标识符为MORPH_ERODE morphOp( MORPH_ERODE, src, dst, kernel, anchor, iterations, borderType,borderValue );}//———————————–【dilate()函数中文注释版源代码】—————————- // 说明:以下代码为来自于计算机开源视觉库OpenCV的官方源代码 // OpenCV源代码版本:2.4.8 // 源码路径:…\opencv\sources\modules\imgproc\src\ morph.cpp // 源文件中如下代码的起始行数:1361行 // 中文注释by浅墨 //——————————————————————————————————– void cv::dilate( InputArray src,OutputArray dst, InputArray kernel,Point anchor, int iterations,int borderType, constScalar& borderValue ){//调用morphOp函数,并设定标识符为MORPH_DILATE morphOp( MORPH_DILATE, src, dst, kernel, anchor, iterations, borderType,borderValue );}

可以发现erode和dilate这两个函数内部就是调用了一下morphOp,只是他们调用morphOp时,第一个参数标识符不同,一个为MORPH_ERODE(腐蚀),一个为MORPH_DILATE(膨胀)。

morphOp函数的源码在…\opencv\sources\modules\imgproc\src\morph.cpp中的第1286行,有兴趣的朋友们可以研究研究,这里就不费时费力花篇幅展开分析了。

三、浅出——API函数快速上手

3.1 形态学膨胀——dilate函数

erode函数,使用像素邻域内的局部极大运算符来膨胀一张图片,从src输入,由dst输出。支持就地(in-place)操作。

天不负;卧薪尝胆,三千越甲可吞吴。

【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀

相关文章:

你感兴趣的文章:

标签云: