【完全版】たった10ステップ!PythonのPillowライブラリで画像処理をマスターしよう

Pythonで画像処理を行うなら、Pillowは外せないライブラリです。初心者でも使いやすいAPIと豊富な機能を兼ね備えたPillowを使えば、画像の読み込みや保存、リサイズ、フィルター適用など、様々な処理を簡単に実装できます。本記事では、Pillowの基本的な使い方から実践的なテクニックまで、ステップバイステップで丁寧に解説します。

【この記事を読んだらわかること】
  • Pillowのインストール方法と基本的な使い方
  • 画像の読み込み、保存、リサイズ、トリミングの方法
  • 画像の回転、反転、フィルター適用、エフェクトの付与方法
  • 画像の一括処理やバッチ処理の実行方法
  • 顔検出や顔認識など、高度な画像処理の実現方法
  • Pillowと機械学習の連携方法
  • Webアプリやサービス開発でのPillowの活用方法
  • さらなる画像処理スキルの向上に向けたヒント

Pillowとは?Pythonの画像処理ライブラリの基礎知識

Pillowは、Pythonで画像処理を行うための強力なライブラリです。元々はPIL(Python Imaging Library)という名前でしたが、Python3に対応するためにフォークされ、現在ではPillowという名前で広く使われています。

Pillowの概要と特徴

Pillowは、シンプルで使いやすいAPIを特徴としており、初心者にも扱いやすいライブラリです。JPEGやPNG、GIF、BMP、TIFFなど、多様な画像フォーマットに対応しています。画像の読み込みや保存、リサイズ、回転、フィルター適用など、豊富な画像処理機能を提供しており、幅広いニーズに応えることができます。

Pillowのインストールと環境設定

Pillowのインストールは非常に簡単です。PillowはPyPIに登録されているため、以下のようにpipコマンドを使ってインストールすることができます。

pip install Pillow

Anacondaを使っている場合は、以下のコマンドでもインストールが可能です。

conda install Pillow

特別な環境設定は不要で、インストールするだけですぐにPillowを使い始められます。

Pillowで扱える画像フォーマット

Pillowは多彩な画像フォーマットをサポートしています。代表的なものとして、以下のようなフォーマットがあります。

  • JPEG:一般的な写真画像のフォーマットです。
  • PNG:可逆圧縮と透明度をサポートするフォーマットで、高画質な画像に適しています。
  • GIF:アニメーション画像にも使われる、コンパクトなフォーマットです。
  • BMP:Windowsビットマップ画像のフォーマットで、シンプルな構造が特徴です。
  • TIFF:高画質な画像データを扱うためのフォーマットです。

この他にも、PPM、PGM、PBMなど、様々なフォーマットに対応しています。Pillowを使えば、これらの画像フォーマットを読み込んだり、別のフォーマットに変換したりと、柔軟な画像処理が可能になります。

次章では、Pillowを使った基本的な画像処理の方法について見ていきましょう。

Pillowによる画像の読み込みと保存

Pillowを使えば、様々な形式の画像ファイルを簡単に読み込んだり、保存したりすることができます。ここでは、画像の読み込みと保存、フォーマット変換について詳しく見ていきましょう。

画像ファイルのオープンと表示

Pillowで画像ファイルを開くには、Image.open()関数を使います。引数には、開きたい画像のファイルパスを指定します。開いた画像はImageオブジェクトとして扱われ、画像のサイズや色深度、フォーマットなどの情報を取得することができます。

from PIL import Image

img = Image.open("sample.jpg")
print(img.format, img.size, img.mode)

上記のコードでは、sample.jpgという画像ファイルを開き、画像のフォーマット、サイズ、モード(カラータイプ)を出力しています。

また、Imageオブジェクトのshow()メソッドを呼び出すことで、デフォルトのビューアで画像を表示することもできます。

img.show()

画像の新規作成と保存

Pillowでは、Image.new()関数を使って新しい画像を作成することもできます。第1引数にはモード(カラータイプ)、第2引数にはサイズ(幅, 高さ)、color引数には背景色を指定します。

from PIL import Image

new_img = Image.new("RGB", (400, 300), color=(255, 255, 255))

上記のコードでは、400×300ピクセルのRGB画像を、白背景で新規作成しています。

