こしあん
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

keras_preprocessingを使ってお手軽に画像を回転させる方法... Data Augmentationで画像を回転させたいことがあります。画像の回転は一般に「アフィン変換」と呼ばれる操作で、OpenCVやPillowのライブラリを使えば簡単にできるのですが、Numpy配列に対して1から書くとかなりめんどいのです。Kerasが裏で使っているkeras_preproc...
PyTorchで双方向連結リストなデータ構造のモデルを作る... ディープラーニングのモデルには、訓練の途中でレイヤーを追加するなど特殊な訓練をするものがあります(Progressive-GANなど)。そのとき、モデルを「レイヤーやブロックの連結リスト」として定義しておくと見通しがよくなることがあります。その例を見ていきます。 訓練中に継ぎ足していくモデル ...
Kerasで重みを共有しつつ、必要に応じて入力の位置を変える方法... Kerasで訓練させて、途中から新しく入力を作ってそこからの出力までの値を取りたいということがたまにあります。例えば、Variational Auto Encoderのサンプリングなんかそうです。このあまり書かれていないのでざっとですが整理しておきます。 こういうことをやりたい 言葉で書いても...
Spectral Normalization(SNGAN)を実装していろいろ遊んでみた... GANの安定化の大きなブレイクスルーである「Spectral Normalization」をPyTorchで実装していろいろ遊んでみました。従来のGANよりも多クラスの出力がかなりやりやすくなりました。確かにGANの安定化についてはものすごい効いているので、ぜひ皆さんも遊んでみてください。 ※ア...
スタイル変換のStyle Lossとは何をやっているか... スタイル変換やImage to Imageの損失関数で使われる・Style Lossの実装を詳しく見ていきます。Style Lossの計算で用いているグラム行列の計算方法をTensorFlowで考えます。 Style Lossのやっていること 2つの画像の、VGG16や19(どっちを使うか、ど...
Pocket
LINEで送る
Delicious にシェア

Add a Comment

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