Урежьте пробел, используя 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)

Но у этого решения есть недостатки:

I need to define border color, it is not a big deal for me, my images has white background And the most disadvantage, This PIL solution doesn't support ImageMagick's -fuzz key. To add some fuzzy cropping. as I can have some jpeg compression artifacts and unneeded huge shadows.

Может быть, PIL имеет некоторые встроенные функции для этого? Или есть какое-то быстрое решение?

 Sergey Markelov26 апр. 2014 г., 08:46
Я знаю, что код там точно такой же, но его также можно найти здесь -gist.github.com/mattjmorrison/932345

Ответы на вопрос(3)

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

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

 04 июл. 2018 г., 15:38
Не могли бы вы уточнить ответ, пожалуйста? (с примером)
 25 июл. 2018 г., 09:20
Я просто попытался использовать функцию trim () в Wand в дополнение к принятому ответу и могу заключить, что Wand дал значительно худшие результаты обрезки, что было очень удивительно, учитывая, что мои изображения были резкими и граница была полностью сплошной.
Решение Вопроса

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

It gets the border colour from the top left pixel, using getpixel, so you don't need to pass the colour. Subtracts a scalar from the differenced image, this is a quick way of saturating all values under 100, 100, 100 (in my example) to zero. So is a neat way to remove any 'wobble' resulting from compression.

Код:

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

Шумный JPEG:

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

 Eugene Nagorny16 мая 2012 г., 12:53
Это я и искал. Это работает как волшебство. Благодарю.
 16 мая 2012 г., 15:20
@Ideviantik - круто, я немного упростила это. наслаждаться.
 11 июн. 2015 г., 22:01
Что делает эта линия? & Quot; diff = ImageChops.add (diff, diff, 2.0, -100) & quot; Вы просто пытаетесь избежать нулевых ребер для getbbox?
 03 авг. 2012 г., 10:26
Обратите внимание, что выполняемая операция очень опасна: она компенсирует шум на границе, но вы больше не можете обрабатывать изображения, где фон и само изображение очень похожи - например, фотографии, если белые статьи расположены на белом фоне.
 14 авг. 2015 г., 10:00
@WichertAkkerman Наверное, я нашел решение: заменитьdiff = ImageChops.add(diff, diff, 2.0, -100) сdiff = ImageChops.add(diff, diff)

import ufp.image
import PIL
im = PIL.Image.open('test.jpg', 'r')
trimed = ufp.image.trim(im, fuzz=13.3)
trimed.save('trimed.jpg')
 18 дек. 2018 г., 19:16
@WillS Вы можете редактировать ответ, и он будет рассмотрен и обновлен.
 07 дек. 2017 г., 15:46
Эта ссылка в вашем ответе теперь пересылает файл размером 1 Гб. Это может быть хорошая идея, чтобы удалить его.

Ваш ответ на вопрос