作成した画像や、変更を加えた画像を保存するには、Imageオブジェクトのsave()メソッドを使います。第1引数には保存先のファイルパス、第2引数には保存形式を指定します。

new_img.save("new_image.png", "PNG")

上記のコードでは、新規作成した画像をnew_image.pngというファイル名で、PNG形式で保存しています。

画像フォーマットの変換と出力

Pillowを使えば、読み込んだ画像を別の形式に変換して保存することも簡単です。Imageオブジェクトのconvert()メソッドを使って、画像のモード(カラータイプ)を変更できます。

from PIL import Image

img = Image.open("sample.jpg")
img_png = img.convert("RGBA")

上記のコードでは、JPEGで読み込んだ画像を、RGBAモードに変換しています。

変換後の画像を保存する際は、save()メソッドの第2引数で保存形式を指定します。

img_png.save("converted_image.png", "PNG")

このようにして、JPEGで読み込んだ画像をPNG形式で保存することができます。Pillowでは、他にもTIFFやBMP、GIFなど様々な形式での保存に対応しています。

以上のように、Pillowを使えば画像の読み込みや保存、フォーマット変換を手軽に行うことができます。次章では、Pillowを使ったより実践的な画像処理の方法について見ていきましょう。

Pillowを使った基本的な画像処理テクニック

Pillowライブラリには、画像処理に役立つ様々な機能が用意されています。ここでは、リサイズやトリミング、回転、明るさ調整、テキスト描画など、基本的な画像処理テクニックについて見ていきましょう。

画像のリサイズとトリミング

画像のサイズを変更するには、Imageオブジェクトのresize()メソッドを使います。新しいサイズを指定することで、アスペクト比を維持したままリサイズすることができます。

from PIL import Image

img = Image.open("sample.jpg")
resized_img = img.resize((400, 300))

上記のコードでは、sample.jpgを幅400ピクセル、高さ300ピクセルにリサイズしています。

また、crop()メソッドを使えば、画像の一部を切り抜くこともできます。切り抜く領域を (左上のx座標, 左上のy座標, 右下のx座標, 右下のy座標) の形式で指定します。

cropped_img = img.crop((100, 100, 300, 300))

上記のコードでは、sample.jpgの (100, 100) から (300, 300) までの領域を切り抜いています。

画像の回転と反転

rotate()メソッドを使えば、画像を指定した角度だけ回転できます。expandオプションをTrueにすると、回転後の画像が切れないよう、サイズが自動的に拡大されます。

from PIL import Image

img = Image.open("sample.jpg")
rotated_img = img.rotate(45, expand=True)

上記のコードでは、sample.jpgを45度回転させ、サイズを拡大しています。

また、transpose()メソッドを使えば、画像を垂直方向や水平方向に反転できます。

flipped_img = img.transpose(Image.FLIP_LEFT_RIGHT)

上記のコードでは、sample.jpgを左右反転させています。

画像の明るさ・コントラスト調整

ImageEnhanceモジュールを使えば、画像の明るさやコントラストを簡単に調整できます。BrightnessクラスやContrastクラスのインスタンスを作成し、enhance()メソッドで調整の度合いを指定します。

from PIL import Image, ImageEnhance

img = Image.open("sample.jpg")
enhancer = ImageEnhance.Brightness(img)
brighter_img = enhancer.enhance(1.5)

上記のコードでは、sample.jpgの明るさを1.5倍に増やしています。同様に、Contrastクラスを使えばコントラストを調整できます。

画像へのテキスト描画

ImageDrawモジュールを使えば、画像上にテキストを描画することができます。まず、Drawオブジェクトを作成し、text()メソッドでテキストを描画します。フォントを指定するには、ImageFontモジュールを使います。

from PIL import Image, ImageDraw, ImageFont

img = Image.open("sample.jpg")
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 24)
draw.text((50, 50), "Hello, World!", font=font, fill=(255, 255, 255))

上記のコードでは、sample.jpgの (50, 50) の位置に、24ポイントのArialフォントで「Hello, World!」と白色で描画しています。

以上のように、Pillowを使えば画像のリサイズやトリミング、回転、明るさ調整、テキスト描画など、様々な処理を手軽に行うことができます。次章では、さらに高度な画像処理テクニックについて見ていきましょう。

Pillowによる画像フィルターと効果の適用

