图像处理:双边滤波算法

这篇具有很好参考价值的文章主要介绍了图像处理:双边滤波算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天主要是回顾一下双边滤波,我曾经在这篇——图像处理:推导五种滤波算法中推导过它,其中包含了我自己写的草稿图。

目录

双边滤波算法原理

(1)空间域核

 (2)值域核

理解双边滤波

空域权重​编辑和值域权重​编辑的意义

Opencv实现双边滤波

双边滤波代码实现

参考资料


双边滤波算法原理

双边滤波Bilateral filter是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。双边滤波器的好处是可以做边缘保存Edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。

双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘Edge Preserve),是由于其滤波器的核由两个函数生成:空间域核和值域核

(1)空间域核

由像素位置欧式距离决定的模板权值 。

 为模板窗口的其他系数的坐标;

为模板窗口的中心坐标点;

是空间域上的高斯核函数的标准差,用于控制像素位置的权值。

使用公式生成的滤波器模板和高斯滤波器使用的模板是没有区别的。权值称为定义域核,也称为空间系数、空间域。显示由的计算公式可知,它是计算临近点q到中心点p临近程度,因此定义域核是用于衡量空间临近的程度。

 (2)值域核

由像素值的差值决定的模板权值 。

 

其中,为模板窗口的其他系数的坐标, 表示图像在点处的像素值;

为模板窗口的中心坐标点,对应的像素值为;

是像素值域上的高斯核函数的标准差,用于控制像素值的权值。

一般会将权值称为值域核,或像素值域,但不管是值域核还是空间域核,其大小都在[0 1]之间。


最后,将上述两个模板相乘就得到了双边滤波器的模板权值:

因此,双边滤波器的数据公式可以表示如下:

 

理解双边滤波

双边滤波(Bilateral filter)其综合了高斯滤波器和α-截尾均值滤波器的特点,同时考虑了空间域与值域的差别,而高斯滤波器和α均值滤波分别只考虑了空间域和值域差别。高斯滤波器只考虑像素间的欧式距离,其使用的模板系数随着和窗口中心的距离增大而减小;α-截尾均值滤波器则只考虑了像素灰度值之间的差值,去掉α%的最小值和最大值后再计算均值。

空域权重和值域权重的意义

空域权重衡量的是两点之间的距离,距离越远权重越低;

值域权重衡量的是两点之间的像素值相似程度,越相似权重越大。

这里从图像的平坦区域边缘区域定性分析双边滤波的降噪效果:

  • 在平坦区域,临近像素的像素值的差值较小,对应值域权重接近于1,此时空域权重起主要作用,相当于直接对此区域进行高斯模糊。因此,平坦区域相当于进行高斯模糊。
  • 在边缘区域,临近像素的像素值的差值较大,对应值域权重接近于0,导致此处核函数下降(因),当前像素受到的影响就越小,从而保持了原始图像的边缘的细节信息。

Opencv实现双边滤波

 查阅资料才发现,原来双边滤波函数已经在Opencv中实现了。

我们来查看一下这个函数:

def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None): # real signature unknown; restored from __doc__
    """
    bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst
    .   @brief Applies the bilateral filter to an image.
    .   
    .   The function applies bilateral filtering to the input image, as described in
    .   http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
    .   bilateralFilter can reduce unwanted noise very well while keeping edges fairly sharp. However, it is
    .   very slow compared to most filters.
    .   
    .   _Sigma values_: For simplicity, you can set the 2 sigma values to be the same. If they are small (\<
    .   10), the filter will not have much effect, whereas if they are large (\> 150), they will have a very
    .   strong effect, making the image look "cartoonish".
    .   
    .   _Filter size_: Large filters (d \> 5) are very slow, so it is recommended to use d=5 for real-time
    .   applications, and perhaps d=9 for offline applications that need heavy noise filtering.
    .   
    .   This filter does not work inplace.
    .   @param src Source 8-bit or floating-point, 1-channel or 3-channel image.
    .   @param dst Destination image of the same size and type as src .
    .   @param d Diameter of each pixel neighborhood that is used during filtering. If it is non-positive,
    .   it is computed from sigmaSpace.
    .   @param sigmaColor Filter sigma in the color space. A larger value of the parameter means that
    .   farther colors within the pixel neighborhood (see sigmaSpace) will be mixed together, resulting
    .   in larger areas of semi-equal color.
    .   @param sigmaSpace Filter sigma in the coordinate space. A larger value of the parameter means that
    .   farther pixels will influence each other as long as their colors are close enough (see sigmaColor
    .   ). When d\>0, it specifies the neighborhood size regardless of sigmaSpace. Otherwise, d is
    .   proportional to sigmaSpace.
    .   @param borderType border mode used to extrapolate pixels outside of the image, see #BorderTypes
    """
    pass

