模糊原理
Smooth/Blur给图像预处理时减低噪声,操作背后是数学的卷积计算
相关API
均值滤波:
blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1, -1));
Size(x, y) 滤波模板kernel的尺寸
point(-1, -1)锚点,也就是处理的像素位于kernel的什么位置,(-1,-1)表示锚点在kernel的中心,没有要不需要更改。
高斯滤波:
GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);
Size(width, height) width,height大小可以不同,但必须为正数或者奇数
sigmax表示高斯核函数在x方向上的标准偏差,sigmay表示高斯核函数在y方向上的标准偏差
sigmay = 0时,值自动由sigmax确定(sigmay = sigmax);
sigmay = sigmax = 0时,它们的值由Size(width, height)自动确定。
中值滤波
对椒盐噪声有很好的抑制作用
medianBlur(Mat src, Mat dst, ksize);
中值模糊的ksize大小必须大于1并且为奇数。
高斯双边滤波
均值模糊无法克服边缘像素丢失问题,因为均值滤波是基于平均权重。
高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值得不同。
高斯双边模糊是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变。
bilateralFilter(src, dst, int d, double sigmaColor, double sigmaSpace);
int d:每个像素邻域的直径范围,越大越平滑越模糊,如果为非正数则根据sigmaspace计算该值
double sigmaColor:参数越大,该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域,平滑效果更好
double sigmaSpace:如果d>0,d指定了邻域大小且与sigmaSpace无关,否则根据它来计算d值
sigma越大边缘越模糊,越小边缘越清晰,sigma<10,滤波器不会有多少作用,sigma>150时效果会非常明显。
代码展示一
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("F:/Opencvlearn/picture/3.jpg");
if (src.empty())
{
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
Mat dst;
blur(src, dst, Size(7, 7), Point(-1, -1));//均值滤波
imshow("blurimage", dst);
Mat gblur;
GaussianBlur(src, gblur, Size(5, 5), 7, 7);//高斯滤波
imshow("gaussianblur", gblur);
waitKey(0);
return 0;
}
代码展示二
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("F:/Opencvlearn/picture/zh.png");
if (src.empty())
{
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
Mat dst;
medianBlur(src, dst, 5); //中值滤波
namedWindow("medianBlur", WINDOW_AUTOSIZE);
imshow("medianBlur", dst);
bilateralFilter(src, dst, 20, 17, 17); //双边滤波
namedWindow("bilateralFilter", WINDOW_AUTOSIZE);
imshow("bilateralFilter", 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); //调整对比度
namedWindow("finalimg", WINDOW_AUTOSIZE);
imshow("finalimg", resultimg);
waitKey(0);
return 0;
}