Вы можете делать то, что вы собираетесь после использования функции expand()
, доступной в модуле ImageOps
модуля PIL.
from PIL import Image
from PIL import ImageOps
filename = 'C:/Users/Desktop/Maine_Coon_263.jpg'
img = Image.open(filename)
val = 10 #--- pixels to be cropped
#--- a new image with a border of 10 pixels on all sides
#--- also notice fill takes in the color of white as (255, 255, 255)
new_img = ImageOps.expand(img, border = val, fill = (255, 255, 255))
#--- cropping the image above will not result in any black portion
cropped = new_img.crop((val, val, 150, 150))
Функция crop()
принимает только один параметр того, какая часть должна быть обрезана.Нет функции для обработки ситуации, когда передается отрицательное значение. Следовательно, при передаче отрицательного значения изображение дополняется черными пикселями.
Используя функцию expand()
, вы можете установить цвет по вашему выбору.и затем продолжайте и обрезайте, как вы хотите.
РЕДАКТИРОВАТЬ
В ответ на ваше редактирование я имею в виду кое-что довольно наивное, но оно работает.
- Получитьабсолютные значения всех значений, которые будут обрезаны.Вы можете использовать
numpy.abs()
. - Далее максимум среди этих значений, используя
numpy.max()
. - Наконец, увеличьте изображение, используя это значение, и обрежьте его соответствующим образом.
Этот код поможет вам:
#--- Consider these values in a tuple that are to crop your image
crop_vals = (-10, -20, 1000, 500)
#--- get maximum value after obtaining the absolute of each
max_val = np.max(np.abs(crop_vals))
#--- add border to the image using this maximum value and crop
new_img = ImageOps.expand(img, border = max_val, fill = (255, 255, 255))
cropped = new_img.crop((max_val - 10, max_val - 20, new_img.size[0], new_img.size[1]))