red0orange

red0orange

画像のpad+resizeについて

コード#

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
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。