6

使用在一致背景下拍摄的衣服图像,我想让图像中的所有像素都透明,除了衣服。解决此问题的最佳方法是什么?我研究了为此常用的算法和开源库opencv。除了自己滚动或使用 opencv 之外,还有一种简单的方法可以做到这一点吗?我对任何语言或平台持开放态度。

谢谢

4

4 回答 4

6

如果您的背景在图像中一致但在图像之间不一致可能会变得棘手,但这是我会做的:

  1. 将图像分离成某种强度/颜色形式,例如 YUV 或 Lab。
  2. 在颜色部分上制作直方图。找到最常出现的颜色,这(很可能)是您的背景(更新),也许这里更好的技巧是找到距离图像边缘一两个像素内所有像素中出现次数最多的颜色。
  3. 从图像的边缘开始,将具有该颜色并通过该颜色的像素连接到边缘的所有像素设置为透明。
  4. 这件衣服的边缘现在看起来有点难看,因为它由从背景和这件衣服中获取颜色的像素组成。为了解决这个问题,您需要做更多的工作:

    1. 通过某种边缘检测机制找到这件衣服的边缘。
    2. 将边缘像素的颜色替换为边缘像素“内部”的颜色(即该区域中衣服的颜色)和透明(如果您的输出图像格式支持)的混合颜色。
    3. 如果您想变得真正花哨,则可以根据该像素的颜色与背景颜色“相似”的程度来增加透明度。
于 2009-10-28T09:26:20.590 回答
2

基本上,找到背景的颜色并减去它,但我想你知道这一点。自动完成这一切有点棘手,但似乎有可能。

首先,看一下OpenCV 的blob 检测,看看这是否基本上为您完成。

自己做:

查找背景:有几种选择。可能最简单的方法是对图像进行直方图,并且具有相似值的大量像素是背景,如果有两个大集合,则背景将是中间有一个大洞的那个。另一种方法是将周边的带作为背景颜色,但这似乎较差,例如,来自闪光灯的反射可以显着增亮位于中心的背景像素。

删除背景:首先是根据背景颜色对图像进行阈值处理,然后对此运行“打开”或“关闭”算法,然后将其用作掩码来选择您的服装。(打开/关闭的重点是不要去除衣服上的小背景色物品,例如白色衬衫上的黑色纽扣,或者说黑色衣服上的明亮反射。)

OpenCV 是一个很好的工具。

最棘手的部分可能是物体周围的阴影(例如,白色背景上的黑色夹克在某些边缘会有连续的灰色阴影,在哪里进行切割?),但如果你走到这一步,发布另一个问题。

于 2009-10-27T02:28:52.003 回答
0

对于彩色图像,每张图片都具有相同的背景:

  • 将您的图像转换为 HSV 或 HSL
  • 确定背景的色调值 (+/-10):执行此步骤一次,例如使用 Photoshop,然后在所有图片上使用相同的值。
  • 执行颜色阈值:在色调通道上排除背景色调(通常为 [0,hue[ + ]hue, 255]),对于所有其他通道包括整个值范围(通常为 0 到 255)。这将选择不是背景的像素。
  • 执行“填充孔”操作(通常在斑点分析或标记函数中找到)以完成可能与背景颜色相同的衣服部分。
  • 现在你有一个图像,它是衣服的“蒙版”:非零像素代表衣服,0 像素代表背景。
  • 此处理步骤取决于您希望如何使像素透明:通常,如果您将图像保存为带有 alpha(透明)通道的 PNG,请在 alpha 通道之间使用逻辑与(也称为“屏蔽”)操作原始图像和掩码在上一步中构建。
  • 瞧,背景消失了,保存生成的图像。
于 2009-10-26T20:25:27.210 回答
0

如果您知道背景的确切颜色强度并且它永远不会改变并且衣服永远不会与这种颜色相吻合,那么这是背景减法的简单应用,即所有不是特定颜色强度的东西都被认为是“开”像素,感兴趣的一个。然后,您可以使用连接组件标签 ( http://en.wikipedia.org/wiki/Connected_Component_Labeling ) 来确定对象的单独分组。

于 2009-10-26T19:40:17.910 回答