Pillowでグレースケール化するときに3チャンネルで出力するテクニック
Posted On 2019-07-20
カラー画像をグレースケール化すると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の中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー