Я пытаюсь понять функцию 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: вставлено в исходный код
Как уже отмечалось, это не рекурсия. 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