pyplot python imagemagick python-imaging-library

python - pyplot - Recorta el espacio en blanco usando PIL



title plt python (3)

¿Hay una solución simple para recortar espacios en blanco en la imagen en PIL?

ImageMagick tiene soporte fácil para él de la siguiente manera:

convert test.jpeg -fuzz 7% -trim test_trimmed.jpeg

Encontré una solución para PIL:

from PIL import Image, ImageChops def trim(im, border): bg = Image.new(im.mode, im.size, border) diff = ImageChops.difference(im, bg) bbox = diff.getbbox() if bbox: return im.crop(bbox)

Pero esta solución tiene desventajas:

  1. Necesito definir el color del border , no es un gran problema para mí, mis imágenes tienen fondo blanco
  2. Y la mayor desventaja es que esta solución PIL no es compatible con la clave -fuzz de ImageMagick. Para agregar algunos cultivos difusos. como puedo tener algunos artefactos de compresión jpeg y sombras enormes innecesarias.

¿Puede ser que PIL tenga algunas funciones integradas para ello? ¿O hay alguna solución rápida?


No creo que haya nada integrado en PIL que pueda hacer esto. Pero he modificado tu código para que lo haga.

  • Obtiene el color del borde desde el píxel superior izquierdo, utilizando getpixel , por lo que no necesita pasar el color.
  • Resta un escalar de la imagen diferenciada, esta es una manera rápida de saturar todos los valores por debajo de 100, 100, 100 (en mi ejemplo) a cero. Entonces, es una buena manera de eliminar cualquier ''bamboleo'' resultante de la compresión.

Código:

from PIL import Image, ImageChops def trim(im): bg = Image.new(im.mode, im.size, im.getpixel((0,0))) diff = ImageChops.difference(im, bg) diff = ImageChops.add(diff, diff, 2.0, -100) bbox = diff.getbbox() if bbox: return im.crop(bbox) im = Image.open("bord3.jpg") im = trim(im) im.show()

Jpeg muy comprimido:

Recortada:

Jpeg ruidoso:

Recortada: