图像在计算机中通过什么方式表示_22. 图像类比: Image Analogies

aa0511c3b0fc253843e9fb55f37b2bec.png

本文同步发表在我的微信公众号“计算摄影学”,欢迎扫码关注

86479c8e17ef6d1d2f9779591587e700.png

【转载请注明来源和作者】

到目前为止,我已经介绍了很多对图像进行处理的方法,包括基本的图像滤波,图像的合成与融合,纹理图像的生成、图像的修补等等。你会发现这些传统的图像处理方法真是五花八门,每个具体的应用都可能对应着一种或者多种各式各样的算法。你有没有想过,是否有某种统一的方式,可以教会计算机进行图像处理,而不需要改变算法本身?例如,我们有下面两幅图A和A’, 我们告诉计算机A'是由A进行某种处理得到的。然后我们给计算机提供图像B,希望计算机能自动模仿A'的风格得到图像B '。

cfa4d210ed6c2d83ca1a9e8567b13608.png

3f7410e92acba5ae081f34ca6ba2932e.png

如果你关注最近几年深度学习的进展,你一定想到了Neural Style Transfer等深度学习的有趣应用。嗯,的确利用Neural Style Transfer有可能做到上述示例所要求的图像变换,但我今天要介绍的却是一篇2001年的文章,作者在那时就提出了图像类比这个概念:

Hertzmann et al., “Image analogies,” SIGGRAPH 2001.

正如上面示例所描述的,图像类比的定义是:

4a9f3192853a3a2e5ebd63c7e6783b01.png

给定一对图像A和A'(分别为未处理的源图像和处理后的图像),以及未处理的目标图像B,合成一个新目标滤波图像B’,从而使(下面公式的意思就是B'是B按照A到A'的方式进行处理的结果)

a1738131a104b0889f3144a787a7a2e9.png

这个算法有哪些应用呢?我们一一来看文章中给出的例子:

一、效果展示

1. 玩具应用:图像模糊

图像模糊当然不必要用本文所说的方法去做,直接高斯滤波即可做到。但是这个例子说明了Image Analogies是可以完成图像滤波这样的基础图像变换操作的。

dfe9f6f8b591c2958bfd07f0eb4a4f69.png

2. 纹理合成

我们已经学习了多种纹理合成的方法,想不到图像类比也可以用于纹理合成。这里只需要将A或B看做是0维数组即可。作者还专门与其他两种纹理合成方式(Wei-Levoy及Ashikhmin)做了对比:

5e1eb0116375939730c19cf9eddacb52.png

3. 超分辨率:

这是我自己最喜欢的应用:给定一幅模糊、清晰的图像,图像类比算法就可以学习到如何将模糊图像转换为清晰的图像。这里作者指出A及A’可以不止一对图像,可以是多个图像patch对。

58a098749c6f1102cca11d9ba6932918.png

4. 纹理转移

7ce8b6e560a025ae8b060fc83b9d8275.png

5. 艺术风格转移

f5f66545e2f151156577d812155ed4ad.png

艺术风格转移非常类似于你在Neural Style Transfer中看到的风格转移的应用,这里有一些更漂亮的例子:

先来两个A到A'的图像对,展示需要类比的风格:

de89a1526f4516a073be154bf57b5110.png

然后我们看看对如下图片应用图像类比的例子,我们喜欢模仿上述A/A’图像对。

da300f2b1f73ae30643894502f62fca2.png

看看效果非常惊人:

ca80774db44c57cd71a3e4ce9ea69773.png

d9ac48c57e852af794ad6fa0ede9cf2d.png

0951cbbee0fd7ae6dd21e043903a27ce.png

6. 手绘图片变照片

你可能听说过有名的Pix2Pix应用(传送门),它能把手绘变成逼真的照片:

d83a0589fa28ff00ba2d8f60b3a615d9.png

图像类比也一样可以实现这样的效果(某种程度上看起来更加惊人)

48ddbae689207fa81972c7a0bc327c10.png

4afcb446138ba6a5a811132e75e9c878.png

下面这个视频展示了图像类比的精彩应用,包括交互式应用:

bfaeda50fb36de6c4b24cb7111e12622.png
https://www.zhihu.com/video/1151993681094467584

二、原理分析

