这篇文章缘起于这篇博客:http://xiaoxia.org/2011/12/03/shocked-by-gimp-filter-smart-remove-selection/

看完以后着实震惊了,这下要去掉照片里的东西实在太简单了。在群里吼了一声以后,美术表示 Photoshop CS5 很淡定。于是我找来了 Photoshop CS5 (PS CS5) 教程 看看,大约 9 分钟的时候,CS5 潇洒地 P 掉了背景中的一个人,神奇了!

这项工作原来是要靠人手完成的,自己选取一块相近的纹理,通过 PS 的图章工具补上去,但是人手补上的话会有个问题,一个是纹理不对,一个是光线不对,反映在图上就是修补的区域没有过渡,变成很生硬的一块。

而通过软件完成这项工作,不仅大大节省了时间,而且效果与人手修补毫不逊色,比我本人 ps 更是好的多了 XD

于是找来了 resynthesizer 源码分析,似乎最关键的就是以下这段代码:

 /* Setup */    make_offset_list();    for(int i=0;i<256;i++)    for(int j=0;j<256;j++)      diff_table[i][j] = (i-j)*(i-j);  for(int i=0;i<int(data_points.size());i++) {    int j = rand() % data_points.size();    Coordinates temp = data_points[i];    data_points[i] = data_points[j];    data_points[j] = temp;  }    for(int n=data_points.size();n>0;) {    n = n/2; // <- note magic number... the more repetition, the higher the quality, maybe    for(int i=0;i<n;i++)      data_points.push_back(data_points[i]);  }

这段代码是 GIMP 的 resynthesizer 插件进行取样的过程,取样最特别的地方,在于对自身进行复制,形成一段纹理。具体的工作原理,可以参考作者的论文:《A NON-HIERARCHICAL PROCEDURE FOR RE-SYNTHESIS OF COMPLEX TEXTURES》

我简略地翻译一下概要:

再看 photoshop CS5,里面有个关键词,content aware, 这个概念可以参考这篇文章:http://dl.acm.org/citation.cfm?id=1276390 不过毕业以后就看不到 ACM 的全文了。。。content aware 的神奇之处,在于不仅根据几何形状,还根据图像中的能量进行识别。至于能量函数,abstract 里说的很抽象,印象中是利用图像中的熵这类东西解决的。所以,PS CS5 的智能去除,应该是通过 content aware 的 SEAM 将目标物盖住吧,可惜 ps 没有开源,没办法得到确切答案了。