こしあん
2019-07-20

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

Pocket
LINEで送る


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

Related Posts

Numpyだけで複数の画像をタイルし1つの画像にまとめる方法... 「torchvision.utilsのmake_gridやテンソルをタイルして保存するのって便利だよね。でも、いちいちこのためにPyTorchのテンソルに変えるのって面倒だよね」ということで同じことをNumpyでも実装してみました。Numpy配列の扱い方を工夫すればいけます。 コード make...
Kerasのジェネレーターでサンプルが列挙される順番について... Kerasの(カスタム)ジェネレーターでサンプルがどの順番で呼び出されるか、1ループ終わったあとにどういう処理がなされるのか調べてみました。ジェネレーターを自分で定義するとモデルの表現の幅は広がるものの、バグが起きやすくなるので「本当に順番が保証されるのか」や「ハマりどころ」を確認します。 0~...
PyTorchでGANの訓練をするときにrequires_grad(trainable)の変更はいる... PyTorchでGANのある実装を見ていたときに、requires_gradの変更している実装を見たことがあります。Kerasだとtrainableの明示的な変更はいるんで、もしかしてPyTorchでもいるんじゃないかな?と疑問になったので、確かめてみました。 requires_gradの変更とは...
PyTorchでConvolutionフィルターをやる(エッジ検出やアンシャープマスク)... PyTorchでPILのConvolutionフィルター(エッジ検出やアンシャープマスク)をやりたくなったので、どう実装するか考えてみました。 やりたいこと PIL/PillowのConvolutionフィルター(ImageFilterなど)の処理をPyTorchの畳み込み演算で再現したい ...
Numpyの配列のみを操作して四角形を描画する(Numpyの画像処理)... Numpyの画像処理です。Numpyの配列のみを操作して、画面上に四角形を描画してみます。Numpyの画像処理は出力結果の合成のときにたまに使う割には若干独特なので注意が必要です。 Numpy arrayの画像の構造は(y, x, channel) ここだけ覚えておけば大丈夫です。Pillo...
Pocket
LINEで送る
Delicious にシェア

Add a Comment

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