在python当中是看不到源代码的,而且参数释义也是英文的,不过它这里倒是给出了一个网址,好像是介绍双边滤波的,我们一起来看看双边滤波。

双边滤波算法,图像处理,# 计算机视觉,算法,图像处理,python

原来是这是一篇有关于双边滤波论文。

双边滤波算法,图像处理,# 计算机视觉,算法,图像处理,python双边滤波算法,图像处理,# 计算机视觉,算法,图像处理,python    双边滤波算法,图像处理,# 计算机视觉,算法,图像处理,python                               

它这里做了两种实验分别是黑白实验以及颜色实验。

  • 黑白实验中做了三组,分别是猫咪、水果静物、洋葱,经过双边滤波处理后,大部分的精细纹理被消除掉了。
  • 颜色实验做了两组,黑白实验中当使用标准低通滤波器平滑黑白图像, 在边缘上产生中间层次的灰色,从而产生模糊的图像,颜色实验要复杂的多,产生的是两个颜色的融合颜色,例如,在蓝色之间红色有各种深浅不一的粉红色和紫色。而且平滑颜色边缘时可能会产生色带,平滑的图像不仅看起来模糊,而且还表现出物体周围有奇特的彩色光环。第二组是红衣小男孩,图(一)显示出了五次迭代的效果,图(二)单次迭代会比原来的图像更清晰,可能足以满足我们图像处理上的大多数要求,多个迭代具有拼合图像中颜色的效果相当多,但没有模糊的边缘。图(三)卡通形象,所有阴影和边缘都是保留了下来,但大部分阴影都消失了,没有“新”颜色通过过滤引入。

双边滤波算法,图像处理,# 计算机视觉,算法,图像处理,python

接下来,还是来看看双边滤波的一个效果,我们自己来实现一下看看,万一人家作者是吹嘘的呢?

双边滤波代码实现

既然opencv中有这个函数了,那我们也就不用再费时间自己去写了,毕竟你自己写的效果可能还真不如这里面已经集成好的。

def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None):
  • src: 输入的原始图像。
  • d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
  • sigmaColor:颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 (这个参数可以理解为值域核的)
  • sigmaSpace:,如果该值较大,则意味着颜⾊相近的较远的像素将相互影响,从而使更⼤的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小,那么不考虑sigmaSpace值,否则d正比于sigmaSpace。(这个参数可以理解为空间域核的)
  • dst:输出图像。
  • borderType:用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT。

双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。
对于简单的滤波而言,可以将两个sigma值设置成相同的值,如果值<10,则对滤波器影响很小,如果值>150则会对滤波器产生较大的影响,会使图片看起来像卡通,就像是上面论文中那样。

import cv2
import numpy as np


def stackImages(scale,imgArray):
    rows = len(imgArray)
    cols = len(imgArray[0])
    rowsAvailable = isinstance(imgArray[0], list)
    width = imgArray[0][0].shape[1]
    height = imgArray[0][0].shape[0]
    if rowsAvailable:
        for x in range ( 0, rows):
            for y in range(0, cols):
                if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:
                    imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
                else:
                    imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)
                if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)
        imageBlank = np.zeros((height, width, 3), np.uint8)
        hor = [imageBlank]*rows
        hor_con = [imageBlank]*rows
        for x in range(0, rows):
            hor[x] = np.hstack(imgArray[x])
        ver = np.vstack(hor)
    else:
        for x in range(0, rows):
            if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
                imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
            else:
                imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
            if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
        hor= np.hstack(imgArray)
        ver = hor
    return ver

def empty(a):
    pass

path = './Images/rgblena.jpg'
img = cv2.imread(path)

cv2.namedWindow('image')
cv2.createTrackbar('d', 'image', 1, 50, empty)
cv2.createTrackbar('sigmaColor', 'image', 1, 150, empty)
cv2.createTrackbar('sigmaSpace', 'image', 1, 150, empty)
while True:
    d = cv2.getTrackbarPos('d', 'image')
    sigmaColor = cv2.getTrackbarPos('sigmaColor', 'image')
    sigmaSpace = cv2.getTrackbarPos('sigmaSpace', 'image')
    print(d,sigmaColor,sigmaSpace)
    dst = cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)
    stackimg=stackImages(0.5,[img,dst])
    cv2.imshow('image', stackimg)

    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()

网上都是有关于轨迹栏控制C++版本的双边滤波,这里我就用python来实现轨迹栏控制。请一定一定要注意的是,轨迹栏滑动条请慢点调试,双边滤波的计算是比较费时间的,搞不好窗口会被卡住。

双边滤波算法,图像处理,# 计算机视觉,算法,图像处理,python

