模糊图像
模糊处理:九个点的像素加起来除以9,为中心那个红点的像素,这样就实现了模糊处理,又叫均值滤波
另外:还有一种常用的滤波方法:高斯滤波
由高斯的图可知,滤波的权重是不一样的(相比于均值滤波),会保留一些原有的图像特质,而均值滤波收周围的干扰比较大。
相关API:
均值模糊:
blur(原图像,输出图像,窗口xy坐标,中心像素在哪(默认-1,-1就是正中心));
高斯模糊:
- 均值模糊:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv)
{
Mat src, dst;
src = imread("C:/Users/Administrator/Pictures/20160711084909.jpg");
if (!src.data)
{
printf("could not load image...\n");
return -1;
}
char input_title[] = "input image";
char out_title[] = "blur image";
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
namedWindow(out_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
blur(src, dst, Size(3, 3), Point(-1, -1));
imshow(out_title, dst);
waitKey(0);
return 0;
}
效果图:
图1-1 均值模糊
Size()改为15, 1,效果:
图1-2 x轴模糊
进行X方向上的模糊
Size()改为1, 15效果:
图1-3 y轴模糊
进行Y方向上的模糊
Size的参数尽量选奇数
- 高斯模糊:
GaussianBlur(src, gblur, Size(11, 11), 11, 11);
效果图:
图1-4 高斯模糊图(为了对比参数都为Size(11, 11))
特性,极大值极小值突出。
空域核和值域核同时考虑。
ksize:卷积和的大小是多大(奇数)
d:窗口半径
150:值域的约束条件,根据颜色值来计算,颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域
3:坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
引用一篇文章里面更加详细的讲述了各个参数的作用:双边滤波参数介绍
- 中值滤波
原来的代码(错误):
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv)
{
Mat src, dst;
src = imread("C:/Users/Administrator/Pictures/20160711084909.jpg");
if (!src.data)
{
printf("could not load image...\n");
return -1;
}
char input_title[] = "input image";
char out_title[] = "blur image";
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
//namedWindow(out_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
medianBlur(src, dst, 3);
imshow(input_title, dst);
waitKey(0);
return 0;
}
无法出来新的图片,参考别的博主的文章后发现:原来是最后输出的窗口名字是out_title,我写成了imshow(input_title, dst);
更正后的:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv)
{
Mat src, dst;
src = imread("C:/Users/Administrator/Pictures/20160711084909.jpg");
if (!src.data)
{
printf("could not load image...\n");
return -1;
}
char input_title[] = "input image";
char out_title[] = "blur image";
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
//namedWindow(out_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
medianBlur(src, dst, 3);
imshow(out_title, dst);
waitKey(0);
return 0;
}
效果图:
图1-5 中值模糊
- 双边滤波
bilateralFilter(src, blur2, 15, 150, 3);
效果图:
图1-6 对比中指滤波(左)的双边滤波图
对比高斯模糊:
图1-7 对比高斯模糊(左)的双边滤波图
配合掩模操作:
Mat result;
Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(blur2, result, -1, kernel, Point(-1, -1), 0);
图1-8 掩模后最后效果