Pynote

Python、機械学習、画像処理について

OpenCV - 画像をリサイズする方法 (cv2.resize)

resize

cv2.resize で画像をリサイズできる。

dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
  • 引数
    • src: 入力画像
    • dsize: 出力サイズ
    • dst: 出力画像
    • fx: x 方向の倍率
    • fy: y 方向の倍率
    • interpolation: 補完方法
      • cv2.INTER_NEAREST: 最近傍補間
      • cv2.INTER_LINEAR: バイリニア補間 (デフォルト)
      • cv2.INTER_CUBIC: バイキュービック補間
      • cv2.INTER_AREA: ピクセル領域の関係を利用したリサンプリング
      • cv2.INTER_LANCZOS4: Lanczos 補間
  • 返り値
    • dst: 出力画像

dsize で出力の大きさを指定するか、fx, fy で幅及び高さ方向の倍率をそれぞれ指定する。
dsize を指定した場合、fx=0, fy=0 とし、fx, fy を指定した場合、dsize=None としなければならない。

入力画像

指定した大きさにリサイズする。

import cv2

# 画像を読み込む。
img = cv2.imread("sample.jpg")

# 指定した大きさにリサイズする。
dst = cv2.resize(img, dsize=(100, 300))

print(f"{img.shape} -> {dst.shape}")
# (400, 400, 3) -> (300, 100, 3)

指定した倍率でリサイズする。

import cv2

# 画像を読み込む。
img = cv2.imread("sample.jpg")

# 指定した倍率でリサイズする。
dst = cv2.resize(img, dsize=None, fx=0.702, fy=0.702)

print(f"{img.shape} -> {dst.shape}")
# (400, 400, 3) -> (281, 281, 3)

アスペクト比を固定して、幅が指定した値になるようリサイズする。

import cv2

# 画像を読み込む。
img = cv2.imread("sample.jpg")

# アスペクト比を固定して、幅が指定した値になるようリサイズする。
def scale_to_width(img, width):
    scale = width / img.shape[1]
    return cv2.resize(img, dsize=None, fx=scale, fy=scale)


dst = scale_to_width(img, 250)

print(f"{img.shape} -> {dst.shape}")
# (400, 400, 3) -> (250, 250, 3)

アスペクト比を固定して、高さが指定した値になるようリサイズする。

import cv2

# 画像を読み込む。
img = cv2.imread("sample.jpg")

# アスペクト比を固定して、高さが指定した値になるようリサイズする。
def scale_to_height(img, height):
    scale = height / img.shape[0]
    return cv2.resize(img, dsize=None, fx=scale, fy=scale)


dst = scale_to_height(img, 250)

print(f"{img.shape} -> {dst.shape}")
# (400, 400, 3) -> (250, 250, 3)

アスペクト比を固定して、指定した大きさに収まるようリサイズする。

import cv2

# 画像を読み込む。
img = cv2.imread("sample.jpg")

# アスペクト比を固定して、指定した大きさに収まるようリサイズする。
def scale_box(img, width, height):
    scale = max(width / img.shape[1], height / img.shape[0])
    return cv2.resize(img, dsize=None, fx=scale, fy=scale)


dst = scale_box(img, 200, 100)

print(f"{img.shape} -> {dst.shape}")
# (400, 400, 3) -> (200, 200, 3)

アスペクト比を固定して、指定した解像度にリサイズする。

リサイズ前の大きさを (w, h), リサイズ後の大きさを (W, H)、リサイズの倍率を s とする。
このとき、リサイズ後の解像度を resolation とするには、

 \displaystyle
\begin{align}
W &= w * s \\
H &= h * s \\
W * H &= resolation
\end{align}

を解いて、倍率を s = \sqrt{\frac{resolation}{w * h}} と決めればよい。

import cv2
import math

# 画像を読み込む。
img = cv2.imread("sample.jpg")

# アスペクト比を固定して、指定した解像度にリサイズする。
def scale_to_resolation(img, resolation):
    h, w = img.shape[:2]
    scale = math.sqrt(resolation / (h * w))
    return cv2.resize(img, dsize=None, fx=scale, fy=scale)


dst = scale_to_resolation(img, 640 * 480)

print(f"{img.shape} -> {dst.shape}")
# (400, 400, 3) -> (554, 554, 3)