[PAMI2013] Guided Image Filtering 导向滤波器以及OpenCV-Python代码实现

论文地址:https://www.researchgate.net/profile/Xiaoou_Tang/publication/236228168_Guided_Image_Filtering/links/54e999640cf27a6de1103c64.pdf
He, K. , J. Sun , and X. Tang . “Guided Image Filtering.” IEEE Transactions on Pattern Analysis & Machine Intelligence 2013:1397-1409.

摘要:在本文中,我们提出了一种新型的显式图像滤波器-引导滤波器。该引导滤波器由局部线性模型推导而来,通过考虑引导图像的内容来生成滤波输出,引导图像可以是输入图像本身,也可以是另一幅不同的图像。引导滤波器可以像常用的双边滤波器一样作为保持边缘的平滑算子,但是在边缘附近有更好的行为。它与消光拉普拉斯矩阵也有理论联系,是比平滑算子更通用的概念,可以更好地利用制导图像中的结构。此外,该导引滤波器具有快速的非近似线性时间算法,其计算复杂度与滤波核的大小无关。我们证明了引导滤波器在很多计算机视觉和计算机图形应用中都是有效的,包括降噪,细节平滑/增强、HDR压缩、图像抠图/羽化、去雾和联合上采样。

Guided Image Filtering

  • 引导滤波定义
  • 引导滤波与其他方向相比优势所在
  • 引导滤波的主要特点及应用
  • 引导滤波的算法原理
  • OpenCV-Python代码实现
  • 参考资料

引导滤波定义

即需要引导图的滤波器,引导图可以是单独的图像或者是输入图像,当引导图为输入图像时,引导滤波就成为一个保持边缘的滤波操作,可以用于图像重建的滤波。

引导滤波与其他方向相比优势所在

像高斯滤波等线性滤波算法所用的核函数相对于待处理的图像是独立无关的,也就意味着,对任意图像都是采用相同的操作。但是,有时候我们是希望在滤波过程中可以加入引导图像中的信息的,例如,在上色处理过程中,结果图像的色度通道需要包含跟给定亮度通道一致的连续边缘。

引导滤波的主要特点及应用

1、引导滤波(导向滤波)是一种图像滤波技术,通过一张引导图I,对初始图像p(输入图像)进行滤波处理,使得最后的输出图像大体上与初始图像P相似,但是纹理部分与引导图I相似。其典型应用有两个:保边图像平滑,抠图。

2、 引导滤波(导向滤波)的目的是,保持双边滤波的优势(有效保持边缘,非迭代计算),而克服双边滤波的缺点(设计一种时间复杂度为 O(1) 的快速滤波器,而且在主要边缘附近没有梯度的变形)。

3、 引导滤波(导向滤波)不仅能实现双边滤波的边缘平滑,而且在检测到边缘附近有很好的表现,可应用在图像增强、HDR压缩、图像抠图及图像去雾等场景。

引导滤波的算法原理

在这里插入图片描述
从图中也可以看出,导向滤波的输入为两个,一个是真实的输入p,另一个是引导输入I。输出为q,是p和I共同作用的产物。

噪声和边缘的区别,噪声一般周围的像素梯度变化较大,并且以其为中心,向四周的梯度大体相似。而边缘出现了梯度的阶跃,并且梯度最大的方向在边缘的法线方向,其他方向远离法线方向逐渐变小。一般的滤波无法区分噪声和边缘,于是对其统一处理,因此很多情况下,滤波的同时,边缘也被处理模糊了。

引导滤波算法也属于可以保持边缘的一种滤波算法。导向滤波之所以叫这个名字,大概是因为算法在进行滤波时需要一幅引导图像,引导图像可以是另外单独的图像,也可以是输入图像本身,当引导图为输入图像本身时,引导滤波就成为一个保持边缘的滤波操作。引导滤波可以用于降噪、细节平滑、HDR压缩、抠图、去雾以及联合采样等方面。

