09-模糊图像1(OpenCV)
掌握
1、模糊原理;
2、代码;
模糊原理
1、Smooth/Blur(光滑/模糊)是图像处理中最常用的操作之一,用于去噪;
2、使用该操作一般是给图像预处理降低噪声影响;
3、Smooth/Blur背后是数学的卷积运算(图像处理中将数学连续运算转换为离散运算):使用卷积算子(掩膜mask);
4、通常这些卷积算子计算都是线性操作,所以又叫线性滤波;
注:k,l:窗口大小,f(x,y):原始图像,h(i,j):为卷积算子;g(x,y):输出图像;(卷积算子与原始图像相乘后赋值给原始图像中心像素)
5、3 * 3卷积边缘有1个像素无法处理;5 * 5卷积边缘有2个像素无法处理;7 * 7卷积边缘有3个像素无法处理,OpenCV提供了特殊方法对边缘进行处理;
均值滤波
所有像素点取相同权重:
高斯滤波
考虑不同像素点取不同权重
A为归一化系数
相关API
1、均值模糊API
//均值模糊API
//Size(xradius,yradius) 代表卷积算子大小(窗口大小)(3*3...)
//Point(-1,-1) 代表对像素中心点进行卷积
blur(Mat src , Mat dst ,Size(xradius,yradius) ,Point(-1,-1));
2、高斯模糊API
Size() : 窗口大小,卷积算子大小,必须为正数且为奇数;
sigmax : 高斯函数的系数;
sigmay : 高斯函数的系数;
Demo
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src, dst;
src = imread("C:\\Users\\hello\\Desktop\\2.jpg");
if (!src.data)
{
cout << "could not load the image..." << endl;
return -1;
}
const char* input_title = "input image";
const char* output_title = "均值模糊";
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
//卷积应该选择奇数,也可以单独设置X/Y方向的模糊
//filter2D()函数也可以做卷积,只是需要单独定义卷积
//blur(src, dst, Size(3, 3), Point(-1, -1)); //3 * 3 均值模糊--最常见
//blur(src, dst,Size(15,1), Point(-1, -1)); //x方向模糊
blur(src, dst,Size(11,11), Point(-1, -1)); //模糊
imshow(output_title, dst);
Mat gaussmat;
GaussianBlur(src, gaussmat, Size(11,11), 11, 11);//高斯模糊基于全自动的模糊,稍微清楚一点
imshow("高斯模糊", gaussmat);
waitKey(0);
return 0;
}