カラー画像を白黒(グレースケール)に変換したり、印刷用の形式に変換したりする場合、Pillowの convert() メソッドを使用します。
変換の際に指定する「モード(文字列)」の意味と、実際にグレースケール化するコードを解説します。
目次
Pillowにおける主な色空間(カラーモード)
Image.open() で画像を読み込んだ際や、convert() で変換する際に使用される主なモード識別子は以下の通りです。
| モード文字列 | 色空間の種類 | 説明 |
L | グレースケール | 8ビット(0〜255)の白黒画像です。0が黒、255が白を表します。 |
RGB | トゥルーカラー | Red, Green, Blueの3チャンネル(各8ビット)で色を表現する、最も一般的なPC用カラー形式です。 |
CMYK | 印刷用カラー | Cyan, Magenta, Yellow, Key plate(黒)の4チャンネルで表現される印刷用の形式です。 |
1 | 2値画像 | 1ビット(0か1)の完全な白黒画像です。グレーの中間色はありません。 |
RGBA | 透過カラー | RGBに加え、透明度(Alpha)を持った形式です。PNGなどで使用されます。 |
実行可能なサンプルコード
以下のコードは、カラー画像を読み込み、グレースケール(L モード)に変換して保存するスクリプトです。
from PIL import Image, ImageDraw
import os
def convert_to_grayscale():
input_filename = "vivid_landscape.jpg"
output_filename = "monochrome_landscape.jpg"
# 動作確認用のカラー画像を作成(ファイルがない場合)
if not os.path.exists(input_filename):
create_test_color_image(input_filename)
try:
# 1. 画像の読み込み
with Image.open(input_filename) as img:
print(f"Original Mode: {img.mode}") # 通常は 'RGB'
# 2. グレースケールへの変換
# convert("L") を呼び出すだけで、輝度に基づいた自然な白黒画像が生成されます
gray_img = img.convert("L")
print(f"Converted Mode: {gray_img.mode}") # 'L' に変わっていることを確認
# 3. 保存
gray_img.save(output_filename)
print(f"Saved: {output_filename}")
# 参考: もし2値化(白か黒のみ)したい場合は "1" を指定します
# binary_img = img.convert("1")
# binary_img.save("binary_sample.jpg")
except Exception as e:
print(f"エラーが発生しました: {e}")
def create_test_color_image(filename):
"""検証用のカラフルな画像を作成"""
width, height = 400, 300
img = Image.new("RGB", (width, height), "white")
draw = ImageDraw.Draw(img)
# 赤、緑、青の帯を描画
draw.rectangle((0, 0, width//3, height), fill="red")
draw.rectangle((width//3, 0, width*2//3, height), fill="green")
draw.rectangle((width*2//3, 0, width, height), fill="blue")
img.save(filename)
print(f">> テスト画像を作成しました: {filename}")
if __name__ == "__main__":
convert_to_grayscale()
解説:convertメソッドの重要性
image.convert(mode) は、単に色を変換するだけでなく、ピクセルデータの内部表現そのものを変更します。
- ファイルサイズの削減:
RGB(1画素あたり24ビット)からL(1画素あたり8ビット)に変換することで、画像の情報量が減り、保存時のファイルサイズを小さくできます。 - 画像処理の前処理: OCR(文字認識)やエッジ検出などの画像解析を行う前には、ノイズを減らすために画像をグレースケール化するのが一般的です。
