簡體   English   中英

如何從python中的圖像中刪除白色模糊

[英]How to remove white fuzziness from image in python

我正在嘗試從產品圖像中刪除背景,將它們保存為透明png並且達到了一個我無法弄清楚如何以及為什么我會在產品周圍獲得白線的模糊(參見第二張圖片)don'知道效果的真實詞。 我也失去了耐克旋風,這也是白色的:(

輸入 產量

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")

我有什么想法可以解決這個問題,所以我得到了干凈的選擇,邊緣?

拍攝您的圖像副本並使用PIL / Pillow的ImageDraw.floodfill()以合理的公差從左上角填充填充物 - 這樣您只會填充到襯衫的邊緣並避開Nike徽標。

然后采取背景輪廓,使其變成白色,其他一切都變黑,並嘗試應用一些形態(可能來自scikit-image)來擴大白色稍微大一些以隱藏鋸齒。

最后,使用putalpha()將生成的新圖層放入圖像中。


我真的很熱愛,但這里有它的骨頭。 只是在開始時丟失原始圖像的副本,並在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()

在此輸入圖像描述

如果你不熟悉的形態,安東尼蒂森有一些值得一讀的優秀化整為零這里

順便說一下,你也可以使用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')

現在你可以玩了,oops我的意思是用potrace “仔細試驗”以平滑alpha輪廓。 基本命令是:

potrace -b pgm newalpha.pgm -o smoothalpha.pgm

然后,您可以將圖像smoothalpha.pgm重新加載到Python中,並在putalpha()調用的最后一行使用它。 這是原始未平滑的alpha和平滑的alpha之間差異的動畫:

在此輸入圖像描述

仔細看邊緣,看看差異。 在平滑之前,您可能希望嘗試將alpha的大小調整為兩倍大小或一半大小以查看其具有的效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM