Image Analogies

个人学习笔记, 根基尚浅, 免不得颇多纰漏, 望批评指教.

这是一篇2001年的文章, 其核心主要讲了如何将一对图片之间的"转换模式"应用到其他图片上去, 也就是使一张新的图片经过这种已知的"转换模式"生成所期望的图片. 这篇文章虽未提及"image-to-image"的概念, 但它所阐述的图像之间的映射关系的提取应用, 依然是"image-to-image"的核心思想.

Problem

考虑一对图像\(A\)和\(A^{'}\), 分别是未处理和已处理的图像(the unfiltered and filtered source images, respectively). 目标图像是未经处理的\(B\), 根据\(A\)和\(A^{'}\)之间的转换模式来合成新的目标图像\(B^{'}\).也就是:
\[
A:A^{'}::B:B^{'}
\]

Model

Input:

  • 未处理的源图像\(A\)
  • 已处理的源图像\(A^{'}\)
  • 未处理的目的图像\(B\)

Output: 按照\(A\rightarrow A^{'}\)转换方式处理生成的\(B^{'}\)

所用到的数据表示:
\[
A(p): \textbf{array} \ p \in SourcePoint \ \textbf{of} \ Feature \\
A^{'}(p): \textbf{array}\ p \in SourcePoint \ \textbf{of} \ Feature^{'} \\
B(q):\textbf{array} \ q \in TargetPoint \ \textbf{of} \ Feature \\
B^{'}(q): \textbf{array} \ q \in TargetPoint \ \textbf{of} \ Feature^{'} \\
s(q): \textbf{array} \ q \in TargetPoint \ \textbf{of} \ SourcePoint
\]

其中\(p\)代表\(A\)中的像素及其相关的\(A^{'}\)中的像素, \(q\)代表\(B\)与\(B^{'}\)间相应的像素.\(A(p)\)与\(A^{'}(p)\)分别代表\(A\)与\(A^{'}\)中像素\(p\)上的特征向量, 同理, \(B(q)\)与\(B^{'}(q)\)表示各自图像中\(q\)像素上的特征向量. \(s(\cdot)\)代表着\(q\)与\(p\)之间的映射关系, 有\(s(q)=p\).

在实际操作中, 作者先生成图像的不同分辨率表示(图像金字塔), 用\(\ell\)来表示分辨率的层次, 例如\(A_{\ell}\)代表图像\(A\)在\(\ell\)分辨率上的表示, 则\(A_{\ell -1}\)代表着与之相关的低分辨率图像的表示. 用\(L\)表示最大的分辨率.

整个合成处理过程按分辨率从小到大遍历, 在分辨率的每一层次上, 都计算出\(B^{'}\), 计算过程为在每一个分辨率层次上, 根据目标图像对中像素\(q\)的"统计数据"与源域图像对中像素\(p\)的相关统计数据做比较, 找出最好的对应关系(这里我的理解是找出与\(q\)的特征向量最相似的\(p\)). 找出来源域中最相似的像素\(p\)之后, 将\(B^{'}_{\ell}(q)\)特征向量的值设为\(A_{\ell}^{'}(p)\), 用\(s_{\ell}(q)=p\)来保存这种"最好"的匹配关系.

整个算法流程如图表示:

这个算法的核心是"BESTMATCH"子程序, 也就是如何找出最近似于\(q\)的\(p\), 这里所输入的\(B^{'}\)代表着一部分已经合成过的图像(因为\(B^{'}\)是未知的要生成的目的图像, 由上面的伪代码可以看出它是逐个像素遍历的, 就像织毛衣一样, 逐个像素的进行生成, 而每个像素生成的过程还依赖于已经生成的像素.). BESTMATCH通过两种不同的方法来找出与合成像素最相匹配的源域图像中的像素. 这两种方法分别是:

  • \(approximate \ search\): 根据\(p\), \(q\)及它们邻接像素的特征向量来找出最近匹配的像素.
  • \(coherence \ search\): 保持与邻接合成像素的相干性.

由于\(L_{2}\)范式对于感知相似性(perceptual similarity)并不是一种完美的度量方式, 因此在\(L_{2}\)度量下, 相干性的像素(coherent pixels)会比最佳匹配(best match)的像素要看上去好一些. 故而要根据相干参数\(k\)来重新调节approximate-search距离, 这是为了接下来进一步比较这两种方法所算得的像素.关于算法的详细表述如下:

\(F_{\ell}(p)\)表示当前\(\ell\)分辨率水平及\(\ell - 1\)分辨率水平上\(A\)与\(A^{'}\)中像素\(p\)邻接像素的特征向量的联合, \(F_{\ell}(q)\)同理作用在目标图像\(B\)及\(B^{'}\)上, \(B^{'}\)上的邻接像素只包括已经合成出来的. BESTAPPROXIMATEMATCH用了approximate-nearest-neighbor search(ANN)的方法来找出最邻近的像素位置. 而BESTCOHERENCEMATCH根据下面的式子返回\(s(r^*)+(q-r^*)\):
\[
r^*=arg\ \min \limits_{r\in N(q)}||F_{\ell}(s(r)+(q-r))-F_{\ell}(q)||^2
\]
上式首先找出能使源域像素特征与目的域像素特征最接近的\(q\)的邻接像素, \(s(r^*)\)指的是与\(r^*\)相近似的源域图像中的像素, 再加上\((q-r^*)\)则能得出与\(q\)近似的源域像素\(p\).

由上图可以有个直观的理解, 为了合成\(B_{\ell}^{'}\)中的\(q\)像素, 需要考虑\(B_{\ell}^{'}\), \(B_{\ell}\), \(B_{\ell-1}^{'}\)以及\(B_{\ell -1}\)中\(q\)周围的像素, 然后寻找源域中最相似的像素\(p\).(从中可以看出为什么要将原始图像进行金字塔化, 低分辨率的图像像素较少, 较容易合成, 并且能为更高分辨率的图像提供参考参数).

在特征的选取上, 如果用RGB颜色参数, 作者发现源域的图像并不能包含充足的数据去进行匹配(这是因为RGB图片的邻域空间比灰度图像的要大的多, 对于颜色单一的图片来说, 很容易产生稀疏的结果). 因此, 作者使用像素的亮度特征来取代RGB, 应用在模糊, 超分以及艺术化的例子.

Conclusion

这篇文章主要讲了如何学习两张图片间的"转换"模式, 由于是2001年的文章, 深度学习尚未兴起, 作者的方法总体可概括为基于pixel特征相似性的处理, 这有一些缺点, 一是源域图像要有较明显的"转换模式"的存在, 比如blur, 超分转换. 二是对于学习不同的"滤波"(艺术化, 浮雕化, 模糊, 超分等), 作者要调换特征, 进行一些额外的不同处理. 不过这篇文章的image-to-image思想值得仔细学习.

最新文章

  1. Android之SAX解析XML
  2. ReferentialConstraint 中的依赖属性映射到由存储生成的列
  3. macbook上实现MacOS+Windows8+Ubuntu三系统
  4. Window下生成OpenSSL自签证书
  5. js:判断对象是否为空
  6. svn出现权限不足时的解决方法
  7. 桶排序-C-结构体排序
  8. InstallShield Limited Edition for Visual Studio 2013
  9. 第二章 基本图像处理(Image Processing)
  10. JavaScript中的面向对象程序设计
  11. pyqt pyside QLineEdit 重写键盘事件
  12. echarts 调整图表大小的方法
  13. lvs为何不能完全替代DNS轮询
  14. openFileDialog的使用
  15. python3 pyodbc简单使用
  16. Angular6 学习笔记——组件详解之组件通讯
  17. 用MVC5+EF6+WebApi 做一个考试功能(六) 仓储模式 打造EF通用仓储类
  18. @Dataprovider 和 @Factory 的使用
  19. vux 局部注册组件
  20. AES CFB/OFB/ECB/CBC/CTR优缺点

热门文章

  1. Main property in package.json defines package entry point
  2. Vue学习手记04-跨域问题
  3. OpenJudge计算概论-异常细胞检测
  4. 关于tomcat-users.xml添加用户被重复加载的问题mark
  5. Android高频单词
  6. c# 扫描局域网IP列表的几种方法
  7. osg机械臂模拟
  8. Python检查数组元素是否存在类似PHPisset()方法
  9. 生成对抗网络GAN详解与代码
  10. 阿里云ecs自动创建快照教程