欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenCV C++开发 第二节:图像处理(五、均值模糊、高斯模糊、中值模糊、双边模糊、腐蚀、膨胀)

程序员文章站 2022-07-14 11:35:38
...

一、均值模糊、高斯模糊

狠人话不多,上代码:

#include <opencv2/opencv.hpp> 
#include <iostream> 
using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("C:\\Users\\Administrator\\Desktop\\test.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	char input_title[] = "input image";
	char output_title[] = "blur image";
	namedWindow(input_title, CV_WINDOW_AUTOSIZE);
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);
	imshow(input_title, src);

	blur(src, dst, Size(11, 11), Point(-1, -1));//均值模糊
	imshow(output_title, dst);

	Mat gblur;
	GaussianBlur(src, gblur, Size(11, 11), 11, 11);//高斯模糊
	imshow("gaussian blur", gblur);

	waitKey(0);
	return 0;
}

以上代码中主要的几个知识点解释下:

1.blur(src, dst, Size(11, 11), Point(-1, -1));

Size: 滤波模板kernel的尺寸,一般使用Size(w, h)来指定,如Size(3,3)。正常Size越大越模糊。
Point(-1, -1): 字面意思是锚点,也就是处理的像素位于kernel的什么位置,默认值为(-1, -1)即位于kernel中心点,如果没有特殊需要则不需要更改。需要修改就是0--(size值-1)范围的值,0,0是左上角。

2.GaussianBlur(src, gblur, Size(11, 11), 11, 11);

Size: 滤波模板kernel的尺寸,一般使用Size(w, h)来指定,如Size(3,3)。正常Size越大越模糊。

效果如下图:

OpenCV C++开发 第二节:图像处理(五、均值模糊、高斯模糊、中值模糊、双边模糊、腐蚀、膨胀)

二、中值模糊、双边模糊

#include <opencv2/opencv.hpp> 
#include <iostream> 
using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("C:\\Users\\Administrator\\Desktop\\test.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	medianBlur(src, dst, 3);//中值模糊
	//bilateralFilter(src, dst, 15, 100, 5);//双边模糊
	namedWindow("BiBlur Filter Result", CV_WINDOW_AUTOSIZE);
	imshow("BiBlur Filter Result", dst);

	Mat resultImg;
	Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(dst, resultImg, -1, kernel, Point(-1, -1), 0);
	imshow("Final Result", resultImg);

	waitKey(0);
	return 0;
}

以上代码中主要的几个知识点解释下:

1.medianBlur(src, dst, 3);

中值模糊。3为ksize,大小必须是大于1而且必须是奇数。越大越模糊。

效果如下图,先模糊,后提高对比度亮度【之前课程有https://blog.csdn.net/u012618086/article/details/103709489】:

OpenCV C++开发 第二节:图像处理(五、均值模糊、高斯模糊、中值模糊、双边模糊、腐蚀、膨胀)

2.bilateralFilter(src, dst, 15, 100, 5);

15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值
150 – sigma color 决定多少差值之内的像素会被计算
3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值

效果如下图,先模糊,后提高对比度亮度【之前课程有https://blog.csdn.net/u012618086/article/details/103709489】:

OpenCV C++开发 第二节:图像处理(五、均值模糊、高斯模糊、中值模糊、双边模糊、腐蚀、膨胀)

三、腐蚀、膨胀

#include <opencv2/opencv.hpp> 
#include <iostream> 
using namespace cv;

Mat src, dst;
char OUTPUT_WIN[] = "output image";
int element_size = 3;
int max_size = 21;
void CallBack_Demo(int, void*);
int main(int argc, char** argv) {

	src = imread("C:\\Users\\Administrator\\Desktop\\test.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
	createTrackbar("Element Size :", OUTPUT_WIN, &element_size, max_size, CallBack_Demo);
	CallBack_Demo(0, 0);

	waitKey(0);
	return 0;
}

void CallBack_Demo(int, void*) {
	int s = element_size * 2 + 1;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	dilate(src, dst, structureElement, Point(-1, -1), 1);//膨胀
	//erode(src, dst, structureElement);//腐蚀
	imshow(OUTPUT_WIN, dst);
	return;
}

以上代码中主要的几个知识点解释下:

1.createTrackbar("Element Size :", OUTPUT_WIN, &element_size, max_size, CallBack_Demo);

element_size是可调的数值。max_size是最大的数。CallBack_Demo为回调的数。

2.Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));

这里是掩膜的设置。

MORPH_RECT是方形,MORPH_CROSS是十字形结构,MORPH_ELLIPSE是椭圆形。
第二个Size参数是掩膜的大小,就是腐蚀程度的体现。

3.dilate(src, dst, structureElement, Point(-1, -1), 1);

膨胀,最大像素值用来替换锚点的像素。src是源图像。dst是目的图像structureElement是掩膜。Point是锚点位置,-1,-1代表中间点。1是重复执行次数。

效果如下图:

OpenCV C++开发 第二节:图像处理(五、均值模糊、高斯模糊、中值模糊、双边模糊、腐蚀、膨胀)

4.erode(src, dst, structureElement);

腐蚀,最小值替换锚点重叠下图像的像素值。src是源图像。dst是目的图像structureElement是掩膜。

效果如下图:

OpenCV C++开发 第二节:图像处理(五、均值模糊、高斯模糊、中值模糊、双边模糊、腐蚀、膨胀)

相关标签: OpenCV C++