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:
- Necesito definir el color del
border
, no es un gran problema para mí, mis imágenes tienen fondo blanco - 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:
Use la varita http://docs.wand-py.org/en/0.3-maintenance/wand/image.html
recorte (color = Ninguno, fuzz = 0) Elimina el borde sólido de la imagen. Utiliza el píxel superior izquierdo como una guía de forma predeterminada, o también puede especificar el color para eliminar.
usando la función de recorte en el módulo ufp.image.
import ufp.image
import PIL
im = PIL.Image.open(''test.jpg'', ''r'')
trimed = ufp.image.trim(im, fuzz=13.3)
trimed.save(''trimed.jpg'')
ver ejemplo: Recortar el espacio en blanco del borde de la imagen con fuzz [Python]