opencv-062-图像形态学(膨胀与腐蚀)

知识点

膨胀与腐蚀是图像形态学最基础的两个操作,形态学的其它操作都是基于这两个操作基础上得到的,图像形态学是二值图像分析的重要分支学科。在OpenCV中膨胀与腐蚀对应两个相关的API,膨胀可以看成是最大值滤波,即用最大值替换中心像素点;腐蚀可以看出是最小值滤波,即用最小值替换中心像素点。

膨胀的API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void cv::dilate(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
)

src 输入图像,任意通道的
dst 输出图像,类型与通道数目必须跟输入保持一致
kernel 结构元素
anchor 中心位置锚定
iterations 循环次数
borderType 边缘填充类型

腐蚀的API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void cv::erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
)
src 输入图像,任意通道的
dst 输出图像,类型与通道数目必须跟输入保持一致
kernel 结构元素
anchor 中心位置锚定
iterations 循环次数
borderType 边缘填充类型

代码(c++,python)

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
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/*
* 图像形态学(膨胀与腐蚀)
*/
int main() {
Mat src = imread("../images/master.jpg");
if (src.empty()) {
cout << "could not load image.." << endl;
}
imshow("input", src);

Mat dresult, eresult;
// 定义结构元素3*3大小的矩形
Mat se = getStructuringElement(MORPH_RECT, Size(3,3));
// 膨胀
dilate(src, dresult, se);
// 腐蚀
erode(src, eresult, se);

imshow("dilate", dresult);
imshow("erode", eresult);

waitKey(0);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cv2 as cv
import numpy as np

src = cv.imread("D:/images/dannis2.jpg")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)

# 使用3x3结构元素进行膨胀与腐蚀操作
se = np.ones((3, 3), dtype=np.uint8)
dilate = cv.dilate(src, se, None, (-1, -1), 1)
erode = cv.erode(src, se, None, (-1, -1), 1)

# 显示
cv.imshow("dilate", dilate)
cv.imshow("erode", erode)
cv.waitKey(0)
cv.destroyAllWindows()

结果

代码地址

github