常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。
本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触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_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()函数得到更详细的解释。
===================分割线================
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====================