代码之家  ›  专栏  ›  技术社区  ›  Joe Cannatti

边缘检测和透明度

  •  6
  • Joe Cannatti  · 技术社区  · 15 年前

    使用在一致背景下拍摄的衣物图像,我希望使图像中的所有像素都透明,除了衣物。最好的方法是什么?我研究了这个和开源库中常见的算法 opencv . 除了滚动我自己或使用OpenCV之外,还有一个简单的方法可以做到这一点吗?我对任何语言或平台都开放。

    谢谢

    4 回复  |  直到 12 年前
        1
  •  6
  •   jilles de wit    15 年前

    如果你的背景被考虑在一个图像中,但在图像中不一致,这可能会变得棘手,但我要做的是:

    1. 将图像分为一些强度/颜色形式,如yuv或lab。
    2. 在颜色部分做一个柱状图。找到最神秘的颜色,这是(最有可能)你的背景(更新),也许这里的一个更好的技巧是找到所有像素中最神秘的颜色在一个或两个像素从图像边缘。
    3. 从图像的漩涡开始,将所有具有该颜色并通过该颜色的像素连接到边缘的像素设置为透明。
    4. 这件衣服的边缘现在看起来有点难看,因为它由像素组成,像素从背景和衣服上获取颜色。要解决这个问题,你需要做更多的工作:

      1. 通过一些 edge detection 机制。
      2. 将边缘像素的颜色替换为仅“内部”边缘像素(即该区域中服装的颜色)和透明(如果输出图像格式支持该颜色)的混合颜色。
      3. 如果你想得到真正的花哨,你增加透明度取决于多少“喜欢”背景颜色的像素的颜色。
        2
  •  2
  •   tom10    15 年前

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

    首先,看看 点检测 用opencv,看看这是否基本上是为你做的。

    自己动手:

    查找背景 :有几个选项。可能最简单的方法是对图像进行柱状图,大量具有相似值的像素是背景,如果有两个大的集合,背景将是中间有一个大洞的集合。另一种方法是将周界周围的一条带作为背景色,但这似乎不太好,例如,来自闪光灯的反射可以显著地照亮位于中心位置的背景像素。

    删除背景 :首先根据背景色对图像进行阈值处理,然后在此基础上运行“打开”或“关闭”算法,然后将其用作遮罩来选择衣服。(打开/关闭的重点是不要删除衣服上的小背景色项目,例如白色上衣上的黑色按钮,或者,例如黑色衣服上的明亮反射。)

    opencv是一个很好的工具。

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

        3
  •  0
  •   ldog    15 年前

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

        4
  •  0
  •   Adrien Plisson    15 年前

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

    • 将图像转换为hsv或hsl
    • 确定背景的色调值(+/-10):例如,使用photoshop执行此步骤一次,然后对所有图片使用相同的值。
    • 执行颜色阈值:在色调通道上排除背景色调(通常为[0,色调[+]Hue,255]),因为所有其他通道都包括整个值范围(通常为0到255)。这将选择非背景的像素。
    • 执行“填充孔”操作(通常在斑点分析或标签功能中找到),以完成可能与背景颜色相同的衣服部分。
    • 现在您有了一个衣服的“蒙版”图像:非零像素表示衣服,0像素表示背景。
    • 处理的这一步取决于如何使像素透明:通常,如果使用alpha(透明度)通道将图像保存为png,则在原始图像的alpha通道和上一步中构建的遮罩之间使用逻辑和(也称为“遮罩”)操作。
    • voil_160;,背景消失,保存生成的图像。