前言:最近在做一个图像的作业, 要求python实现双边滤波和引导双边滤波。
可以使用opencv,numpy。不能用opecv增强库(ximageproc之类的就用不了啦),
这里记录一下学习心得。主要是直觉上地介绍各个滤波器,后面有空再更代码细节。

ps. 查资料过程中,最无法理解的一个概念是都说双边滤波的弊端:梯度反转 (gradient reveral ) 。但是找了很多文章和问答都没看到解释清楚的答案,最后还是无奈找到何凯文大神的会议PPT,似乎看懂了一点。后面会介绍。

图像滤波系列

  • 高斯滤波 Guassion Filter
    • 图像滤波器/卷积核
      • 互相关和卷积名词误用
    • 高斯函数
      • 缺点
  • 双边滤波 Bilateral Filter
      • 空间高斯分布和颜色高斯分布
  • 联合双边滤波 Joint Bilateral Filter
  • 引导滤波 Guidance Filter
      • 解决梯度反转问题

高斯滤波 Guassion Filter

高斯滤波,涉及两个概念:图像滤波 + 高斯函数。

图像滤波器/卷积核

参考链接:https://spatial-lang.org/conv
correlation vs convolution

滤波操作:
蓝色格子 – 原图,虚线格子 – padding, 绿色格子 – 结果图
图像滤波【一】:从高斯滤波到引导滤波-编程知识网

互相关和卷积名词误用

互相关(cross-correlation) 和 卷积(convolution),这俩概念其实最早是用在信号处理的,处理一维信号。图像是二维的,也是一维信号的延伸。
图像滤波: “卷积核” 对图像执行“卷积”操作。从而得到想要的效果:平滑,锐化,去噪等等。
为什么给“卷积”打上引号呢,现在的图像滤波算法对卷积核的定义其实是“correlation(相关)” 而不是“convolution(卷积)” 。

  • Correlation :
    过滤器(kernel)在图像上移动并计算每个位置的乘积总和的过程。
  • Convolution:
    先将过滤器翻转180度,然后执行Correlation。

这两个操作区别只在于核是否先翻转自己。那么它们之间到底有什么不同(物理意义)。

先一句话总结:在单位像素下,互相关(correlation) 之后只能得到一个 kernel 翻转副本,而卷积(convolution) 能保留 kernel 的原始副本。

看下面两张图:
(a)和 w 互相关得到的是滤波器 w 的 180度翻转(e)
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
先翻转 w,之后correlation,最终得到了和 w 一样的值(h)。:
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
图源 correlation vs convolution

至于为什么大家混淆了这两者之间的概念,却也习以为常,我个人认为是因为“问题不大”,卷积核翻转对称的情况很多,比如下面

从左至右:中值滤波,边缘滤波,边缘滤波,图像锐化
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
图源: slides from CSCI5210 CS CUHK Chi-Wing FU,Philip

卷积在神经网络里面用的也非常多,但其实都是correlation。传统的图像处理需要人工选择滤波器,CNN则是全靠机器自己【找出】适合的卷积核,训练过程中只需要指定核的大小,所以先翻转再相关,等于是脱了裤子放屁。

高斯函数

高斯滤波: 卷积核换成高斯分布离散采样后的值
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
三维空间,看起来像一座山,高斯核的权重包含的是「空间信息」。意味着离中心点越远的像素点权重越低。
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
图源: slides from CSCI5210 CS CUHK Chi-Wing FU,Philip

缺点

高斯滤波能起到很好的平滑效果,但是有一个严重的缺点,它在滤波时会把图像的所有点,包括噪点(需要去除)、边缘(需要保留),一视同仁。它关心的只有「空间信息」。
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
图源: slides from CSCI5210 CS CUHK Chi-Wing FU,Philip

双边滤波 Bilateral Filter

为了解决高斯滤波导致滤波后图像边缘模糊的问题。
双边滤波诞生了。

双边滤波除了关心空间信息,还关心【像素差】,想象一下,如果图像存在边缘(edge),那么是否说明在边缘的两个方向,存在像素的【梯度变化】?
如下图:
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
卷积核不再是统一的【空间】高斯分布,而是在与中心点像素值接近的地方接近于【空间】高斯分布,在与中心点像素差较大的地方接近于【颜色】高斯分布。

空间高斯分布和颜色高斯分布

对比高斯滤波
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
双边滤波增加了一项【颜色高斯】和一项【权重】图像滤波【一】:从高斯滤波到引导滤波-编程知识网

联合双边滤波 Joint Bilateral Filter

联合双边滤波最早是为了解决「具有闪光和无闪光图像对的数码摄影」问题
论文:【Digital Photography with Flash and No-Flash Image Pairs】
提出问题:开了闪光灯的照片会失去细节(曝光过渡);不开闪光灯会有很多噪点:
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
图源论文
作者结合两张图片的优点,提出了联合双边滤波:
图像滤波【一】:从高斯滤波到引导滤波-编程知识网

引导滤波 Guidance Filter

有空再更…

论文: https://arxiv.org/pdf/1801.06928.pdf
PPT:http://kaiminghe.com/eccv10/eccv10ppt.pdf

先放张何恺明大神的图
图像滤波【一】:从高斯滤波到引导滤波-编程知识网
图像滤波【一】:从高斯滤波到引导滤波-编程知识网

引导滤波的贡献:

  • 消除了梯度翻转
  • 让双边滤波处理速度变成了O(1)却不需要近似处理(图片不会失真)

解决梯度反转问题

图解图像滤波【一】:从高斯滤波到引导滤波-编程知识网
我一直不理解,到底为什么都说双边滤波有梯度翻转(gradient reversal)的问题?因为在我看来,滤波器再怎么滤,也不会让边缘的像素出现峰值。我的脑子想象不到…

后来才明白其实不是滤波后的图像出现梯度翻转。
而是在利用双边滤波进行图片【细节增强】(Detail Enhancement) 的时候发生的!

【原图】 -> 【双边滤波】 -> 【原图 – 双边滤波 = 细节】 -> 【原图 + 细节 * n】 = 【带有梯度反转的增强图】

这张图是当时论文会议的PPT, 非常形象,第一行红色曲线为滤波后;白色为原图。(想象成图片的横切面,高度为图像的亮度/像素值)
图像滤波【一】:从高斯滤波到引导滤波-编程知识网