Вот функция, реализованная в PIL
и cv2
.Ввод может быть любого размера;функция находит масштаб, необходимый для подгонки наибольшего края к желаемой ширине, а затем помещает его на изображение черного квадрата нужной ширины.
In PIL
def resize_PIL(im, output_edge):
scale = output_edge / max(im.size)
new = Image.new(im.mode, (output_edge, output_edge), (0, 0, 0))
paste = im.resize((int(im.width * scale), int(im.height * scale)), resample=Image.NEAREST)
new.paste(paste, (0, 0))
return new
В cv2
def resize_cv2(im, output_edge):
scale = output_edge / max(im.shape[:2])
new = np.zeros((output_edge, output_edge, 3), np.uint8)
paste = cv2.resize(im, None, fx=scale, fy=scale, interpolation=cv2.INTER_NEAREST)
new[:paste.shape[0], :paste.shape[1], :] = paste
return new
При желаемой ширине 128:
→ ![enter image description here](https://i.stack.imgur.com/0IfFD.png)
→![enter image description here](https://i.stack.imgur.com/22Xfp.png)
Не показано: эти функции работают с изображениями, размер которых превышает требуемый размер