复制一份你的图像并使用PIL / Pillow的ImageDraw.floodfill()函数,从左上角开始使用合理的容差进行填充 - 这样你只会填充到衬衫的边缘并避免涉及Nike标志。
然后将背景轮廓变为白色,其他全部变成黑色,并尝试应用一些形态学(可能来自scikit-image)来扩张白色区域以隐藏锯齿。
最后,使用putalpha()
将新生成的图层放入图像中。
时间真的很紧,但这就是大致的方法。请注意,需要在开始时复制原始图像,并在最后使用putalpha()
将新的Alpha层叠加回去 ...
from PIL import Image, ImageDraw
import numpy as np
import skimage.morphology
im = Image.open('shirt.jpg')
ImageDraw.floodfill(im,xy=(0,0),value=(255,0,255),thresh=10)
im.show()
在这里尝试更改阈值 (thresh
)。如果将其设置为50,则效果更干净,可能已足够停止。
![enter image description here](https://istack.dev59.com/qEvwz.webp)
n = np.array(im)
bgMask =(n[:, :, 0:3] == [255,0,255]).all(2)
Image.fromarray((bgMask*255).astype(np.uint8)).show()
![enter image description here](https://istack.dev59.com/aVaH1.webp)
strel = skimage.morphology.disk(13)
closed = skimage.morphology.binary_closing(bgMask,selem=strel)
Image.fromarray((closed*255).astype(np.uint8)).show()
![图片描述在此处输入](https://istack.dev59.com/4VHGX.webp)
如果您对形态学不熟悉,可以阅读Anthony Thyssen的一些很好的笔记 这里。
顺便说一下,您还可以使用potrace
来稍微平滑轮廓线。
今天我有更多时间,因此提供了一个更完整的版本。您可以根据您的图像来实验形态学盘大小和洪水填充阈值,直到找到适合您需求的东西:
from PIL import Image, ImageDraw
import numpy as np
import skimage.morphology
im = Image.open('shirt.jpg')
orig = im.copy()
ImageDraw.floodfill(im,xy=(0,0),value=(255,0,255),thresh=50)
im.show()
n = np.array(im)
bgMask =(n[:, :, 0:3] == [255,0,255]).all(2)
Image.fromarray((bgMask*255).astype(np.uint8)).show()
strel = skimage.morphology.disk(13)
newalpha = skimage.morphology.binary_closing(bgMask,selem=strel)
newalpha = skimage.morphology.binary_dilation(newalpha, selem=strel)
newalphaPIL = (newalpha*255).astype(np.uint8)
newalphaPIL = Image.fromarray(255-newalphaPIL, mode='L')
newalphaPIL.show()
orig.putalpha(newalphaPIL)
orig.save('result.png')
![在此输入图像描述](https://istack.dev59.com/2dYiu.webp)
关于使用 potrace
平滑轮廓线,你需要将 new alphaPIL
保存为 PGM 格式的图像,因为这是 potrace
所需的输入格式。因此代码如下:
newalphaPIL.save('newalpha.pgm')
现在你可以玩耍,哎呀,我是说“谨慎实验”使用
potrace
平滑α轮廓。基本命令如下:
potrace -b pgm newalpha.pgm -o smoothalpha.pgm
接着,您可以重新加载图像smoothalpha.pgm
到Python中,并在 putalpha()
调用的最后一行使用它。以下是原始未平滑化阿尔法和平滑化后的差异动画:
![enter image description here](https://istack.dev59.com/3GY5z.gif)
仔细观察边缘以查看差异。您可能希望在平滑之前将Alpha大小调整为两倍或一半,以查看其效果。
IPython
中交互测试我的代码,而且在最终确定答案时有时会漏掉一些步骤。我已经添加了import skimage.morphology
。 - Mark Setchellpotrace
的内容,不确定是否值得这样做。如果您喜欢,还有一个Python版本... https://pypi.org/project/pypotrace/ - Mark Setchell