1. ホーム
  2. パイソン

[解決済み】PythonでRGB画像をグレースケールに変換するにはどうすればいいですか?

2022-05-01 14:52:52

質問

を使おうとしています。 matplotlib を使用して、RGB 画像を読み込んでグレースケールに変換しています。

matlabでは、こんな使い方をしています。

img = rgb2gray(imread('image.png'));

matplotlibチュートリアル をカバーするものではありません。ただ、画像にあるように

import matplotlib.image as mpimg
img = mpimg.imread('image.png')

で、その配列をスライスしているのですが、私の理解ではRGBをグレースケールに変換するのとは違うようです。

lum_img = img[:,:,0]

numpyやmatplotlibにrgbからgrayに変換する組み込み関数がないのは信じがたいことだと思います。これは画像処理では一般的な操作ではないでしょうか?

を使って取り込んだ画像で動作する、とてもシンプルな関数を書いてみました。 imread を5分で完了させました。恐ろしく非効率ですが、だからこそプロフェッショナルな実装が組み込まれていることを望んでいたのです。

Sebastianは私の機能を改善してくれましたが、私はまだビルトインのものを見つけたいと思っています。

matlabの(NTSC/PAL)実装です。

import numpy as np

def rgb2gray(rgb):

    r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
    gray = 0.2989 * r + 0.5870 * g + 0.1140 * b

    return gray

解決方法は?

でやってみてはどうでしょうか? ピロー :

from PIL import Image
img = Image.open('image.png').convert('L')
img.save('greyscale.png')


入力画像にアルファ(透明)チャンネルがあり、それを保持する必要がある場合は、モード LA :

img = Image.open('image.png').convert('LA')


matplotlibと 数式

Y' = 0.2989 R + 0.5870 G + 0.1140 B 

ができたんですね。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

def rgb2gray(rgb):
    return np.dot(rgb[...,:3], [0.2989, 0.5870, 0.1140])

img = mpimg.imread('image.png')     
gray = rgb2gray(img)    
plt.imshow(gray, cmap=plt.get_cmap('gray'), vmin=0, vmax=1)
plt.show()