OpenCV算法学习笔记之形态学处理
in OpenCV with 0 comment

OpenCV算法学习笔记之形态学处理

in OpenCV with 0 comment

形态学处理最初是数学集合论发展来的并且用于处理二值图的,后来将这些方法推广到普通的灰度级图像处理中。常用的形态学处理有腐蚀、膨胀、开运算、闭运算、顶帽运算、底帽运算。其中腐蚀和膨胀是基本操作,其他几个操作都可以由这两个操作组合得到。

腐蚀

原理

我们在之前的中值模糊中将某个位置的邻域的灰度值进行排序,然后取中值作为这个位置的灰度值。而腐蚀操作与此类似,是取邻域的最小值作为其输出值。不同的是这里的邻域不再是单纯的矩形,也可以是椭圆形、十字交叉型等,在其他的描述中这个邻域可能叫做结构元,只是用来指明邻域形状的不同,与卷积和类似,它同样需要指定一个锚点。

因为取每个位置邻域内的的最小值,所以腐蚀后的总体亮度的平均值会比原图低,图像中比较亮的区域的面积会变小甚至消失,而比较暗的区域的面积会增大,我们将图像$I$与腐蚀结构元$S$的腐蚀操作记为:

$$ E = I \ominus S $$

实现

对于图像的腐蚀操作,OpenCV提供函数erode(src, element[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])实现了该功能:

参数解释
src输入矩阵
element结构元
anchor结构元的锚点
iterations腐蚀操作的次数
borderType边界扩充类型
borderValue边界扩充值

与卷积操作类似,对于边界处的像素的邻域有可能超过图像边界,所以需要扩充边界,边界扩充类型与图像平滑中提到的相同,其中镜像扩充的效果是最好的。对于函数erode最常调节的是elementiterations,其他参数采用默认的即可,结构元element可以利用OpenCV提供的函数getStructuringElement(shape, ksize[, anchor, ]),参数解释下表所示:

参数解释
shapeMORPH_RECT: 产生矩形的结构元
MORPH_ELLIPSE: 产生的椭圆形的结构元
MORPH_CROSS: 产生的十字交叉型的结构元
ksize结构元的尺寸
anchor结构元的锚点

膨胀

原理

与腐蚀相反,膨胀是取每一个位置邻域内的最大值,同样,邻域的形状由结构元确定。膨胀后的图像总体亮度的平均值比原图会有所上升,图像中较亮的物体的尺寸会变大,相反,较暗的物体的尺寸会变小甚至消失。图像$I$与结构元$S$的膨胀操作记为:

$$ D = I \oplus S $$

实现

OpenCV提供函数dilate(src, element[, dst[, anchor[, iterations[, borderType[, borderValue ]]]]])实现了膨胀操作,其参数的设置与函数erode一样的。

开运算和闭运算

开运算

先腐蚀后膨胀的操作叫做开运算,即

$$ I \circ S = (I \ominus S ) \oplus S $$

它具有消除亮度较高的细小区域,在纤细处分离物体,对于较大的物体,可以在不明显改变其面积的情况下平滑其边界等作用。

开运算还有一个很重要的作用:消除暗背景下的较亮区域。

闭运算

先膨胀后腐蚀的操作叫做闭运算,记作

$$ I \bullet S = (I \oplus S) \ominus S $$

它具有填充白色物体内细小黑色空洞的区域,连接临近物体,同一个结构元、多次迭代处理也可以在不明显其面积的情况下平滑其边界的作用。

实现

OpenCV提供函数morphologyEx(src, op, element[, dst[, anchor[, iterations[, borderType[, borderValue ]]]]])实现了形态学处理,其中参数op如下所示:

enum MorphTypes{
    MORPH_ERODE    = 0,    // 腐蚀
    MORPH_DILATE   = 1,    // 膨胀
    MORPH_OPEN     = 2,    // 开运算
    MORPH_CLOSE    = 3,    // 闭运算
    MORPH_GRADIENT = 4     // 形态梯度,膨胀图减腐蚀图         
    MORPH_TOPHAT   = 5,    // 顶帽运算         
    MORPH_BLACKHAT = 6,    // 底帽运算         
    MORPH_HITMISS  = 7     // Hit-or-Miss运算(也称作Hit-and-Miss运算)             
};

顶帽变换和底帽变换

顶帽运算

图像减去开运算的结果称为顶帽变换:

$$ T_{hat}(I) = I - I \circ S $$

由于开运算可以消除较暗背景下的较亮区域,那么用原图减开运算后的结果就可以得到原图中灰度较亮的区域,所以也称作白顶帽运算。

底帽运算

闭运算减去图像的结果称作底帽运算:

$$ B_{hat}(I) = I \bullet S - I $$

闭运算可以删去亮度较高背景下的较暗区域,那么用闭运算的结果减去原图就可以得到原图中灰度较暗的区域,所以又称作黑底帽运算。

Hit-or-Miss变换

中文直译过来就是击中和击不中变换,是指用一个结构元与图像进行匹配,保留完全匹配的模板的锚点作为结果的一个元素,得到的结果为击中结果;然后再用一个击不中结构元与图像的补集进行匹配,保留完全匹配的模板的锚点作为结果的一个元素,得到的结果记为击不中结果。两者取交集就是HITMISS结果,步骤为

  1. 使用击中模板$S_1$与原图进行匹配;
  2. 使用击不中模板$S_2$与原图的补进行匹配;
  3. 对1,2步骤得到的结果取交集;

OpenCV提供的函数morphologyEx进行HITMISS变换只能对数据类型为CV_8UC1的二值图进行处理;

参考

《OpenCV算法精解——基于Python和C++》(张平)第七章

击中与击不中变换

赞 (0)
Responses