均值模糊无法克服边缘像素信息丢失缺陷,原因是均值滤波是基于平均权重,赋予图像内的像素与图像边缘像素一样的比值权重,图像处理是会使得边缘部分图像部分像素信息丢失;
高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同 ;
高斯双边模糊,即双边滤波器是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变
一.双边滤波器 (Bilateral Filter)
当图像在变化程度平缓的区域时,邻域中的像素值(RGB值)差距相差不大。因此此时的双边就是普通的高斯滤波,达到对图像平滑的效果。
当图像在变化程度剧烈的区域,比如在边缘区域时,邻域中的像素值(RGB值)差距相差很大。此时高斯函数计算出的值wr朝0值趋近,颜色差值越大,wr越逼近0,最终整个式子的值逼近于0。最终的结果是权值为0。因此在最终计算时,该处将不影响输出值。
Bilateral加入了相似程度分部以后可以将源图像左侧那些跟当前像素差值过大的点给滤去,这样就很好地保持了边缘。
平滑处理输入图像不仅可以消除噪音,还平滑了图像边缘。为了避免这种情况,我们可以使用双边滤波器。一般的高斯模糊在进行采样时主要考虑了像素间的空间距离关系,但是却并没有考虑像素值之间的相似程度,因此这样我们得到的模糊结果通常是整张图片一团模糊。Bilateral blur的改进就在于在采样时不仅考虑像素在空间距离上的关系,同时加入了像素间的相似程度考虑,因而可以保持原始图像的大体分块进而保持边缘。
以与高斯滤波器类似的方式,双边滤波器还考虑具有分配给它们中的每一个的权重的相邻像素。这些权重有两个分量,第一个是高斯滤波器使用的相同权重。第二个组件考虑了相邻像素和评估像素之间的强度差异。
Bilateral加入了相似程度分部以后可以将源图像左侧那些跟当前像素差值过大的点给滤去,这样就很好地保持了边缘。
API 函数接口:
bilateralFilter(Mat src,Mat dst,int d,double sigmaColor,double sigmaSpace, int borderType)
src : 源8位或浮点,1通道或3通道图像。
dst : 与src具有相同大小和类型的目标映像。
d : 过滤期间使用的每个像素邻域的直径。如果它是非正数,则从sigmaSpace计算。
sigmaColor : 过滤颜色空间中的西格玛。参数的值越大意味着像素邻域内的更远的颜色(参见sigmaSpace)将混合在一起,从而产生更大的半等颜色区域。
sigmaSpace : 在坐标空间中过滤西格玛。较大的参数值意味着只要它们的颜色足够接近,更远的像素就会相互影响(参见sigmaColor)。当d> 0时,无论 sigmaSpace如何,它都指定邻域大小。否则,d与sigmaSpace成比例。
borderType : 用于外推图像外部像素的边框模式
=========================================================================
代码实现:
图像处理效果:
二.中位数滤波器 (Median Filter)
中值滤波器遍历图像的每个像素元素,并用其相邻像素的中值(位于评估像素周围的方形邻域中的中心像素)替换每个像素的值。
API函数接口 :
medianBlur(Mat src,Mat dst,int i)
src : 源图像椒盐噪声有很好的抑制作用
dst : 目标图像,必须与src的类型相同
i : 内核的大小(掩膜图片的大小)
=========================================================================
代码实现:
#include"stdafx.h"
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage, dst;
srcImage = imread("F:/photo/qx.jpg");
if (srcImage.empty()) {
printf("photo error");
return -1;
}
namedWindow("input_image", WINDOW_AUTOSIZE);
imshow("input_image", srcImage);
medianBlur(srcImage, dst, 3);
namedWindow("medianBlu", WINDOW_AUTOSIZE);
imshow("medianBlu", dst);
waitKey(0);
return 0;
}
图像处理效果: