快速引导滤波原理详解(fast guided filter)

符号标记

q : 输出图像 p : 输入图像 I : 引导图 a k , b k : 线性变换模型 r : 滤波半径 s : 下采样因子 q: 输出图像 \\[2ex] p: 输入图像 \\[2ex] I: 引导图 \\[2ex] a_k,b_k: 线性变换模型 \\[2ex] r: 滤波半径 \\[2ex] s: 下采样因子 \\[2ex] q:输出图像p:输入图像I:引导图ak,bk:线性变换模型r:滤波半径s:下采样因子

输入图单通道,引导图单通道

  1. 文章假设滤波结果是对guidance image线性变换的结果:
    q i = a k I i + b k , ∀ i ∈ ω k q_i = a_k I_i + b_k, \forall i \in \omega_k qi=akIi+bk,iωk
    这就是最终的滤波公式,但是目前 a k , b k a_k, b_k ak,bk是未知的,需要求解;另外目前为止 a k , b k a_k, b_k ak,bk ω k \omega_k ωk之内被假设为常量。
    相对于普通的滤波,如高斯滤波,这个公式最大的不同是多了bias项 b k b_k bk

  2. 为了求解 a k , b k a_k, b_k ak,bk,需要建立一个目标函数,目标函数的建立规则是:

    • ω k \omega_k ωk区域内,滤波结果 q i q_i qi与输入图像 p i p_i pi要尽可能相近,两者之差的二范数要最小(最小二乘)。
    • 对尺度因子 a k a_k ak加了正则化进行惩罚,避免 a k a_k ak太飘,同样是二范数。

    于是就需要最小化以下目标函数:
    E ( a k , b k ) = ∑ i ∈ ω k ( ( a k I i + b k − p i ) 2 + ϵ a k 2 ) E(a_k,b_k) = \sum_{i \in \omega_k} {((a_k I_i + b_k - p_i)^2 + \epsilon a_k^2)} E(ak,bk)=iωk((akIi+bkpi)2+ϵak2)
    注意上式中 q i q_i qi已经用 a k I i + b k a_k I_i + b_k akIi+bk代替。

  3. 通过目标函数求解 a k , b k a_k, b_k ak,bk
    使用目标函数 E ( a k , b k ) E(a_k,b_k) E(ak,bk)分别对 a k , b k a_k,b_k ak,bk求偏导并置零,来获得等式:
    ∂ E ∂ a k = ∑ i ( 2 ( a k I i + b k − p i ) I i + 2 ϵ a k ) = 0 ∂ E ∂ b k = ∑ i 2 ( a k I i + b k − p i ) = 0 \frac{\partial E}{\partial a_k} = \sum_{i} (2(a_k I_i + b_k - p_i) I_i + 2 \epsilon a_k) = 0 \\[4ex] \frac{\partial E}{\partial b_k} = \sum_{i} 2(a_k I_i + b_k - p_i) = 0 akE=i(2(akIi+bkpi)Ii+2ϵak)=0bkE=i2(akIi+bkpi)=0
    上式中为了看起来清爽一点,把求和符号中的 i ∈ ω k i \in \omega_k iωk简写为 i i i
    注意求和符号只针对 i i i,所以但凡脚标不是 i i i的量都可以移动到求和符号之外,顺便把系数2给干掉,然后上述两式变为:
    a k ∑ i I i I i + b k ∑ i I i − ∑ i p i I i + ∣ ω ∣ ϵ a k = 0 a k ∑ i I i + ∣ ω ∣ b k − ∑ i p i = 0 a_k\sum_{i}{I_i I_i} + b_k\sum_{i}{I_i} - \sum_{i}{p_i I_i} + |\omega|\epsilon a_k = 0 \\[4ex] a_k\sum_{i}{I_i} + |\omega|b_k - \sum_{i}{p_i} = 0 akiIiIi+bkiIiipiIi+ωϵak=0akiIi+ωbkipi=0
    首先可以通过第二个式子求得:
    b k = 1 ∣ ω ∣ ∑ i p i − a k 1 ∣ ω ∣ ∑ i I i (1) b_k = \frac{1}{|\omega|} \sum_{i}{p_i} - a_k \frac{1}{|\omega|}\sum_{i}{I_i} \tag{1} bk=ω1ipiakω1iIi(1)
    上式中 ∣ ω ∣ |\omega| ω表示 ω k \omega_k ωk区域中像素个数,所以 1 ∣ ω ∣ ∑ i \frac{1}{ |\omega|} \sum_{i} ω1i的意思其实就是求平均。
    b k b_k bk代入第一个式子,再经过一系列化简,可以得到 a k a_k ak的表达式:
    a k ∑ i I i I i + ( 1 ∣ ω ∣ ∑ i p i − a k 1 ∣ ω ∣ ∑ i I i ) ∑ i I i − ∑ i p i I i + ∣ ω ∣ ϵ a k = 0 a k ( ∑ i I i I i − 1 ∣ ω ∣ ∑ i I i ∑ i I i + ∣ ω ∣ ϵ ) + 1 ∣ ω ∣ ∑ i p i ∑ i I i − ∑ i p i I i = 0 为了显示得干净点,求和符号中的 i 也干掉了 : a k = ∑ p i I i − 1 ∣ ω ∣ ∑ p i ∑ I i ∑ I i I i − 1 ∣ ω ∣ ∑ I i ∑ I i + ∣ ω ∣ ϵ 上下同除以 ∣ ω ∣ 得 : a k = 1 ∣ ω ∣ ∑ p i I i − 1 ∣ ω ∣ ∑ p i 1 ∣ ω ∣ ∑ I i 1 ∣ ω ∣ ∑ I i I i − 1 ∣ ω ∣ ∑ I i 1 ∣ ω ∣ ∑ I i + ϵ (2) a_k\sum_{i}{I_i I_i} + (\frac{1}{ |\omega|} \sum_{i}{p_i} - a_k \frac{1}{|\omega|}\sum_{i}{I_i})\sum_{i}{I_i} - \sum_{i}{p_i I_i} + |\omega|\epsilon a_k = 0 \\[4ex] a_k(\sum_{i}{I_i I_i} - \frac{1}{ |\omega|}{\sum_{i}{I_i}\sum_{i}{I_i} + |\omega| \epsilon}) + \frac{1}{ |\omega|}{\sum_{i}{p_i}\sum_{i}{I_i}} - \sum_{i}{p_i I_i} = 0 \\[4ex] 为了显示得干净点,求和符号中的i也干掉了: \\[4ex] a_k = \frac{\sum{p_i I_i} - \frac{1}{ |\omega|}{\sum{p_i}\sum{I_i}}} {\sum{I_i I_i} - \frac{1}{ |\omega|}{\sum{I_i}\sum{I_i} + |\omega| \epsilon}} \\[4ex] 上下同除以 |\omega| 得: \\[4ex] a_k = \frac{\frac{1}{|\omega|}\sum{p_i I_i} - \frac{1}{|\omega|}{\sum{p_i} \frac{1}{|\omega|}\sum{I_i}}} {\frac{1}{ |\omega|}\sum{I_i I_i} - \frac{1}{|\omega|}{\sum{I_i} \frac{1}{ |\omega|}\sum{I_i} + \epsilon}} \tag{2} akiIiIi+(ω1ipiakω1iIi)iIiipiIi+ωϵak=0ak(iIiIiω1iIiiIi+ωϵ)+ω1ipiiIiipiIi=0为了显示得干净点,求和符号中的i也干掉了:ak=IiIiω1IiIi+ωϵpiIiω1piIi上下同除以ω:ak=ω1IiIiω1Iiω1Ii+ϵω1piIiω1piω1Ii(2)
    这就是最符合原文章算法流程的公式写法,不用再按照原文章的公式写法简化了。
    最后需注意,虽然前面假设 a k , b k a_k,b_k ak,bk ω k \omega_k ωk区域内是常量,但实际上根据上述(1)(2)两公式计算出来后并不是常量,所以要考虑 ω k \omega_k ωk区域中 a k , b k a_k,b_k ak,bk变化带来的影响,一般采用平均的方式去处理,也就是:
    q i = 1 ∣ ω ∣ ∑ k ∈ ω i a k I i + 1 ∣ ω ∣ ∑ k ∈ ω i b k (3) q_i = \frac{1}{|\omega|}\sum_{k\in\omega_i}a_k I_i + \frac{1}{|\omega|}\sum_{k\in\omega_i}b_k \tag{3} qi=ω1kωiakIi+ω1kωibk(3)
    上述(1, 2, 3)三个公式就是正常guidefilter的完整求解过程。

  4. 文章中 a k , b k a_k, b_k ak,bk的公式解释
    μ k = 1 ∣ ω ∣ ∑ I i \mu_k = \frac{1}{|\omega|}{\sum{I_i}} μk=ω1Ii p k = 1 ∣ ω ∣ ∑ p i p_k = \frac{1}{|\omega|}{\sum{p_i}} pk=ω1pi
    那么 a k , b k a_k,b_k ak,bk分别可写为:
    a k = 1 ∣ ω ∣ ∑ p i I i − p k μ k 1 ∣ ω ∣ ∑ I i 2 − μ k 2 + ϵ b k = p k − a k μ k a_k = \frac{\frac{1}{|\omega|}\sum{p_i I_i} - p_k\mu_k} {\frac{1}{|\omega|}\sum{I_i^2} - \mu_k^2 + \epsilon} \\[4ex] b_k = p_k - a_k\mu_k ak=ω1Ii2μk2+ϵω1piIipkμkbk=pkakμk
    然后再来看个方差公式:
    σ k 2 = 1 ∣ ω ∣ ∑ i ( I i − μ k ) 2 = 1 ∣ ω ∣ ∑ i ( I i 2 − 2 I i μ k + μ k 2 ) = 1 ∣ ω ∣ ( ∑ i I i 2 − 2 μ k ∑ i I i + ∑ i μ k 2 ) ( 请注意 : ∑ I i = ∣ ω ∣ μ k , ∑ i μ k 2 = ∣ ω ∣ μ k 2 ) = 1 ∣ ω ∣ ( ∑ i I i 2 − 2 μ k ∣ ω ∣ μ k + ∣ ω ∣ μ k 2 ) = 1 ∣ ω ∣ ( ∑ i I i 2 − ∣ ω ∣ μ k 2 ) = 1 ∣ ω ∣ ∑ i I i 2 − μ k 2 \begin{aligned} \sigma_k^2 &= \frac {1}{|\omega|} \sum_{i}(I_i - \mu_k)^2 \\[4ex] &= \frac {1}{|\omega|} \sum_{i} (I_i^2 - 2I_i\mu_k + \mu_k^2) \\[4ex] &= \frac {1}{|\omega|} (\sum_{i}I_i^2 - 2\mu_k \sum_{i}I_i + \sum_{i}\mu_k^2) \\[4ex] & (请注意: \sum{I_i} = |\omega|\mu_k, \sum_{i}\mu_k^2 = |\omega|\mu_k^2)\\[4ex] &= \frac {1}{|\omega|} (\sum_{i}I_i^2 - 2\mu_k |\omega| \mu_k + |\omega|\mu_k^2) \\[4ex] &= \frac {1}{|\omega|} (\sum_{i}I_i^2 - |\omega|\mu_k^2) \\[4ex] &= \frac {1}{|\omega|} \sum_{i}I_i^2 - \mu_k^2 \\[4ex] \end{aligned} σk2=ω1i(Iiμk)2=ω1i(Ii22Iiμk+μk2)=ω1(iIi22μkiIi+iμk2)(请注意:Ii=ωμk,iμk2=ωμk2)=ω1(iIi22μkωμk+ωμk2)=ω1(iIi2ωμk2)=ω1iIi2μk2
    同理可以把协方差公式也写在这里,下面推导多通道公式时候会用到
    σ k 2 = 1 ∣ ω ∣ ∑ i ( I i 0 − μ k 0 ) ( I i 1 − μ k 1 ) = 1 ∣ ω ∣ ∑ i ( I i 0 I i 1 − I i 0 μ k 1 − I i 1 μ k 0 + μ k 0 μ k 1 ) = 1 ∣ ω ∣ ( ∑ i I i 0 I i 1 − μ k 1 ∑ i I i 0 − μ k 0 ∑ i I i 1 + ∑ i μ k 0 μ k 1 ) = 1 ∣ ω ∣ ( ∑ i I i 0 I i 1 − ∣ ω ∣ μ k 1 μ k 0 − ∣ ω ∣ μ k 0 μ k 1 + ∣ ω ∣ μ k 0 μ k 1 ) = 1 ∣ ω ∣ ∑ i I i 0 I i 1 − μ k 1 μ k 0 \begin{aligned} \sigma_k^2 &= \frac {1}{|\omega|} \sum_{i}(I_{i0} - \mu_{k0}) (I_{i1} - \mu_{k1}) \\[4ex] &= \frac {1}{|\omega|} \sum_{i} (I_{i0} I_{i1} - I_{i0} \mu_{k1} - I_{i1} \mu_{k0} + \mu_{k0} \mu_{k1}) \\[4ex] &= \frac {1}{|\omega|} (\sum_{i} I_{i0} I_{i1} - \mu_{k1} \sum_{i} I_{i0} - \mu_{k0} \sum_{i} I_{i1} + \sum_{i} \mu_{k0} \mu_{k1}) \\[4ex] &= \frac {1}{|\omega|} (\sum_{i} I_{i0} I_{i1} - |\omega| \mu_{k1} \mu_{k0} - |\omega| \mu_{k0} \mu_{k1} + |\omega| \mu_{k0} \mu_{k1}) \\[4ex] &= \frac {1}{|\omega|} \sum_{i} I_{i0} I_{i1} - \mu_{k1} \mu_{k0} \end{aligned} σk2=ω1i(Ii0μk0)(Ii1μk1)=ω1i(Ii0Ii1Ii0μk1Ii1μk0+μk0μk1)=ω1(iIi0Ii1μk1iIi0μk0iIi1+iμk0μk1)=ω1(iIi0Ii1ωμk1μk0ωμk0μk1+ωμk0μk1)=ω1iIi0Ii1μk1μk0
    所以 a k a_k ak就可以进一步写为论文中的:
    a k = 1 ∣ ω ∣ ∑ p i I i − p k μ k σ k 2 + ϵ a_k = \frac{\frac{1}{|\omega|}\sum{p_i I_i} - p_k\mu_k} {\sigma_k^2 + \epsilon} ak=σk2+ϵω1piIipkμk

