4. 数码相机内的图像处理-更多图像滤波

2020-04-17 15:33:16 浏览数 (1)

在上一篇,我重点介绍了线性移不变滤波器,并且提到了这些滤波器可以用卷积来实现,其中:

  • 线性,是指最终生成的像素值是由邻域像素值线性混合而成
  • 移不变,是指不管对于哪个坐标的像素,其线性混合的系数都是一致的,不会因为像素坐标的变化而变化

这一篇我首先会延续上一篇的内容,介绍线性移不变滤波器的一种用法,即模板匹配。然后会通过放开上述两个约束条件,来介绍更多的滤波器。

一. 模板匹配

让我们回忆下,如何用线性移不变滤波器来检测图像的边缘?

一维水平和垂直边缘滤波器

可以看看上面这张图,很明显我们用特别的滤波核与原图进行卷积就可以得到边缘。而且很容易看出,滤波核的内容和最终检测出来的边缘的特点高度一致。

这给了我们一个启发,即线性滤波器是一种衡量滤波模板和局部图像的相似度的一种手段。那么是否可以将它的应用推广呢?例如,是否可以用这个思想来检测下图中爱因斯坦的眼睛呢?

先看看最基本的方案,直接用眼睛局部图像作为模板来卷积源图像:

方案一

这会得到什么结果呢?也许你会认为,因为线性滤波器是在衡量模板与局部图像的相似度,那么上图中双眼处会有很高的相速度,因此结果图中双眼处很亮,其他地方会很暗。然后实际上的结果却是下面这样:

很明显,不仅眼睛处的响应比较高,胸前衬衫处也得到了很高的响应,我们没有达到找到眼睛的目的。观察上述公式,可以知道输出结果是跟图像的局部区域的像素值正相关的,衬衫很白,像素值很大,最终的响应值也自然很大。

因此这给了我们一个启发:输出值不能跟原始像素的绝对值相关。为此,可以采用下面的方案:

方案二

此方案会先减去图像的均值,再用结果图与模板进行卷积。它的结果比方案一好,能检测出一只眼睛,但也会引入错误,依然有部分领口的衬衫被错误的当成眼睛检测出来了。可见这种方案还不够鲁棒。

第三种方案是直接用均方差来衡量局部图像和模板的差异.

此方案效果比较好,很明显它检测出了眼睛,并且没有引入误匹配区域。然而这种方法高度依赖于图像的对比度,如果图像的颜色收到干扰,那么立刻就会导致错误。例如,我们在源图像上加一些信息如下,可以看到结果中爱因斯坦身上的响应大大超过了眼睛的响应。

方案三

现在来看看最为鲁棒的一种方案:归一化互相关系数(NCC),见下图

方案四

它能够比较准确的检测出爱因斯坦的眼睛,而且对于图像的局部对比度收到干扰的情况也很鲁棒,见下面的结果, 即便在原图的眼睛周围加上干扰遮罩,检测结果依然一致

s

有遮罩时NCC结果

当然,如果采用NCC,其实已经不再是线性移不变滤波器了,输出像素值不再是其领域像素的线性加权和。

模板匹配是否能解决所有目标检测的问题呢?不行。当源图像进行了各种warp变换时,模板就不再起作用。

各种Warp变换

当然,NCC这样的滤波器给了我们进一步的启发,即是否可以放宽线性或者移不变这两个条件中的一个或两个,来构造更多类型的滤波器呢?这就是我们接下来讲的内容。

二. 非线性移不变滤波器

  1. 非线性但移不变的滤波器代表:形态学操作

形态学操作的基本版本是用于处理二值图像的,当然其衍生版本可以用于处理灰度图像甚至彩色图像。

要理解形态学操作,首先需要对图像的逻辑操作及图像的集合有基本的概念,见下图:

基本图像逻辑操作

可以看到,利用逻辑操作可以组合出很多图像。

既然我们说形态学操作也是滤波,通常都会有对应的滤波核,形态学操作中的滤波核称为结构元素(Structuring Element),它主要标识了被滤波的图像上的像素需要和哪些邻域的像素做逻辑操作。下图是两个典型的例子:

形态学操作所用核

可以将包括了所有结构元素像素的窗口定义如下:

结构元素定义

这样我们就可以定义和实现出一系列形态学操作了。

例如,

膨胀操作可以根据设定的结构元素来扩张一个二值图像

膨胀

它实际上是用结构元素窗口内的有效像素的"或"结果来替代目标像素的值,如下图

腐蚀操作想法,是用结构元素窗口内的有效像素的"与"结果来替代目标像素的值,如下图:

腐蚀

从视觉上,膨胀使得图像的“1”的部分扩张,腐蚀使得图像的"1"的部分收缩。

