我需要把一个照片上的背景去掉,换上我们自己的背景。照片是一个人站在一个单色布景(如蓝颜色布景)前照的,现在要把照片上的单色布景去掉,即把人的图像取出,再贴到我们事先准备好的背景图像上去。 现在的难点是怎么把图像的单色背景去掉?需要源程序、算法及相关资料!
请注意:
  1. 背景肯定是不均匀的。
  2. 背景颜色不是固定的,有的是蓝色,有的可能是别的颜色,事先是不知道的。
  3. 完全自动处理,不能由人工指定图像中的某个点作为背景颜色,必须自动识
     别 出背景颜色。
  4. 由软件自动完成上述功能,不是人工用photoshop之类的工具去作。
  5. 最好是能够实时的,处理速度不需要太高,每秒处理3至5帧图像即可。
  6. 这个处理过的图片要放到新的背景图像中去,合成一个新的照片。

解决方案 »

  1.   

    最简单的办法就是通过:
    TCanvas.Pixels[X, Y: Integer]: TColor;
    扫描整个图片,如果该点是背景色,则置为新背景色。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  2.   

    这年头妙想天开的人真多,如果可以这样做PHOTOSHOP早就做了。
      

  3.   

    YUGIBALSA(龙荃) :
    你又少见多怪了吧,这并不是什么难事。每个人不会的东西多了去了。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  4.   

    你必须保证背景色彩在一定阈值以内(也就是说背景布要够干净);人像不能有与背景近似颜色--至少在边缘区域(就好象用红背景就少带红领巾,穿红衣服).
    然后假定左上角是clean的,以此附近取样为背景色,对整个图像中在阈值(一般取32 ,不知道彩色应该怎么算)内的 色彩clean掉(基本照搬photoshop的magicwand).
    有个问题:做完的图像你们怎么保存(对透明区域的处理?)
      

  5.   

    to:RamjetZhang(我曾经不是一头猪)我曾经编程对源图像进行处理,把每个点的颜色分解为RGB三个值,同假定的背景色(如左上角的第一个点)进行比较,三种颜色同背景的三种颜色的差值的绝对值之和小于某个值(如80)则认为是背景色。但这样作的效果仍然不好,距离实用的阶段还差的太远。
    至于做完的图像的透明部分,可以保存为纯白色或纯黑色,因为实际照片里出现纯白色或纯黑色概率非常小。
      

  6.   

    to :YUGIBALSA(龙荃)
    这并不是妙想天开,你没见过电视电影特技中的画面合成吗?主持人可以在兰背景前主持节目,而输出给观众看的画面却是主持人在一个具有美丽风景为背景的环境中主持节目。
    photoshop之所以没有作这样的功能,主要是因为photoshop是用来编辑/制作真正的照片的,这样的照片通常是在人们真正需要留念的地方拍摄的,这样的背景通常不是一个单色的布景。难道你没事了会找一个单色的布景来照相吗?
      

  7.   

    to : thirdapple(陨落雕) 
    如果是靠单纯判断颜色,图像处理也不会形成独立的一门学科了。
      

  8.   

    可不可以将你的源程序给我一份,我也在琢磨这个问题!谢谢![email protected]
      

  9.   

    不好意思,我看错了,认为楼主的想法中的"背景肯定是不均匀的。"意思是"背景是什么都不一定"楼上几位的说法都是可行的,我看过很多人作过,其实也不会太难,楼主最好自己想想SORRY
      

  10.   

    我也正在做这方面的软件,我用神经网络的BP前溃算法的,就是先取前景,背景N各样本点,进行网络训练,然后对图片的每个象素点经过网络判别前景和背景,是可以动态改变背景的
      

  11.   

    to zplinze(linze) :你的思路非常好。但有一个问题,把彩色图像转成灰度图像后,原来在彩色图像中有明显区别的某些颜色在灰度图像中会变得颜色值非常接近,尤其是和背景色接近时就非常难办了。我试者作了域值分隔,但不管如何选择域值,都会有很多前景色都被当成了背景色,效果不够好,不能达到实用的程度。
      

  12.   

    如果在转换成灰度图后人的区域边界(注意是边界!)和背景灰度值相差较大的话,在域值分割后,基本能区分出人的区域边界吧?但是在这块区域内有很多很杂黑点,这些就是被当成背景色的前景色。
    如果这些“噪声”比较细小,可以通过膨胀运算将其去掉。就像下面这幅图的最后两幅一样
    http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/chapter08/dilation.gif
    如果这些噪声比较大,得另想办法了,我们再好好想想,呵呵