Pillowには、画像にフィルターや特殊効果を適用するための機能が豊富に用意されています。ここでは、ぼかしやシャープ、エンボス等の画像フィルター、二値化や減色処理、アルファチャンネルを使った透明度の操作について見ていきましょう。

ぼかし・シャープ・エンボス等の画像フィルター

ImageFilterモジュールを使えば、画像に様々なフィルターを適用することができます。例えば、ぼかし効果を与えるにはBLURGaussianBlurBoxBlurなどのフィルターを使用します。

from PIL import Image, ImageFilter

img = Image.open("sample.jpg")
blurred_img = img.filter(ImageFilter.BLUR)

上記のコードでは、sample.jpgBLURフィルターを適用し、ぼかし効果を与えています。

また、シャープ効果を与えるにはSHARPENUnsharpMaskなどのフィルターを使います。

sharpened_img = img.filter(ImageFilter.SHARPEN)

エンボス効果を与えたい場合は、EMBOSSフィルターを使用します。

embossed_img = img.filter(ImageFilter.EMBOSS)

このように、ImageFilterモジュールを使えば、簡単に画像にフィルターを適用することができます。

画像の二値化と減色処理

画像をグレースケールや白黒(二値)に変換するには、convert()メソッドを使います。引数には、変換先のモードを指定します。

from PIL import Image

img = Image.open("sample.jpg")
grayscale_img = img.convert("L")
bw_img = img.convert("1")

上記のコードでは、sample.jpgをグレースケール("L")と白黒("1")に変換しています。

また、posterize()メソッドを使えば、画像の色数を減らす減色処理を行うことができます。引数には、減色後の色数を指定します。

posterized_img = img.posterize(4)

上記のコードでは、sample.jpgの色数を4色に減らしています。減色処理は、画像のファイルサイズを小さくしたい場合などに有効です。

アルファチャンネルと透明度の操作

Pillowでは、RGBAモードの画像を使ってアルファチャンネル(透明度)を扱うことができます。putalpha()メソッドを使えば、画像にアルファチャンネルを追加できます。

from PIL import Image

img = Image.open("sample.png").convert("RGBA")
transparent_img = Image.new("RGBA", img.size, (255, 255, 255, 128))

上記のコードでは、sample.pngをRGBAモードに変換し、半透明の白色の画像を新規作成しています。

また、alpha_composite()関数を使えば、2つのRGBA画像を合成することができます。

composited_img = Image.alpha_composite(img, transparent_img)

上記のコードでは、sample.pngと半透明の白色画像を合成しています。アルファチャンネルを使えば、画像に透明度を持たせたり、複数の画像を重ねたりすることができます。

以上のように、Pillowを使えば画像にフィルターや効果を適用したり、二値化や減色処理を行ったり、アルファチャンネルを操作したりと、多様な画像処理が可能です。次章では、これらの技術を応用した実践的な画像処理の例を見ていきましょう。

Pillowを活用した実践的な画像処理

これまで紹介してきたPillowの機能を組み合わせることで、より実践的な画像処理を行うことができます。ここでは、画像の一括処理やバッチ処理、顔検出と顔認識、モザイクやぼかしによる匿名化など、実用的な画像処理の例を見ていきましょう。

画像の一括処理とバッチ処理

Pythonのosモジュールやglobモジュールを使えば、ディレクトリ内の画像ファイルを一括で処理することができます。例えば、以下のコードでは、imagesディレクトリ内のJPEGファイルを一括でリサイズし、resizedディレクトリに保存しています。

import os
from PIL import Image

for file in os.listdir("images"):
    if file.endswith(".jpg"):
        img = Image.open(os.path.join("images", file))
        img = img.resize((800, 600))
        img.save(os.path.join("resized", file))

このように、一括リサイズや一括フォーマット変換などのバッチ処理を行うことで、大量の画像を効率的に処理することができます。

画像からの顔検出と顔認識

face_recognitionライブラリを使えば、画像から顔を検出したり、顔を認識したりすることができます。以下のコードでは、sample.jpgから顔を検出し、検出された顔の位置を使って顔画像を切り出しています。

import face_recognition
from PIL import Image, ImageDraw

img = Image.open("sample.jpg")
face_locations = face_recognition.face_locations(img)

for face_location in face_locations:
    top, right, bottom, left = face_location
    face_img = img.crop((left, top, right, bottom))
    face_img.show()

