web-dev-qa-db-fra.com

Couper les espaces à l'aide de PIL

Existe-t-il une solution simple pour découper les espaces sur l'image dans PIL?

ImageMagick a un support facile pour cela de la manière suivante:

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

J'ai trouvé une solution pour 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)

Mais cette solution présente des inconvénients:

  1. Je dois définir border couleur, ce n'est pas grave pour moi, mes images ont un fond blanc
  2. Et le plus désavantage, cette solution PIL ne prend pas en charge la clé -fuzz D'ImageMagick. Pour ajouter un recadrage flou. car je peux avoir des artefacts de compression jpeg et des ombres énormes inutiles.

Peut-être que PIL a des fonctions intégrées pour cela? Ou existe-t-il une solution rapide?

45
Eugene Nagorny

Je ne pense pas qu'il y ait quoi que ce soit intégré à PIL qui puisse faire cela. Mais j'ai modifié votre code pour qu'il le fasse.

  • Il obtient la couleur de la bordure à partir du pixel supérieur gauche, en utilisant getpixel, vous n'avez donc pas besoin de passer la couleur.
  • Soustrait un scalaire de l'image différenciée, c'est un moyen rapide de saturer toutes les valeurs sous 100, 100, 100 (dans mon exemple) à zéro. Il en va de même pour éliminer toute "oscillation" résultant de la compression.

Code:

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 fortement compressé:

enter image description here Tondu: enter image description here

JPEG bruyant:

enter image description here Tondu: enter image description here

104
fraxel

en utilisant la fonction trim sur le module 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')
2
c2o93y50

Utilisez la baguette http://docs.wand-py.org/en/0.3-maintenance/wand/image.html

trim (couleur = None, fuzz = 0) Supprimer la bordure pleine de l'image. Utilise le pixel supérieur gauche comme guide par défaut, ou vous pouvez également spécifier la couleur à supprimer.

2
Jie Bao