一、联合双边滤波背景
联合双边滤波(Joint Bilateral Filter, JBF)是一种图像处理技术,它在传统的双边滤波(Bilateral Filter, BF)基础上进行了改进,通过引入一个引导图(guidance image)来优化滤波过程。
双边滤波因其在平滑图像的同时能够保持边缘信息而受到广泛关注。然而,双边滤波在某些情况下会出现不稳定性,尤其是在边缘附近。为了解决这一问题,联合双边滤波被提出,它通过引入一个引导图来改进滤波过程。
二、 原理
联合双边滤波的基本原理与双边滤波相似,都是基于高斯函数来计算像素的权重。不同之处在于,联合双边滤波在计算权重时,不仅考虑了空间距离和像素值差异,还引入了引导图的信息。具体来说,联合双边滤波的公式如下:
Y ( i ) = 1 W i ∑ j ∈ S G σ d ( i , j ) G σ r ( i ^ , j ^ ) X j Y(i) = \frac{1}{W_{i}}\sum_{j\in{S}}G_{\sigma d}(i,j)G_{\sigma r}(\hat i,\hat j)X_{j} Y(i)=Wi1j∈S∑Gσd(i,j)Gσr(i^,j^)Xj
其中, X X X 是待处理的图像, X ^ \hat X X^是引导图,i,j 分别是图像中的像素位置, W i W_i Wi 是归一化系数。
其中, σ d \sigma d σd和 σ r \sigma r σr是高斯参数, G σ d G_{\sigma d} Gσd和 G σ r G_{\sigma r} Gσr分别表示空间函数和灰度相似度函数,表示为
G σ d = e − 1 2 ( d ( i , j ) σ d ) 2 G_{\sigma d}=e^{-\frac{1}{2}(\frac{d(i,j)}{\sigma d})^2} Gσd=e−21(σdd(i,j))2
G σ r = e − 1 2 ( X i − X j σ r ) 2 G_{\sigma r}=e^{-\frac{1}{2}(\frac{X_i-X_j}{\sigma r})^2} Gσr=e−21(σrXi−Xj)2
其中, d ( i , j ) d(i,j) d(i,j)是i,j像素之间的欧氏距离
与双边的区别在于,联合滤波算法的引导图是低频图像,论文中是用高斯滤波,也可以用引导滤波等算法结果,看你的选择。
3. 实现
在OpenCV的contrib模块中,提供了联合双边滤波的API:jointBilateralFilter
。该函数的参数包括引导图、待滤波的图像、滤波后的图像、像素邻域直径、灰度域sigma和空间域sigma。以下是Python语言的实现示例:
import cv2 as cv
src = cv.imread("image.jpg", cv.IMREAD_GRAYSCALE) # 待滤波的图像
joint = cv.imread("joint_image.jpg", cv.IMREAD_GRAYSCALE) # 引导图
dst = cv.ximgproc.jointBilateralFilter(joint, src, 9, 75, 75) # 联合双边滤波
cv.imshow("Filtered Image", dst)
cv.waitKey(0)
cv.destroyAllWindows()
4. 应用效果
联合双边滤波在图像去噪的同时,能够更好地保留图像的边缘和纹理信息。相比于传统的双边滤波,联合双边滤波在处理含有复杂纹理的图像时,能够获得更清晰的边缘和更平滑的背景。下图依次是添加标准差为0.001的高斯滤波图、双边滤波处理图、联合滤波处理图
5. 结论
联合双边滤波作为一种有效的图像去噪技术,通过引入引导图信息,提高了滤波的稳定性和效果。它在图像处理领域具有广泛的应用前景,尤其是在需要保持图像边缘信息的场景中。
测试程序链接如下:
https://github.com/AomanHao/Matlab-Image-Denoise/tree/master/Bilateral%20Filtering%20advanced
参考文献
《基于区间梯度的联合双边滤波图像纹理去除方法》