さらに、face_recognitionライブラリを使って顔認識を行えば、画像内の人物を特定することもできます。顔検出と顔認識を組み合わせることで、様々な応用が可能です。

画像のモザイク・ぼかし処理による匿名化

プライバシー保護のために、画像内の顔や個人情報などを匿名化する必要がある場合があります。Pillowを使えば、特定の領域にモザイクやぼかしを適用することで、簡単に匿名化処理を行うことができます。

以下のコードでは、sample.jpgの特定の領域にモザイク処理を適用しています。resize()メソッドで画像を縮小し、再度拡大することでモザイク効果を実現しています。

from PIL import Image, ImageFilter

img = Image.open("sample.jpg")
face_locations = [(100, 100, 200, 200), (300, 300, 400, 400)]

for face_location in face_locations:
    left, top, right, bottom = face_location
    face_img = img.crop((left, top, right, bottom))
    face_img = face_img.resize((10, 10), Image.NEAREST).resize((right-left, bottom-top), Image.NEAREST)
    img.paste(face_img, (left, top, right, bottom))

img.show()

また、ImageFilterモジュールのぼかしフィルターを使えば、特定の領域をぼかすことで匿名化することもできます。

以上のように、Pillowを使えば画像の一括処理やバッチ処理、顔検出と顔認識、匿名化処理など、実践的な画像処理を行うことができます。次章では、さらにPillowを活用するためのヒントを紹介します。

Pillowのさらなる活用に向けて

ここまでPillowの基本的な使い方から実践的な画像処理まで見てきましたが、Pillowの活用はこれだけにとどまりません。ここでは、Pillowをさらに活用するためのヒントを紹介します。

Pillowと機械学習の連携

Pillowで前処理した画像データを機械学習モデルの入力として使用することで、画像認識や物体検出などの高度な画像処理を実現できます。例えば、Pillowで画像のリサイズやデータ拡張を行い、Kerasなどのライブラリでニューラルネットワークを構築・学習させることができます。

from PIL import Image
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model

img = Image.open("sample.jpg")
img = img.resize((224, 224))
img_array = img_to_array(img) / 255.0
img_array = img_array.reshape((1,) + img_array.shape)

model = load_model("model.h5")
prediction = model.predict(img_array)

上記のコードでは、Pillowで画像を読み込んでリサイズし、Kerasのimg_to_array関数で配列に変換しています。そして、学習済みのモデルを使って画像の予測を行っています。このように、Pillowと機械学習ライブラリを連携させることで、より高度な画像処理が可能になります。

Pillowを使ったWebアプリやサービスの開発

Pillowは、Webアプリやサービスの開発でも活用することができます。例えば、DjangoなどのWebフレームワークと組み合わせることで、画像アップロードやサムネイル生成などの機能を持ったサービスを作ることができます。

from io import BytesIO
from PIL import Image
from django.core.files.base import ContentFile
from .models import Photo

def save_photo(request):
    uploaded_file = request.FILES['file']
    img = Image.open(uploaded_file)
    img = img.resize((800, 600))

    thumb_io = BytesIO()
    img.save(thumb_io, format='JPEG')

    photo = Photo()
    photo.image.save(uploaded_file.name, ContentFile(thumb_io.getvalue()), save=False)
    photo.save()

上記のコードは、Djangoでの画像アップロード処理の一例です。Pillowを使って、アップロードされた画像をリサイズし、サムネイルを生成しています。また、AWSのLambdaなどのサーバーレス環境でPillowを使って画像処理を行うこともできます。

画像処理スキルのさらなる向上のために

Pillowは非常に便利なライブラリですが、画像処理の世界はPillowだけではありません。OpenCVやScikit-imageなど、他の画像処理ライブラリにも触れることで、より深い理解を得ることができます。また、画像処理アルゴリズムの仕組みを学ぶことで、自分で高度な処理を実装できるようになります。

画像処理の最新の研究動向をキャッチアップするためには、論文や書籍を読むことも重要です。さらに、Kaggleなどのデータ分析コンペティションに参加することで、実践的なスキルを磨くことができます。

Pillowを起点として、画像処理の奥深い世界に飛び込んでみませんか。きっと新たな発見と、さらなるスキルアップが待っているはずです。