智能去除选定区域
这篇文章缘起于这篇博客: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 没有开源,没办法得到确切答案了。