智能去除选定区域
这篇文章缘起于这篇博客: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没有开源,没办法得到确切答案了。
posted on 2011-12-23 15:20 lifehacker 阅读(508) 评论(0) 编辑 收藏 举报