前言:最近在做一个图像的作业, 要求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
互相关和卷积名词误用
互相关(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, 非常形象,第一行红色曲线为滤波后;白色为原图。(想象成图片的横切面,高度为图像的亮度/像素值)