本人最近一直在研究如何用算法自动实现证件照换背景的技术,比如拍摄时是白底、灰底的图片,如何将其背景换成蓝色或红色。就是功能类似于Photoshop CS4中的“滤镜-抽出”工具,可无论自己怎么尝试,发现和PS的效果有一定的差距。现在遇到的问题即是,边缘部分的处理效果始终不是很自然,不是原背景色还保留其中,就是将肤色处理得过多。
在这里先说下自己的大致实现思路:
1.先像PS抽出中一样,手动画出边缘的可能区域
2.在这个可能区域中找出边缘的过渡点
3.在这些边缘点在rgbR颜色空间上进行两步处理。第一步,消色。即在原图的基础上消去旧背景色的影响。第二步,做透明处理,以使新背景色在替换时显得自然
4.根据第3步中得到的边缘像素信息与新背景进行合并处理。这里关键的即是第3步中的两个处理。自己一直没有找到好的数学模糊对其进行运算~~最后在这请教,有无高人指定下,实现思路~~ 如果有兴趣的朋友也可以一起来讨论! QQ:992455695

解决方案 »

  1.   

    @anmychen2001  边缘区域我已经找出来了,问题是换背景颜色后,边缘部分显得很生硬 
      

  2.   

       // Sample neighbor pixels
       float s00 = tex2D(ImageMap, texCoord + float2(-off, -off)).r;
       float s01 = tex2D(ImageMap, texCoord + float2( 0,   -off)).r;
       float s02 = tex2D(ImageMap, texCoord + float2( off, -off)).r;   float s10 = tex2D(ImageMap, texCoord + float2(-off,  0)).r;
       float s12 = tex2D(ImageMap, texCoord + float2( off,  0)).r;   float s20 = tex2D(ImageMap, texCoord + float2(-off,  off)).r;
       float s21 = tex2D(ImageMap, texCoord + float2( 0,    off)).r;
       float s22 = tex2D(ImageMap, texCoord + float2( off,  off)).r;   // Sobel filter in X direction
       float sobelX = s00 + 2 * s10 + s20 - s02 - 2 * s12 - s22;
       // Sobel filter in Y direction
       float sobelY = s00 + 2 * s01 + s02 - s20 - 2 * s21 - s22;   // Find edge, skip sqrt() to improve performance ...
       float edgeSqr = (sobelX * sobelX + sobelY * sobelY);
       // ... and threshold against a squared value instead.
       return edgeSqr > 0.07 * 0.07;用这个边缘算法看看
      

  3.   

    @anmychen2001  http://images.cnblogs.com/cnblogs_com/_xbc/383862/o_s1.JPG 你看这图,左边是原图,中间中PS的处理效果,右边是我自己的处理效果