应用场景:
腐蚀操作常用于降噪、滤除掉一些斑点和线条;
膨胀操作常用于图片补全;
两者经常结合操作:即开运算与闭运算
开运算 = 腐蚀--->膨胀
闭运算 = 膨胀--->腐蚀
礼帽和黑帽:
礼帽 = 原图 - 开运算所得图片;(可得到一些细小的部分,即斑点和线条)
黑帽 = 原图 - 闭运算所得图片;(可得到细小遗漏部分,即斑点和线条中间的遗漏部分)
程序源码:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <stdio.h>
using namespace cv;
using namespace std;
RNG rng(12345);
Scalar color[7] = {
(Scalar(0,0,255)),//红色
(Scalar(0,255,0)),//绿色
(Scalar(255,0,0)),//蓝色
(Scalar(255,255,0)),//浅蓝色
(Scalar(255,0,255)),//紫色
(Scalar(0,255,255)),//黄色
(Scalar(128,128,192)),//浅粉色
};
int main()
{
Mat image,corrosion_img,expansion_img,open_img,close_img,tophat_img,blackhat_img;
image = imread("../finger.jpg", 1);
if (image.empty()) {
cout << "无此图片" << endl;
return 0;
}
while (1)
{
imshow("原图", image);
waitKey(1);
//腐蚀操作
Mat element = getStructuringElement(MORPH_CROSS, Size(6, 6), Point(-1, -1));//Size(6, 6)内核等级
erode(image, corrosion_img, element);
imshow("腐蚀", corrosion_img);
waitKey(1);
//膨胀操作
dilate(image, expansion_img, element);
imshow("膨胀", expansion_img);
waitKey(1);
//开运算
morphologyEx(image, open_img, MORPH_OPEN, element);
imshow("开运算", open_img);
waitKey(1);
//闭运算
morphologyEx(image, close_img, MORPH_OPEN, element);
imshow("闭运算", close_img);
waitKey(1);
//礼帽
morphologyEx(image, tophat_img, MORPH_TOPHAT, element);
imshow("礼帽", tophat_img);
waitKey(1);
//黑帽
morphologyEx(image, blackhat_img, MORPH_BLACKHAT, element);
imshow("黑帽", blackhat_img);
waitKey(1);
}
return 1;
}
图片: