我正在尝试从产品图片中删除背景,将它们另存为透明png,以至于我无法弄清楚如何以及为什么使产品周围的白线像模糊不清(请参见第二张图片) )不知道效果的真实含义。我也失去了白色的耐克耐克鞋:(
from PIL import Image
img = Image.open('test.jpg')
img = img.convert("RGBA")
datas = img.getdata()
newData = []
for item in datas:
if item[0] > 247 and item[1] > 247 and item[2] > 247:
newData.append((255, 255, 255, 0))
else:
newData.append(item)
img.putdata(newData)
img.save("test.png", "PNG")
有什么想法我可以解决这个问题,以便获得清晰的选择,边缘吗?
答案 0 :(得分:4)
复制图像并使用PIL / Pillow的ImageDraw.floodfill()以合理的公差从左上角进行填充-这样,您将只填充到衬衫的边缘并避免使用Nike徽标
然后将背景轮廓设为白色,将其他所有颜色设为黑色,然后尝试应用某种形态(可能来自scikit图像)以将白色扩大一些以隐藏锯齿。
最后,使用putalpha()
将生成的新层放入图像中。
我真的很想争取时间,但这是它的关键。只是在开始时丢失了原始图像的副本,而在结尾时丢失了新的alpha层的putalpha()
...
from PIL import Image, ImageDraw
import numpy as np
import skimage.morphology
# Open the shirt
im = Image.open('shirt.jpg')
# Make all background pixels (not including Nike logo) into magenta (255,0,255)
ImageDraw.floodfill(im,xy=(0,0),value=(255,0,255),thresh=10)
# DEBUG
im.show()
此处具有阈值(thresh
)的实验。如果您将其设置为50,它的工作原理将更加整洁,可能足以将其停止。
# Make into Numpy array
n = np.array(im)
# Mask of magenta background pixels
bgMask =(n[:, :, 0:3] == [255,0,255]).all(2)
# DEBUG
Image.fromarray((bgMask*255).astype(np.uint8)).show()
# Make a disk-shaped structuring element
strel = skimage.morphology.disk(13)
# Perform a morphological closing with structuring element
closed = skimage.morphology.binary_closing(bgMask,selem=strel)
# DEBUG
Image.fromarray((closed*255).astype(np.uint8)).show()
如果您不熟悉形态学,那么安东尼·蒂森(Anthony Thyssen)有一些值得一读的here知识点。
顺便说一句,您也可以使用potrace
稍微平滑轮廓。
我今天有更多时间,所以这里是一个更完整的版本。您可以根据图像尝试形态磁盘的大小和填充阈值,直到找到适合自己需求的内容为止:
#!/bin/env python3
from PIL import Image, ImageDraw
import numpy as np
import skimage.morphology
# Open the shirt and make a clean copy before we dink with it too much
im = Image.open('shirt.jpg')
orig = im.copy()
# Make all background pixels (not including Nike logo) into magenta (255,0,255)
ImageDraw.floodfill(im,xy=(0,0),value=(255,0,255),thresh=50)
# DEBUG
im.show()
# Make into Numpy array
n = np.array(im)
# Mask of magenta background pixels
bgMask =(n[:, :, 0:3] == [255,0,255]).all(2)
# DEBUG
Image.fromarray((bgMask*255).astype(np.uint8)).show()
# Make a disk-shaped structuring element
strel = skimage.morphology.disk(13)
# Perform a morphological closing with structuring element to remove blobs
newalpha = skimage.morphology.binary_closing(bgMask,selem=strel)
# Perform a morphological dilation to expand mask right to edges of shirt
newalpha = skimage.morphology.binary_dilation(newalpha, selem=strel)
# Make a PIL representation of newalpha, converting from True/False to 0/255
newalphaPIL = (newalpha*255).astype(np.uint8)
newalphaPIL = Image.fromarray(255-newalphaPIL, mode='L')
# DEBUG
newalphaPIL.show()
# Put new, cleaned up image into alpha layer of original image
orig.putalpha(newalphaPIL)
orig.save('result.png')
关于使用potrace
平滑轮廓,您可以将new alphaPIL
保存为PGM格式的图像,因为potrace
就像输入一样。这样就可以了:
newalphaPIL.save('newalpha.pgm')
现在您可以玩了,哎呀,我的意思是用potrace
来“仔细实验” 以平滑Alpha轮廓。基本命令是:
potrace -b pgm newalpha.pgm -o smoothalpha.pgm
然后可以将图像smoothalpha.pgm
重新加载到Python中,并在putalpha()
调用的最后一行使用它。这是原始的未平滑的alpha与平滑的alpha之间的差异的动画:
仔细查看边缘以发现差异。您可能需要尝试将alpha大小调整为两倍大小或一半大小,然后再进行平滑处理以查看效果如何。