opencv学习笔记九:形态学操作

腐蚀:拿一个结构元素去滑动窗口,将窗口覆盖下图像的最小值当作结构元素中心点的像素值;

膨胀:拿一个结构元素去滑动窗口,将窗口覆盖下图像的最大值当作结构元素中心点的像素值;

提取内边缘:原图-腐蚀后的图;

提取外边缘:膨胀后的图-原图;

开操作:先腐蚀后膨胀;

闭操作:先膨胀后腐蚀;

顶帽变换:原图 - 开操作后的图;

黑帽变换:闭操作后的图-原图。

主函数:

#include<opencv2/opencv.hpp>
using namespace cv;
void CallBack(int, void*);
int element_size = 3;
Mat src, dst;
int main(int arc, char** argv)
{   	
	src = imread("1.jpg");
	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src);

	namedWindow("output", CV_WINDOW_AUTOSIZE);
	createTrackbar("Element Size", "output",&element_size,21,CallBack);//创建轨迹条
	CallBack(0, 0);	//调用回调函数
	waitKey(0);
	return 0;
}

定义结构元素:getStructuringElement(shape, Size ksize, Point(-1, -1));

参数解释:结构元素形状,结构元素尺寸,锚点。

创建轨迹条:

1、创建轨迹条:createTrackbar("Element Size", "output",&element_size,21,CallBack);

参数解释:轨迹条名称,窗口名称,起始值,终止值,回调函数。

2、调用回调函数 :CallBack(0, 0);  

3、定义回调函数:CallBack(int, void*){}

【1】腐蚀:erode(src, dst, structure, Point(-1, -1));

参数解释:原图像,目标图像,结构元素,锚点

腐蚀回调函数:

void CallBack(int, void*) {
	int s = 2 * element_size + 1;
	Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	erode(src, dst, structure, Point(-1, -1));//腐蚀
	imshow("output", dst);
}

运行结果如下:

【2】膨胀:dilate(src, dst, structure, Point(-1, -1));

参数解释:原图像,目标图像,结构元素,锚点

膨胀回调函数:

void CallBack(int, void*) {
	int s = 2 * element_size + 1;
	Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	dilate(src, dst, structure, Point(-1, -1));//膨胀	
	imshow("output", dst);
}

 运行结果如下:

【3】形态学操作: morphologyEx(src, dst, int op, structure);

参数解释:原图形,目标图像,操作类型,结构元素;

操作类型有: MORPH_ERODE    = 0(腐蚀)

                         MORPH_DILATE   = 1(膨胀)

                         MORPH_OPEN     = 2(开运算)

                         MORPH_CLOSE    = 3(闭运算)

                         MORPH_GRADIENT = 4(梯度)

                         MORPH_TOPHAT   = 5(顶帽)

                         MORPH_BLACKHAT = 6(黑帽)

                         MORPH_HITMISS  = 7(击中击不中)

开运算回调函数:

void CallBack(int, void*) {
	int s = 2 * element_size + 1;
	Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));	
	morphologyEx(src, dst, MORPH_OPEN, structure);
	imshow("output", dst);
}

运行结果如下:

闭运算回调函数:

void CallBack(int, void*) {
	int s = 2 * element_size + 1;
	Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	morphologyEx(src, dst, MORPH_CLOSE, structure);
	imshow("output", dst);
}

  运行结果如下:

 顶帽变换回调函数:

void CallBack(int, void*) {
	int s = 2 * element_size + 1;
	Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	morphologyEx(src, dst, MORPH_TOPHAT, structure);
	imshow("output", dst);
}

运行结果图如下:

黑帽变换回调函数:

void CallBack(int, void*) {
	int s = 2 * element_size + 1;
	Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	morphologyEx(src, dst, MORPH_BLACKHAT, structure);
	imshow("output", dst);
}

 运行结果如下:

定义水平结构元素提取水平直线 :

#include<opencv2/opencv.hpp>
using namespace cv;
void CallBack(int, void*);
int element_size = 3;
Mat src, dst,gray, bin_gray;
int main(int arc, char** argv)
{   	
	src = imread("5.jpg");
	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src);

	cvtColor(src, gray,CV_BGR2GRAY);
	imshow("gray", gray);

	adaptiveThreshold(~gray, bin_gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15,0);
	imshow("bin_gray", bin_gray);

	Mat structure = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
	namedWindow("output", CV_WINDOW_AUTOSIZE);
	createTrackbar("Element Size", "output",&element_size,21,CallBack);//创建轨迹条
	CallBack(0, 0);	//调用回调函数
	waitKey(0);
	return 0;
}
void CallBack(int, void*) {
	int s = 2 * element_size + 1;
	Mat structure = getStructuringElement(MORPH_RECT, Size(s,1), Point(-1, -1));
	//erode(src, dst, structure, Point(-1, -1));//腐蚀
	//dilate(src, dst, structure, Point(-1, -1));//膨胀	
	morphologyEx(bin_gray, dst, MORPH_OPEN, structure);//形态学操作
	imshow("output", dst);
}

运行结果如下:

定义垂直结构提取竖直直线 :将上面结构元素改为Mat structure = getStructuringElement(MORPH_RECT, Size(1,s), Point(-1, -1))即可;

运行结果如下:

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82386346