在这个专栏的前面几次文章里面,我给大家介绍了空域的图像处理,还介绍了频域的图像处理。我们可以看到在空域中有时不好解决的问题,或者解决起来比较慢的问题,转换到一个新的表达方式,或者说变换域,即”频域“的时候,有可能解决的比较好。那么有没有除了频域之外的新的变换域呢?答案是肯定的,我们上一篇文章中提到的泊松图像编辑编辑,尤其是其中的泊松融合,就是一个在“梯度域”上进行图像处理的典型方法。回顾一下其中的关键思想,可以用下图中的“引导插值”来描述:
这里v是一个引导场,它可以是一个原始图像g的梯度场,即Δg.
其实这一类在梯度域进行图像处理的方法还有很多,在ICCV 2007时有专门的course来介绍梯度域的图像处理,大家可以参考这里看到更多的信息:cs.cmu.edu/~ILIM/projec。
它的基本依据是:人类的视觉系统(Human Vision System, HVS)对图像中像素值的变化(即梯度)更加敏感,而对像素值的绝对值不敏感。下面这个影片形象的说明了这个观点:
视频由我通过GradientShop作者的演示PPT剪辑而成,原地址:grail.cs.washington.edu,以下同
人眼对像素值的变化更敏感
既然对于人类的视觉系统来说梯度比绝对值更重要,那么一定就有可能通过操作图像的梯度来对图像进行处理和变换。事实上我在上面列出的链接里面就提到了非常多的在梯度域进行图像处理的方法和应用场景,包括但不限于:
我们来看一个简单的直观的例子,来说明改变图像的梯度如何就可以对图像进行处理,甚至可以改变图像中的一些高层特征
视频由我通过GradientShop作者的演示PPT剪辑而成,原地址:grail.cs.washington.edu,以下同
改变梯度可以改变图像的高层特征
事实上,改变梯度不仅仅如我提到的例子一般可以改变图像的对比度。梯度对应着图像中丰富的信息,包括:
以上示例都说明了改变图像的梯度确实可以对图像进行处理和操作,这也是为什么我之前给出的ICCV Course链接里面有那么多丰富多彩的研究成果。下图很好的总结了什么是梯度域的图像处理:
梯度域的图像处理成果一直没有形成一个统一的简洁的框架,各种各样的方法也散布在很多论文里面,有一些方法的实现也非常复杂,而且还具有明显的局限性。直到本文所述的叫做GradientShop框架的出现。
GradientShop的原始信息出自:http:// grail.cs.washington.edu,我会将这篇论文及相关演讲PPT中的精要部分展示给大家。
简而言之,GradientShop框架的目标是:
让我们通过一个简单的视频来看看这个统一框架到底能做什么,这是作者在SIGGRAPH上的宣讲视频:
视频来自GradientShop作者在SIGRAPH2010的演讲资料:grail.cs.washington.edu
GradientShop 基本思想
可以看到这个框架确实有很多精彩的应用,而且按照作者的说法这些应用只是“抛砖引玉”,读者应该还可以基于这个统一框架实现更多丰富多彩的应用。
这里还有一个作者放出的精彩说明,GradientShop可以很容易做出艺术感的非真实渲染效果。
视频剪辑自GradientShop作者在SIGRAPH2010的演讲资料:grail.cs.washington.edu
GradientShop 非真实感渲染
现在我们来看看这个方法的基本原理。
2.2 基本原理
让我先用一句大白话总结GradientShop的思想:“图像处理就是使得目标图像的梯度和像素值都逼近用户指定的梯度和像素值的过程”。
这里我们先做一些符号上的定义:
作者还定义了一个函数F(u, …) -> [d,g,w],它的输入是待处理图像,以及其它一些必要的跟具体应用相关的参数,例如用户标记的区域,图像中的显著性特征等等,而它的输出则是d, g, 以及w
有了上述定义,那么对图像的处理就变成了一个优化如下能量函数的过程(公式摘于原论文,以下同)
这里:
fx和fy是目标图像f在x和y方向上的梯度值,相应的,gx和gy则是期望的梯度值。而wd, wx, wy则是每个子部分的权重,它们说明了梯度约束和像素值约束对最终图像的影响。这里有个小视屏可以说明这些知识:
视频由我通过GradientShop作者的演示PPT剪辑而成,原地址:grail.cs.washington.edu,以下同
GradientShop基本原理
由于Ed和Eg都是二次项,因此整个能量方程可以用一些标准的带权的最小二乘法来求解,例如1994年Shewchuk等提出的共轭梯度法,这在很多软件库中都有实现。
上述公式虽然非常简单,但我明白对一些读者来说还是显得太抽象。因此我在下一节给大家用一些例子来说明,相信能让各位很快理解此框架的精髓。
先以一个最简单的例子“图像锐化”来举例,为了进行基本的图像锐化,只需要这样设置:
我们来看看上面式子的直观解释:
1) 将d设置为等于源图像u,这使得输出图像不会偏差源图像u太远
2) 将
和
设置为源图像的梯度乘以一个大于1的常量
, 可以提升像素间的变化,正如我在文章一开篇给大家看的黑白边缘例子一样
3)
控制着像素值约束的权重,可以任意调整。
4)
设置为1,意味着每个像素的梯度约束都是一致的
视频由我通过GradientShop作者的演示PPT剪辑而成,原地址:grail.cs.washington.edu,以下同
GradientShop 普通锐化
GradientShop的作者还提出了一种“智能锐化”算法,这个算法的其他部分跟上述普通算法一致,所不同之处在于只对原图像中的“显著性”区域进行梯度的增强, 其中
和
说明了图像的显著区域的梯度的增益,而e则表征显著性区域。
我们先看看效果,再来说说显著性区域
GradientShop 智能锐化
很显然,这种智能锐化不会在锐化图像的过程中导致普通锐化的一些缺陷,例如放大了噪声,或带来图像中的间断。而这就是构建在了显著性区域检测上。
什么是显著区域呢?事实上这超出了本文的讨论范畴,有很多人都提出了对图像中的显著性特征的检测。比如经典的利用梯度的幅值的方法,以及GradientShop作者提出的对图像里长的连贯的边缘的检测的方法。下面这个图示说明作者所用的显著特征检测与传统的利用梯度检测的方法的比较,很明显作者所用方法检测到的是连贯的长边缘,对人眼来说更加显著。使用了显著特征检测,将使得不同的像素点具备不同的目标梯度g,因此结果也是不同的,
我们来看另外一个例子:非真实渲染滤波器, 这里我们首先检测图像的显著性边缘。然后平滑非显著区域,同时增强显著区域,使得画面看起来像是画家对显著边缘用黑色画笔画浓了一般。
视频素材来自GradientShop作者在SIGRAPH2010的演讲资料:grail.cs.washington.edu
GradientShop 非真实感渲染
作者在论文里对GradientShop方法得到的图与传统的另外两种方法做了对比。传统方法没有用像素值作为约束,所以它需要做非常复杂的后处理,而且效果也不够美观。而GradientShop则可以很好的保留图像的边缘特征、景深特征等。
这里所使用的各项公式为:
当用户设定光照的方向o时,可以很容易模拟出各种打光的效果.
GradientShop 光照
论文中的公式如下:
仅仅利用用户给出的稀疏的信息进行图像的插值是一个很热门的领域,其中有很多有趣的应用例如给灰度图上色。下面这个视频展示了如何利用GradientShop框架做到这一点:
视频由我通过GradientShop作者的演示PPT剪辑而成,原地址:grail.cs.washington.edu,以下同
GradientShop 上色
正如前面所说,GradientShop是一个简单的统一框架,它可以利用空域信息和梯度域信息来处理图像或视频,而且支持非常多的应用方向。我今天给大家展示的只是其中一小部分。如果各位感兴趣,可以到我参考资料所附的网址去查看更多信息或参考原论文。
如果你实际开发过工程项目就会明白一个统一框架对产品的扩展、维护有多么大的好处,我希望这篇文章激起了你的兴趣。我也鼓励大家去学习作者提供的C++源代码,我也会按惯例在后续放上我整理好的Python Notebook,供大家参考。
这一篇文章的绝大部分素材来自于如下链接,我重点参考了原始论文,以及作者的SIGGRAPH2010演示材料