2.bilateral filter
其filter kernel的值不仅仅与距离有关,还与image的值有关。
对于Gaussian kernel,其值如下
而对于值域核,其值与两个像素之间的相似度有关:
在图像明显的边缘区域,其值域kernel如下:(值域kenel在平滑区域近似为1,在边缘区域用)
最终kernel的结果为空间域kernel(guassian)*值域kenerl(值域kenel在平滑区域近似为1,在边缘区域用)
代码:cv2.bilateralFilter
源码:参考https://blog.csdn.net/flow_specter/article/details/107557303
与gaussian filter的比较
3.联合双边滤波(joint bilateral filter)
值域的权重是从引导图像中获得,而不是待滤波图像
4.guided filter
参考文章:Guided Image Filtering
(1)理论:
a) 我们希望输出图像q和引导图像I有着相同的梯度变化。即引导图像I有边缘时,输出图像q也有边缘
b) 我们希望输出图像q和输入图像p的差异越小越好
c)根据前面两个约束,构建能量函数E,并通过让能量函数E最小化得到相应的参数。
即guided filter是通过最优化理论,最小化能量函数,得到最后的输出q的
(2)计算方式
code:输入图像Psub,引导图像Isub,guided filter后的输出图像q
120 #Isub的shape为276*276
121 (rows, cols) = Isub.shape
122 123 "box的作用是利用滑动窗口的方式,依次获得(2*r+1)*(2*r+1)窗口范围的值的和,
124 r=8时,即获得17*17个像素的和;输出数组的shape和输入的数组的shape一致"
125 N = box(np.ones([rows, cols]), r)
126
127 #根据公式7 8 9 10,计算相应的值
128 meanI = box(Isub, r) / N
129 meanP = box(Psub, r) / N
130 corrI = box(Isub * Isub, r) / N
131 corrIp = box(Isub * Psub, r) / N
132 varI = corrI - meanI * meanI
133 covIp = corrIp - meanI * meanP
134
135 a = covIp / (varI + eps)
136 b = meanP - a * meanI
137
138 meanA = box(a, r) / N
139 meanB = box(b, r) / N
140
141 if s is not None:
142 ? meanA = sp.ndimage.zoom(meanA, s, order=1)
143 ? meanB = sp.ndimage.zoom(meanB, s, order=1)
144
145 q = meanA * I + meanB
146 return q
(3)guided fileter无梯度翻转问题,而bilateral filter存在梯度翻转问题
(4)相关应用
可以用于mask的优化
图像上色
(5)弊端
有时候边缘会过度平滑