Tengo una imagen binaria, dimensiones 64x63 donde cada píxel es un 1 o 0.

import struct
from PIL import Image
import numpy

...

i1 = Image.frombytes('1', (64, 63), r[3], 'raw')

¿Cómo puedo invertir esta imagen?

Editar

Intenté la solución sugerida:

from PIL import Image
import PIL.ImageOps    

i1 = PIL.ImageOps.invert(i1)

Sin embargo, esto resultó en el error:

raise IOError("not supported for this image mode")
IOError: not supported for this image mode

Y esto, creo, se debe al hecho de que la imagen no es ni RGB ni L (escala de grises). En cambio, es un archivo de imagen binario donde cada píxel es solo 0 o 1.

8
waylonion 2 ene. 2017 a las 06:28
 – 
9000
2 ene. 2017 a las 06:31
¡Gracias por la sugerencia! Sin embargo, intenté esto aunque recibí un error de PIL que indicaba que las imágenes binarias no son compatibles.
 – 
waylonion
2 ene. 2017 a las 08:10
El error exacto que recibo es: raise IOError ("no es compatible con este modo de imagen") IOError: no es compatible con este modo de imagen
 – 
waylonion
2 ene. 2017 a las 08:16

4 respuestas

Otra opción es convertir la imagen a un formato de inversión compatible, antes de invertirla, es decir:

import PIL.ImageOps
inverted_image = PIL.ImageOps.invert( image.convert('RGB') )
5
hamish 19 ago. 2019 a las 10:54

Si está dispuesto a convertir i1 en una matriz numerosa, puede hacerlo

i1 = 1 - numpy.asarray(i1)
3
bobo 2 ene. 2017 a las 08:53
Parece que i1 no es una matriz numerosa. Estoy usando Image.frombytes para crear i1. Usando el código i1 = 1 - i1, recibo el error: TypeError: tipos de operandos no admitidos para -: 'int' e 'Image'
 – 
waylonion
2 ene. 2017 a las 08:13
1
He editado el código para solucionar este problema. Si necesita seguir trabajando con el objeto Pillow Image, puede usar Image.fromarray(i1) después
 – 
bobo
2 ene. 2017 a las 09:04

Encontré exactamente el mismo problema. Hay una solución sin tomarse la molestia de usar numpy.
puedes usar ImageMath:

from PIL import ImageMath
i2 = ImageMath.eval('255-(a)',a=i1)

De esta forma puede invertir una imagen binaria (modo 1 en PIL).
Para obtener más información sobre ImageMath, consulte aquí.

1
Amen 20 ago. 2017 a las 18:07
from PIL import Image
import PIL.ImageOps    

image = Image.open('your_image.png')

inverted_image = PIL.ImageOps.invert(image)

inverted_image.save('your_image_inv.png')
-2
Imran 2 ene. 2017 a las 08:16