膨胀腐蚀的效果

膨胀和腐蚀有很多应用,这里举两个有趣的:

  1. 检测图像上的目标物

例如要检测下面左图中所有的e,由于是印刷字体,所有的e都长得一致,只需要用e的形状作为结构元素,然后对左图做腐蚀操作,就可以得到右图——所有的e都被凸显出来了。

检测字符

2. 边缘检测

下面展示了图像边缘检测采用膨胀腐蚀操作的过程,可见只要选择合适的窗口大小,合适的操作顺序,就可以检测出特定图像的边缘。

检测边缘

除了膨胀腐蚀之外,还有更多的形态学操作,例如:

更多形态学操作

常见形态学操作效果

前面谈到的操作都只针对二值图像,但是我们可以很容易的将这些操作推广到灰度图,其过程如下:

形态学操作扩展到灰度图上

一些灰度图上做形态学操作的示意如下:

灰度图形态学效果例子

2. 线性但移变的滤波器代表:Lens Blur

在景深效果绘制(DOF Rendering)领域,一种有趣的滤波器叫做DOF Filter,它是一种线性但移变的滤波器,每一个像素点的滤波半径是根据其所对应的物距不同而不同,但都是邻域像素的加权和。

一般来说,会首先根据场景的三维信息,再加上感兴趣的点的坐标,生成一张与被滤波图像同尺寸的半径图,用于表示每一个像素点的滤波半径。接下来就用此半径图来控制每个点的滤波。

大光圈虚化的基本思想

大光圈虚化例子

3. 非线性、非移不变的滤波器代表:双边滤波器与非局部均值滤波器

现在来看看双边滤波器,它主要的特点是对图像进行滤波平滑的同时能够尽可能保持图像的边缘。

下图是用普通高斯滤波平滑一幅图像的效果,可以看到由于对每一个像素都采用了同样尺寸的对称模糊核,所以边缘两边的像素就会相互污染了。

高斯核会污染边缘

要想能够不破坏边缘,我们需要有一种滤波器,对图像像素的模糊邻域不会越过其边缘:

如何做到呢?对比下面的图,可以看到高斯滤波只使用了空间距离来衡量像素的权重,而双边滤波则在空间距离的基础上,加入了像素亮度距离。而由于边缘两边的亮度值差异很大,因此越过边缘的像素的滤波权重很小,这就是双边滤波能够保持边缘的秘诀。

双边滤波的保边原理

高斯 vs 双边

高斯核为啥可以保边

下面几张图来自Real-Time Edge-Aware Image Processing with the Bilateral Grid,我觉得更加清晰的表明了双边滤波和高斯滤波的差异:

高斯滤波:

高斯滤波原理

双边滤波:

双边滤波原理

双边滤波有很多应用,其中最典型的是保边去噪与平滑

双边滤波的去噪功能

现在姑娘们用的美颜美肤软件,就可以用双边滤波来实现:

双边滤波可以用于美颜

双边滤波可以用于美颜

然而,从前面的公式可以看出,双边滤波不能直接用卷积来实现,它是一种非线性、非移不变的滤波器,所以原始的实现是很慢的。有很多人研究了快速的双边滤波,感兴趣的读者可以深入学习。

还有一种非线性、非移不变的滤波器是Non-Local Means(非局部均值)滤波器,它的思想是图像中有很多冗余的信息,所以当我们用加权平均来获得一个像素的滤波后的值时,来源信息可以不仅仅是该像素的邻域,而是可以扩大范围到全图。

例如,下图框内都是冗余的信息,我们可以对比各种滤波器的结果,可以看到Non-Local Means滤波器可以得到比双边滤波器更加平滑的结果,同时对边缘的保护也很好。

三. 总结

这篇帖子先介绍了模板匹配,然后通过放开滤波器的两个约束条件“线性”和“移不变”,来介绍了更多有趣的滤波器。下面的脑图总结了本章的关键内容。感谢你的阅读。

我在如下的Jupyter Notebook中展示了本帖中的相关操作,你可以对着它获取更深入的理解,也能够进一步掌握用Python来进行图像处理的一些技巧。

nbviewer.jupyter.org/gi

跟这一系列专题文章相关的Notebook可以从github.com/yourwanghao/获取

参考资料:

这一篇文章的绝大部分素材来自于

[1] CMU 2017 Fall Computational Photography Course 15-463, Lecture 4

如果不做特别说明,素材均来自于[1]

我也会参考下面的重要资料中的内容

[2] Richard Szeliski, Computer Vision : Algorithms and Applications, Section 3.2, 8.1

[3]Real-Time Edge-Aware Image Processing with the Bilateral Grid, SIGGRAPH '07, Jiawen Chen

0 人点赞