形态学滤波

// ConsoleApplication36.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

//************************************
//		形态学
//************************************

Mat g_srcImage, g_dstImage;
int g_nElementShape = MORPH_RECT;

int g_nMaxIterationNum = 10;
int g_nOpenCloseNum = 0;
int g_nErodeDilateNum = 0;
int g_nTopBlackHatNum = 0;
int g_nGradientNum = 0;
static void on_OpenClose(int, void *);
static void on_ErodeDilate(int, void *);
static void on_TopBlackHat(int, void *);
static void on_Gradient(int, void *);
static void ShowHelpText();

int main()
{
	system("color 5E");
	ShowHelpText();
	g_srcImage = imread("C:/Users/hasee-pc/Desktop/girl.jpg");
	if (!g_srcImage.data)
	{
		printf("error in srcImage\n");
		return -1;
	}

	namedWindow("【原始图】");
	imshow("【原始图】", g_srcImage);

	namedWindow("【开运算/闭运算】", 1);
	namedWindow("【腐蚀/膨胀】", 1);
	namedWindow("【顶帽/黑帽】", 1);
	namedWindow("【形态学梯度】", 1);

	g_nOpenCloseNum = 9;
	g_nErodeDilateNum = 9;
	g_nTopBlackHatNum = 2;

	createTrackbar("迭代值:", "【开运算/闭运算】", &g_nOpenCloseNum, g_nMaxIterationNum * 2 + 1, on_OpenClose);
	createTrackbar("迭代值:", "【腐蚀/膨胀】", &g_nErodeDilateNum, g_nMaxIterationNum * 2 + 1, on_ErodeDilate);
	createTrackbar("迭代值:", "【顶帽/黑帽】", &g_nTopBlackHatNum, g_nMaxIterationNum * 2 + 1, on_TopBlackHat);
	createTrackbar("迭代值:", "【形态学梯度】", &g_nGradientNum, g_nMaxIterationNum + 1, on_Gradient);

	while (1)
	{
		int c;
		on_OpenClose(g_nOpenCloseNum, 0);
		on_ErodeDilate(g_nErodeDilateNum, 0);
		on_TopBlackHat(g_nTopBlackHatNum, 0);
		on_Gradient(g_nGradientNum, 0);

		c = waitKey(0);

		if ((char)c == 'q' || char(c) == 27)
			break;
		if ((char)c == 49)//1  椭圆形
			g_nElementShape = MORPH_ELLIPSE;
		else if ((char)c == 50)//2 矩形
			g_nElementShape = MORPH_RECT;
		else if ((char)c == 51)//3 十字形
			g_nElementShape = MORPH_CROSS;
		else if ((char)c == ' ')// 空格 三种情况循环
			g_nElementShape = (g_nElementShape + 1) % 3;
	}
//	while (char(waitKey(1) != 'q')) {}
	waitKey(0);
}

static void on_Gradient(int, void *)
{
	int Absolute_offset = g_nGradientNum;

	Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));

	morphologyEx(g_srcImage, g_dstImage, MORPH_GRADIENT, element);

	imshow("【形态学梯度】", g_dstImage);
}
static void on_OpenClose(int, void *)
{
	int offset = g_nOpenCloseNum - g_nMaxIterationNum;//偏移量
	int Absolute_offset = offset > 0 ? offset : -offset;//偏移量绝对值

	Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));
	if (offset < 0)
	{
		morphologyEx(g_srcImage, g_dstImage, MORPH_OPEN, element);
	}
	else
	{
		morphologyEx(g_srcImage, g_dstImage, MORPH_CLOSE, element);
	}
	imshow("【开运算/闭运算】", g_dstImage);
}
static void on_ErodeDilate(int, void *)
{
	int offset = g_nErodeDilateNum - g_nMaxIterationNum;
	int Absolute_offset = offset > 0 ? offset : -offset;
	
	Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));
	if (offset < 0)
		erode(g_srcImage, g_dstImage, element);
	else
		dilate(g_srcImage, g_dstImage, element);
	imshow("【腐蚀/膨胀】", g_dstImage);
}
static void on_TopBlackHat(int, void *)
{
	int offset = g_nTopBlackHatNum - g_nMaxIterationNum;
	int Absolute_offset = offset > 0 ? offset : -offset;

	Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1,Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));

	if (offset < 0)
		morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT, element);
	else
		morphologyEx(g_srcImage, g_dstImage, MORPH_BLACKHAT, element);
	imshow("【顶帽/黑帽】", g_dstImage);
}
static void ShowHelpText()
{
	cout << "1  ----> 表示椭圆形\n";
	cout << "2  ----> 表示矩形\n";
	cout << "3  ----> 表示十字形\n";
	cout << "q  ----> 退出\n";
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值