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是掩膜。
效果如下图: