Pillowで画像自動化術
はじめに
近年、デジタルコンテンツの量は爆発的に増加し、画像を扱う業務は単なる「画像編集」から「画像処理の自動化」へと進化しています。Pythonはその柔軟性と豊富なライブラリで、画像処理の自動化に最適な言語です。特にPillow(Python Imaging Libraryの後継)は、リサイズ、トリミング、フィルタ適用、フォーマット変換、サムネイル作成など、画像編集の基本機能を網羅しています。本記事では、Python自動化とPillowを組み合わせて、日常業務で直面する画像処理タスクを効率化する方法を実践的に解説します。
基礎知識・概念
まずは、Python自動化で頻繁に使われる概念を整理します。PythonImagingLibrary(PIL)は画像を読み込むときにImage.open()、画像を保存するときにImage.save()を使用します。PillowはPILの機能を拡張し、Image.resize()でリサイズ、Image.crop()でトリミング、Image.filter()でフィルタ処理、Image.convert()でフォーマット変換を行います。サムネイル作成はImage.thumbnail()メソッドで簡単に実装でき、画像編集の基本操作を一通り網羅しています。
実装・設定の詳細
以下では、Python自動化とPillowを使った画像処理のワークフローをステップバイステップで示します。まずは環境構築から始めましょう。
pip install pillow
次に、画像フォルダ内の全ファイルを対象にリサイズとサムネイル作成を行うスクリプト例です。
import os
from PIL import Image
INPUT_DIR = 'input_images'
OUTPUT_DIR = 'output_images'
THUMBNAIL_SIZE = (200, 200)
TARGET_SIZE = (1024, 768)
os.makedirs(OUTPUT_DIR, exist_ok=True)
for filename in os.listdir(INPUT_DIR):
if not filename.lower().endswith(('.jpg', '.jpeg', '.png', '.bmp')):
continue
img_path = os.path.join(INPUT_DIR, filename)
with Image.open(img_path) as img:
# フォーマット変換:PNG → JPEG
if img.mode != 'RGB':
img = img.convert('RGB')
# リサイズ
img_resized = img.resize(TARGET_SIZE, Image.LANCZOS)
# フィルタ適用:シャープ
img_sharp = img_resized.filter(ImageFilter.SHARPEN)
# 保存
out_path = os.path.join(OUTPUT_DIR, f'{os.path.splitext(filename)[0]}.jpg')
img_sharp.save(out_path, 'JPEG', quality=90)
# サムネイル作成
thumb = img.copy()
thumb.thumbnail(THUMBNAIL_SIZE, Image.LANCZOS)
thumb_path = os.path.join(OUTPUT_DIR, f'{os.path.splitext(filename)[0]}_thumb.jpg')
thumb.save(thumb_path, 'JPEG', quality=80)
ポイント解説:
Image.open()で画像を読み込み、Image.close()はwith構文で自動的に処理されます。- リサイズ時に
Image.LANCZOSを指定すると高品質な結果が得られます。 - サムネイルは
thumbnail()メソッドを使うことで、元画像のアスペクト比を保ったままサイズを縮小できます。 - フォーマット変換は
convert('RGB')で行い、JPEGに変換する際はqualityパラメータで圧縮率を調整します。
応用テクニック
基本機能をマスターしたら、実務で役立つ応用テクニックに挑戦してみましょう。以下では、複数画像をバッチ処理し、メタデータを付与し、さらにクラウドストレージへ自動アップロードする例を紹介します。
1. メタデータの埋め込み
PillowはImage.infoでEXIF情報を扱えます。撮影日時やカメラ情報を追加することで、画像管理が容易になります。
from PIL import ExifTags
exif_dict = {
ExifTags.TAGS[k]: v
for k, v in img.info.get('exif', {}).items()
}
exif_dict['DateTime'] = '2026:01:17 12:00:00'
img.save(out_path, exif=img.info.get('exif'))
2. 画像の自動タグ付け(簡易OCR)
pytesseractを併用して画像内の文字を抽出し、ファイル名に反映させることで検索性を向上させます。
pip install pytesseract
import pytesseract
text = pytesseract.image_to_string(img, lang='eng')
safe_text = ''.join(c if c.isalnum() else '_' for c in text[:20])
new_name = f'{safe_text}_{os.path.splitext(filename)[0]}.jpg'
3. クラウドストレージへの自動アップロード
AWS S3やGoogle Cloud Storageにアップロードすることで、バックアップと共有が簡単になります。以下はboto3を使ったS3アップロード例です。
pip install boto3
import boto3
s3 = boto3.client('s3')
bucket_name = 'my-image-bucket'
s3.upload_file(out_path, bucket_name, f'processed/{new_name}')
これらのテクニックを組み合わせることで、画像処理の自動化パイプラインを構築し、手作業を大幅に削減できます。
トラブルシューティング
画像処理を自動化する際に直面しやすいエラーとその対処法をまとめます。
- FileNotFoundError:入力フォルダが存在しない場合。
os.makedirs(INPUT_DIR, exist_ok=True)でフォルダを作成するか、パスを確認してください。 - OSError: cannot identify image file:画像が破損しているか、サポート外の形式。
Image.open()の前にtry/exceptでスキップするようにします。 - MemoryError:大量の高解像度画像を一度に処理するとメモリ不足。
with Image.open() as img:で画像を逐次処理し、不要になったオブジェクトはdelで解放します。 - PermissionError:書き込み権限がないディレクトリへ保存しようとした場合。
os.chmod()で権限を変更するか、別の出力先を指定してください。
まとめ
Python自動化とPillowを組み合わせることで、画像のリサイズ、トリミング、フィルタ適用、フォーマット変換、サムネイル作成といった基本的な画像編集タスクを高速かつ正確に実行できます。さらに、メタデータ埋め込みやOCRによるタグ付け、クラウドストレージへの自動アップロードを組み合わせることで、業務フロー全体を自動化し、人的ミスを削減できます。次のステップとしては、画像認識ライブラリ(OpenCV、TensorFlow)を導入し、画像分類や物体検出を自動化することを検討してみてください。
コメント
コメントを投稿