【拜小白opencv】39-形态学滤波4——闭运算

常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。

本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。

博主机器配置为:VS2013+opencv2.4.13+Win-64bit。

若本文能给读者带来一点点启示与帮助,我就很开心了。

====================分割线====================


1-开运算

形态学闭运算操作同样能去除噪声及平滑目标边缘等功能,其数学表达式如下:




  • 闭运算(Closing Operation),其实就是先膨胀再腐蚀的结果。
  • 形态学闭运算能够排除小型黑洞(黑色区域),消除低于邻近点的孤立点,达到去噪的作用。
  • 闭运算的结果也是会平滑对象的轮廓,但是与开运算不同的是,闭运算一般会将狭窄的缺口连接起来形成细长的弯口,并消除小孔洞
===============分割线=================

2-morphologyEx()函数

作用:该函数可以进行形态学滤波的操作,里面包含了开运算、闭运算、形态学梯度、顶帽、黑帽、腐蚀、膨胀等。
void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor=Point(-1,-1), int iterations=1,
                                int borderType=BORDER_CONSTANT,
                                const Scalar& borderValue=morphologyDefaultBorderValue() );
参数解释:
  • 参数1:输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
  • 参数2:OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
  • 参数3:int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
————MORPH_OPEN – 开运算(Opening operation)
————MORPH_CLOSE – 闭运算(Closing operation)
————MORPH_GRADIENT -形态学梯度(Morphological gradient)
————MORPH_TOPHAT - “顶帽”(“Top hat”)
————MORPH_BLACKHAT - “黑帽”(“Black hat“)
————MORPH_ERODE - “腐蚀”
————MORPH_DILATE - “膨胀”

————另有CV版本的标识符也可选择,如CV_MOP_CLOSE,CV_MOP_GRADIENT,CV_MOP_TOPHAT,CV_MOP_BLACKHAT等,这应该是OpenCV1.0系列版本遗留下来的标识符,和上面的“MORPH_OPEN”一样的效果。 

  • 参数4:InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement()配合这个参数的使用。getStructuringElement()函数会返回指定形状和尺寸的结构元素(内核矩阵)。关于getStructuringElement()函数,请见文章里有相关讲解:【拜小白opencv】36-形态学滤波1——腐蚀
  • 参数5:Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
  • 参数6:int类型的iterations,迭代使用函数的次数,默认值为1。
  • 参数7:int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
  • 参数8:const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

使用morphologyEx()函数,一般我们只需要填前面的四个参数,后面的四个参数都有默认值。
===================分割线================

3-代码演示

/*
功能:形态学滤波:闭运算。 本质就是先膨胀后腐蚀的过程。
*/

#include <opencv2/core/core.hpp>                
#include <opencv2/highgui/highgui.hpp>                
#include <opencv2/imgproc/imgproc.hpp>               
#include <iostream>              
using namespace std;
using namespace cv;

int main()
{
	Mat srcImage, dstImage; //源图像,输出图像
	//---------【1】读取源图像并检查图像是否读取成功---------      
	srcImage = imread("D:\\OutPutResult\\ImageTest\\xing.jpg");
	if (!srcImage.data)
	{
		cout << "读取图片错误,请重新输入正确路径!\n";
		system("pause");
		return -1;
	}
	imshow("【源图像】", srcImage);
	//---------【2】获取自定义核---------
	Mat element = getStructuringElement(MORPH_RECT, Size(7, 7));
	//---------【3】进行闭运算操作---------
	morphologyEx(srcImage, dstImage, MORPH_CLOSE, element);
	//---------【4】显示效果图---------
	imshow("【效果图--闭运算操作】", dstImage);
	waitKey(0);
	return 0;
}
================分割线===================

4-显示结果



===================分割线=================

5-程序说明

为了观察效果,本例中核的设置为7*7,该参数可以根据自己需要进行调节。
例子中,morphologyEx()函数的第三个参数,同学可以右键进行”查看定义“,看看都有什么,自己换个参数,看看会不会有什么效果。



参考文章:【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑


==================END====================

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

余额充值