【问题标题】:how to remove background image and get fore image如何删除背景图像并获取前图像
【发布时间】:2011-01-07 04:32:14
【问题描述】:

有两张图片

alt text http://bbs.shoucangshidai.com/attachments/month_1001/1001211535bd7a644e95187acd.jpg alt text http://bbs.shoucangshidai.com/attachments/month_1001/10012115357cfe13c148d3d8da.jpg 一张是背景图片,另一张是一个人的照片,背景相同,大小相同,我想要做的是删除第二张图片的背景并仅提取该人的个人资料。常见的方法是从第二张图像中减去第一张图像,但我的问题是人穿的颜色是否与背景相似。减法的结果很糟糕。我无法获得整个人的个人资料。谁有好的想法删除背景给我一些建议。 提前谢谢你。

【问题讨论】:

  • 呃什么?你能把图像放在 photobucket 或其他东西上,这样我们就可以看到你在说什么?您将两张照片逐像素添加在一起?您是在谈论色度键控(参见en.wikipedia.org/wiki/Chroma_key)吗?
  • 不,简单来说这是一种从人的照片中去除背景的方法。
  • 你真的可以用图像示例重写问题,真的很难理解你想要什么
  • ...还有你想要的语言,服务器端,客户端等等
  • Alex:在他有实现方法之前,实现语言并不重要。

标签: image-processing computer-vision image-segmentation background-foreground


【解决方案1】:

将照片发布到 Craigslist 上,并告诉他们您将支付 5 美元让某人这样做。

保证您会在几分钟内获得成功。

【讨论】:

    【解决方案2】:

    您可以逐个像素地遍历两个图像,并且只“减去”完全相同的像素,而不是直接减法。不过,这当然不会考虑颜色的微小差异。

    【讨论】:

    • 这可能是问题,因为光线条件不稳定
    • -1:这与减去所有内容然后将阈值设置为 0 完全相同。此外,即使照明是静态的,也不能保证两个后续帧中的像素完全相同.
    • 这是比较两个图像的非常原始的方法。使用阈值和邻域信息将在现实生活中提供更好的结果
    【解决方案3】:

    我认为常见的一种技术是使用mixture model。抓取一些背景帧,并为每个像素构建一个颜色混合模型。

    当你应用一个包含人的帧时,你会得到一些颜色是前景或背景的概率,给定混合模型中每个像素的概率密度。

    在你得到 P(pixel is foreground) 和 P(pixel is background) 之后,你可以对概率图像进行阈值处理。

    另一种可能性是在一些更聪明的分割算法中使用概率作为输入。一个例子是graph cuts,我注意到它的效果很好。

    但是,如果该人穿着与背景在视觉上无法区分的衣服,显然上述方法都不起作用。您要么必须获得另一个传感器(如 IR 或 UV),要么有一个非常精细的“人体模型”,如果它发现它认为是躯干和头部,可以将腿“添加”到正确的位置。

    祝项目顺利!

    【讨论】:

    • 很好的解决方案。如果我可以添加它,一个好的算法可能是:
    【解决方案4】:

    如果您对图像背景有一个很好的估计,那么从带有人物的图像中减去它是一个很好的第一步。但这只是第一步。之后,您必须对图像进行分割,即您必须将图像划分为“背景”和“前景”像素,并具有如下约束:

    1. 在前景区域,与背景图像的平均差异应该很高
    2. 在背景区域,与背景图像的平均差异应该很低
    3. 这些区域应该是平滑的。轮廓长度和曲率应尽可能小。
    4. 区域的边界在源图像中应具有高对比度

    如果您有数学倾向,可以使用 Mumford-Shah 泛函对这些约束进行完美建模。 See here for more information.

    但您或许可以采用其他分割算法来解决该问题。

    如果你想要一个快速简单(但不完美)的版本,你可以试试这个:

    • 减去两个图像
    • 找到背景-前景差异大于某个阈值的最大连续像素“斑点”。这是对前景图像中“人物区域”的第一次粗略估计,但分割不符合上述标准 3 和 4。
    • 找到最大斑点的轮廓(编辑:请注意,您不必从轮廓开始。您也可以从较大的多边形开始,因为步骤会自动将其缩小到最佳位置。)
    • 现在遍历轮廓中的每个点并平滑轮廓。即对于每个点,找到使公式最小化的点:c1*L - c2*G,其中 L 是如果将点移动到此处,则 L 是轮廓多边形的长度,G 是该点将移动到的位置处的梯度, c1/c2 是控制过程的常数。将点移动到该位置。这具有平滑源图像中低梯度区域的轮廓多边形的效果,同时保持它与源图像中的高梯度(即人的可见边界)相关联。 L 和 G 可以尝试不同的表达方式,例如 L 可以考虑长度和曲率,G 还可以考虑背景中的梯度和减去的图像。
    • 您可能需要重新规范化轮廓多边形,即确保轮廓上的点有规律地间隔。要么,要么确保点之间的距离在之前的步骤中保持规则。 (“测地线蛇”)
    • 重复最后两步直到收敛

    您现在有一个轮廓多边形,它触及可见的人物背景边界,并在边界不可见或对比度低的地方平滑地继续。 查找“Snakes”(e.g. here) 了解更多信息。

    【讨论】:

    • 您是否有用于 Mumford-Shah 背景分离的有效指针?上面的链接不再有效。是的 - 我知道我玩游戏有点晚了......
    • @nimrodm:我已经更新了链接。但老实说,这只是 Google Scholar 的第一次成功。
    【解决方案5】:

    在减去图像之前对图像进行低通滤波(模糊)。 然后使用该差异信号作为掩码来选择感兴趣的像素。 足够宽的过滤器将忽略最终在您感兴趣的对象内雕刻出“可怕”区域的太小(高频)特征。它还将减少像素级噪声和错位(最高频率信息)的突出显示。

    此外,如果您有两个以上的帧,引入一些时间滞后也会让您随着时间的推移形成更稳定的感兴趣区域。

    【讨论】:

      【解决方案6】:

      背景与前景检测非常主观。应用场景定义背景或前景。但是,在您详细说明的应用程序中,我猜您是在暗示该人是前景。 使用上述假设,您寻求的是一个人检测算法。一个可能的解决方案是:

      1. 运行 haar 特征检测器 + 增强的弱分类器级联 (详见opencv wiki
      2. 计算帧间运动(差异)
      3. 如果一帧有 +ve 人脸检测,则对运动像素进行聚类 脸部周围 (kNN algorithm)

      瞧……你应该有一个简单的人员检测器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多