Метод getbbox из библиотеки изображений Python (PIL) не работает

Я хочу обрезать изображение до меньшего размера, вырезав белые области по краям. Я попробовал решение, предложенное на этом форуме Обрезать изображение PNG до минимального размера, но метод pil getbbox () возвращает ограничивающую рамку того же размера, что и изображение, т. е. кажется, что он не распознает пустые области вокруг. Я пробовал следующее:

>>>import Image
>>>im=Image.open("myfile.png")
>>>print im.format, im.size, im.mode
>>>print im.getbbox()
PNG (2400,1800) RGBA
(0,0,2400,1800)

Я проверил, что у моего изображения есть действительно белые кадрируемые границы, обрезав изображение с помощью автоматической обрезки GIMP. Я также пробовал с версиями рисунка ps и eps, но безуспешно.
Любая помощь будет принята с благодарностью.


person etepoc    schedule 26.03.2012    source источник


Ответы (1)


Проблема в том, что getbbox() обрезает черные границы, из документов: Calculates the bounding box of the non-zero regions in the image.

введите описание изображения здесь введите описание изображения здесь

import Image    
im=Image.open("flowers_white_border.jpg")
print im.format, im.size, im.mode
print im.getbbox()
# white border output:
JPEG (300, 225) RGB
(0, 0, 300, 225)

im=Image.open("flowers_black_border.jpg")
print im.format, im.size, im.mode
print im.getbbox()
# black border output:
JPEG (300, 225) RGB
(16, 16, 288, 216) # cropped as desired

Мы можем легко исправить белые границы, сначала инвертируя изображение с помощью ImageOps.invert, а затем используя getbbox():

import ImageOps
im=Image.open("flowers_white_border.jpg")
invert_im = ImageOps.invert(im)
print invert_im.getbbox()
# output:
(16, 16, 288, 216)
person fraxel    schedule 26.03.2012
comment
Большое спасибо за быстрый и четкий ответ. Это сработало, но мне пришлось сначала преобразовать из RGBA в RGB перед использованием invert, вызвав функцию convert: invert_im = im.convert (RGB), а затем invert_im = ImageOps.invert (invert_im), иначе я получил ошибку IOError, не поддерживаемую для этот режим изображения. - person etepoc; 26.03.2012
comment
@ user1292774 - круто, рад, что это сработало .., если хотите, вы можете проголосовать / и отметить стрелку, чтобы принять ответ, вверху слева, тогда мы оба получим несколько очков;) - person fraxel; 26.03.2012
comment
Я уже пытался проголосовать, но у меня меньше 15 баллов, и система не позволяет мне на данный момент, я сделаю это, если когда-нибудь получу эти 15 баллов. Спасибо! - person etepoc; 26.03.2012
comment
@etepoc - никаких проблем :) Все это меня чертовски смутило, когда я начал использовать ТАК, медали и все такое .. - person fraxel; 26.03.2012