Pynote

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

Pillow (PIL) - 画像をリサイズする方法について

resize

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

Image.resize(size, resample=0)
  • 引数
    • size: リサイズ後の大きさ。(幅, 高さ) のタプルで指定する。
    • resample: 補完方法
      • PIL.Image.NEAREST: 最近傍補間 (デフォルト)
      • PIL.Image.BILINEAR: バイリニア補間
      • PIL.Image.BICUBIC: バイキュービック補間
      • PIL.Image.LANCZOS: Lanczos 補間
  • 返り値
    • dst: リサイズした画像

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

from PIL import Image

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

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

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

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

from PIL import Image

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

# 指定した倍率でリサイズする。
fx, fy = 0.702, 0.702
size = (round(img.width * fx), round(img.height * fx))

dst = img.resize(size)

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

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

from PIL import Image

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

# アスペクト比を固定して、幅が指定した値になるようリサイズする。
def scale_to_width(img, width):
    height = round(img.height * width / img.width)
    return img.resize((width, height))


dst = scale_to_width(img, 250)

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

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

from PIL import Image

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

# アスペクト比を固定して、高さが指定した値になるようリサイズする。
def scale_to_height(img, height):
    width = round(img.width * height / img.height)
    return img.resize((width, height))


dst = scale_to_height(img, 250)

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

thumbnail

Image.thumbnail で画像を指定した大きさに収まるようリサイズできる。
この関数は元の画像を直接リサイズするので注意する。

Image.thumbnail(size, resample=3)
  • 引数
    • size: この大きさに収まるようにリサイズする。(幅, 高さ) のタプルで指定する。
    • resample: 補完方法
      • PIL.Image.NEAREST: 最近傍補間 (デフォルト)
      • PIL.Image.BILINEAR: バイリニア補間
      • PIL.Image.BICUBIC: バイキュービック補間
      • PIL.Image.LANCZOS: Lanczos 補間
from PIL import Image

# 画像を読み込む。
img = Image.open("sample.jpg")
print(img.size)  # (400, 400)

# アスペクト比を固定して、指定した大きさに収まるようリサイズする。
img.thumbnail((200, 100))
print(img.size)  # (100, 100)