【Python】Pillowで画像をグレースケール変換する:色空間(カラーモード)の解説と変換メソッド

カラー画像を白黒(グレースケール)に変換したり、印刷用の形式に変換したりする場合、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チャンネルで表現される印刷用の形式です。
12値画像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(文字認識)やエッジ検出などの画像解析を行う前には、ノイズを減らすために画像をグレースケール化するのが一般的です。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次