Подтвердить что ты не робот

Обрезать пробелы с помощью PIL

Есть ли простое решение обрезать пробелы на изображении в PIL?

ImageMagick легко поддерживает его следующим образом:

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

Я нашел решение для 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)

Но это решение имеет недостатки:

  • Мне нужно определить цвет border, для меня это не очень важно, мои изображения имеют белый фон
  • И самый недостаток, это решение PIL не поддерживает ImageMagick -fuzz. Чтобы добавить нечеткое обрезку. так как я могу иметь некоторые артефакты сжатия JPEG и ненужные огромные тени.

Может быть, у PIL есть некоторые встроенные функции? Или есть быстрое решение?

4b9b3361

Ответ 1

Я не думаю, что в PIL есть что-то, что может сделать это. Но я изменил ваш код, чтобы он это сделал.

  • Он получает цвет границы из верхнего левого пикселя, используя getpixel, поэтому вам не нужно передавать цвет.
  • Вычитает скаляр из разностного изображения, это быстрый способ насыщения всех значений в 100, 100, 100 (в моем примере) до нуля. Так что аккуратный способ удалить любое "колебание" в результате сжатия.

код:

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:

enter image description here Обрезано: enter image description here

Noisy jpeg:

enter image description here Обрезано: enter image description here

Ответ 2

Использовать палочку http://docs.wand-py.org/en/0.3-maintenance/wand/image.html

отделка (цвет = нет, fuzz = 0) Удалите сплошную границу с изображения. По умолчанию используется верхний левый пиксель в качестве руководства, или вы также можете указать цвет для удаления.

Ответ 3

используя функцию обрезки в модуле 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')

Ответ 4

Чтобы убрать белые границы, эта команда за меня.

convert orig.png -flatten -fuzz 1% -trim + repage trimmed.jpg