La mejor manera de hacerlo es utilizar el algoritmo "color a alfa" utilizado en Gimp para reemplazar un color. Funcionará perfectamente en tu caso. Reimplementé este algoritmo usando PIL para un procesador de fotografía python de código abierto phatch. Puede encontrar la implementación completa here. Esta es una implementación pura de PIL y no tiene otras dependencias. Puede copiar el código de función y usarlo. Aquí está una muestra utilizando Gimp:
a 
Puede aplicar la función color_to_alpha
en la imagen utilizando el negro como color. Luego pegue la imagen en un color de fondo diferente para hacer el reemplazo.
Por cierto, esta implementación utiliza el módulo ImageMath en PIL. Es mucho más eficiente que acceder a píxeles usando getdata.
EDIT: Aquí está el código 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)
Traté de conseguir que esto funcione, pero dijo que no núcleo módulo llamado y cosas por el estilo , fue solo un desastre. Probablemente soy un idiota, pero no pude hacer que funcionara. Gracias de todos modos, estoy seguro de que su respuesta ayudará a otra persona. – Cookies
No intente ejecutar todo el archivo. Solo copie la función color_to_alpha. De todos modos, me alegra que hayas encontrado una solución que funcione para ti. Si necesita una solución más eficiente, sabe dónde buscar;) –
Lo hice, y primero dijo que el nombre global 'OPCIONES' no está definido, así que copié esa parte y luego dijo que _t no está definido, pero era un módulo que no tenía. Eso es lo que quise decir con desorden, traté de hacer que funcionara pero no pude, el método sugerido a continuación que funcionó para mí está bien, pero si tu función realmente podría eliminar todos los píxeles de fondo de la imagen sería genial. Todavía quedan algunos que confunden tesseract. – Cookies