• OpenCV图像处理学习九,双边滤波器 (Bilateral Filter)和中位数滤波器 (Median Filter)


    均值模糊无法克服边缘像素信息丢失缺陷,原因是均值滤波是基于平均权重,赋予图像内的像素与图像边缘像素一样的比值权重,图像处理是会使得边缘部分图像部分像素信息丢失;

    高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同 ;

    高斯双边模糊,即双边滤波器是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变

    一.双边滤波器 (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 : 内核的大小(掩膜图片的大小)

    =========================================================================

    代码实现:

    1. #include"stdafx.h"
    2. #include
    3. #include
    4. using namespace cv;
    5. int main(int argc, char** argv) {
    6. Mat srcImage, dst;
    7. srcImage = imread("F:/photo/qx.jpg");
    8. if (srcImage.empty()) {
    9. printf("photo error");
    10. return -1;
    11. }
    12. namedWindow("input_image", WINDOW_AUTOSIZE);
    13. imshow("input_image", srcImage);
    14. medianBlur(srcImage, dst, 3);
    15. namedWindow("medianBlu", WINDOW_AUTOSIZE);
    16. imshow("medianBlu", dst);
    17. waitKey(0);
    18. return 0;
    19. }

    图像处理效果:

     



     

  • 相关阅读:
    Openssl数据安全传输平台016:在QT中的数据库操作+在项目中的设计与实现
    如何使用积分系统增强用户留存?会员积分体系建设方式介绍
    企业级容器云PaaS解决方案【厚PaaS+轻应用+微服务】---(3)
    java基础-第4章-面向对象(二)
    HBuilder包装iOS APP上App Store的详细过程
    手撕AVL树 (C++ 实现)
    cmka下切换使用不同版本的boost-未解决
    Linux14 NAT网络配置原理 查看网络ip和网关 修改ip地址 指定ip方法 主机名与hosts映射 主机名解析过程
    stable diffusion实践操作-LyCORIS
    k8s驱逐(3)-kubelet节点压力驱逐-源码分析篇
  • 原文地址:https://blog.csdn.net/weixin_44651073/article/details/126318001