保边滤波算法及python实现

三大保边滤波算法:引导滤波、双边滤波、加权最小二乘平滑滤波算法

双边滤波

各向异性滤波,基于小波变换的滤波(Edge-avoiding wavelets and their applications),基于域变换的滤波(Domain Transform for Edge-Aware Image and Video Processing),基于geodesic的滤波(Geodesic Image and Video Editing)
双边滤波器:非线性滤波器,输出图像每个像素都是其邻域各像素的加权平均,权值随空间距离和数值差异的增加而减小。

B L F ( g ) p = 1 k p ∑ q G σ s ( ∣ ∣ p − q ) G σ r ( ∣ ∣ g p − g q ) BLF(g)_p=\frac{1}{k_p}\sum_q G_{\sigma_s}(||p-q)G_{\sigma_r}(||g_p-g_q) BLF(g)p=kp1qGσs(∣∣pq)Gσr(∣∣gpgq)
k p = ∑ q G σ s ( ∣ ∣ p − q ∣ ∣ ) G σ r ( ∣ ∣ g p − g q ∣ ∣ ) k_p=\sum_q G_{\sigma_s}(||p-q||)G_{\sigma_r}(||g_p-g_q||) kp=qGσs(∣∣pq∣∣)Gσr(∣∣gpgq∣∣)
其中,g为输入图像,p和q表示像素的空间位置,核函数 G σ s G_{σ_s } Gσs G σ r G_{σ_r } Gσr通常高斯核, σ s σ_s σs决定空间支撑、 σ r σ_r σr决定值域支撑调节边缘敏感度
双边滤波器性能定性分析:
1.给定像素p,其原始像素值为 g p g_p gp (a particular pixel p, whose unfiltered value is g p g_p gp )。随 σ s σ_s σs的增大,更多的邻域像素q参与像素p的平滑,其中与 g p g_p gp相近的 g q g_q gq 贡献最大,导致平滑后p点像素值与g_p差值很小(as σ s σ_s σs is increased, more and more distant pixels q , whose value g q g_q gq is close to g p g_p gp are being averaged together, and as a result the filtered value does not stray too far from g p g_p gp )。当 σ s → ∞ σ_s→ ∞ σs时,双边滤波器等同于值域滤波器(in the limit ( σ s → ∞ σ_s → ∞ σs), the bilateral filter becomes a range filter)。因此,为实现大尺度平滑,不仅需要增大 σ s σ_s σs σ r σ_r σr也需要相应增加(more aggressive smoothing cannot be achieved only by increasing σ s σ_s σs , and the range support σ r σ_r σr must be increased as well)。
2.增大 σ r σ_r σr会降低双边滤波器的保边性能,导致部分边缘模糊(increasing σ_r reduces the ability of the bilateral filter to preserve edges, and some of them become blurred)。当 σ r → ∞ σ_r → ∞ σr,双边滤波器等同于高斯滤波器(in the limit ( σ r → ∞ σ_r → ∞ σr ) the bilateral filter becomes a linear Gaussian filter)。

imgfilter = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace,borderType)
# 使用方法
imgfilter = cv2.bilateralFilter(img, 11, 25, 25)

第一个参数src,表示输入图像
第二个参数d,表示在滤波过程中每个像素邻域的直径
第三个参数sigmaColor,颜色空间滤波器的sigma值。这个值越大,表示该像素领域内有更宽的颜色被混合到一起
第四个参数sigmaSpace,坐标空间中滤波器的sigma值,值越大,表示更大的区域足够相似的颜色获取相同的颜色。当d>0时,无论sigmaSpace取何值,d指定邻域大小。否则d正比与sigmaSpace。
第五个参数borderType,处理边界模式,可直接选默认值
在这里插入图片描述

导数滤波

