导向滤波与opencv python实现

定义

导向滤波是一个线性滤波,输出为由引导图 I I I乘上输入图 P P P得到的权重的加权平均。
在这里插入图片描述
i i i j j j是像素下标,滤波核 W i j W_{ij} Wij I I I的函数,其不依赖于 p p p

引导滤波器的关键假设是引导I和滤波器输出 q q q之间的局部线性模型。我们假设 q q q I I I在以像素 k k k为中心的窗口 ω k \omega_k ωk中的线性变换。
在这里插入图片描述
这里假设( a k a_k ak, b k b_k bk)在 ω k \omega_k ωk中为线性的常数。其中 ω k \omega_k ωk为一个半径为 r r r的正方形窗口。在一个窗口 ω k \omega_k ωk内,只会确定一个 a k a_k ak b k b_k bk,但可以根据一个 a k a_k ak b k b_k bk,求出 ∣ ω ∣ |\omega| ω q i q_i qi。这个局部线性模型确保 q q q只有在 I I I有边缘时才有边缘,因为 ∇ q ∇q q = a ∇ I a∇I aI

推导

利用岭回归确认参数 a k a_k ak, b k b_k bk的值,也就是求下式的最小值:
在这里插入图片描述
其中 ϵ \epsilon ϵ是一个正则化参数,以防 a k a_k ak过大。
可以认为 q i q_i qi p i p_i pi去掉噪音 n i n_i ni后的图片:
在这里插入图片描述

得出的结果如下:
在这里插入图片描述
其中 μ k \mu_k μk σ k 2 \sigma_k^2 σk2 I I I ω k \omega_k ωk内的均值与方差。 ∣ ω ∣ |\omega| ω是窗口内的像素数目。 p ‾ k \overline{p}_k pk是窗口内 p p p的均值。具体推导可参考:公式推导

将这个线性模型应用在整幅图像上的所有小窗口上, q i q_i qi在不同的小窗口内会有不同取值,所以需要将 q i q_i qi取平均:
在这里插入图片描述
论文指出,一开始提出的加权平均的权重如下式:
在这里插入图片描述
其只取决于引导图像 I I I。具体推导详见论文3.3。

ϵ \epsilon ϵ值的影响

I = p I=p I=p时,该算法即成为一个边缘保持滤波器。
在这里插入图片描述

Case 1:

如果某个窗口在平坦区域,那么该区域的方程 σ k 2 \sigma_k^2 σk2将远远小于 ϵ \epsilon ϵ。从而 a k ≈ 0 a_k\approx0 ak0 b k ≈ p ‾ k b_k\approx\overline{p}_k bkpk,即相当于对该区域作均值滤波。

Case 2:

如果某个窗口在高方差区域,那么该区域的方程 σ k 2 \sigma_k^2 σk2将远远大于 ϵ \epsilon ϵ。从而 a k ≈ 1 a_k\approx1 ak1 b k ≈ 0 b_k\approx0 bk0,即相当于在区域保持原有梯度。

在这里插入图片描述
r r r ϵ \epsilon ϵ越大,图像越模糊,越趋于做均值滤波。

代码

在这里插入图片描述
输入图像必须得先进行归一化后再处理,否则滤波后会有超过255的值

def guided_filter(I,p,win_size,eps):

    mean_I = cv2.blur(I,(win_size,win_size))
    mean_p = cv2.blur(p,(win_size,win_size))

    corr_I = cv2.blur(I*I,(win_size,win_size))
    corr_Ip = cv2.blur(I*p,(win_size,win_size))

    var_I = corr_I-mean_I*mean_I
    cov_Ip = corr_Ip - mean_I*mean_p

    a = cov_Ip/(var_I+eps)
    b = mean_p-a*mean_I

    mean_a = cv2.blur(a,(win_size,win_size))
    mean_b = cv2.blur(b,(win_size,win_size))

    q = mean_a*I + mean_b
    return q

参考文献

Guided Image Filtering
导向滤波(Guided Filter)公式详解

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。在Python中使用OpenCV进行图像滤波可以实现图像的平滑、锐化、边缘检测等操作。 在OpenCV中,常用的图像滤波方法包括均值滤波、中值滤波、高斯滤波等。这些滤波方法可以通过调整参数来控制滤波效果。 1. 均值滤波:使用一个固定大小的滑动窗口,在窗口内计算像素的平均值,并将该平均值作为输出像素的值。均值滤波可以有效地去除图像中的噪声,但会导致图像的细节模糊。 2. 中值滤波:使用一个固定大小的滑动窗口,在窗口内对像素进行排序,然后将中间值作为输出像素的值。中值滤波对于去除椒盐噪声等椒盐噪声效果较好,但对于高斯噪声等其他类型的噪声效果较差。 3. 高斯滤波:使用一个高斯核函数对图像进行卷积操作,通过调整高斯核函数的参数来控制滤波效果。高斯滤波可以平滑图像并保留图像的细节信息。 除了这些基本的滤波方法,OpenCV还提供了其他一些滤波方法,如双边滤波导向滤波等,可以根据具体需求选择合适的滤波方法。 下面是使用OpenCV进行图像滤波的示例代码: ```python import cv2 # 读取图像 image = cv2.imread('image.jpg') # 均值滤波 blur_image = cv2.blur(image, (5, 5)) # 中值滤波 median_image = cv2.medianBlur(image, 5) # 高斯滤波 gaussian_image = cv2.GaussianBlur(image, (5, 5), 0) # 显示原始图像和滤波后的图像 cv2.imshow('Original Image', image) cv2.imshow('Blur Image', blur_image) cv2.imshow('Median Image', median_image) cv2.imshow('Gaussian Image', gaussian_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码首先使用`cv2.imread`函数读取一张图像,然后分别使用`cv2.blur`、`cv2.medianBlur`和`cv2.GaussianBlur`函数对图像进行均值滤波、中值滤波和高斯滤波。最后使用`cv2.imshow`函数显示原始图像和滤波后的图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值