栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

腐蚀与膨胀

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

腐蚀与膨胀

简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。

最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:

1、消除噪声

2、分割(isolate)独立的图像元素,以及连接(join)相邻的元素。

3、寻找图像中的明显的极大值区域或极小值区域。

注意:腐蚀和膨胀是对白色区域(高亮部分)而言,不是黑色部分;膨胀是图像中高亮部分进行膨胀,效果图拥有比原图更大的高亮区域;腐蚀是图像中高亮部分进行腐蚀,效果图拥有比原图更小的高亮区域。

膨胀

求局部最大值,并把最大值赋给参考点指定的像素,这样会使得图像中高亮区域逐渐增长。

进行 腐蚀 操作的函数是 dilate 。 它接受了三个参数:

src: 原图像

 dilate _dst: 输出图像

element: 腐蚀操作的内核。 如果不指定,默认为一个简单的  矩阵。否则,我们就要明确指定它的形状,可以使用函数 getStructuringElement:

我们可以为我们的内核选择三种形状之一:

  • 矩形: MORPH_RECT
  • 交叉形: MORPH_CROSS
  • 椭圆形: MORPH_ELLIPSE

然后,我们还需要指定内核大小,以及 锚点 位置。不指定锚点位置,则默认锚点在内核中心位置。

腐蚀

求局部最小值,并把最小值赋给参考点指定的像素,这样会使得图像中高亮区域逐渐减少。

进行 腐蚀 操作的函数是 erode 。 它接受了三个参数:

src: 原图像

erosion_dst: 输出图像

element: 腐蚀操作的内核。 如果不指定,默认为一个简单的  矩阵。否则,我们就要明确指定它的形状,可以使用函数 getStructuringElement:

我们可以为我们的内核选择三种形状之一:

  • 矩形: MORPH_RECT
  • 交叉形: MORPH_CROSS
  • 椭圆形: MORPH_ELLIPSE

然后,我们还需要指定内核大小,以及 锚点 位置。不指定锚点位置,则默认锚点在内核中心位置。

程序
#include
#include
#include
#include
#include
#include 
using namespace cv;
using namespace std;
//--------------------------------------【main( )函数】-----------------------------------------
//          描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-------------------------------------------------------------------------------------------------

Mat src = imread("D:\VC\c++\opencv源码\opencv源码\12.bmp");
Mat dst1 ,dst2;
int p = 3;//膨胀参数值
int f = 4;//腐蚀参数值

//膨胀回调函数
void on_p(int, void*)
{
	Mat element = getStructuringElement(MORPH_ELLIPSE, Size(p * 2 + 1, p * 2 + 1));
	dilate(src, dst1, element);
	imshow("膨胀图", dst1);
}

//腐蚀回调函数
void on_f(int, void*)
{
	Mat element1 = getStructuringElement(MORPH_ELLIPSE, Size(f * 2 + 1, f * 2 + 1));
	erode(src, dst2,element1);
	imshow("腐蚀图", dst2);
}
int main()
{
	double time0 = static_cast(getTickCount());//记录起始时间

    namedWindow("原图", WINDOW_FREERATIO);
	namedWindow("膨胀图");
	namedWindow("腐蚀图");
	imshow("原图", src);

	//膨胀
	createTrackbar("内核值", "膨胀图", &p, 20, on_p);
	on_p(p, 0);
	
	//腐蚀
	createTrackbar("内核值", "腐蚀图", &f, 20, on_f);
	on_f(f, 0);

	time0 = ((double)getTickCount() - time0) / getTickFrequency();
	cout << "此方法运行时间:" << time0 << "秒" << endl;//输出运行时间
	
	waitKey(0);
	return 0;
}

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630517.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号