常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。
本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。
博主机器配置为:VS2013+opencv2.4.13+Win-64bit。
若本文能给读者带来一点点启示与帮助,我就很开心了。
====================分割线====================
形态学操作就是基于形状的一系列图像处理操作。OpenCV为进行图像的形态学变换提供了快捷、方便的函数。最基本的形态学操作有二种,他们是:腐蚀与膨胀(Erosion 与 Dilation)。
膨胀与腐蚀能实现多种多样的功能,主要如下:
在进行腐蚀和膨胀的讲解之前,首先需要注意,腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。
膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。
腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。
也可以这么理解:
腐蚀是指:将卷积核B滑过图像A,找出卷积核区域内最小像素值作为锚点像素值。这一操作可以扩大低像素值区域。
膨胀是指:将卷积核B滑过图像A,找出卷积核区域内最大像素值作为锚点像素值。这一操作可以缩小低像素值区域。
本文主要说下腐蚀内容,膨胀请见下一篇文章。
=================分割线================
腐蚀原理示意图
腐蚀的数学表达式如下:
腐蚀可以消除小物体(白色)。
==============分割线==============
此函数作用:可实现对高亮区域的减少。
下面来看看erode()函数的定义:
void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));
/*
功能:形态学滤波:腐蚀操作
*/
#include
#include
#include
#include
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(5, 5));
//---------【3】进行腐蚀操作---------
erode(srcImage, dstImage, element);
//---------【4】显示效果图---------
imshow("【效果图--腐蚀操作】", dstImage);
waitKey(0);
return 0;
}