毛星云Opencv之6.4.9形态学滤波综合示例代码

#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
#include<time.h>
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;

static void on_OpenClose(int, void*);
static void on_ErodeDilate(int, void*);
static void on_TopBlackHat(int, void*);


int main()
{
	g_srcImage = imread("C:/Users/离子键/source/repos/Project8/1.jpg");

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

	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);

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

		c = waitKey(0);
		if ((char)c == 'q' || (char)c == 27)
			break;
		if ((char)c == 49)
			g_nElementShape = MORPH_ELLIPSE;
		else if ((char)c == 50)
			g_nElementShape = MORPH_RECT;
		else if ((char)c == 51)
			g_nElementShape = MORPH_CROSS;
		else if ((char)c == ' ')
			g_nElementShape = (g_nElementShape + 1) % 3;
	}
	return 0;
}

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);
		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);

}

运行结果图:

 原版介绍:

 

 

 

 

 

 

 

 

在C#中,使用OpenCVSharp库进行图像处理,特别是灰度形态学滤波(Grayscale Morphological Filtering)是非常常见的。形态学滤波主要用于去除噪声、连接断裂的线条或填充孔洞等,通常分为两个主要步骤:结构元素和操作。 1. **结构元素**:这是形态学操作的基础,通常是像矩形、十字或椭圆这样的简单形状,但也可以自定义。OpenCVSharp提供了一些预定义的结构元素类型,如`MorphologyExStructuringElement.ElementShape.Rect`或`MorphologyExStructuringElement.ElementShape.Ellipse`。 2. **基本操作**: - **腐蚀(Erosion)**:通过将结构元素在图像上滑动并移除每个位置与结构元素中心点相交区域的像素值,从而缩小物体边缘。 - **膨胀(Dilation)**:相反的过程,结构元素填充像素使得边缘向外扩展。 - **开运算(Opening)**:先腐蚀后膨胀,用于去除小的噪声点。 - **闭运算(Closing)**:先膨胀后腐蚀,常用于填补小的空洞。 - **顶帽(Top Hat)**:原图减去腐蚀的结果,突出高亮细节。 - **黑帽(Black Hat)**:腐蚀后的图像减去原图,突出低对比度区域。 3. **形态学链**:有时候可能需要执行一系列连续的形态学操作,比如先用开运算消除噪声,然后用闭运算恢复边缘完整性。 在实际代码中,你可以这样使用: ```csharp using Emgu.CV; using Emgu.CV.Structure; // 加载图片 Image<Gray, byte> src = new Image<Gray, byte>("path_to_your_image.jpg"); // 定义结构元素 Mat kernel = MatOfByte.Create(3, 3, (byte[,])new[,] { {0, 1, 0}, {1, 1, 1}, {0, 1, 0} }); // 矩形结构 // 应用腐蚀操作 Image<Gray, byte> erosion = src.MorphologyEx(kernel, Emgu.CV.CvEnum.MORPHOPS.CV_ERODE); // 类似地,为其他操作替换参数 var dilationKernel = ...; // 填充空洞 erosion = erosion.MorphologyEx(dilationKernel, Emgu.CV.CvEnum.MORPHOPS.CV_DILATE); ``` 如果你想要了解更多关于OpenCVSharp在C#中的应用,相关问题可以包括:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值