这里我使用了cv2.namedWindow函数创建了一个名为“image”的窗口,并使用cv2.createTrackbar函数创建了三个滑动条,分别用来调整d、sigmaColor和sigmaSpace参数。

在while循环中,使用cv2.getTrackbarPos函数获取滑动条的当前值,并将其作为双边滤波函数的参数,然后将滤波结果显示在窗口中。

参考资料

双边滤波 (ed.ac.uk)

浅析bilateral filter双边滤波器的理解-面圈网

双边滤波方法原理与代码实践(附完整代码)_双边滤波器公式_小小何先生的博客-CSDN博客

基于卷积神经网络的坝面表观缺陷实时检测方法与应用 - 中国知网 (cnki.net)文章来源地址https://www.toymoban.com/news/detail-785048.html

到了这里,关于图像处理:双边滤波算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图像处理OpenCV(C++版)】——5.5 图像平滑之双边滤波

    前言 : 😊😊😊 欢迎来到本博客 😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。 😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–搜索你要查询的算子

    2024年02月13日
    浏览(32)
  • 图像处理与计算机视觉--第四章-图像滤波与增强-第二部分

    目录 1.图像噪声化处理与卷积平滑 2.图像傅里叶快速变换处理 3.图像腐蚀和膨胀处理 4 图像灰度调整处理 5.图像抖动处理算法    

    2024年02月07日
    浏览(34)
  • 图像处理与计算机视觉--第四章-图像滤波与增强-第一部分

    目录 1.灰度图亮度调整 2.图像模板匹配 3.图像裁剪处理 4.图像旋转处理 5.图像邻域与数据块处理

    2024年02月07日
    浏览(47)
  • opencv-34 图像平滑处理-双边滤波cv2.bilateralFilter()

    双边滤波(BilateralFiltering)是一种图像处理滤波技术,用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同,双边滤波在考虑像素之间的空间距离之外,还考虑了像素之间的灰度值相似性。这使得双边滤波能够有效地去除噪声,同时保持图像的细节和边缘。

    2024年02月14日
    浏览(27)
  • Opencv-C++笔记 (13) : opencv-图像卷积一(均值、中值、高斯、双边滤波)与 边缘处理

    头文件 quick_opencv.h:声明类与公共函数 主函数调用 src:输入图像 。 dst:输出图像 。 ksize:内核大小 ,一般用 Size(w,h),w 为宽度,h 为深度。 anchor:被平滑的点,表示取 内核中心 ,默认值 Point(-1,-1)。 boderType:推断图像外部像素的某种边界模式。默认值 BORDER_DEFAULT 目的:

    2024年02月16日
    浏览(36)
  • 图像处理与计算机视觉算法

    图像处理与计算机视觉算法是实现对图像和视频内容分析、理解和操作的一系列技术。这些算法可以分为多个类别,包括但不限于以下几个主要方面: 预处理 : 像素操作:灰度化、二值化、直方图均衡化等,用于改善图像的对比度和亮度分布。 去噪:高斯滤波、中值滤波、

    2024年02月22日
    浏览(40)
  • 计算机图像处理—HOG 特征提取算法

    1. 实验内容 本实验将学习HOG 特征提取算法。 2. 实验要点 HOG 算法 HOG 算法有效的原因 创建 HOG 描述符 HOG 描述符中的元素数量 可视化 HOG 描述符 理解直方图 3. 实验环境 Python 3.6.6 numpy matplotlib cv2 copy 简介 正如在 ORB 算法中看到的,我们可以使用图像中的关键点进行匹配,以检

    2024年02月09日
    浏览(43)
  • tSNE算法在计算机视觉中的图像处理

    作者:禅与计算机程序设计艺术 引言 1.1. 背景介绍 随着计算机视觉领域的发展,数据可视化和图像处理成为了许多应用的核心部分。图像处理算法作为数据可视化技术的基础,在许多领域都发挥着重要作用。t-SNE算法,全称为t-Distributed Stochastic Neighbor Embedding算法,是近年来

    2024年02月09日
    浏览(32)
  • OpenCV处理图像和计算机视觉任务时常见的算法和功能

    当涉及到OpenCV处理图像和计算机视觉任务时,有许多常见的具体算法和功能。以下是一些更具体的细分: 图像处理算法: 图像去噪 :包括均值去噪、高斯去噪、中值滤波等,用于减少图像中的噪声。 直方图均衡化 :用于增强图像的对比度,特别适用于低对比度图像。 边缘

    2024年02月11日
    浏览(32)
  • 计算机视觉任务图像预处理之去除图像中的背景区域-------使用连通域分析算法(包含完整代码)

    通过连通域分析算法能够找到最大的连通域,即图片的主体部分,然后保存该连通域的最小外接矩阵,即可去除掉无关的背景区域 更多图像预处理操作工具集包含在这个github仓库中

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包