相关算法比较:
像高斯滤波等线性滤波算法所用的核函数相对于待处理的图像是独立无关的,也就意味着,对任意图像都是采用相同的操作。但是,有时候我们是希望在滤波过程中可以加入引导图像中的信息的,例如,在上色处理过程中[2],结果图像的色度通道需要包含跟给定亮度通道一致的连续边缘。

方式1:通过引导图像获得约束条件,转化为非齐次方程的求解问题,此方法设计到大型稀疏方程求解,所以会比较耗时。
方式2:直接利用引导图像得到滤波核函数。例如在之前说的双边滤波[3]中,在某像素点的输出为周边像素与该点相似度相关的权重和,只是双边滤波所用的引导图像是它本身;另外,在[4]中,引导图像则是另外一幅图像。
当然这些方法也有缺点:一是可能引入梯度反转伪影,二是计算量的快速优化难度。在[5]中,作者证明了双边滤波可以是一种解决高斯亲和矩阵时的雅克比插值,这就比原始优化方法在速度上要优化不少;针对这些缺点,引导滤波算法做出了改进。

OpenCV-Python代码实现

# -*- coding: utf-8 -*-import cv2
import numpy as npsrc_img_path = 'src_img.jpg'
guided_img_path = 'guided_img.jpg'def my_guidedFilter_oneChannel(srcImg, guidedImg, rad=9, eps=0.01):srcImg = srcImg / 255.0guidedImg = guidedImg / 255.0img_shape = np.shape(srcImg)P_mean = cv2.boxFilter(srcImg, -1, (rad, rad), normalize=True)I_mean = cv2.boxFilter(guidedImg, -1, (rad, rad), normalize=True)I_square_mean = cv2.boxFilter(np.multiply(guidedImg, guidedImg), -1, (rad, rad), normalize=True)I_mul_P_mean = cv2.boxFilter(np.multiply(srcImg, guidedImg), -1, (rad, rad), normalize=True)var_I = I_square_mean - np.multiply(I_mean, I_mean)cov_I_P = I_mul_P_mean - np.multiply(I_mean, P_mean)a = cov_I_P / (var_I + eps)b = P_mean - np.multiply(a, I_mean)a_mean = cv2.boxFilter(a, -1, (rad, rad), normalize=True)b_mean = cv2.boxFilter(b, -1, (rad, rad), normalize=True)dstImg = np.multiply(a_mean, guidedImg) + b_meanreturn dstImg * 255.0def my_guidedFilter_threeChannel(srcImg, guidedImg, rad=9, eps=0.01):img_shape = np.shape(srcImg)dstImg = np.zeros(img_shape, dtype=float)for ind in range(0, img_shape[2]):dstImg[:, :, ind] = my_guidedFilter_oneChannel(srcImg[:, :, ind],guidedImg[:, :, ind], rad, eps)dstImg = dstImg.astype(np.uint8)return dstImgdef main():src_img = cv2.imread(src_img_path)guided_img = cv2.imread(guided_img_path)print(np.shape(src_img))print(np.shape(guided_img))dstimg = my_guidedFilter_threeChannel(src_img, guided_img, 9, 0.01)print(np.shape(dstimg))cv2.imwrite('output.jpg', dstimg)cv2.imshow('output', dstimg)cv2.waitKey(0)if __name__ == '__main__':main()import matplotlib.pyplot as pltsrc_img = plt.imread(src_img_path)guided_img = plt.imread(guided_img_path)output_img = plt.imread('output.jpg')plt.subplot(131)plt.imshow(src_img)plt.axis('off')plt.title('src')plt.subplot(132)plt.imshow(guided_img)plt.axis('off')plt.title('guided')plt.subplot(133)plt.imshow(output_img)plt.axis('off')plt.title('output')plt.show()

在这里插入图片描述

参考资料

  1. https://blog.csdn.net/a6333230/article/details/79937339
  2. https://blog.csdn.net/piaoxuezhong/article/details/78372787
  3. https://blog.csdn.net/shan54321/article/details/80597439
  4. https://blog.csdn.net/u013921430/article/details/99695647


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部