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

谢谢

有帮助吗?

解决方案

如果你的背景在图像中是一致的,但在图像中不一致,那可能会变得棘手,但这就是我要做的事情:

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

    1. 通过边缘检测机制找到服装的边缘。
    2. 用“仅在内部”的颜色混合来替换边缘像素的颜色。边缘像素(即该区域中衣服的颜色)和透明(如果您的输出图像格式支持)。
    3. 如果你想变得非常花哨,你可以根据多少“喜欢”增加透明度。背景颜色是该像素的颜色。

其他提示

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

首先,使用OpenCV查看 blob detection ,看看这是否基本完成。

自己动手:

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

删除背景:首先采取的方法是根据背景颜色对图像进行阈值处理,然后运行“打开”按钮。或“关闭”算法就此,然后用它作为面具来选择你的服装文章。 (打开/关闭的目的是不要去除衣服上的小背景色,如白色衬衫上的黑色纽扣,或者说,黑色衣服上的明亮反光。)

OpenCV是一个很好的工具。

这个最棘手的部分可能是在物体周围的阴影处(例如,白色背景上的黑色夹克会在某些边缘处产生连续的灰色阴影以及在哪里进行切割?)但是如果你得到的话到目前为止,发布了另一个问题。

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

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

  • 将图像转换为 HSV 或 HSL
  • 确定背景的色调值 (+/-10):执行此步骤一次,例如使用 Photoshop,然后在所有图片上使用相同的值。
  • 执行颜色阈值:色调通道上排除背景的色调(通常为 [0,hue[ + ]hue, 255]),因为所有其他通道包括整个值范围(通常为 0 到 255)。这将选择不是背景的像素。
  • 执行“填充孔”操作(通常在斑点分析或标记功能中发现)以完成可能与背景颜色相同的衣服部分。
  • 现在你有了一张衣服“面具”的图像:非零像素代表衣服,0像素代表背景。
  • 此处理步骤取决于您希望如何使像素透明:通常,如果将图像保存为带有 alpha(透明)通道的 PNG,请在原始图像的 alpha 通道与上一步中构建的蒙版之间使用逻辑 AND(也称为“蒙版”)运算。
  • 瞧,背景消失了,保存生成的图像。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top