Il modo migliore per farlo è utilizzare l'algoritmo "colore in alfa" utilizzato in Gimp per sostituire un colore. Funzionerà perfettamente nel tuo caso. Ho reimplementato questo algoritmo utilizzando PIL per un processore di foto python open source phatch. È possibile trovare l'intera implementazione here. Questa è una pura implementazione del PIL e non ha altre dipendenze. È possibile copiare il codice funzione e usarlo. Ecco un esempio utilizzando Gimp:
a
È possibile applicare la funzione color_to_alpha
sulle immagini utilizzando il nero come colore. Quindi incollare l'immagine su un colore di sfondo diverso per fare la sostituzione.
A proposito, questa implementazione utilizza il modulo ImageMath in PIL. È molto più efficiente dell'accesso ai pixel usando i getdata.
EDIT: Ecco il codice completo:
from PIL import Image, ImageMath
def difference1(source, color):
"""When source is bigger than color"""
return (source - color)/(255.0 - color)
def difference2(source, color):
"""When color is bigger than source"""
return (color - source)/color
def color_to_alpha(image, color=None):
image = image.convert('RGBA')
width, height = image.size
color = map(float, color)
img_bands = [band.convert("F") for band in image.split()]
# Find the maximum difference rate between source and color. I had to use two
# difference functions because ImageMath.eval only evaluates the expression
# once.
alpha = ImageMath.eval(
"""float(
max(
max(
max(
difference1(red_band, cred_band),
difference1(green_band, cgreen_band)
),
difference1(blue_band, cblue_band)
),
max(
max(
difference2(red_band, cred_band),
difference2(green_band, cgreen_band)
),
difference2(blue_band, cblue_band)
)
)
)""",
difference1=difference1,
difference2=difference2,
red_band = img_bands[0],
green_band = img_bands[1],
blue_band = img_bands[2],
cred_band = color[0],
cgreen_band = color[1],
cblue_band = color[2]
)
# Calculate the new image colors after the removal of the selected color
new_bands = [
ImageMath.eval(
"convert((image - color)/alpha + color, 'L')",
image = img_bands[i],
color = color[i],
alpha = alpha
)
for i in xrange(3)
]
# Add the new alpha band
new_bands.append(ImageMath.eval(
"convert(alpha_band * alpha, 'L')",
alpha = alpha,
alpha_band = img_bands[3]
))
return Image.merge('RGBA', new_bands)
image = color_to_alpha(image, (0, 0, 0, 255))
background = Image.new('RGB', image.size, (255, 255, 255))
background.paste(image.convert('RGB'), mask=image)
Ho cercato di arrivare a questo lavoro, ma ha detto di no nucleo modulo chiamato e cose del genere , era solo un casino. Sono probabilmente un idiota ma non riuscivo proprio a farlo funzionare. Grazie comunque sono sicuro che la tua risposta aiuterà qualcun altro. – Cookies
Non si dovrebbe provare a eseguire l'intero file. Basta copiare la funzione color_to_alpha stessa. Ad ogni modo, sono felice che tu abbia trovato una soluzione che funziona per te. Se hai bisogno di una soluzione più efficiente, sai dove guardare;) –
ho fatto, e prima ho detto che il nome globale "OPZIONI" non è definito, quindi ho copiato quella parte e poi ha detto che _t non è definito, ma era un modulo che non avevo. Questo è ciò che intendevo per pasticcio, ho cercato di farlo funzionare ma non potevo, il metodo suggerito di seguito che ha funzionato per me va bene, ma se la tua funzione potesse davvero eliminare tutti i pixel di sfondo nell'immagine sarebbe fantastico. Ne rimangono ancora alcuni che confondono il tesseract. – Cookies