#include<iostream>
#include<opencv2/opencv.hpp>
#define window1 "【结果1】"
#define window "【原图】"
#define window2 "【结果2】"
#define window3 "【结果3】"
#define window4 "【结果4】"
#define window5 "【结果5】"
using namespace std;
using namespace cv;
Mat src,dst1,dst2,dst3;
Mat element;
int n_kersize1 = 10;//初始值为3.
int n_kersize2 = 10;//初始值为3.
int n_kersize3 = 10;//初始值为3.
int maxker = 10;
int type=0;
int ELEMENTSHARP = MORPH_RECT;//初始值为方形。
void on_openclose(int,void*);
void on_erodedalite(int,void*);
void on_topblackhat(int,void*);
//形态学滤波的应用,对一副图像进行开闭,顶帽黑帽,腐蚀膨胀,三个窗口用滑动条来表示,迭代值也是一个滑动条。十字,矩形,ellipse也是可选控制条件。
//核的大小控制,默认为10位原图,小于10的是腐蚀,大于10的是膨胀,顶帽黑帽同理,开运算闭运算同理。
int main()
{
system("color5E");
//1.载入原图
src = imread("猫咪.jpg",0);
//2.缩放和灰度化
resize(src,src,Size(),0.6,0.6);
imshow(window,src);
//3.创建初始值。
namedWindow("【开和闭运算窗口】",1);
namedWindow("【腐蚀和膨胀运算窗口】",1);
namedWindow("【顶帽和黑帽运算窗口】",1);
//4.创建滑动条和返回函数。
while (1)
{
createTrackbar("类型于规模控制", "【开和闭运算窗口】", &n_kersize1, 21, on_openclose);
createTrackbar("类型于规模控制", "【腐蚀和膨胀运算窗口】", &n_kersize2, 21, on_erodedalite);
createTrackbar("类型于规模控制", "【顶帽和黑帽运算窗口】", &n_kersize3, 21, on_topblackhat);
char c=waitKey(1);
//从键盘键入的字符来辨别核心的类型。是方形1,cross 2 ellipse 3 其他则跳出。
if (c == '1')
{
ELEMENTSHARP = MORPH_RECT;
}
else
if (c == '2')
{
ELEMENTSHARP = MORPH_CROSS;
}
else
if (c == '3')
{
ELEMENTSHARP = MORPH_ELLIPSE;
}
else
break;
}
waitKey(0);
return 0;
}
void on_openclose(int,void*)
{
int size = n_kersize1 - maxker;
int x = abs(size);
Mat ker = getStructuringElement(ELEMENTSHARP,Size(2*x+1,2*x+1),Point(x,x));
if (size >= 0) //大于进行开运算。
{
morphologyEx(src,dst1,MORPH_OPEN,ker);
}
else
{
morphologyEx(src, dst1, MORPH_CLOSE, ker);
}
imshow("【开和闭运算窗口】",dst1);
}
void on_erodedalite(int, void*)
{
int size = n_kersize2 - maxker;
int x = abs(size);
Mat ker = getStructuringElement(ELEMENTSHARP, Size(2 * x + 1, 2 * x + 1), Point(x, x));
if (size >= 0) //大于进行开运算。
{
morphologyEx(src, dst2,MORPH_ERODE, ker);
}
else
{
morphologyEx(src, dst2,MORPH_DILATE, ker);
}
imshow("【腐蚀和膨胀运算窗口】", dst2);
}
void on_topblackhat(int,void*)
{
int size = n_kersize3 - maxker;
int x = abs(size);
Mat ker = getStructuringElement(ELEMENTSHARP, Size(2 * x + 1, 2 * x + 1), Point(x, x));
if (size >= 0) //大于进行开运算。
{
morphologyEx(src, dst3,CV_MOP_TOPHAT, ker);
}
else
{
morphologyEx(src, dst3,CV_MOP_BLACKHAT, ker);
}
imshow("【顶帽和黑帽运算窗口】", dst3);
}
//注意,dst输出图,必须为三个,不能为一个。
黑帽,突出轮廓附近更暗的区域。
顶帽运算可以突出闭轮廓附近更亮的区域。
来源:CSDN
作者:梅津太郎
链接:https://blog.csdn.net/gaocui883/article/details/103462425