Как обрезать изображение в центре? Потому что я знаю, что ящик представляет собой 4-кортеж, определяющий координату слева, сверху, справа и ниже, но я не знаю, как получить эти координаты, чтобы они посеялись в центре.Обрезать изображение в центре с помощью PIL
ответ
Предполагая, что вы знаете размер вы хотите обрезать, чтобы (new_width X new_height):
import Image
im = Image.open(<your image>)
width, height = im.size # Get dimensions
left = (width - new_width)/2
top = (height - new_height)/2
right = (width + new_width)/2
bottom = (height + new_height)/2
im.crop((left, top, right, bottom))
Это сломается, если вы попытаетесь обрезать небольшое изображение больше, но я предполагаю, что вы выиграли Не пытайтесь (или вы можете поймать этот случай, а не обрезать изображение).
Хорошо, наконец, это получилось! Спасибо, кучи. – user2401069
Небольшая коррекция, обрезка принимает массив. im.crop ((слева, сверху, справа, внизу)) – freakTheMighty
Nitpick: Вы имеете в виду последовательность, а не массив. :) – EOL
Одна из возможных проблем с предлагаемым решением заключается в том, что существует нечетное различие между желаемым размером и старым размером. У вас не может быть половины пикселей с каждой стороны. Нужно выбрать сторону, чтобы добавить дополнительный пиксель.
Если есть нечетное различие для горизонтали, то приведенный ниже код добавит лишний пиксель вправо, а если есть и нечетное различие по вертикали, то дополнительный пиксель идет вниз.
import numpy as np
def centeredCrop(img, new_height, new_width):
width = np.size(img,1)
height = np.size(img,0)
left = np.ceil((width - new_width)/2.)
top = np.ceil((height - new_height)/2.)
right = np.floor((width + new_width)/2.)
bottom = np.floor((height + new_height)/2.)
cImg = img[top:bottom, left:right]
return cImg
Неверное округление, изображение результата не всегда будет иметь требуемые размеры. Правильная формула: 'right = width - floor ((width - new_width)/2)' –
Это функция Я искал:
from PIL import Image
im = Image.open("test.jpg")
crop_rectangle = (50, 50, 200, 200)
cropped_im = im.crop(crop_rectangle)
cropped_im.show()
Взято из another answer
вы знаете размер изображения и размер меньшего изображения, которое вы хотите получить, я предполагать? У вас есть что показать, где вы пытались? –