Smooth/Blur是图像处理中最简单和常用的操作之一
使用该操作的原因之一就是为了给图像预处理的时候减低噪声
使用Smooth/Blur操作其背后是数学的卷积计算
通常这些卷积算子计都是线性操作,所以又叫线性滤波
窗口内所有数据相加,然后取平均值替换中心点的像素值
高斯模糊的原理是利用高斯函数,距离窗口正中心越近的像素,其权重就越大,中心点的像素的权重最大。
中值滤波对椒盐噪声有很好的抑制作用,椒盐噪声就是在图像上有很明显的噪点
将窗口内的像素值进行排序,取中值替换掉中心点的像素值
这里可以衍生到最大值滤波和最小值滤波
均值滤波无法克服边缘像素信息缺失缺陷。原因是均值滤波是基于平均权重
高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同
高斯双边模糊是边缘保留的滤波方法,避免了边缘信息的丢失,保留了图像轮廓不变
均值模糊
-blur(Mat src,Mat dst,Size(xradius,yradius),Point(-1,-1));
//参数说明 1源图像 2目标图像 3均值窗口的大小 4中心点,(-1,-1)默认就是最中心的点
高斯模糊
-GaussianBlur(Mat src,Mat dst,Size(11,11),sigmax,sigmay);
其中Size(x,y), x,y必须是整数且必须是奇数
中值模糊
medianBlur(Mat src,Mat dest,ksize) //ksize是窗口的大小
双边模糊(先双边模糊再提高图像对比度,对人像来说会有意想不到的效果)
bilateralFilter(src,dest,d=15,150,3)
-15计算的半径,半径之内的像素会被纳入计算,如果提供-1则根据sigma space参数取值
-150 sigma color决定多少差值之内的像素会被计算
-3 sigma space 如果d的值大于0则声明无效,否则根据它来计算d的值
代码演示:
#include
#include
#include
using namespace cv;
using namespace std;
int main(int argc, int argv) {
Mat src,dst_blur,dst_gaussian,dst_median,dst_bilateral;
src = imread("D:/image/img1.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
blur(src, dst_blur, Size(3, 3), Point(-1, -1)); //均值滤波
GaussianBlur(src, dst_gaussian, Size(3, 3), 11, 11); //高斯滤波
medianBlur(src, dst_median, 3); //中值滤波
bilateralFilter(src,dst_bilateral,15,150,3);//双边滤波
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
namedWindow("dst_blur", WINDOW_AUTOSIZE);
imshow("dst_blur", dst_blur);
namedWindow("dst_gaussian", WINDOW_AUTOSIZE);
imshow("dst_gaussian", dst_gaussian);
namedWindow("dst_median", WINDOW_AUTOSIZE);
imshow("dst_median", dst_median);
namedWindow("dst_bilateral", WINDOW_AUTOSIZE);
imshow("dst_bilateral", dst_bilateral);
waitKey(0);
return 0;
}