形态学滤波的应用,对一副图像进行开闭,顶帽黑帽,腐蚀膨胀,三个窗口用滑动条来表示,迭代值也是一个滑动条。十字,矩形,ellipse也是可选控制条件。

跟風遠走 提交于 2019-12-09 20:05:01
#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输出图,必须为三个,不能为一个。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
黑帽,突出轮廓附近更暗的区域。
在这里插入图片描述
顶帽运算可以突出闭轮廓附近更亮的区域。
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!