※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。


Python3.6でカラー画像をモノクロ・グレー画像にする方法解説

PIL python3 Pillow 画像処理 python

投稿日:2019年10月25日

このエントリーをはてなブックマークに追加
この記事ではRGB画像をpython3.6のライブラリPillowを使ってグレーまたはモノクロにする方法について詳しく解説します。

はじめに

この記事ではPython3.7Pillowを使ってRGB画像をグレー・モノクロ画像にする方法について解説します。環境は以下の通りです。

  • Ubuntu18.04LTS
  • Python3.6.3
  • pip 19.2.3
  • Pillow 6.2.1

実践

まずはPillowのインストールをします。

terminal
$ pip install Pillow==6.2.1

グレー画像への変換

simple_convert.py
from PIL import Image

img = Image.open("./jerry_beans.jpg")    # 読み込み
img_g = img.convert(mode="L")               # 変換
img_g.save("./jerry_beans_gray.jpg")        # 変換した画像の保存

変換した画像をみてみましょう!

▲元画像(RGB)
▲変換後(グレースケール)

白黒画像への変換

白黒(モノクロ)とグレースケールの違い

いや、知ってるよ!!」って方、申し訳ありません。飛ばしてください。僕はこの違い知らなかつたので説明しておきます(笑)。白黒画像は0(白)と1(黒)の2つの値のみで色を表します。それに対し、グレースケールは色を0~255の値で表すのです。白黒は一つの画素を2bit(0と1)で表しますが、グレースケールは8bit(0~255)で表すためデータ容量にも差が生まれます。

そしてさらに大きく変わるのがその見た目でしょう。ディスプレイで確認するとわかりやすいのですが、白黒(モノクロ)画像は白と黒の中間色をドットの間隔で表しているのがわかります。

したがモノクロの画像を生成するコードです。

simple_convert_bin.py
from PIL import Image

img = Image.open("./jerry_beans.jpg")
img_g = img.convert(mode="1")        # 白黒の場合はmodeを"1に"
img_g.save("./jerry_beans_bin.jpg")

並べて見ると一目瞭然ではないですか?

▲元画像(RGB)
▲変換後(モノクロ)
▲グレースケール

補足

convert(mode="L")でグレーにされるときの計算方法について、単純にRGBを足して1/3しているのではなく、ITU-R Rec BT.601という以下の計算が適用されていることを心にとどめておいてください。

ITU-R Rec BT.601
R * 299/1000 + G * 587/1000 + B * 114/1000

赤、青、緑のそれぞれの値と人間が感じる明るさには差があるそうです。そのため、RGBをそのまま足して1/3のような計算をしてしまうと思った色と違ってしまうのです。それを解決するためにバイアスをかけて計算する方法の一つが上のITU-R Rec BT.601というわけです。最後にRGBの和の1/3でグレー画像を生成する方法と、それぞれの画像の比較を載せて終了にします。

simple_calculate_three_split.py
from PIL import Image

img = Image.open("./jerry_beans.jpg")
size = img.size

img_g = Image.new("L",size)        # からのグレー画像を用意

def calculate_pixel(r,g,b):
    """
    グレーを単純にRGBの和の3分の1で計算
    """
    grey = int((r + g + b) / 3)
    if grey > 255:
        return 255
    else:
        return grey
# オリジナル画像のすべての画素に対して
# (R + G + B) / 3の計算をし空のグレー画像のpixelを埋める
for x in range(size[0]):
    for y in range(size[1]):
        r,g,b = img.getpixel((x, y))
        img_g.putpixel( (x,y) ,calculate_pixel(r,g,b))
# 生成したグレー画像を保存
img_g.save("./jerry_beans_grey_splitted.jpg")
▲変換後(グレースケール・ITU-R Rec BT.601)
▲変換後(グレースケール・RGBの和の1/3)
▲元画像(RGB)

さいごに

参考書籍

このエントリーをはてなブックマークに追加


関連記事

記事へのコメント