アスペクト比を変えずに画像縮小
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埋めした場所。
どの画像も固定サイズになり、左上に詰めれていることがわかる。