我们有一个系统,人们通过数码单反相机进行面部拍摄。我们需要具有透明背景的人物图像。我们目前正在做的是拍摄图像并在 Photoshop 中对其进行编辑和裁剪,使用魔术橡皮擦工具删除背景图像。
我正在寻找的是一种解析图像并自动擦除我们拥有的半白色背景以及调整大小和裁剪的方法。是否有某种库或代码示例可以在不需要人工干预的情况下执行此操作?
这是一个真正复杂的问题。就像下面建议的答案一样,您需要对每个像素进行模糊匹配并将其设置为透明,但您还需要检测其他附近的像素以确保它们的颜色不接近。衬衫上的白色吊牌,白色的眼皮,头发,苍白的皮肤反射着闪光。所有这些都是被任何贪婪的模糊逻辑删除的候选者。
想想 Photoshop 中的魔棒工具。它在检测图片中人物的边缘方面有多好?是的,这是图像编辑软件的最高标准,背后有数千个工程小时。
对于问答格式,这不是一个可行的要求,这是人类比机器做得更好的事情之一。但是,这并不意味着这是不可能的,谁知道呢,你可能就是这样做的人。请不要在 VB.NET 中这样做:)
一些伪代码来了解您需要做什么:
Bitmap faceShot = Bitmap.FromFile(filepath)
foreach pixel in faceShot
//the following line is where the magic happens, you can do any fuzzy match on the color that suits you
//figure out your color range and do a fuzzy match percentage wise
if (pixel between RGB(255,255,255) and RGB(250,235,215)) //white and antique white
pixel.setAlpha=0
endif
end foreach
您可以以此作为处理单个图像的起点,
http://www.java2s.com/Code/VB/2D/ProcessanImageinvertPixel.htm
基本上,如果您有一个恒定的背景颜色(如电视绿屏),只需选择接近您正在擦除的颜色的像素并将其 Alpha 级别设置为 0(透明)即可。将 RGB 值视为 XYZ 坐标,您可以与背景颜色保持 3d 距离,并使特定阈值内的所有内容透明。
作为一项改进,您还可以将另一个阈值内的所有内容设为半透明,这样头发周围的边缘和类似的东西看起来更柔软且不那么刺眼。
或者,您可以在 Photoshop 中执行相同的操作并获得良好的结果,因为它应该支持批处理。
编辑,再想一想,您可能还想使用绿色屏幕类型的背景,而不是像您所说的那样使用灰白色背景,因为您可能会使人们的眼睛透明。我肯定会尝试在 Photoshop/Gimp/等中对其进行批处理。