コード#
import cv2
import numpy as np
def pad_resize_image(image, width, height):
# オリジナル画像のサイズを取得する
original_height, original_width = image.shape[:2]
# スケールを計算する
scale = min(width / original_width, height / original_height)
# スケール後の新しいサイズを計算する
new_width = int(original_width * scale)
new_height = int(original_height * scale)
# 画像をスケーリングする
resized_image = cv2.resize(image, (new_width, new_height))
# 新しいキャンバスを作成し、スケーリングされた画像を中央に配置する
if len(resized_image.shape) == 3:
padded_image = np.zeros((height, width, resized_image.shape[2]), dtype=np.uint8)
else:
padded_image = np.zeros((height, width), dtype=np.uint8)
start_x = (width - new_width) // 2
start_y = (height - new_height) // 2
padded_image[start_y:start_y + new_height, start_x:start_x + new_width] = resized_image
# 目標座標系から元の座標系への変換行列を計算する
scale_matrix = np.eye(3)
scale_matrix[0, 0] = scale
scale_matrix[1, 1] = scale
translation_matrix = np.eye(3)
translation_matrix[0, 2] = start_x
translation_matrix[1, 2] = start_y
transformation_matrix = translation_matrix.dot(scale_matrix)
return padded_image, transformation_matrix
if __name__ == "__main__":
image = cv2.imread("test.png")
new_image, _ = pad_resize_image(image, 256, 256)
cv2.imshow("image", new_image)
cv2.waitKey(0)
pass