看到这里,你一定会好奇图像类比到底是如何实现的。如果你仔细阅读了我之前介绍的如下文章,那就比较容易理解图像类比的实现了:

  • 18. 纹理合成再探 - 一种基于金字塔的方法
  • 19. 纹理合成再谈 - 一种非参数的方法
  • 20. 用于纹理合成和转移的图像缝合
  • 21. 修补图像的利器:基于纹理填充技术的Inpainting

我们来回顾下图像类比的关键:

  • 我们手上有示例图A和A',说明了我们希望将图像处理成什么风格
  • 有一幅图像B,希望能处理成A'的风格

为了实现这点,有这么一些关键要点:

  1. 构建金字塔,在各个尺度上去类比A'

我们曾经在18. 纹理合成再探 - 一种基于金字塔的方法中讲过,要让B看起来像A',需要在各个特征尺度上都看起来像,一个比较好的方法是构建多尺度的金字塔,在各个维度上去模仿A'。

图像类比的实现中,也确实是通过构建高斯金字塔来拆解了A、A'、B的各个特征尺度并进行后续操作的。

35fd56d501d959f6e124b195b9c0c336.png

2. 搜索、匹配、填充

在19. 纹理合成再谈 - 一种非参数的方法和20. 用于纹理合成和转移的图像缝合中,我们提到当需要填充目标图像(B')中的某个像素时,可以通过在纹理样本片段中寻找和当前想要填充的像素最匹配的像素来进行填充。

c8d1f5cca014cf12350d0773ea058182.png

图像类比其实也是这样做的,当需要生成B'的某个像素q时,需要搜寻A'中与q最匹配的像素,并将A'中的q所在的图像patch复制到q。

理解到这一层后,我们可以来看看图像类比的伪代码:

2ac0b5360b7da4ded58c4ab6ee617773.png

接着我们来看进一步的细节:

图像特征

怎么表示图像的特征是很重要的问题。为了做到尽可能准确的匹配,作者提到可以采用邻域像素来表示特征,并把金字塔中当前层和尺度更小的一层的特征结合起来。因此具体来说每个图像对(A/A'或B/B')的像素的特征可以表示为(下面下划线表示连接符,X为A或B)

Feature(

)_Feature(
)_Feature(
)_Feature(
)

在金字塔的最大尺度层,像素点m的特征是5x5的邻域像素,在其他尺度,则是3x3的邻域像素。

所以按照这个设定,对金字塔的底层(最大尺度层),每个像素的特征长度是5*5 + 5* 5 + 3*3 + 3*3 = 68,而对其他层,特征的长度是 3*3 + 3*3 + 3*3 + 3*3 = 36 。然而B'中只有部分像素是已经合成了的,作者指出在计算特征时邻域中只应该包括B'那些已经合成好的像素,因此实际上的特征长度更短,取决于B'中哪些像素已经合成。

BestMatch方法

当有了源特征集(来自A和A')和目标特征集(来自B和B')时,就很容易进行匹配了,这里的关键就是BestMatch函数。作者推荐采用ANN(近似最近邻)算法进行匹配,在此我不阐述细节,你只需知道它是一种比暴力搜索更加快速,但允许在精度上有所妥协的方法即可。但是作者指出,通过这种方式匹配到的源像素点p不一定在视觉上最符合人类的感知相关性。因此作者还采用了一种叫做一致性搜索的方法,后面我会详细描述。

我们先来看看Best Match函数的伪代码:

4b32978ea07295e17b2923aad604f342.png

可以清楚的看到几个信息:

  1. 最终得到的匹配点p要么来自于BESTAPPROXIMATEMATCH匹配函数(papp),要么来自于BESTCOHERENCEMATCH函数(pcoh)
  2. 用dapp和dcoh来表示两个函数得出的匹配点与目标点q的特征距离
  3. 为了惩罚dapp,用(
    )对其进行扩大,最终值如果比dcoh小才会选择papp作为输出,否则就认为pcoh是输出结果

上述伪代码中,BESTAPPROXIMATE函数执行的就是近似最近邻搜索,而BESTCOHERENCEMATCH则是执行的一致性匹配。

BESTAPPROXIMATEMATCH 最近邻匹配

我们来看看最近邻搜索BESTAPPROXIMATEMATCH的示意图:

a39cc5c3db65d483b16f93dd3d8c215b.png

可以看到,正如我上面所讲,BESTAPPROXIMATEMATCH首先是将A和A'的l层以及l-1层的特征连接到一起,将B和B'的l层及l-1层的特征连接到一起,形成源和目标两个特征集,然后搜索B中每个像素q所对应的源像素p。

BESTCOHERENCEMATCH 一致性匹配

那么一致性搜索是怎么回事呢?一致性搜索的方法来源于下面这篇引文:

Michael Ashikhmin. Synthesizing Natural Textures. 2001 ACM Symposium on Interactive 3D Graphics, pages 217–226, March 2001.

可以用引文中的插图来描述这种方法:

e732bb77be8186b90b56a0da5c19e113.png

这篇文章的作者观察到一个重要现象,即待填充的像素与其L形的已填充邻域像素的源像素有高度的相关性。例如如果一个当前待填充像素为Dst(x,y), 而Dst(x+1, y-2)来自于Src(x=37, y=15),那么Dst(x,y)的源像素很可能来自于Src(x=36, 17)。在上图中,待填充像素的L形已填充邻域(灰色方块)有4个像素,因此待填充像素有4个候选源像素。只需要判断这4个候选者哪个与目标像素的对应像素(黑色方块)距离最小即可。这种方法可以很大程度上保持填充像素与其周边像素的信息一致性,因此从视觉上看起来效果不错。

如果用公式来描述,一致性匹配的结果就是p = s(r*) + (q - r),其中

8acb3c5963e6b82d5219e2fdb609ba75.png

Fl(p)表示源特征, Fl(q)表示目标特征

三、实战

我在github上找到的很好的Image Analogies的实现是:http://jmecom.github.io/projects/computational-photography/image-analogies/, 这里面提供了对此方法的详细实现(Matlab),以及实操过程中看到的现象和问题,建议你仔细阅读。 我在此简要的总结一下一些论文中没有提到的点:

  1. 图像上色是一个困难的问题,并不是总能得到很好的结果。例如下图中,B'的结果就不好。

5c82f781f08d82f7c390386764794b3e.png

一个关键的发现是,图像类比的作者列出的关于图像上色的例子通常是每个色块会覆盖一大片区域,每个区域之间有强边界的情况。但如果需要上色的目标有很多小的色块,边界也不是那么明确时,上色就不会那么成功。下面是另外一个失败的例子:

12ce19d9991a1881c2c34925d2c89c41.png

2. 除了上色应用,在其他很多应用里面也会观察到这个算法对于输入图像以及参数都比较敏感,很多时候需要仔细的调参才能得到好的结果,甚至很多时候无法得到好的结果

1b60a9991b1afa938ccb25a06ee7eeb8.png

3. 算法速度巨慢无比

最慢的地方就是最近邻搜索,正如我上面分析的,我们是在一个几十维的空间内做最近邻搜索,尽管我们已经采用了近似搜索,依然很慢。 我在想也许换成Flann(Fast Library for Approximate Neighour Nearest Neighbor Search)可能会好些。当然调整金字塔的层数也有帮助,但又会遇到质量与性能的妥协。由于速度特别慢,所以很难进行精细的参数调整,也就很难在实际中应用此算法。

三、总结

今天介绍的图像类比算法(Image Analogies)是一个具有多种应用的、统一框架型的算法,就像我们之前介绍的13. GradientShop统一图像处理框架是一种统一框架一样。 图像类比的特点是你可以给出成对的图像(A和A')来训练算法,告诉算法希望把图像处理成A'的风格。接下来对输入图像B,算法会自动的将其转换为A'的风格。 这其中蕴含的思想非常像多年后出现的Neural Style Transfer等算法。图像类比算法其中应用了我们之前学习过的纹理填充的一些关键思想,使得我们在图像合成这个领域保持了知识的延续性,非常值得去认真学习研究。

希望这篇文章能够给你带来启发,别忘了给我点赞哦^_^

四、参考资料

本文的大部分信息来自于:

  1. Hertzmann et al., “Image analogies,” SIGGRAPH 2001.
  2. Michael Ashikhmin. Synthesizing Natural Textures. 2001 ACM Symposium on Interactive 3D Graphics, pages 217–226, March 2001.
  3. http://jmecom.github.io/projects/computational-photography/image-analogies/

本文还有少量信息来自于:

CMU 2017 Fall Computational Photography Course 15-463, Lecture 9

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值