zoukankan      html  css  js  c++  java
  • 智能去除选定区域

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

  • 相关阅读:
    MongoDB学习笔记(一) MongoDB介绍及安装
    MVC DefaultControllerFactory代码分析
    WCF中的变更处理
    分布式文档存储数据库 MongoDB
    wcf学习资料
    vs2010打包安装
    Android语音识别RecognizerIntent
    Eclipse快捷键
    甲骨文公司老板埃里森在耶如大学的…
    Android&nbsp;TTS语音识别
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/smart_remove_selection_algorithm_in_gimp_and_photoshop.html
Copyright © 2011-2022 走看看