PythonのPillowで画像処理入門 Part 2:変形操作編

この記事は、Pythonの画像処理ライブラリPillowの解説シリーズの第2回です。今回は、画像の切り抜き(クロップ)、コピー&ペースト、リサイズ、回転、反転といった、画像の形状を操作する基本的な変形処理について解説します。


目次

1. 画像の切り抜き(クロップ)

.crop()メソッドを使うと、画像内の矩形領域を切り抜いて、新しいImageオブジェクトとして取得できます。

領域は、(左, 上, 右, 下)の4つの座標をタプルで指定します。座標の原点(0, 0)は画像の左上隅です。

from PIL import Image

try:
    img = Image.open('sample.png')
    
    # (x1, y1)から(x2, y2)までの領域を定義
    # (左, 上, 右, 下)
    box = (100, 100, 400, 400)
    cropped_img = img.crop(box)
    
    cropped_img.save('cropped_sample.png')
    print("画像を切り抜いて保存しました。")

except FileNotFoundError:
    print("エラー: sample.pngが見つかりません。")

2. 画像のコピー&ペースト

.copy()メソッドで画像の複製を作成し、.paste()メソッドでその複製の上に別の画像を貼り付けることができます。

from PIL import Image

try:
    img = Image.open('sample.png')
    
    # 貼り付けるパーツを切り抜く
    part_to_paste = img.crop((50, 50, 150, 150))
    
    # 元画像のコピーを作成
    img_copy = img.copy()
    
    # コピーした画像にパーツを貼り付け
    # paste(貼り付ける画像, (左上のx座標, 左上のy座標))
    img_copy.paste(part_to_paste, (0, 0))
    img_copy.paste(part_to_paste, (200, 300))
    
    img_copy.save('pasted_sample.png')
    print("画像をコピー&ペーストして保存しました。")

except FileNotFoundError:
    print("エラー: sample.pngが見つかりません。")

3. 画像のリサイズとサムネイル作成

画像のサイズを変更するには、主にresize()thumbnail()の2つのメソッドがあります。

resize((幅, 高さ)) このメソッドは、指定した幅と高さに画像をリサイズした、新しいImageオブジェクトを返します。アスペクト比は維持されず、画像は指定されたサイズに引き伸ばされます。

thumbnail((幅, 高さ)) このメソッドは、アスペ-クト比を維持したまま、指定した幅と高さの範囲内に収まるように画像を縮小します。resize()とは異なり、このメソッドは元のImageオブジェクトを直接変更します

from PIL import Image

try:
    img = Image.open('sample.png')
    width, height = img.size

    # 幅と高さを半分にリサイズ
    resized_img = img.resize((width // 2, height // 2))
    resized_img.save('resized_sample.png')
    
    # 128x128のサムネイルを作成
    # 元のオブジェクトが変更されるため、コピーに対して操作を行う
    thumbnail_img = img.copy()
    thumbnail_img.thumbnail((128, 128))
    thumbnail_img.save('thumbnail_sample.jpg')

    print("リサイズ版とサムネイル版を保存しました。")

except FileNotFoundError:
    print("エラー: sample.pngが見つかりません。")

4. 画像の回転と反転

.rotate()メソッドで画像を回転させ、.transpose()メソッドで画像を反転させることができます。

from PIL import Image, ImageOps

try:
    img = Image.open('sample.png')
    
    # 画像を90度回転
    img.rotate(90).save('rotated_90.png')
    
    # expand=Trueは、回転後の画像全体が収まるようにキャンバスサイズを拡張する
    img.rotate(45, expand=True).save('rotated_45_expanded.png')
    
    # 左右反転
    # 古い `Image.FLIP_LEFT_RIGHT` は `Image.Transpose.FLIP_LEFT_RIGHT` になりました
    img.transpose(Image.Transpose.FLIP_LEFT_RIGHT).save('flipped_horizontal.png')
    
    # 上下反転
    img.transpose(Image.Transpose.FLIP_TOP_BOTTOM).save('flipped_vertical.png')

    print("回転・反転した画像を保存しました。")

except FileNotFoundError:
    print("エラー: sample.pngが見つかりません。")

まとめ

今回は、Pillowを使った画像の基本的な変形操作について解説しました。.crop()で画像を切り抜き、.paste()で貼り付け、.resize().thumbnail()でサイズを変更し、.rotate().transpose()で向きを変えることができます。

次回は、より高度な操作として、ピクセル単位で画像を直接編集する方法について解説します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次