形态学变换
膨胀与腐蚀
形态学变化是基于图像形状的一些简单操作。操作对象一般是二值图像,需要两个输入,一个是我们的原图,另一个是3x3的结构元素(内核),决定了膨胀操作的本质。常见的操作是图像的膨胀和腐蚀。以及他们的进阶操作注入Opening、Closing、Gradient等等。(参考)
结构元素的形状
MORPH_RECT |
矩形 |
MORPH_ELLIPSE |
椭圆形 |
MORPH_CROSS |
十字型 |
膨胀Dilation
跟卷积操作非常类似.有图像A和3x3的结构元素,结构元素在A上进行滑动.计算结构元素在A上覆盖的最大像素值来替换当前结构元素对应的正中间的元素
膨胀的作用:
- 对象边缘增加一个像素
- 使对象边缘平滑
- 减少了对象与对象之间的距离
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | /**
* 膨胀: 用内核中最大的值填充当前像素点的值
*/
void dilation(){
Mat img = imread("../assets/morph-j.jpg",IMREAD_GRAYSCALE);
imshow("src",img);
Mat dst;
Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5));
dilate(img,dst,kernel);
// 将膨胀之后的图像显示出来
imshow("dilation",dst);
}
|
腐蚀Erosion
腐蚀和膨胀过程类似,唯一不同的是以覆盖的最小值替换当前的像素值
侵蚀的作用:
- 对象边缘减少一个像素
- 对象边缘平滑
- 弱化了对象与对象之间连接
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | /**
* 腐蚀: 用内核覆盖的最小像素值替换当前像素值
*/
void erosion(){
Mat img = imread("../assets/morph-j.jpg",IMREAD_COLOR);
imshow("src",img);
Mat dst;
Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5));
// 腐蚀
erode(img,dst,kernel);
// 显示图像
imshow("dst",dst);
}
|
开操作Opening
先腐蚀,后膨胀,主要应用在二值图像或灰度图像
先腐蚀: 让当前窗口中最小的颜色值替换当前颜色值
后膨胀: 让当前窗口中最大的颜色值替换当前颜色值
作用:
- 一般用于消除小的干扰或噪点(验证码图的干扰线)
- 可以通过此操作配合结构元素,提取图像的横线和竖线
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | /**
* 开操作: 先腐蚀,再膨胀
*/
void openning(){
Mat img = imread("../assets/morph-opening.jpg",IMREAD_COLOR);
imshow("src",img);
Mat dst;
Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5));
morphologyEx(img,dst,MORPH_OPEN,kernel);
imshow("dst",dst);
}
|
去除验证码上面的干扰线
闭操作Closing
先膨胀,后侵蚀
一般用于填充内部缝隙
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | /**
* 先膨胀再腐蚀
*/
void closing(){
Mat img = imread("../assets/morph-closing.jpg",IMREAD_COLOR);
imshow("src",img);
// 定义结构元素
Mat dst;
Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3));
// 进行形态学变换
morphologyEx(img,dst,MORPH_CLOSE,kernel);
imshow("dst",dst);
}
|
小结
形态学变换中还有一些其它的变换,大家可以自行尝试查看执行效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | 开运算
先对图像腐蚀,再膨胀
dst=open(src,element)=dilate(erode(src,element))
闭运算
先膨胀再腐蚀
dst=close(src,element)=erode(dilate(src,element))
形态梯度
膨胀图和腐蚀图之差
dst=morph_grad(src,element)=dilate(src,element)−erode(src,element)
顶冒
原图和开运算图之差
dst=tophat(src,element)=src−open(src,element)
黑冒
闭运算结果和原图之差
dst=blackhat(src,element)=close(src,element)−src
|