模糊原理
Smooth/Blur 是图像处理中最简单和常用的操作之一
使用该操作的原因之一就为了给图像预处理时候减低噪声
使用Smooth/Blur操作其背后是数学的卷积计算
通常这些卷积算子计算都是线性操作,所以又叫线性滤波
归一化盒子滤波(均值滤波)
高斯滤波
均值模糊 - blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1));
#include <iostream>
#include <cstring>
#include <opencv2/highgui/highgui.hpp>
#include<cmath>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("D:/opencv/2/a.jpg");
if (src.empty())
{
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
//moveWindow("input", 100, 100);
imshow("input", src);
//均值模糊
Mat jzdst;//通过周围的像素点的平均值来取代中心像素点的像素值。 只能相对减少噪声,且对噪声特别敏感
blur(src, jzdst, Size(3, 3), Point(-1, -1));
namedWindow("均值模糊", WINDOW_AUTOSIZE);
//moveWindow("均值模糊", 100, 100);
imshow("均值模糊", jzdst);
waitKey(0);
return 0;
}
高斯模糊 - GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay); 其中Size(x, y), x, y 必须是正数而且是奇数
//高斯模糊
Mat gsdst;//对周围像素点有特殊的算子,可以更加平滑的取代中心像素点的值。 保持图像平滑的同时,更能保存图像的灰度特征
GaussianBlur(src, gsdst, Size(3, 3), 3, 3);
// Mat kernel=(Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
// filter2D(gsdst,gsdst,gsdst.depth(),kernel);
char gs[] = "高斯模糊";
namedWindow(gs, WINDOW_AUTOSIZE);
imshow(gs, gsdst);
中值模糊medianBlur(Mat src, Mat dest, ksize)
统计排序滤波器 中值对椒盐噪声有很好的抑制作用
Mat zzdst;//取周围像素点的中值,取带中心像素点。 对噪声不敏感,但会导致图像没有连续性。 对椒盐噪声有很好的处理效果
medianBlur(src, zzdst, 11); //椒盐噪声就像 一幅图像上面撒了一些盐巴,一粒一粒不恰当的像素点
namedWindow("中值滤波", WINDOW_AUTOSIZE);
imshow("中值滤波", zzdst);
双边滤波bilateralFilter(src, dest, d=15, 150, 3);
- 15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值
- 150 – sigma color 决定多少差值之内的像素会被计算
- 3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值 中值模糊的ksize大小必须是大于1而且必须是奇数。
均值模糊无法克服边缘像素信息丢失缺陷。
原因是均值滤波是基于平均权重 高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同
高斯双边模糊 – 是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变
//双边滤波
Mat sbdst;
bilateralFilter(src, sbdst, 30, 50, 3);
namedWindow("双边滤波", WINDOW_AUTOSIZE);