文章链接:链接1
有博主做了翻译:链接2
引导滤波的定义中,用到了局部线性模型,该模型认为某函数上一点与其邻近部分的点成线性关系,一个复杂的函数可以用多个局部的线性函数来表示,当需求该函数上某一点的值时,只需计算所有包含该点的线性函数的值做平均,引导滤波函数的输入输出在二维窗口内满足线性关系:
q i = a k I i + b k , ∀ i ∈ w k q_i=a_k I_i+b_k,∀i∈w_k qi=akIi+bk,iwk
p是输入图像,I是引导图像,q是滤波输出图像, a k a_k ak b k b_k bk是系数, w k w_k wk是窗口
对等式两边求导 ∇ q = a ∇ I ∇q=a∇I q=aI
当引导图像 I I I有梯度时,输出q也有类似的梯度
最小化输出图q和输入图p的差别,定义代价函数:
E ( a k , b k ) = ∑ i ∈ w k ( ( a k I i + b k − p i ) 2 + ϵ a k 2 ) E(a_k,b_k )=\sum_{i∈w_k}((a_k I_i+b_k-p_i )^2+ϵa_k^2) E(ak,bk)=iwk((akIi+bkpi)2+ϵak2)
这里,ϵ是正则化参数,对代价函数求最小值
在这里插入图片描述
p k p_k pk μ k μ_k μk是p和I窗口内的均值。求 a k a_k ak
在这里插入图片描述
在这里插入图片描述
当作为滤波器时,通常I=p,
如果 ϵ = 0 ϵ=0 ϵ=0,从上式中可以看出,滤波器没有任何作用,输出等于输入
ϵ > 0 ϵ>0 ϵ>0,在像素强度变化小的区域,做了一个加权均值滤波,在变化大的区域,对图像的滤波效果很弱,有助于保持边缘
ϵ ϵ ϵ的作用就是界定变化的大小,在窗口不变的情况下,随着ϵ的增大,滤波效果更加明显。
指导滤波算法流程:
在这里插入图片描述
以彩色图像做指导滤波
上面的结果,图像对应位置相乘,都是单通道的情况,指导图为单通道,如果要用彩色图像为指导图,则略微复杂一点
在这里插入图片描述

import cv2
import numpy as np
from skimage.metrics import peak_signal_noise_ratio


def guide_filter(I, p, r, eps):
    """
    :param I: 引导图像
    :param p: 输入图像
    :param r: 窗口半径
    :param eps:
    :return:
    """
    I = I / 255  # 引导滤波图像必须归一化
    p = p / 255
    winSize = (2 * r + 1, 2 * r + 1)
    # I的均值
    mean_I = cv2.blur(I, winSize)
    # p的均值
    mean_p = cv2.blur(p, winSize)

    # I*I和I*p的均值平滑
    mean_II = cv2.blur(I*I, winSize)
    mean_Ip = cv2.blur(I*p, winSize)

    # 方差
    var_I = mean_II - mean_I * mean_I

    # 协方差
    cov_Ip = mean_Ip - mean_I * mean_p

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

    # 对a、b进行均值平滑
    mean_a = cv2.blur(a, winSize)
    mean_b = cv2.blur(b, winSize)

    q = mean_a * I + mean_b
    q = q * 255
    q[q > 255] = 255

    return q.astype(np.uint8)

if __name__ == '__main__':

    img = cv2.imread('1.jpg', 0)

    # 引导滤波
    imgguidefilter = guide_filter(img, img, 16, 1e-2)
 
    cv2.imshow('img', img)
    cv2.imshow('guide_filter', imgguidefilter)
    cv2.waitKey()

在这里插入图片描述

加权最小二乘法滤波原理

