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;
	}
	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越大越模糊。

效果如下圖:

二、中值模糊、雙邊模糊

#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】:

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】:

三、腐蝕、膨脹

#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是重複執行次數。

效果如下圖:

4.erode(src, dst, structureElement);

腐蝕,最小值替換錨點重疊下圖像的像素值。src是源圖像。dst是目的圖像structureElement是掩膜。

效果如下圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章