Opencv形态学滤波-综合

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat srcImage, dstImage;
int g_nDilorEro = 0, g_nValue = 0, g_nWay = 0;
Mat DilateElement, ErodeElement, Element;

//有滚动条事件时,可以进入回调函数
void on_Trackbar(int, void *)
{
	if (g_nDilorEro == 0)
	{
		Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
		morphologyEx(srcImage, dstImage, CV_MOP_DILATE, Element);
		imshow("【形态学滤波窗口】", dstImage);
	}
	else if (g_nDilorEro == 1)
	{
		Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
		morphologyEx(srcImage, dstImage, CV_MOP_ERODE, Element);
		imshow("【形态学滤波窗口】", dstImage);
	}
	else if (g_nDilorEro == 2)
	{
		Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
		morphologyEx(srcImage, dstImage, CV_MOP_OPEN, Element);
		imshow("【形态学滤波窗口】", dstImage);
	}
	else if (g_nDilorEro == 3)
	{
		Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
		morphologyEx(srcImage, dstImage, CV_MOP_CLOSE, Element);
		imshow("【形态学滤波窗口】", dstImage);
	}
	else if (g_nDilorEro == 4)
	{
		Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
		morphologyEx(srcImage, dstImage, CV_MOP_GRADIENT, Element);
		imshow("【形态学滤波窗口】", dstImage);
	}
	else if (g_nDilorEro == 5)
	{
		Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
		morphologyEx(srcImage, dstImage, CV_MOP_TOPHAT, Element);
		imshow("【形态学滤波窗口】", dstImage);
	}
	else
	{
		Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
		morphologyEx(srcImage, dstImage, CV_MOP_BLACKHAT, Element);
		imshow("【形态学滤波窗口】", dstImage);
	}
}

int main()
{
	srcImage = imread("tiger.jpg");
	imshow("【原图】", srcImage);
	dstImage.create(srcImage.size(), srcImage.type());

	//选择形态学滤波方式  0代表是膨胀运算,1代表是腐蚀运算,2代表是开运算,3代表是闭运算,4代表是形态学梯度,5代表是顶帽
	//6代表是黑帽
	namedWindow("【滚动条窗口】");
	createTrackbar("1234567", "【滚动条窗口】", &g_nDilorEro, 6, on_Trackbar);
	on_Trackbar(g_nDilorEro, 0);
	createTrackbar("Value", "【滚动条窗口】", &g_nValue, 100, on_Trackbar);
	on_Trackbar(g_nValue, 0);
	createTrackbar("way", "【滚动条窗口】", &g_nWay, 2, on_Trackbar);
	on_Trackbar(g_nWay, 0);

	char c;
	char name[50];
	int num = 0;
	while (1)
	{
		//获取按键值
		c = waitKey(0);

		//如果按下键盘的Esc就表示是退出
		if (c == 27)
			break;
		//如果按下空格键就保存照片
		if (c == 32)
		{
			sprintf(name, "照片%d.jpg", num++);
			imwrite(name, dstImage);
		}
	}

	return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在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、付费专栏及课程。

余额充值