一、均值模糊、高斯模糊
狠人話不多,上代碼:
#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是掩膜。
效果如下圖: