1、形态学滤波
简单来说,形态学操作就是基于形状的一系列图像处理操作,最基本的形态学操作:膨胀、腐蚀。在图像处理中,两种操作都是针对白色部分(高亮部分)而言的,膨胀就是对白色部分的扩张,相反,腐蚀是白色部分被腐蚀。
膨胀,就是求局部最大值的操作,所谓的局部是指一个任意大小和形状的卷积核(或称模板,掩码),该核覆盖的像素值中取最大值,赋值给核锚点(通常是中间点)所对应的像素点,这样就会使图像中高亮部分逐渐扩张。
腐蚀,就是膨胀的反操作,核覆盖的像素值中取最小值,效果也是相反的。
开操作,先腐蚀后膨胀,其效果就是去除图像中的一些白色点(高亮点)。
闭操作,先膨胀后腐蚀,其效果就是填补图像中的黑色空洞。
顶帽,原图与开运算之差。
黑帽,原图与比运算之差。
2、函数原型
// 膨胀
void dilate( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
// 腐蚀
void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
// 形态学核心函数
void morphologyEx( InputArray src, OutputArray dst,
int op, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
// 获取核
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
3、测试代码
膨胀
void test6() {
Mat src = imread("D:/zi.png");
cvtColor(src, src, CV_BGR2GRAY);
threshold(src, src, 200, 255, THRESH_OTSU);
Mat dilate_img;
Mat kernel = getStructuringElement(MORPH_RECT, Size(9, 9));
dilate(~src, dilate_img, kernel);
imshow("binary", ~src);
imshow("dilate_img", dilate_img);
}
腐蚀
void test6() {
Mat src = imread("D:/zi.png");
cvtColor(src, src, CV_BGR2GRAY);
threshold(src, src, 200, 255, THRESH_OTSU);
Mat erode_img;
Mat kernel = getStructuringElement(MORPH_RECT, Size(9, 9));
erode(~src, erode_img, kernel);
imshow("binary", ~src);
imshow("erode_img", erode_img);
}
开操作
void test6() {
Mat src = imread("D:/gao.png");
cvtColor(src, src, CV_BGR2GRAY);
threshold(src, src, 200, 255, THRESH_OTSU);
Mat open_img;
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));
morphologyEx(~src, open_img,MORPH_OPEN,kernel);
imshow("binary", ~src);
imshow("open_img", open_img);
}
闭操作
void test6() {
Mat src = imread("D:/gao.png");
cvtColor(src, src, CV_BGR2GRAY);
threshold(src, src, 200, 255, THRESH_OTSU);
Mat close_img;
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));
morphologyEx(~src, close_img, MORPH_CLOSE, kernel);
imshow("binary", ~src);
imshow("close_img", close_img);
}
顶帽
void test6() {
Mat src = imread("D:/gao.png");
cvtColor(src, src, CV_BGR2GRAY);
threshold(src, src, 200, 255, THRESH_OTSU);
Mat tophat_img;
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));
morphologyEx(~src, tophat_img, MORPH_TOPHAT, kernel);
imshow("binary", ~src);
imshow("tophat_img", tophat_img);
}
黑帽
void test6() {
Mat src = imread("D:/gao.png");
cvtColor(src, src, CV_BGR2GRAY);
threshold(src, src, 200, 255, THRESH_OTSU);
Mat blackhat_img;
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));
morphologyEx(~src, blackhat_img, MORPH_BLACKHAT, kernel);
imshow("binary", ~src);
imshow("blackhat_img", blackhat_img);
}