用python从图像中提取衣服

时间:2016-05-17 08:48:14

标签: python image opencv numpy crop

我正在研究如何使用python和其他一些库来裁剪此图像中的连衣裙(参见图像1),所以我需要对照片中的许多模型的不同图像进行此操作,它们将具有不同的尺寸和形状,所以我需要做一些通用的东西,可以拍摄图像,分析它,并除去所有礼服,

image1的 This is an example image before processing 我有一个代码,它采用这个图像并在模型的形状周围做一些掩码并放置alpha通道,所以我得到了这个(image2):

IMAGE2 image after processing

正如你所看到的,这是我的代码的结果,但不是我需要的,我真的需要删除模型周围的所有颜色,如果可能的话,衣服周围的所有颜色,并需要是通用的..即应该使用不同形状和大小的不同型号

这是我使用PIL和numpy库在python上编写的代码,我使用的是python 3.4

    import numpy
from numpy import array
from PIL import Image
#import cv2

# read image as RGB and add alpha (transparency)
im = Image.open("one.jpg").convert("RGBA")

# convert to numpy (for convenience)
imArray = numpy.asarray(im)

# create mask (zeros + circle with ones)

center = (100,100)
radius = 100
mask = numpy.zeros((imArray.shape[0],imArray.shape[1]))
for i in range(imArray.shape[0]):
    for j in range(imArray.shape[1]):
        #if (i-center[0])**2 + (j-center[0])**2 < radius**2:
        #    mask[i,j] = 1
        if ((j > 110 and j<240 and i>65 ) or (j > 440 and j<580 and i>83 )):
            mask[i, j] = 1

"""
lower = numpy.array([0,0,0])
upper = numpy.array([15, 15, 15])
shapeMask = cv2.inRange(imArray, lower, upper)
"""

# assemble new image (uint8: 0-255)
newImArray = numpy.empty(imArray.shape,dtype='uint8')

# colors (three first columns, RGB)
newImArray[:,:,:3] = imArray[:,:,:3]

# transparency (4th column)
newImArray[:,:,3] = mask*255          

# back to Image from numpy
newIm = Image.fromarray(newImArray, "RGBA")
newIm.save("one2.png")

结果应该是PNG图像,除了模型以外都是透明的,或者如果可能的话还要穿着

正如你所看到我只制作一个总是在同一个地方的静态面具,并且它是矩形的,没有调整到模型,请告诉我你是否需要更多解释我需要的东西

非常感谢! 塞萨尔

4 个答案:

答案 0 :(得分:0)

如果您可以假设背景相当简单,(颜色均匀或几乎水平线条),您可以进行边缘检测,并删除第一个出现边缘之外的所有像素。

任何边缘检测滤波器都应该足够了,但我可能会选择一个简单的高通滤波器,它只能增强垂直边缘。 你只是想弄清楚模特的轮廓在哪里!

然后从框架中移除所有像素,向内移动,直到遇到第一条边。 (清理模型外的背景)。

去除手臂和衣服等之间的孔。将移除的像素的颜色值中位数,以获得此行的背景颜色,然后移除颜色值接近行的其余部分的找到平均值的像素。

删除应该通过构建蒙版图像来完成,然后从图像中减去它,因为之后可以将蒙版用于不透明度/ alpha通道。

风险:

  • 如果连衣裙或模特的颜色与背景颜色太近,模特/连衣裙上会出现洞。
  • 背景中的模式会干扰算法并保持行不变。
  • 背景中的噪点可能导致删除或颜色值仅从靠近帧的像素设置。

通过打开和关闭删除掩码可以最大限度地减少其中一些问题。 其他通过边缘检测前的空间中值滤波器。

答案 1 :(得分:0)

第一步是计算背景颜色。获取50*50块找到方差,将10-20 pixels向右移动并获得另一个块,计算其方差等等。将差异存储在数组中。 (以及他们的手段)。

方差最小的是背景颜色,你会看到一堆那些。找到背景颜色后,选择5 * 5块,如果方差非常小且平均值等于其中一个背景(即类似特征),则将其设为白色或做任何你想做的事。

这只是我的直觉,我对图像处理并不专业。

答案 2 :(得分:0)

您可以尝试从模型图像中提取礼服。

  1. link是名为 PixelDTGAN 的图像条件图像生成模型的github存储库。该模型将执行一项具有挑战性的任务,即根据穿着打扮的人的输入图像生成一件衣服
  2. 此模型在语义级别上将输入域转移到目标域,并在像素级别生成目标图像。
  3. 要生成逼真的目标图像,请使用真实/假区分符,就像在生成对抗网络中一样,使用域区分符使生成的图像与输入图像相关。

答案 3 :(得分:0)

这是一个非常棘手的问题,尤其是当您不知道背景将是什么以及背景有阴影时。

衣服的网也将部分或全部丢失,甚至可能失去身体和手臂之间的区域。

尝试使用ImageMagick。但是OpenCV也有类似的命令。

输入:

enter image description here

首先,稍微模糊图像,然后从HCL色彩空间中提取色相通道。

第二,我将所有白色的容差在30%的范围内更改为黑色。

第三,我使用自己的脚本之一执行Otsu阈值设置。

第四次我做了少量的形态学研究。

第五,我使用连接的组件处理来删除面积小于150像素的所有区域。在OpenCV中,这将是斑点检测(SimpleBlobDetection)并将结果反转(取反)作为掩码。

最后,我将遮罩放入输入的alpha通道中,以使背景透明(此处将显示为白色)。

convert image.jpg -blur 0x1 -colorspace HCL -channel r -separate hue.png
convert hue.png -fuzz 30% -fill black -opaque white filled.png
otsuthresh -g save filled.png thresh.png
convert thresh.png -morphology open disk:1 morph.png
convert morph.png -type bilevel \
-define connected-components:mean-color=true \
-define connected-components:area-threshold=150 \
-connected-components 4 \
-negate \
mask.png
convert image.jpg mask.png -alpha off -compose copy_opacity -composite result.png


这是步骤的图像:

色调图像: enter image description here

将白色转换为黑色后的填充图像: enter image description here

大津阈值图像: enter image description here

遮罩: enter image description here

结果: enter image description here

如您所见,结果并不能很好地保持女人和衣服的轮廓,特别是在头发和衣服的网状上。

您可以在https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html处调查OpenCV GrabCut前景扩展