模糊处理所用的原理:数学上的卷积计算,所谓的卷积算子或称为掩模(窗口),简单理解为一组m*n矩阵,m,n为奇数的好,这样可以保证中心点存在,针对图像的像素矩阵,自上向下,自左向右的移动掩模矩阵(或卷积算子)的中心点,从而遍历像素矩阵(注意,3*3的掩模矩阵,边缘的1列像素点无法处理,5*5的掩模矩阵,边缘的2个像素点无法处理,这些无法处理的像素点可以采取其他算法处理)。
常用的几种方式(各具特色,各有优缺点):
1.均值滤波:blur函数
解释:归一化盒子滤波(均值滤波),掩模矩阵的各系数(权重)值同等(缺点是无法处理极值像素信息,因为它权重平均)。
2.高斯滤波:GaussianBlur函数:
解释:掩模矩阵的各系数(权重)值是不一样的(窗口中其他位置权重偏小,越靠近中心元素权重越大,中心元素权重最大,各位置权重值相加结果为1),因此更利于保存像素原有的特征。
3.中值滤波:medianBlur函数
解释:基于统计学,窗口内的图像各像素值进行排序,取中值替代中心像素的颜色值,同理也存在最大值(最小值)滤波;
4.双边滤波:
解释:窗口内各位置对应的像素值与中心位置像素值进行差值比较,差值大的去除,此方式可以弥补高斯滤波的部分缺点,更好的保留边缘信息
代码示例:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat matSrc = imread("D:/Learn/OpenCV/Info/PIC/dt.jpg");
Mat matRet;
imshow("ImageSrc", matSrc);
Size size = Size(3, 3);//掩模矩阵,第一个参数为x轴方向,第二个参数为y轴方向
Size sizeX = Size(20, 1);//x轴方向的模糊处理之后,类似于动态效果
Point anchor = Point(-1, -1);//矩阵中心
//均值模糊
blur(matSrc, matRet, size, anchor);
Mat matXImg;
blur(matSrc, matXImg, sizeX, anchor);
imshow("Blur", matRet);
imshow("BlurX", matXImg);
//高斯模糊
Mat matGausBlur;
int sigmaX = 20;
int sigmaY = 20;
GaussianBlur(matSrc, matGausBlur, size, sigmaX, sigmaY);
imshow("GaussianBlur", matGausBlur);
//中值模糊
Mat medianMat;
medianBlur(matSrc, medianMat, 3);//窗口为3*3
imshow("MedianBlur", medianMat);
//双边滤波
Mat bilateralMat;
int d = 3;//中心点辐射的半径范围
int sigmaColor = 150;//颜色差值范围
int sigmaSpace = 3;//如果d参数值为正数,则此参数无效
bilateralFilter(matSrc, bilateralMat, d, sigmaColor, sigmaSpace);
imshow("bilateral", bilateralMat);
waitKey(0);
return 0;
}