OpenCVで長方形の画像に余白をつけて正方形にする

長方形の画像を正方形にしたいときに,長方形+余白で正方形にするコードを書きました.

長方形を正方形にする手段

  • 長方形から正方形を切り出す
  • 長方形を変形させて正方形にする
  • 長方形に余白をつけて正方形にする

主にこの三つが考えられました.

正方形を切り出すのは,一部の画像が切れてしまうので却下.長方形を正方形に変形するのも被写体の形が歪むので却下.

というわけで,余白をつけて正方形にしてみます.(正確には余黒...?)

余白の付け方

OpenCV を使うのは初めてだったので,なかなか苦労しました.

方針

  1. 画像のサイズを取得し,長辺の長さを正方形の一片の長さにする
  2. 1.で決めた大きさの正方形を新規作成する
  3. 長方形を正方形の上に重ねて保存する

という流れで進めようかと.

実装

1 と 2 は次の記事の内容を使えばできます.

問題は 3 です.画像に画像を重ねるという処理は,デフォルトで実装されていないようです.ありそうな気もしますが.

結論として,長方形の画像のすべての行のパラメータを取得して,正方形の画像に上書きするという方法を採りました.

img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
tmp = img[:, :]
height, width = img.shape[:2]
if(height > width):
    size = height
    limit = width
else:
    size = width
    limit = height
start = int((size - limit) / 2)
fin = int((size + limit) / 2)
new_img = cv2.resize(np.zeros((1, 1, 3), np.uint8), (size, size))
if(size == height):
    new_img[:, start:fin] = tmp
else:
    new_img[start:fin, :] = tmp

参考