【OpenCV基础】第十课:形态学操作

膨胀,腐蚀,开操作,闭操作,形态学梯度,顶帽,黑帽

Posted by x-jeff on April 8, 2020

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.形态学操作

图像形态学操作:基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学。

形态学有四个基本操作:膨胀、腐蚀、开、闭。

2.膨胀与腐蚀

2.1.膨胀

跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状

(左图为原图,右图为膨胀操作之后的输出图像。)

2.2.腐蚀

腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值。

(左图为原图,右图为腐蚀操作之后的输出图像。)

2.3.相关API

2.3.1.getStructuringElement

getStructuringElement函数会返回指定形状和尺寸的结构元素。

1
2
3
4
5
Mat getStructuringElement(
	int shape,
	Size ksize,
	Point anchor=Point(-1,-1)
);
  • 参数int shape表示内核的形状,有三种形状可以选择:
    1. 矩形MORPH_RECT
    2. 十字形MORPH_CROSS
    3. 椭圆MORPH_ELLIPSE
  • 参数Size ksize表示内核的大小(必须为正奇数)。
  • 参数Point anchor表示内核的锚点,默认位置在中心。

三种内核形状的说明,以5*5大小的内核为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#MORPH_RECT
1 1 1 1 1 
1 1 1 1 1 
1 1 1 1 1 
1 1 1 1 1 
1 1 1 1 1

#MORPH_CROSS
0 0 1 0 0 
0 0 1 0 0 
1 1 1 1 1 
0 0 1 0 0 
0 0 1 0 0 

#MORPH_ELLIPSE
0 0 1 0 0 
1 1 1 1 1 
1 1 1 1 1 
1 1 1 1 1 
0 0 1 0 0 

2.3.2.膨胀

1
2
3
4
5
6
7
8
9
void dilate( 
	InputArray src,//原始图像
	OutputArray dst,//输出图像
	InputArray kernel,//结构元素
	Point anchor = Point(-1,-1),//结构元素的锚点位置
	int iterations = 1,//膨胀操作执行次数
	int borderType = BORDER_CONSTANT,//图像边缘处理方式
	const Scalar& borderValue = morphologyDefaultBorderValue()//处理边缘用的值
);

2.3.3.腐蚀

腐蚀操作的API参数基本和膨胀相同,不再赘述。

1
2
3
4
5
6
7
8
9
void erode( 
	InputArray src,
	OutputArray dst, 
	InputArray kernel,
	Point anchor = Point(-1,-1), 
	int iterations = 1,
	int borderType = BORDER_CONSTANT,
	const Scalar& borderValue = morphologyDefaultBorderValue() 
);

3.其他形态学操作

3.1.开操作与闭操作

3.1.1.开操作

开操作:先腐蚀后膨胀。

上图左为原图,右为执行开操作之后的图。

3.1.2.闭操作

闭操作:先膨胀后腐蚀。

上图左为原图,右为执行闭操作之后的图。

3.2.形态学梯度

形态学梯度:膨胀减去腐蚀。

上图左为原图,右为执行形态学梯度之后的图。

很明显,该操作可用于提取边缘。

3.3.顶帽与黑帽

3.3.1.顶帽

顶帽:原图像与开操作之间的差值图像(对应像素值差的绝对值)。

以3.1.1部分的原图作为例子,顶帽操作得到的图像见下:

3.3.2.黑帽

黑帽:原图像与闭操作之间的差值图像。

以3.1.2部分的原图作为例子,黑帽操作得到的图像见下:

3.4.相关API

1
2
3
4
5
6
7
8
9
10
void morphologyEx( 
	InputArray src,//原图像
	OutputArray dst,//输出图像
	int op,//形态学操作类型
	InputArray kernel,//结构元素,使用getStructuringElement构建
	Point anchor = Point(-1,-1),//锚点
	int iterations = 1,//操作执行次数
	int borderType = BORDER_CONSTANT,//边界处理方式
	const Scalar& borderValue = morphologyDefaultBorderValue()//处理边界时所使用的值
);

其中,参数int op有以下几种选择:

  1. MORPH_ERODE=0:腐蚀
  2. MORPH_DILATE=1:膨胀
  3. MORPH_OPEN=2:开操作
  4. MORPH_CLOSE=3:闭操作
  5. MORPH_GRADIENT=4:形态学梯度
  6. MORPH_TOPHAT=5:顶帽操作
  7. MORPH_BLACKHAT=6:黑帽操作
  8. MORPH_HITMISS=7

4.代码地址

  1. 形态学操作