基本去噪滤波器存在的问题:各向同性滤波,比如box filter/Gaussian filter。这类滤波器在能够平滑噪声的影响的同时,也会抹去一些细节,减弱edge在图片中的表现。有时我们需要保留edge的feature,因此有一些人对edge persevering滤波进行研究。最常见的bilateral filter,效果不错,有空可以深入看一看。Guided filter同样是一种保留边缘的滤波器。
Guide filter从命名的方法就可以看出除了需要输入图片外,还需要一个guide image(导向图)。导向图 ![[公式]](https://www.zhihu.com/equation?tex=I) 可以是一副单独的图像,也可以是需要处理的输入图像 ![[公式]](https://www.zhihu.com/equation?tex=p) .当引导图像就是 ![[公式]](https://www.zhihu.com/equation?tex=p) 本身的时候,导向滤波就变成了一个Edge-perserving的滤波器
输入需要处理的图片 ![[公式]](https://www.zhihu.com/equation?tex=p) ,导向图 ![[公式]](https://www.zhihu.com/equation?tex=I) ,滤波输出结果 ![[公式]](https://www.zhihu.com/equation?tex=q) 。
![[公式]](https://www.zhihu.com/equation?tex=q_i%3D%5Csum_jW_%7Bij%7D%28I%29p_j)
filter kernel ![[公式]](https://www.zhihu.com/equation?tex=W_%7Bij%7D) 是导向图 ![[公式]](https://www.zhihu.com/equation?tex=I) 的函数,与 ![[公式]](https://www.zhihu.com/equation?tex=p) 无关。
定义:
令导向滤波器是导向图 ![[公式]](https://www.zhihu.com/equation?tex=I) 和滤波输出 ![[公式]](https://www.zhihu.com/equation?tex=q) 的局部线性模型。
导引图像与q之间存在线性关系,这样设定是因为我们希望导引图像提供的是信息主要用于指示哪些是边缘哪些是区域,所以在滤波时,如果导引图告诉我们这里是区域,那么就将其磨平。如果导引图告诉我们这里是边缘,这在最终的滤波结果里就要设法保留这些边缘信息。只有当I和q之间是线性关系的这种引导关系才有意义。 原文链接:https://blog.csdn.net/baimafujinji/article/details/74750283
假定 ![[公式]](https://www.zhihu.com/equation?tex=q) 是导向图 ![[公式]](https://www.zhihu.com/equation?tex=I) 在窗口内的线性变换(q is a linear transform of I in a window ![[公式]](https://www.zhihu.com/equation?tex=w_k) centered at pixel k)
![[公式]](https://www.zhihu.com/equation?tex=q_i+%3D+a_kI_i%2Bb_k%2C%5Cspace+i%5Cin+w_k)
![[公式]](https://www.zhihu.com/equation?tex=a_k%2C%5Cspace+b_k) 假定在窗口 ![[公式]](https://www.zhihu.com/equation?tex=w_k) 中是常值。
通过求梯度运算可以看到 ![[公式]](https://www.zhihu.com/equation?tex=%5Cnabla+q%3D+a%5Cnabla+I) ,当导向图存在edge时,输出图也保留了edge。可以看到这里一定要用线性模型才能保留相应的匹配关系。利用优化和回归的思想来求解 ![[公式]](https://www.zhihu.com/equation?tex=q_i) ,定义cost function,这里利用岭回归的办法。在cost function中加入对参数大小作正则项,防止过拟合。
计算目标是使 ![[公式]](https://www.zhihu.com/equation?tex=E%28a_k%2Cb_k%29) 最小的参数 ![[公式]](https://www.zhihu.com/equation?tex=a_k%2Cb_k) 。推到过程和最小二乘类似【我没推】,可以得到
其中 ![[公式]](https://www.zhihu.com/equation?tex=u_k%2C+%5Csigma_k%5E2) 是 ![[公式]](https://www.zhihu.com/equation?tex=I) 在 ![[公式]](https://www.zhihu.com/equation?tex=w_k) 的均值和方差。 ![[公式]](https://www.zhihu.com/equation?tex=%5Chat%7Bp%7D_k) 是 ![[公式]](https://www.zhihu.com/equation?tex=p) 在 ![[公式]](https://www.zhihu.com/equation?tex=w_k) 的均值, ![[公式]](https://www.zhihu.com/equation?tex=cov_k) 是在区间 ![[公式]](https://www.zhihu.com/equation?tex=w_k) 中的协方差。可以按window遍历图片,计算每一个window内的 ![[公式]](https://www.zhihu.com/equation?tex=a_k+%2C+b_k) 。但是由于每个pixel可能被多个window包含,从而导致算了很多遍 ![[公式]](https://www.zhihu.com/equation?tex=q_i) ,因此一个简单的办法是对所有计算得到的 ![[公式]](https://www.zhihu.com/equation?tex=q_i) 取平均值。【然而实际操作过程中,这种按window遍历的方法太low了,实现的时候都是整张图片操作的】
算法流程如下:
基于MATLAB的算法(这个已经被写入matlab的function了)原代码
function q = guidedfilter(I, p, r, eps)
% - guidance image: I (should be a gray-scale/single channel image)
% - filtering input image: p (should be a gray-scale/single channel image)
% - local window radius: r
% - regularization parameter: eps
[hei, wid] = size(I);
N = boxfilter(ones(hei, wid), r);
mean_I = boxfilter(I, r) ./ N;
mean_p = boxfilter(p, r) ./ N;
mean_Ip = boxfilter(I.*p, r) ./ N;
% this is the covariance of (I, p) in each local patch.
cov_Ip = mean_Ip - mean_I .* mean_p;
mean_II = boxfilter(I.*I, r) ./ N;
var_I = mean_II - mean_I .* mean_I;
a = cov_Ip ./ (var_I + eps);
b = mean_p - a .* mean_I;
mean_a = boxfilter(a, r) ./ N;
mean_b = boxfilter(b, r) ./ N;
q = mean_a .* I + mean_b;
end
这里需要略作解释的地方是函数boxfilter,它是基于积分图算法实现的Box Filter。
A =
1 1 1
1 1 1
1 1 1
>> B = boxfilter(A, 1);
>> B
B =
4 6 4
6 9 6
4 6 4
从上述代码可以看到,当参数r=1时,此时的滤波器窗口是3×3。将这样大小的一个窗口扣在原矩阵中心,刚好可以覆盖所有矩阵,此时求和为9,即把窗口里覆盖到的值全部加和。此外当把窗口中心挪动到左上角的像素时,因为窗口覆盖区域里只有4个数字,所以结果为4。所以你可以看出这里的Box Filter只是做了求和处理,并没有归一化,所以并不是真正的均值滤波(简单平滑)。必须结合后面的一句
mean_I = boxfilter(I, r) ./ N;
才算是完成了均值滤波。[参见reference1]。
对实现作用效果简单分析,当 ![[公式]](https://www.zhihu.com/equation?tex=I%3Dp) 时, ![[公式]](https://www.zhihu.com/equation?tex=a_k%2C+b_k) 就会退化为
1)当方差比较大的区域,比如edge区域,有 ![[公式]](https://www.zhihu.com/equation?tex=%5Csigma%5E2_k%3E%3E%5Cvarepsilon) ,此时 ![[公式]](https://www.zhihu.com/equation?tex=a_k%5Csimeq1%2Cb_k%5Csimeq0) ,此时 ![[公式]](https://www.zhihu.com/equation?tex=q%3DI)
2) 对方差比较小的区域,有 ![[公式]](https://www.zhihu.com/equation?tex=%5Csigma%5E2_k%3C%3C%5Cepsilon) ,,此时 ![[公式]](https://www.zhihu.com/equation?tex=a_k%5Csimeq0+%2Cb_k%5Csimeq+u_k) , ![[公式]](https://www.zhihu.com/equation?tex=q%3Du_k) ,输出均值。实现初衷。
这里想了一下,图像去噪和线性回归有什么关系,大脑愚钝。
线性回归是依据数据点 ![[公式]](https://www.zhihu.com/equation?tex=%28x_i%2Cy_i%29) ,拟合直线 ![[公式]](https://www.zhihu.com/equation?tex=ax_i%2Bb) ,使得误差 ![[公式]](https://www.zhihu.com/equation?tex=y_i-%28ax_i%2Bb%29) 最小。求解办法是计算误差的二次型函数 ![[公式]](https://www.zhihu.com/equation?tex=J%3D%28y_i-%28ax_i%2Bb%29%29%5E2) ,然后对参数求导得到取参数最小值 ![[公式]](https://www.zhihu.com/equation?tex=argmin_%7Ba%2Cb%7D%28J%29) ,计算得到结果就是满足误差最小的解。
图像去噪问题是,已知包含噪声的图片 ![[公式]](https://www.zhihu.com/equation?tex=p) ,求解原图![[公式]](https://www.zhihu.com/equation?tex=q) 的过程。 ![[公式]](https://www.zhihu.com/equation?tex=p%3Dq%2Bn) ,其中 ![[公式]](https://www.zhihu.com/equation?tex=n) 表示噪声, ![[公式]](https://www.zhihu.com/equation?tex=q) 表示不含噪声的原图。求解目标是 ![[公式]](https://www.zhihu.com/equation?tex=q) ,优化目标是尽可能减小噪声 ![[公式]](https://www.zhihu.com/equation?tex=n) ,所以目标函数 ![[公式]](https://www.zhihu.com/equation?tex=%5Cmin%7C%7Cp_i-q_i%7C%7C%5E2%3D%5Cmin+%7C%7Cn%7C%7C%5E2) ,那么基于这个优化目标的条件下,求得到的解就是 ![[公式]](https://www.zhihu.com/equation?tex=%5Cmin%7C%7Cp_i-q_i%7C%7C+) ,就是噪声最小的解。这就是解决图片去噪的手段。
补充上关于线性回归(岭回归的数学推导)
对于
1)上式的求和范围是window内,看着有点不爽,假设window内像素个数为 ![[公式]](https://www.zhihu.com/equation?tex=N) ,就可以将求和范围调整成 ![[公式]](https://www.zhihu.com/equation?tex=%5Csum_N+) ,看着比较习惯。线性回归的思路是对每个回归参数求偏导数,所以对(1)分别对 ![[公式]](https://www.zhihu.com/equation?tex=a_k) , ![[公式]](https://www.zhihu.com/equation?tex=b_k) 求偏导数:
求最小值的办法即令偏导数为0,因为(2)比较简单,因此先分析(3)可以得到
其中 ![[公式]](https://www.zhihu.com/equation?tex=p_k) , ![[公式]](https://www.zhihu.com/equation?tex=u_k) 分别为window内的均值。
【根据】
可将(5)式整理为
即为所得。