腐蚀与膨胀

腐蚀与膨胀,第1张

腐蚀膨胀

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

最基本的形态学 *** 作有二:腐蚀与膨胀(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;
}

 

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5636395.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存