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思想值得仔细学习.

image analogies笔记的更多相关文章

  1. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  2. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  3. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. NET Core-学习笔记(三)

    这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...

  7. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...

  8. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. python学习之模块:xlsxwriter

    1.安装xlsxwriter模块 pip install xlsxwriter 2.使用 import xlsxwriter workbook = xlsxwriter.Workbook('hello ...

  2. MAC将根目录文件夹的权限赋给用户

    https://my.oschina.net/liujiest/blog/762004 1.sudu -i进入root模式(需输入密码) 2.chown -R 用户名 /文件夹名 sudo -i Pa ...

  3. BAT文件运行时不显示命令窗口的方法

    可以编一个VBS文件调用BAT文件,使运行BAT文件时不显示命令窗口. 新建一个记事本文件,保存为abc.vbs,在文件中加入如下代码: Set shell = Wscript.createobjec ...

  4. OneDrive

    OneDrive https://onedrive.live.com

  5. Ionic4.x 中的button

    官方文档:https://ionicframework.com/docs/api/button 1.ion-button 组件可以定义一个按钮 <ion-button>Default< ...

  6. Ionic 的安装运行

    1.学习前准备工作 1.必须得安装 nodejs (建议安装最新的稳定版本) 2.必须有 Angular 基础:https://www.loaderman.com/goods-1047.html 2. ...

  7. GPS nmealib学习 问题

    When building on Ubuntu 12.x the build fails with the following error… gcc  samples/generate/main.o ...

  8. QML渐变色

    Rectangle { id: tab_btn width: height: parent.height color: "black" gradient: Gradient { G ...

  9. request cluster ID mismatch

    删除了etcd集群所有节点中的--data_dir的内容 [root@node3 ~]# cd /var/lib/etcd/ [root@node3 etcd]# ls member [root@no ...

  10. C# winform中使用Panel调节窗口变化是各控件的位置(转)

    我的目的是在窗口上有些控件,在窗口大小变化时,上面的控件位置不动,大小也不动.下面的控件随着窗口的大小变化而变大. 做法是用两个panel,panelTop和panelFill.上面的控件都放到pan ...