Opencv 笔记1 膨胀、腐蚀、morphologyEx、开、闭操作

一,膨胀 腐蚀

首先,膨胀和腐蚀都是形态学的基础操作,而且针对的都是图像中高亮的区域。膨胀是对图中高亮的区域进行的“扩展”,反之,腐蚀是对图像中高亮区域进行的“紧缩”。

算子如下:

膨胀:

Mat element = getStructuringElement(MORPH_RECT, Size(size, size), Point(-1, -1));
// 上面的size 是一个膨胀或者腐蚀效果的很重要的因素
void dilate(
const Mat& src, // 输入的图像
 Mat& dst,  // 输出的结果图像
const Mat& element, // 从声明得到的element
 Point anchor=Point(-1, -1), // Point(-1, -1)表示中心位置
 int iterations=1, 
int borderType=BORDER_CONSTANT, 
const Scalar& borderValue=morphologyDefaultBorderValue())¶

腐蚀:

void erode(const Mat& src,
 Mat& dst,
 const Mat& element, 
Point anchor=Point(-1, -1),
 int iterations=1, 
int borderType=BORDER_CONSTANT,
 const Scalar& borderValue=morphologyDefaultBorderValue())

代码如下:

Mat src, des;
const  char* win_out1 = "腐蚀";
const  char* win_out2 = "膨胀";
char  outline[] = "demo";
int  Element_size = 2;
int  Max_size = 21;
int  Min_size = 0;
void  Callback_erode(int, void*);
void  Callback_dilate(int, void*);
void  Callback_erode(int, void*)
{
	int size = Element_size * 2 + 1;// 奇数
	Mat element = getStructuringElement(MORPH_CROSS, Size(size, size), Point(-1, -1));
	erode(src, des, element, Point(-1, -1), 1);
	imshow(win_out1, des);
	return;

}

void  Callback_dilate(int, void*)
{
	int size = Element_size * 2 + 1; // 奇数
	Mat element = getStructuringElement(MORPH_RECT, Size(size, size), Point(-1, -1));
	dilate(src, des, element,Point(-1,-1),1);
	imshow(win_out2, des);
	return;
}

int main(int args, char* arg)
{
	// point  
	src = imread("C:\\Users\\19473\\Desktop\\opencv_images\\301.png");
	if (!src.data)
	{
		printf("could not  load  image....\n");
	}

	namedWindow(win_out1, CV_WINDOW_AUTOSIZE);
	namedWindow(win_out2, CV_WINDOW_AUTOSIZE);

	imshow("input_demo", src);


	createTrackbar("size:", win_out1, &Element_size, Max_size, Callback_erode);
	Callback_erode(0, 0);

	createTrackbar("size:", win_out2, &Element_size, Max_size, Callback_dilate);
	Callback_dilate(0, 0);


	waitKey(0);
	return -1;
}

图像如下:

Opencv 笔记1 膨胀、腐蚀、morphologyEx、开、闭操作_第1张图片

二,开、闭、顶帽操作

Mat element = getStructuringElement(MORPH_RECT, Size(size, size), Point(-1, -1));

void morphologyEx(
const Mat& src,  
Mat& dst, 
int op, 
		MORPH_OPEN // 开操作,先腐蚀在膨胀,去除图像中的小的亮点
		MORPH_CLOSE  // 闭操作,先膨胀后腐蚀,去除图像中的暗点
		MORPH_GRADIENT // 梯度,原图像膨胀-原图像腐蚀
		MORPH_TOPHAT // 顶帽操作,原图与开运算之后的图像的差,保留小的亮点,去除大的亮点
		MORPH_BLACKHAT // 黑帽操作,原图像的闭操作与原图的差,可以分离比邻近的点暗一些的斑块
 const Mat& element,
 Point anchor=Point(-1, -1), 
 int iterations=1,
 int borderType=BORDER_CONSTANT, 
 const Scalar& borderValue=morphologyDefaultBorderValue()
 )

图像显示:

Opencv 笔记1 膨胀、腐蚀、morphologyEx、开、闭操作_第2张图片

代码展示:

int main(int args, char* arg)
{
	Mat src, des, des2, des3, des4, des5;

	// point  
	src = imread("C:\\Users\\19473\\Desktop\\opencv_images\\301.png");
	if (!src.data)
	{
		printf("could not  load  image....\n");
	}

	imshow("原图", src);


	Mat Element = getStructuringElement(MORPH_RECT, Size(23, 23), Point(-1, -1));

	 morphologyEx(src, des,CV_MOP_OPEN, Element); // 开闭运算的算子
	 imshow("开", des);

	 morphologyEx(src, des2, CV_MOP_CLOSE, Element); // 开闭运算的算子
	 imshow("闭", des2);

	 morphologyEx(src, des3, CV_MOP_GRADIENT, Element); 
	 imshow("梯度", des3);

	 morphologyEx(src, des4, CV_MOP_TOPHAT, Element);
	 imshow("顶帽", des4);

	 morphologyEx(src, des5, CV_MOP_BLACKHAT, Element); 
	 imshow("黑帽", des5);

	waitKey(0);
	return 0;
}

你可能感兴趣的:(opencv,opencv,计算机视觉,人工智能)