OpenCVで長方形の画像に余白をつけて正方形にする
2017-01-24
長方形の画像を正方形にしたいときに,長方形+余白で正方形にするコードを書きました.
長方形を正方形にする手段
- 長方形から正方形を切り出す
- 長方形を変形させて正方形にする
- 長方形に余白をつけて正方形にする
主にこの三つが考えられました.
正方形を切り出すのは,一部の画像が切れてしまうので却下.長方形を正方形に変形するのも被写体の形が歪むので却下.
というわけで,余白をつけて正方形にしてみます.(正確には余黒...?)
余白の付け方
OpenCV を使うのは初めてだったので,なかなか苦労しました.
方針
- 画像のサイズを取得し,長辺の長さを正方形の一片の長さにする
- 1.で決めた大きさの正方形を新規作成する
- 長方形を正方形の上に重ねて保存する
という流れで進めようかと.
実装
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