我正在研究如何使用python和其他一些库在这张图片中裁剪服装(见图1),所以我需要为照片上的许多模型拍摄不同的图像,它们会有不同的尺寸和形状,所以我需要做一些通用的东西,可以拍摄图像,分析它并除去所有衣服,
image1 我有一个代码,它采用这个图像,并在模型的形状周围做一些掩码,然后放入alpha通道让我得到这个(image2):
你可以看到这是我的代码的结果,但不是我需要的,我真的需要删除模型周围的所有颜色,如果可能的话,衣服周围的所有颜色,并需要是通用的..即应该工作具有不同形状和尺寸的不同型号
这是我使用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图像,除了模型之外都是透明的,或者如果可能的话还要穿着
正如你所看到我只制作一个永远在同一个地方的静态面具,它是矩形的,没有调整到模型,请告诉我你是否需要更多解释我需要什么
非常感谢!塞萨尔
如果你可以假设背景非常简单(颜色均匀,或者只是几乎水平的线条),你可以进行边缘检测,并删除第一个出现边缘之外的所有像素。
任何边缘检测滤波器应该足够了,但我可能会选择一个简单的高通滤波器,它只能增强垂直边缘。你只是想弄清楚模特的轮廓在哪里!
然后从框架中移除所有像素,向内移动,直到遇到第一条边。 (清理模型外的背景)。
要移除手臂和衣服之间的孔等。将移除的像素的颜色值置于中间位置,以获取此行的背景颜色,然后移除颜色值接近行的其余部分的找到平均值的像素。
应该通过构建蒙版图像来完成删除,然后从图像中减去它,因为之后可以将蒙版用于不透明度/阿尔法通道。
风险:
通过打开和关闭删除掩码可以最小化其中一些问题。其他通过边缘检测之前的空间中值滤波器。
第一步是计算背景颜色。得到一块50*50
找到方差,将10-20 pixels
移到右边并得到另一个块,计算它的方差以及更多。将差异存储在数组中。 (以及他们的手段)。
方差最小的是背景颜色,你会看到一堆那些。找到背景颜色后,选择5 * 5块,如果方差非常小,且其平均值等于其中一个背景(即类似特征),则将其设为白色或做任何你想做的事。
这只是我的直觉,我对图像处理并不专业。
您可以试一试,以便从模型的图像中提取服装。
这是一个非常难的问题,特别是当您不知道背景是什么以及背景是否有阴影时。
衣服的结网也将部分或全部丢失,就像身体和手臂之间的区域一样。
这是使用ImageMagick的尝试。但是OpenCV有类似的命令。
输入:
首先,稍微模糊图像,然后从HCL颜色空间中提取Hue通道。
其次,我将所有白色颜色在30%的容差范围内变为黑色。
第三,我使用我的一个脚本执行Otsu阈值处理。
第四,我做了少量形态接近。
第五,我使用连通分量处理去除区域中小于150像素的所有区域。在OpenCV中,这将是blob检测(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
以下是步骤的图像:
正如你所看到的,结果并不是很好地保持女人和衣服的轮廓,特别是在头发和衣服的网状结构。
您可以在qazxsw poi调查OpenCV GrabCut前景提取