用python从图像中提取裙子

2024-04-20 05:39:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究如何使用python和其他一些库来裁剪这张图片中的裙子(参见图片1),所以我需要对照片上有许多模型的不同图像进行此操作,它们的大小和形状也会不同,所以我需要做一些通用的操作,可以拍摄图像,分析它并删除除裙子之外的所有内容

图像1 This is an example image before processing 我有一个代码,拍下这张图片,在模型的形状周围做一些遮罩,然后把alpha通道放进去,这样我就得到了这个(图像2):

图像2 image after processing

我需要的是我周围所有的颜色,但如果我真的需要去除所有的颜色。。i、 e.应与不同形状和尺寸的不同型号配合使用

这是我用PIL和numpy库在python上编写的代码,我使用的是python3.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图像,除了模特,或者裙子(如果可能的话)都是透明的

正如你所看到的,我只做了一个静态掩模,总是在同一个地方,它是矩形的,没有调整到模型,让我知道如果你需要更多的解释,我需要什么

非常感谢! 塞萨尔


Tags: andfrom模型图像imageimportnumpy图片
3条回答

你可以尝试一下,以便从模特的形象中提取衣服。在

  1. link是图像条件图像生成模型github repo,名为PixelDTGAN。该模型将执行一项具有挑战性的任务,即从穿着衣服的人的输入图像生成一件衣服
  2. 该模型在语义层将输入域转换为目标域,在像素级生成目标图像。在
  3. 为了生成真实的目标图像,在生成对抗网中使用真/假鉴别器,使用域鉴别器使生成的图像与输入图像相关。在

第一步是计算背景色。得到一个50*50的块,找到方差,将10-20 pixels右移,得到另一个块,计算它的方差以及更多。将方差存储在数组中。(以及他们的手段)。在

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

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

如果你可以假设背景是相当简单的(颜色均匀,或者只有几乎水平的线条),你可以做边缘检测,然后移除第一个出现的边缘之外的所有像素。在

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

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

去除手臂和衣服之间的洞等。。中值移除像素的颜色值,以获得此行的背景色,然后移除颜色值接近行剩余部分的平均值的像素。在

删除应该通过建立一个遮罩图像,然后从图像中减去它,因为遮罩可以用于不透明/阿尔法通道之后。在

风险:

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

其中一些问题可以通过打开和关闭删除掩码来最小化。 另一种是在边缘检测之前用空间中值滤波。在

相关问题 更多 >