画像に余白を追加して正方形にする方法


機械学習では画像分類等の画像認識を行う際は画像を正方形にリサイズする必要があります。
しかし、画像によってはアスペクト比が1:1ではない為にただリサイズすると歪んでしまうことがあります。
そうならないために画像に余白を追加して、正方形に整形したいと思います。

ソースコード

import cv2
import math

if __name__ == "__main__":
  img = cv2.imread('./sample.jpg')

  height, width, color = img.shape # 画像の縦横サイズを取得

  # 縦長画像→幅を拡張する
  if height > width:
    diffsize = height - width
    # 元画像を中央ぞろえにしたいので、左右に均等に余白を入れる
    padding_half = int(diffsize / 2)
    padding_img = cv2.copyMakeBorder(img, 0, 0, padding_half, padding_half, cv2.BORDER_CONSTANT, (0, 0, 0))
    cv2.imwrite('./[email protected]', padding_img)

  # 横長画像→高さを拡張する
  elif width > height:
    diffsize = width - height
    padding_half = int(diffsize / 2)
    padding_img = cv2.copyMakeBorder(img, padding_half, padding_half, 0, 0, cv2.BORDER_CONSTANT, (0, 0, 0))
    cv2.imwrite('./[email protected]', padding_img)
  • 余白の追加にはcv2.copyMakeBorderを利用しました。
    • 使い方はこの記事を参考にさせて頂きました。
  • 長辺に合わせた正方形を作りたかったので以下のようにしました。
    • 画像の長辺と短辺の差分を取得
    • 横長画像→上下に余白・縦長→左右に余白を追加
    • 1辺当たりの余白は長辺の差分の半分のサイズにすることで、画像を中央寄せにする

結果

  • 横長画像

  • 縦長画像