边缘检测和透明度

时间:2009-10-26 19:33:18

标签: image image-processing computer-vision edge-detection background-subtraction

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

谢谢

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

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

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

自己动手:

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

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

OpenCV是一个很好的工具。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

用于彩色图像,每张图片背景相同:

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