Как работает метод PIL getbbox?

1

Я пытаюсь понять функцию PIL getbbox (get border box), которая "Вычисляет ограничивающий прямоугольник ненулевых областей изображения".

В следующем коде я использую getbbox, и он возвращает именно то, что я ожидаю, с помощью простых изображений в оттенках серого.

import numpy as np
from PIL import Image, ImageFont, ImageDraw, ImageEnhance,ImageChops
import PIL

def trim(im):
dr = ImageDraw.Draw(im)
bg = Image.new(im.mode, im.size, im.getpixel((0,0)))

diff = ImageChops.difference(im, bg)
bbox = diff.getbbox() 

#None if getbbox returns None
if bbox:
     return im.crop(bbox)

Однако я не понимаю, как это работает в соответствии с его исходным кодом. Помимо self.load(), он, похоже, делает какой-то рекурсивный вызов сам по себе. Я думал, что рекурсивные функции требуют прекращения условий, но я не вижу их?

Я чувствую, что это как-то связано с каким-то удалением черных пикселей в массиве изображений, но я просто не понимаю эти, казалось бы, загадочные 2 строки кода (см. Ниже). Любая помощь во мне, понимающая это, будет оценена по достоинству.

def getbbox(self):
    """
    Calculates the bounding box of the non-zero regions in the
    image.
    :returns: The bounding box is returned as a 4-tuple defining the
       left, upper, right, and lower pixel coordinate. If the image
       is completely empty, this method returns None.
    """

    self.load()
    return self.im.getbbox()

edit: вставлено в исходный код

Теги:
python-3.x
python-imaging-library

1 ответ

0

Как уже отмечалось, это не рекурсия. im.getbbox() вызывает https://github.com/python-pillow/Pillow/blob/master/src/_imaging.c#L1947

Затем он вызывает ImagingGetBBox - https://github.com/python-pillow/Pillow/blob/master/src/libImaging/GetBBox.c#L24

Ещё вопросы

Сообщество Overcoder
Наверх
Меню