opencvC++学习10膨胀与腐蚀

图像形态学操作 – 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
形态学有四个基本操作:腐蚀、膨胀、开、闭

膨胀与腐蚀是图像处理中最常用的形态学操作手段

形态学操作-膨胀:

跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状

形态学操作-腐蚀

腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值

API:

getStructuringElement(int shape, Size ksize, Point anchor)
 - 形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
 - 大小

 - 锚点 默认是Point(-1, -1)意思就是中心像素

dilate(src, dst, kernel) ;

膨胀

erode(src, dst, kernel)

腐蚀

代码:

#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;


Mat src;
Mat dst;
int value = 3;
void callback_Dema1(int, void *);
void callback_Dema2(int, void *);

int main()
{
	src = imread("D:/opencvSRC/test.jpg");
	if (!src.data) {

		printf("load image error!\n");
	}
	imshow("src", src);

	namedWindow("StructuringElement1", CV_WINDOW_AUTOSIZE);
	createTrackbar("StructuringElement1", "StructuringElement1", &value, 10, callback_Dema1);
	namedWindow("StructuringElement2", CV_WINDOW_AUTOSIZE);
	createTrackbar("StructuringElement2", "StructuringElement2", &value, 10, callback_Dema2);
	callback_Dema1(0,0);
	callback_Dema2(0, 0);


	waitKey(0);
	return 0;
}
void callback_Dema1(int , void *)
{
	int s = value * 2 + 1;
	Mat StructuringElement = getStructuringElement(MORPH_RECT, Size(s, s),Point(-1, -1));
	dilate(src, dst, StructuringElement, Point(-1, -1), 1);
	imshow("StructuringElement1", dst);

}

void callback_Dema2(int, void *)
{
	int s = value * 2 + 1;
	Mat StructuringElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	erode(src, dst, StructuringElement, Point(-1, -1), 1);
	imshow("StructuringElement2", dst);

}

效果:

猜你喜欢

转载自blog.csdn.net/xiansong1005/article/details/80690946