输入图多通道,引导图单通道

使用引导图对输入图的每个通道分别滤波即可。

输入图单通道,引导图多通道

引导图是多通道的情况下,多个通道需要综合对输入图的单通道产生影响,按照文章公式可以记录为:
q i = a k T I i + b k , ∀ i ∈ ω k q_i = \pmb{a_k^T I_i}+ b_k, \forall i \in \omega_k qi=akTIi+bk,iωk
拆开写为:
q i = a k 0 I i 0 + a k 1 I i 1 + a k 1 I i 1 + b k , ∀ i ∈ ω k q_i = a_{k0} I_{i0} + a_{k1} I_{i1} + a_{k1} I_{i1} + b_k, \forall i \in \omega_k qi=ak0Ii0+ak1Ii1+ak1Ii1+bk,iωk
那么目标函数就变成:
E ( a k , b k ) = ∑ i ∈ ω k ( ( a k 0 I i 0 + a k 1 I i 1 + a k 1 I i 1 + b k − p i ) 2 + ϵ ( a k 0 2 + a k 1 2 + a k 2 2 ) ) E(a_k,b_k) = \sum_{i \in \omega_k} {((a_{k0} I_{i0} + a_{k1} I_{i1} + a_{k1} I_{i1} + b_k - p_i)^2 + \epsilon (a_{k0}^2 + a_{k1}^2 + a_{k2}^2))} E(ak,bk)=iωk((ak0Ii0+ak1Ii1+ak1Ii1+bkpi)2+ϵ(ak02+ak12+ak22))
(下面推导为了看着清爽,会把求和符号中的 i i i省略掉,需要时刻记住,求和符号的对象是 i i i
现在要求 a k 0 , a k 1 , a k 2 , b k a_{k0}, a_{k1}, a_{k2}, b_k ak0,ak1,ak2,bk,使用 E ( a k , b k ) E(a_k,b_k) E(ak,bk)分别对这几项求偏导并置零得:
∂ E ∂ a k 0 = ∑ ( 2 ( a k 0 I i 0 + a k 1 I i 1 + a k 2 I i 2 + b k − p i ) I i 0 + 2 ϵ a k 0 ) = 0 ∂ E ∂ a k 1 = ∑ ( 2 ( a k 0 I i 0 + a k 1 I i 1 + a k 2 I i 2 + b k − p i ) I i 1 + 2 ϵ a k 1 ) = 0 ∂ E ∂ a k 2 = ∑ ( 2 ( a k 0 I i 0 + a k 1 I i 1 + a k 2 I i 2 + b k − p i ) I i 2 + 2 ϵ a k 2 ) = 0 ∂ E ∂ b k = ∑ 2 ( a k 0 I i 0 + a k 1 I i 1 + a k 1 I i 1 + b k − p i ) = 0 \frac{\partial E}{\partial a_{k0}} = \sum (2(a_{k0} I_{i0} + a_{k1} I_{i1} + a_{k2} I_{i2} + b_k - p_i)I_{i0} + 2\epsilon a_{k0}) = 0 \\[4ex] \frac{\partial E}{\partial a_{k1}} = \sum (2(a_{k0} I_{i0} + a_{k1} I_{i1} + a_{k2} I_{i2} + b_k - p_i)I_{i1} + 2\epsilon a_{k1}) = 0 \\[4ex] \frac{\partial E}{\partial a_{k2}} = \sum (2(a_{k0} I_{i0} + a_{k1} I_{i1} + a_{k2} I_{i2} + b_k - p_i)I_{i2} + 2\epsilon a_{k2}) = 0 \\[4ex] \frac{\partial E}{\partial b_k} = \sum 2(a_{k0} I_{i0} + a_{k1} I_{i1} + a_{k1} I_{i1} + b_k - p_i) = 0 \\[4ex] ak0E=(2(ak0Ii0+ak1Ii1+ak2Ii2+bkpi)Ii0+2ϵak0)=0ak1E=(2(ak0Ii0+ak1Ii1+ak2Ii2+bkpi)Ii1+2ϵak1)=0ak2E=(2(ak0Ii0+ak1Ii1+ak2Ii2+bkpi)Ii2+2ϵak2)=0bkE=2(ak0Ii0+ak1Ii1+ak1Ii1+bkpi)=0
类似全部单通道的推导过程,首先可以得到 b k b_k bk的表达式:
b k = 1 ∣ ω ∣ ∑ p i − a k 0 1 ∣ ω ∣ ∑ I i 0 − a k 1 1 ∣ ω ∣ ∑ I i 1 − a k 2 1 ∣ ω ∣ ∑ I i 2 b k = p k − a k 0 μ k 0 − a k 1 μ k 1 − a k 2 μ k 2 b_k = \frac {1}{|\omega|} \sum{p_i} - a_{k0} \frac {1}{|\omega|} \sum{I_{i0}} - a_{k1} \frac {1}{|\omega|} \sum{I_{i1}} - a_{k2} \frac {1}{|\omega|} \sum{I_{i2}} \\[4ex] b_k = p_k - a_{k0} \mu_{k0} - a_{k1} \mu_{k1} - a_{k2} \mu_{k2} bk=ω1piak0ω1Ii0ak1ω1Ii1ak2ω1Ii2bk=pkak0μk0ak1μk1ak2μk2
其中 p k = 1 ∣ ω ∣ ∑ p i p_k = \frac {1}{|\omega|} \sum{p_i} pk=ω1pi μ k 0 = 1 ∣ ω ∣ ∑ I i 0 \mu_{k0} = \frac {1}{|\omega|} \sum{I_{i0}} μk0=ω1Ii0 μ k 1 = 1 ∣ ω ∣ ∑ I i 1 \mu_{k1} = \frac {1}{|\omega|} \sum{I_{i1}} μk1=ω1Ii1 μ k 2 = 1 ∣ ω ∣ ∑ I i 2 \mu_{k2} = \frac {1}{|\omega|} \sum{I_{i2}} μk2=ω1Ii2
b k b_k bk的表达式带入到第一个偏导式子中,顺便做个整理:
∑ ( a k 0 I i 0 2 + a k 1 I i 0 I i 1 + a k 2 I i 0 I i 2 + p k I i 0 − a k 0 μ k 0 I i 0 − a k 1 μ k 1 I i 0 − a k 2 μ k 2 I i 0 − p i I i 0 + ϵ a k 0 ) = 0 a k 0 ∑ I i 0 2 + a k 1 ∑ I i 0 I i 1 + a k 2 ∑ I i 0 I i 2 + p k ∑ I i 0 − a k 0 μ k 0 ∑ I i 0 − a k 1 μ k 1 ∑ I i 0 − a k 2 μ k 2 ∑ I i 0 − ∑ p i I i 0 + ∑ ϵ a k 0 ) = 0 a k 0 ∑ I i 0 2 + a k 1 ∑ I i 0 I i 1 + a k 2 ∑ I i 0 I i 2 + ∣ ω ∣ p k μ k 0 − ∣ ω ∣ a k 0 μ k 0 2 − ∣ ω ∣ a k 1 μ k 1 μ k 0 − ∣ ω ∣ a k 2 μ k 2 μ k 0 − ∑ p i I i 0 + ∣ ω ∣ ϵ a k 0 ) = 0 a k 0 1 ∣ ω ∣ ∑ I i 0 2 + a k 1 1 ∣ ω ∣ ∑ I i 0 I i 1 + a k 2 1 ∣ ω ∣ ∑ I i 0 I i 2 + p k μ k 0 − a k 0 μ k 0 2 − a k 1 μ k 1 μ k 0 − a k 2 μ k 2 μ k 0 − 1 ∣ ω ∣ ∑ p i I i 0 + ϵ a k 0 ) = 0 a k 0 ( 1 ∣ ω ∣ ∑ I i 0 2 − μ k 0 2 + ϵ ) + a k 1 ( 1 ∣ ω ∣ ∑ I i 0 I i 1 − μ k 0 μ k 1 ) + a k 2 ( 1 ∣ ω ∣ ∑ I i 0 I i 2 − μ k 0 μ k 2 ) + p k μ k 0 − 1 ∣ ω ∣ ∑ p i I i 0 = 0 a k 0 ( 1 ∣ ω ∣ ∑ I i 0 2 − μ k 0 2 + ϵ ) + a k 1 ( 1 ∣ ω ∣ ∑ I i 0 I i 1 − μ k 0 μ k 1 ) + a k 2 ( 1 ∣ ω ∣ ∑ I i 0 I i 2 − μ k 0 μ k 2 ) = 1 ∣ ω ∣ ∑ p i I i 0 − p k μ k 0 \sum (a_{k0} I_{i0}^2 + a_{k1} I_{i0} I_{i1} + a_{k2} I_{i0} I_{i2} + p_k I_{i0} - a_{k0} \mu_{k0} I_{i0} - a_{k1} \mu_{k1} I_{i0} - a_{k2} \mu_{k2} I_{i0} - p_i I_{i0} + \epsilon a_{k0}) = 0 \\[4ex] a_{k0} \sum I_{i0}^2 + a_{k1} \sum I_{i0} I_{i1} + a_{k2} \sum I_{i0} I_{i2} + p_k \sum I_{i0} - a_{k0} \mu_{k0} \sum I_{i0} - a_{k1} \mu_{k1} \sum I_{i0} - a_{k2} \mu_{k2} \sum I_{i0} - \sum p_i I_{i0} + \sum \epsilon a_{k0}) = 0 \\[4ex] a_{k0} \sum I_{i0}^2 + a_{k1} \sum I_{i0} I_{i1} + a_{k2} \sum I_{i0} I_{i2} + |\omega| p_k \mu_{k0} - |\omega|a_{k0} \mu_{k0}^2 - |\omega| a_{k1} \mu_{k1} \mu_{k0} - |\omega| a_{k2} \mu_{k2} \mu_{k0} - \sum p_i I_{i0} + |\omega| \epsilon a_{k0}) = 0 \\[4ex] a_{k0} \frac{1}{|\omega|} \sum I_{i0}^2 + a_{k1} \frac{1}{|\omega|} \sum I_{i0} I_{i1} + a_{k2} \frac{1}{|\omega|} \sum I_{i0} I_{i2} + p_k \mu_{k0} - a_{k0} \mu_{k0}^2 - a_{k1} \mu_{k1} \mu_{k0} - a_{k2} \mu_{k2} \mu_{k0} - \frac{1}{|\omega|} \sum p_i I_{i0} + \epsilon a_{k0}) = 0 \\[4ex] a_{k0} (\frac{1}{|\omega|} \sum I_{i0}^2 - \mu_{k0}^2 + \epsilon) + a_{k1} (\frac{1}{|\omega|} \sum I_{i0} I_{i1} - \mu_{k0} \mu_{k1}) + a_{k2} (\frac{1}{|\omega|} \sum I_{i0} I_{i2} - \mu_{k0} \mu_{k2}) + p_k \mu_{k0} - \frac{1}{|\omega|} \sum p_i I_{i0} = 0 \\[4ex] a_{k0} (\frac{1}{|\omega|} \sum I_{i0}^2 - \mu_{k0}^2 + \epsilon) + a_{k1} (\frac{1}{|\omega|} \sum I_{i0} I_{i1} - \mu_{k0} \mu_{k1}) + a_{k2} (\frac{1}{|\omega|} \sum I_{i0} I_{i2} - \mu_{k0} \mu_{k2}) = \frac{1}{|\omega|} \sum p_i I_{i0} - p_k \mu_{k0} (ak0Ii02+ak1Ii0Ii1+ak2Ii0Ii2+pkIi0ak0μk0Ii0ak1μk1Ii0ak2μk2Ii0piIi0+ϵak0)=0ak0Ii02+ak1Ii0Ii1+ak2Ii0Ii2+pkIi0ak0μk0Ii0ak1μk1Ii0ak2μk2Ii0piIi0+ϵak0)=0ak0Ii02+ak1Ii0Ii1+ak2Ii0Ii2+ωpkμk0ωak0μk02ωak1μk1μk0ωak2μk2μk0piIi0+ωϵak0)=0ak0ω1Ii02+ak1ω1Ii0Ii1+ak2ω1Ii0Ii2+pkμk0ak0μk02ak1μk1μk0ak2μk2μk0ω1piIi0+ϵak0)=0ak0(ω1Ii02μk02+ϵ)+ak1(ω1Ii0Ii1μk0μk1)+ak2(ω1Ii0Ii2μk0μk2)+pkμk0ω1piIi0=0ak0(ω1Ii02μk02+ϵ)+ak1(ω1Ii0Ii1μk0μk1)+ak2(ω1Ii0Ii2μk0μk2)=ω1piIi0pkμk0
仿照上述流程,处理一下第二和第三个偏导式,再把第一个也罗列下来,可得:
a k 0 ( 1 ∣ ω ∣ ∑ I i 0 2 − μ k 0 2 + ϵ ) + a k 1 ( 1 ∣ ω ∣ ∑ I i 0 I i 1 − μ k 0 μ k 1 ) + a k 2 ( 1 ∣ ω ∣ ∑ I i 0 I i 2 − μ k 0 μ k 2 ) = 1 ∣ ω ∣ ∑ p i I i 0 − p k μ k 0 a k 0 ( 1 ∣ ω ∣ ∑ I i 0 I i 1 − μ k 0 μ k 1 ) + a k 1 ( 1 ∣ ω ∣ ∑ I i 1 2 − μ k 0 2 + ϵ ) + a k 2 ( 1 ∣ ω ∣ ∑ I i 1 I i 2 − μ k 1 μ k 2 ) = 1 ∣ ω ∣ ∑ p i I i 1 − p k μ k 1 a k 0 ( 1 ∣ ω ∣ ∑ I i 0 I i 2 − μ k 0 μ k 2 ) + a k 1 ( 1 ∣ ω ∣ ∑ I i 1 I i 2 − μ k 1 μ k 2 ) + a k 2 ( 1 ∣ ω ∣ ∑ I i 2 2 − μ k 2 2 + ϵ ) = 1 ∣ ω ∣ ∑ p i I i 2 − p k μ k 2 a_{k0} (\frac{1}{|\omega|} \sum I_{i0}^2 - \mu_{k0}^2 + \epsilon) + a_{k1} (\frac{1}{|\omega|} \sum I_{i0} I_{i1} - \mu_{k0} \mu_{k1}) + a_{k2} (\frac{1}{|\omega|} \sum I_{i0} I_{i2} - \mu_{k0} \mu_{k2}) = \frac{1}{|\omega|} \sum p_i I_{i0} - p_k \mu_{k0} \\[4ex] a_{k0} (\frac{1}{|\omega|} \sum I_{i0} I_{i1} - \mu_{k0} \mu_{k1}) + a_{k1} (\frac{1}{|\omega|} \sum I_{i1}^2 - \mu_{k0}^2 + \epsilon) + a_{k2} (\frac{1}{|\omega|} \sum I_{i1} I_{i2} - \mu_{k1} \mu_{k2}) = \frac{1}{|\omega|} \sum p_i I_{i1} - p_k \mu_{k1} \\[4ex] a_{k0} (\frac{1}{|\omega|} \sum I_{i0} I_{i2} - \mu_{k0} \mu_{k2}) + a_{k1} (\frac{1}{|\omega|} \sum I_{i1} I_{i2} - \mu_{k1} \mu_{k2}) + a_{k2} (\frac{1}{|\omega|} \sum I_{i2}^2 - \mu_{k2}^2 + \epsilon) = \frac{1}{|\omega|} \sum p_i I_{i2} - p_k \mu_{k2} ak0(ω1Ii02μk02+ϵ)+ak1(ω1Ii0Ii1μk0μk1)+ak2(ω1Ii0Ii2μk0μk2)=ω1piIi0pkμk0ak0(ω1Ii0Ii1μk0μk1)+ak1(ω1Ii12μk02+ϵ)+ak2(ω1Ii1Ii2μk1μk2)=ω1piIi1pkμk1ak0(ω1Ii0Ii2μk0μk2)+ak1(ω1Ii1Ii2μk1μk2)+ak2(ω1Ii22μk22+ϵ)=ω1piIi2pkμk2
上面 a k a_k ak相关的系数都是方差或者协方差,记:
σ k m n = σ k n m = 1 ∣ ω ∣ ∑ I i m I i n − μ k m μ k n \sigma_{k}^{mn} = \sigma_{k}^{nm} = \frac{1}{|\omega|} \sum I_{im} I_{in} - \mu_{km} \mu_{kn} σkmn=σknm=ω1IimIinμkmμkn
(上式的相关推导可以在上面翻翻看)
那么上面线性方程组可以进一步写为:
[ σ k 00 + ϵ σ k 01 σ k 02 σ k 10 σ k 11 + ϵ σ k 12 σ k 20 σ k 21 σ k 22 + ϵ ] [ a k 0 a k 1 a k 2 ] = [ 1 ∣ ω ∣ ∑ p i I i 0 − p k μ k 0 1 ∣ ω ∣ ∑ p i I i 1 − p k μ k 1 1 ∣ ω ∣ ∑ p i I i 2 − p k μ k 2 ] \begin{bmatrix} \sigma_{k}^{00} + \epsilon & \sigma_{k}^{01} & \sigma_{k}^{02} \\ \sigma_{k}^{10} & \sigma_{k}^{11} + \epsilon & \sigma_{k}^{12} \\ \sigma_{k}^{20} & \sigma_{k}^{21} & \sigma_{k}^{22} + \epsilon \\ \end{bmatrix} \begin{bmatrix} a_{k0} \\ a_{k1} \\ a_{k2} \\ \end{bmatrix} = \begin{bmatrix} \frac{1}{|\omega|} \sum p_i I_{i0} - p_k \mu_{k0} \\ \frac{1}{|\omega|} \sum p_i I_{i1} - p_k \mu_{k1} \\ \frac{1}{|\omega|} \sum p_i I_{i2} - p_k \mu_{k2} \\ \end{bmatrix} σk00+ϵσk10σk20σk01σk11+ϵσk21σk02σk12σk22+ϵ ak0ak1ak2 = ω1piIi0pkμk0ω1piIi1pkμk1ω1piIi2pkμk2
求解方法:
[ a k 0 a k 1 a k 2 ] = [ σ k 00 + ϵ σ k 01 σ k 02 σ k 10 σ k 11 + ϵ σ k 12 σ k 20 σ k 21 σ k 22 + ϵ ] − 1 [ σ I p 0 σ I p 1 σ I p 2 ] (4) \begin{bmatrix} a_{k0} \\ a_{k1} \\ a_{k2} \\ \end{bmatrix} = \begin{bmatrix} \sigma_{k}^{00} + \epsilon & \sigma_{k}^{01} & \sigma_{k}^{02} \\ \sigma_{k}^{10} & \sigma_{k}^{11} + \epsilon & \sigma_{k}^{12} \\ \sigma_{k}^{20} & \sigma_{k}^{21} & \sigma_{k}^{22} + \epsilon \\ \end{bmatrix} ^{-1} \begin{bmatrix} \sigma_{Ip0} \\ \sigma_{Ip1} \\ \sigma_{Ip2} \\ \end{bmatrix} \tag{4} ak0ak1ak2 = σk00+ϵσk10σk20σk01σk11+ϵσk21σk02σk12σk22+ϵ 1 σIp0σIp1σIp2 (4)
公式(4)中的 σ I p 0 , σ I p 1 , σ I p 2 \sigma_{Ip0},\sigma_{Ip1},\sigma_{Ip2} σIp0,σIp1,σIp2请自行与前面公式对应起来看。
由于3x3矩阵的求逆公式比较容易手写,所以可以进一步简化,采用伴随矩阵的求逆方式。
A − 1 = a d j ( A ) d e t ( A ) A^{-1} = \frac {adj(A)} {det(A)} A1=det(A)adj(A)
上式中 a d j ( A ) adj(A) adj(A)是A的伴随矩阵, d e t ( A ) det(A) det(A)是A的行列式。
3x3矩阵的行列式为:
d e t ( a 00 a 01 a 02 a 10 a 11 a 12 a 20 a 21 a 22 ) = ∣ a 00 a 01 a 02 a 10 a 11 a 12 a 20 a 21 a 22 ∣ = a 00 a 11 a 22 + a 10 a 21 a 02 + a 20 a 01 a 12 − a 00 a 12 a 21 − a 01 a 10 a 22 − a 02 a 11 a 20 det \left ( \begin{matrix} a_{00} & a_{01} & a_{02} \\ a_{10} & a_{11} & a_{12} \\ a_{20} & a_{21} & a_{22} \\ \end{matrix} \right ) = \left | \begin{matrix} a_{00} & a_{01} & a_{02} \\ a_{10} & a_{11} & a_{12} \\ a_{20} & a_{21} & a_{22} \\ \end{matrix} \right | = a_{00}a_{11}a_{22} + a_{10}a_{21}a_{02} + a_{20}a_{01}a_{12} - a_{00}a_{12}a_{21} - a_{01}a_{10}a_{22} - a_{02}a_{11}a_{20} det a00a10a20a01a11a21a02a12a22 = a00a10a20a01a11a21a02a12a22 =a00a11a22+a10a21a02+a20a01a12a00a12a21a01a10a22a02a11a20
3x3矩阵的伴随矩阵等于代数余子矩阵的转置:
a d j ( a 00 a 01 a 02 a 10 a 11 a 12 a 20 a 21 a 22 ) = [ + ∣ a 11 a 12 a 21 a 22 ∣ − ∣ a 01 a 02 a 21 a 22 ∣ + ∣ a 01 a 02 a 11 a 12 ∣ − ∣ a 10 a 12 a 20 a 22 ∣ + ∣ a 00 a 02 a 20 a 22 ∣ − ∣ a 00 a 02 a 10 a 12 ∣ + ∣ a 10 a 11 a 20 a 21 ∣ − ∣ a 00 a 01 a 20 a 21 ∣ + ∣ a 00 a 01 a 10 a 11 ∣ ] = [ a 11 a 22 − a 12 a 21 a 02 a 21 − a 01 a 22 a 01 a 12 − a 02 a 11 a 12 a 20 − a 10 a 22 a 00 a 22 − a 02 a 20 a 02 a 10 − a 00 a 12 a 10 a 21 − a 11 a 20 a 01 a 20 − a 00 a 21 a 00 a 11 − a 10 a 01 ] adj \left ( \begin{matrix} a_{00} & a_{01} & a_{02} \\ a_{10} & a_{11} & a_{12} \\ a_{20} & a_{21} & a_{22} \\ \end{matrix} \right ) = \begin{bmatrix} +\left | \begin{matrix} a_{11} & a_{12} \\ a_{21} & a_{22} \\ \end{matrix} \right | & -\left | \begin{matrix} a_{01} & a_{02} \\ a_{21} & a_{22} \\ \end{matrix} \right | & +\left | \begin{matrix} a_{01} & a_{02} \\ a_{11} & a_{12} \\ \end{matrix} \right | \\[4ex] -\left | \begin{matrix} a_{10} & a_{12} \\ a_{20} & a_{22} \\ \end{matrix} \right | & +\left | \begin{matrix} a_{00} & a_{02} \\ a_{20} & a_{22} \\ \end{matrix} \right | & -\left | \begin{matrix} a_{00} & a_{02} \\ a_{10} & a_{12} \\ \end{matrix} \right | \\[4ex] +\left | \begin{matrix} a_{10} & a_{11} \\ a_{20} & a_{21} \\ \end{matrix} \right | & -\left | \begin{matrix} a_{00} & a_{01} \\ a_{20} & a_{21} \\ \end{matrix} \right | & +\left | \begin{matrix} a_{00} & a_{01} \\ a_{10} & a_{11} \\ \end{matrix} \right | \\ \end{bmatrix} = \begin{bmatrix} a_{11}a_{22} - a_{12}a_{21} & a_{02}a_{21} - a_{01}a_{22} & a_{01}a_{12} - a_{02}a_{11} \\ a_{12}a_{20} - a_{10}a_{22} & a_{00}a_{22} - a_{02}a_{20} & a_{02}a_{10} - a_{00}a_{12} \\ a_{10}a_{21} - a_{11}a_{20} & a_{01}a_{20} - a_{00}a_{21} & a_{00}a_{11} - a_{10}a_{01} \end{bmatrix} adj a00a10a20a01a11a21a02a12a22 = + a11a21a12a22 a10a20a12a22 + a10a20a11a21 a01a21a02a22 + a00a20a02a22 a00a20a01a21 + a01a11a02a12 a00a10a02a12 + a00a10a01a11 = a11a22a12a21a12a20a10a22a10a21a11a20a02a21a01a22a00a22a02a20a01a20a00a21a01a12a02a11a02a10a00a12a00a11a10a01
现在把公式(4)中矩阵求逆的部分展开写一下,注意:

  • 上标数字改为用下标,原来的下标k省略不写。
  • 3x3矩阵是个对称矩阵,所以只用求6个值即可。
  • 为了看着清爽,暂时省略掉 ϵ \epsilon ϵ
    伴随矩阵的值:
    a d j 00 = σ 11 σ 22 − σ 12 σ 12 a d j 11 = σ 00 σ 22 − σ 02 σ 02 a d j 22 = σ 00 σ 11 − σ 01 σ 01 a d j 01 = σ 02 σ 12 − σ 01 σ 22 a d j 02 = σ 01 σ 12 − σ 02 σ 11 a d j 12 = σ 02 σ 01 − σ 00 σ 12 (5) \begin{aligned} adj_{00} = \sigma_{11} \sigma_{22} - \sigma_{12} \sigma_{12} \\[2ex] adj_{11} = \sigma_{00} \sigma_{22} - \sigma_{02} \sigma_{02} \\[2ex] adj_{22} = \sigma_{00} \sigma_{11} - \sigma_{01} \sigma_{01} \\[2ex] adj_{01} = \sigma_{02} \sigma_{12} - \sigma_{01} \sigma_{22} \\[2ex] adj_{02} = \sigma_{01} \sigma_{12} - \sigma_{02} \sigma_{11} \\[2ex] adj_{12} = \sigma_{02} \sigma_{01} - \sigma_{00} \sigma_{12} \end{aligned} \tag{5} adj00=σ11σ22σ12σ12adj11=σ00σ22σ02σ02adj22=σ00σ11σ01σ01adj01=σ02σ12σ01σ22adj02=σ01σ12σ02σ11adj12=σ02σ01σ00σ12(5)
    行列式的值为:
    d e t = σ 00 σ 11 σ 22 + σ 01 σ 12 σ 02 + σ 02 σ 01 σ 12 − σ 00 σ 12 σ 12 − σ 01 σ 01 σ 22 − σ 02 σ 02 σ 11 = σ 00 ( σ 11 σ 22 − σ 12 σ 12 ) + σ 01 ( σ 12 σ 02 − σ 01 σ 22 ) + σ 02 ( σ 01 σ 12 − σ 02 σ 11 ) = σ 00 ∗ a d j 00 + σ 01 ∗ a d j 01 + σ 02 ∗ a d j 02 (6) \begin{aligned} det &= \sigma_{00}\sigma_{11}\sigma_{22} + \sigma_{01}\sigma_{12}\sigma_{02} + \sigma_{02}\sigma_{01}\sigma_{12} - \sigma_{00}\sigma_{12}\sigma_{12} - \sigma_{01}\sigma_{01}\sigma_{22} - \sigma_{02}\sigma_{02}\sigma_{11} \\[2ex] &= \sigma_{00}(\sigma_{11}\sigma_{22} - \sigma_{12}\sigma_{12}) + \sigma_{01}(\sigma_{12}\sigma_{02} - \sigma_{01}\sigma_{22}) + \sigma_{02}(\sigma_{01}\sigma_{12} - \sigma_{02}\sigma_{11}) \\[2ex] &=\sigma_{00}*adj_{00} + \sigma_{01}*adj_{01} + \sigma_{02}*adj_{02} \end{aligned} \tag{6} det=σ00σ11σ22+σ01σ12σ02+σ02σ01σ12σ00σ12σ12σ01σ01σ22σ02σ02σ11=σ00(σ11σ22σ12σ12)+σ01(σ12σ02σ01σ22)+σ02(σ01σ12σ02σ11)=σ00adj00+σ01adj01+σ02adj02(6)
    逆矩阵的值:
    i n v 00 = a d j 00 / d e t i n v 11 = a d j 11 / d e t i n v 22 = a d j 22 / d e t i n v 01 = a d j 01 / d e t i n v 02 = a d j 02 / d e t i n v 12 = a d j 12 / d e t (7) \begin{aligned} inv_{00} = adj_{00} / det \\ inv_{11} = adj_{11} / det \\ inv_{22} = adj_{22} / det \\ inv_{01} = adj_{01} / det \\ inv_{02} = adj_{02} / det \\ inv_{12} = adj_{12} / det \end{aligned} \tag{7} inv00=adj00/detinv11=adj11/detinv22=adj22/detinv01=adj01/detinv02=adj02/detinv12=adj12/det(7)
    注意在写程序的时候 a d j x x adj_{xx} adjxx这个变量就不用再创建了,直接使用 i n v x x inv_{xx} invxx即可。
    然后需要再把 a k 0 , a k 1 , a k 2 , b k a_{k0},a_{k1},a_{k2},b_k ak0,ak1,ak2,bk的计算公式根据已经计算出来的值再写一下。
    a k 0 = i n v 00 ∗ σ I p 0 + i n v 01 ∗ σ I p 1 + i n v 02 ∗ σ I p 2 a k 1 = i n v 01 ∗ σ I p 0 + i n v 11 ∗ σ I p 1 + i n v 12 ∗ σ I p 2 a k 2 = i n v 02 ∗ σ I p 0 + i n v 12 ∗ σ I p 1 + i n v 22 ∗ σ I p 2 b k = p k − a k 0 μ k 0 − a k 1 μ k 1 − a k 2 μ k 2 (8) \begin{aligned} a_{k0} &= inv_{00}*\sigma_{Ip0} + inv_{01}*\sigma_{Ip1} + inv_{02}*\sigma_{Ip2} \\[2ex] a_{k1} &= inv_{01}*\sigma_{Ip0} + inv_{11}*\sigma_{Ip1} + inv_{12}*\sigma_{Ip2} \\[2ex] a_{k2} &= inv_{02}*\sigma_{Ip0} + inv_{12}*\sigma_{Ip1} + inv_{22}*\sigma_{Ip2} \\[2ex] b_k &= p_k - a_{k0} \mu_{k0} - a_{k1} \mu_{k1} - a_{k2} \mu_{k2} \end{aligned} \tag{8} ak0ak1ak2bk=inv00σIp0+inv01σIp1+inv02σIp2=inv01σIp0+inv11σIp1+inv12σIp2=inv02σIp0+inv12σIp1+inv22σIp2=pkak0μk0ak1μk1ak2μk2(8)
    最后需要对 a k 0 , a k 1 , a k 2 , b k a_{k0},a_{k1},a_{k2},b_k ak0,ak1,ak2,bk再做个平均,真正的滤波结果为:
    q i = 1 ∣ ω ∣ ∑ k ∈ ω i a k 0 I i 0 + 1 ∣ ω ∣ ∑ k ∈ ω i a k 1 I i 1 + 1 ∣ ω ∣ ∑ k ∈ ω i a k 1 I i 1 + 1 ∣ ω ∣ ∑ k ∈ ω i b k (9) q_i =\frac{1}{|\omega|} \sum_{k\in\omega_i}a_{k0} I_{i0} + \frac{1}{|\omega|} \sum_{k\in\omega_i}a_{k1} I_{i1} + \frac{1}{|\omega|} \sum_{k\in\omega_i}a_{k1} I_{i1} + \frac{1}{|\omega|} \sum_{k\in\omega_i}b_k \tag{9} qi=ω1kωiak0Ii0+ω1kωiak1Ii1+ω1kωiak1Ii1+ω1kωibk(9)
    公式(5)-(9)就是完整的计算流程。中间有一些替换性的式子,需要在字里行间自行寻找。

输入图多通道,引导图多通道

仍然是使用引导图对输入图的每个通道分别滤波即可。

算法流程

文章中的算法流程如下,其中点乘.* 表示element-wise乘法,fmean表示boxfilter。
最后说明一下fast的意思:何恺明同学在提出guidedfilter后不久,又发现在计算线性模型参数 a k , b k a_k,b_k ak,bk时候,使用下采样后的图像可以,不会带来明显的画质损失。下采样后可以大量减少boxfilter的计算消耗,所以就快了很多。
在这里插入图片描述

代码和示例

博客字数超了,另起一篇,参考:
https://blog.csdn.net/bby1987/article/details/128225408

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值