链接1
基于双边滤波的算法无法在多尺度提取到很好的细节信息,并可能出现伪影。加权最小二乘滤波目的即是使得结果图像u与原图像p经过平滑后尽量相似,但是在边缘部分尽量维持原状
     ∑ p ( ( u p − g p ) 2 + λ ( a x , p ( g ) ( ∂ u ∂ x ) p 2 + a y , p ( g ) ( ∂ u ∂ y ) p 2 ) \sum_p ((u_p-g_p)^2+\lambda(a_{x,p}(g)(\frac{\partial_u}{\partial_x})_p^2+a_{y,p}(g)(\frac{\partial_u}{\partial_y})_p^2) p((upgp)2+λ(ax,p(g)(xu)p2+ay,p(g)(yu)p2)     式(1)
其中 a x a_x ax a y a_y ay为权重系数。目标函数第一项代表输入图像和输出图像越相似越好;第二项是正则项,通过最小化的偏导,使得输出图像越平滑越好,上式可以改写为矩阵形式:
     ( u − g ) T ( u − g ) + λ ( u T D x T A x D x u + u T D y T A y D y u ) (u-g)^T (u-g)+λ(u^T D_x^T A_x D_x u+u^T D_y^T A_y D_y u) (ug)T(ug)+λ(uTDxTAxDxu+uTDyTAyDyu)  式(2)
其中, A x A_x Ax, A y A_y Ay为以 a x a_x ax a y a_y ay为对角元素的对角矩阵, D x D_x Dx, D y D_y Dy为前向差分矩阵,和是后向差分算子,使得上式最小值,u满足:
      ( I + λ L g ) u = g (I+λL_g )u=g (I+λLg)u=g                     式(3)

注:式3推导,式2对u求导,导数为0。 u T u = u 2 u^T u=u^2 uTu=u2
∂ ( ( u − g ) 2 + λ ( u 2 D x T A x D x + u 2 D y T A y D y ) ) ∂ u = 0 \frac{∂((u-g)^2+λ(u^2 D_x^T A_x D_x+u^2 D_y^T A_y D_y ))}{∂u}=0 u((ug)2+λ(u2DxTAxDx+u2DyTAyDy))=0
2 ( u − g ) + 2 λ u ( D x T A x D x + D y T A y D y ) = 0 2(u-g)+2λu(D_x^T A_x D_x+D_y^T A_y D_y )=0 2(ug)+2λu(DxTAxDx+DyTAyDy)=0
u ( I + λ ( D x T A x D x + D y T A y D y ) ) = g u(I+λ(D_x^T A_x D_x+D_y^T A_y D_y ))=g u(I+λ(DxTAxDx+DyTAyDy))=g
)

其中, L g = D x T A x D x + D y T A y D y L_g=D_x^T A_x D_x+D_y^T A_y D_y Lg=DxTAxDx+DyTAyDy,作者取的平滑权重系数为
a x , p ( g ) = ( ∣ ∂ l ∂ x ( p ) ∣ α + ε ) − 1 , a y , p ( g ) = ( ∣ ∂ l ∂ y ( p ) ∣ α + ε ) − 1 a_{x,p} (g)=(|\frac{∂l}{∂x} (p)|^α+ε)^{-1}, a_{y,p} (g)=(|\frac{∂l}{∂y }(p)|^α+ε)^{-1} ax,p(g)=(xl(p)α+ε)1,ay,p(g)=(yl(p)α+ε)1
其中I表示Log,ε一般取0.0001,式3求出u为:
u = F λ ( g ) = ( I + λ L g ) − 1 g u=F_λ (g)=(I+λL_g )^{-1} g u=Fλ(g)=(I+λLg)1g
当所选区域连续,平滑权重系数可以近似为a_x≈a_y≈a,那么
F λ ( g ) ≈ ( I + λ L g ) − 1 g F_λ (g)≈(I+λL_g )^{-1} g Fλ(g)(I+λLg)1g
L为拉普拉斯齐次矩阵

注:拉普拉斯矩阵

拉普拉斯矩阵(Laplacian matrix) 也叫做导纳矩阵、基尔霍夫矩阵或离散拉普拉斯算子,是图论中用于表示图的一种重要矩阵。
定义:给定一个具有n个顶点的简单图G=(V,E),V为顶点集合,E为边集合,其拉普拉斯矩阵可定义为:
L = D − A L=D-A L=DA
其中A∈R为邻接矩阵, D ∈ R n × n D∈R^{n×n} DRn×n为度矩阵
(邻接矩阵是表示顶点之间相邻关系的矩阵。

A i j = { w i j , ( v i , v j ) 或 < v i , v j > ∈ E ( G ) 0 或 ∞ , ( v i , v j ) 或 < v i , v j > ∉ E ( G ) A_ij=\left\{ \begin{array}{ll} w_{ij} &, (v_i,v_j )或<v_i,v_j>∈E(G)\\ 0或\infty &,(v_i,v_j )或<v_i,v_j>∉E(G) \end{array} \right. Aij={ wij0(vi,vj)<vi,vj>∈E(G)(vi,vj)<vi,vj>/E(G)

w i j w_ij wij表示边上的权重, E ( G ) E(G) EG边的集合)
注意A中的元素仅仅可能是0和1,且其对角元素全为0。D是一个对角矩阵,其对角线上的元素计算方式 D i i = ∑ j A i j D_{ii}=\sum_j A_{ij} Dii=jAij 。L的每个元素值的具体计算方式如下:
L i j = { D i j i f i = j − 1 i f i ≠ j a n d v i i s a d j a c e n t t o v j 0 o t h e r w i s e L_{ij}=\left\{ \begin{array}{ll} D_{ij} &if i=j \\ -1&if i\ne j and v_i is adjacent to v_j \\ 0 & otherwise \end{array} \right. Lij= Dij10ifi=jifi=jandviisadjacenttovjotherwise
拉普拉斯矩阵都是对称的
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40649372/article/details/128794166