こしあん
2019-07-20

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

Pocket
LINEで送る
Delicious にシェア

1.9k{icon} {views}

新刊情報

技術書典8の新刊『モザイク除去から学ぶ 最先端のディープラーニング』(A4・195ページ)好評通販中です! 機械学習の入門からGANの最先端までを書いたおすすめの本となっています! Boothで試し読みできます。



カラー画像をグレースケール化すると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チャンネル分無駄になりますが、カラー画像と同時に扱う際は場合分けが不要になります。


新刊情報

技術書典8の新刊『モザイク除去から学ぶ 最先端のディープラーニング』好評通販中(A4・195ページ)です! Boothで試し読みもできるのでよろしくね!


Pocket
LINEで送る

Add a Comment

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