アスペクト比を変えずに画像縮小

deep learningの学習用素材を集めて学習させるために
アスペクト比を変えずに画像サイズを変換した。
opencvにあるresizeと、空いた領域を0で埋めるzeroを組み合わせて実装する。

  • 画像サイズが縦または横のどちらか一つでも指定サイズより大きかったら、Down Scale (openv resize)
  • 画像は左上に詰めて配置し、余った領域は0で埋める
  • Up Scaleはしない

ソースコード

def resize(src_file, dst_file, width, height):
"""
画像ファイルを与えられたサイズにサイズ変換する関数
アス比は固定、左上に寄せる、余った部分はゼロで埋める

Returns
-------
ret_scale : float
拡大/縮小した倍率
"""

src_img = cv2.imread(src_file)
h, w, c = src_img.shape
# dst_img = cv2.resize(src_img, dsize=(width, height))

# アス比固定, padding
scale_w = width / w
scale_h = height / h

ret_scale = 1.0
# Down Convert
if(scale_w < 1.0 or scale_h < 1.0):
if(scale_w < scale_h): 
resize_img = cv2.resize(src_img, dsize=None, fx=scale_w, fy=scale_w, interpolation = cv2.INTER_AREA)
ret_scale = scale_w
else:
resize_img = cv2.resize(src_img, dsize=None, fx=scale_h, fy=scale_h, interpolation = cv2.INTER_AREA)
ret_scale = scale_h
else:
resize_img = src_img

# dst_img 生成
dst_img = np.zeros((height, width, 3), dtype = np.uint8)

# dst_imgにresize_imgを合成
top = 0
left = 0
#dst_img[top:height + top, left:width + left] = resize_img
h, w, c = resize_img.shape
dst_img[0:h, 0:w] = resize_img

cv2.imwrite(dst_file, dst_img)

return ret_scale

実行結果の画像

480x270に変換した。
黒くなっているところが0埋めした場所。
どの画像も固定サイズになり、左上に詰めれていることがわかる。

f:id:skattun:20190414181754j:plainf:id:skattun:20190414181713j:plainf:id:skattun:20190414181657j:plain