こしあん
2019-07-20

Pillowでグレースケール化するときに3チャンネルで出力するテクニック


25.6k{icon} {views}


カラー画像をグレースケール化すると1チャンネルの出力になりますが、カラー画像と同時に扱うと整合性からグレースケールでも3チャンネルで欲しいことがあります。Numpyのブロードキャストを使わずに簡単に3チャンネルで出力する方法を書きます。

グレースケール化してカラー化すればOK

これでOK

img.convert("L").convert("RGB")

確認

convert(“L”)でグレースケール化なので、その後にRGB化します。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

def test():
    with Image.open("lena.png") as img:
        gray = img.convert("L").convert("RGB")
        array = np.asarray(gray, np.uint8)
        print(array.shape) # (512, 512, 3)
    plt.imshow(array)
    plt.show()

if __name__ == "__main__":
    test()

冒頭の画像のような出力になります。Numpyのブロードキャストは不要です。

convert(“RGB”)を入れない場合は「(512, 512)」というshapeになりますが、convert(“L”)のあとにconvert(“RGB”)を入れると「(512, 512, 3)」のshapeになります。フォーマット的にはカラー画像ですが、中身はグレースケールです。メモリ的には2チャンネル分無駄になりますが、カラー画像と同時に扱う際は場合分けが不要になります。



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です