RGBから輝度への変換
jpg画像をなどの一般のカラー画像は二次元の各ピクセルにRGBのベクトルが指定された三次元配列です。で、画像解析をするときはRGBではなく各ピクセルがどれくらいの強度の明るさを有しているか知りたい時があります。RGBの平均値を取るなど、適切でない手法でグレースケールにしてしまうと各ピクセルでの明るさとは対応していません。画像の各ピクセルに入射した光の明るさを示す値が輝度になります。今回はpythonを使って、RGB画像から輝度画像に変換しようという内容です。
具体的な変換式はRGB色空間からNTSC色空間に変換するときの輝度(Y)のみを計算しています。したがって、今回"輝度"と言っているのは"NTSC色空間のY"です。RGBが$(R, G, B)$で表される時、輝度$Y$は次式で求められます。
$$Y = 0.299 R + 0.587 G + 0.114 B$$
プログラム
import cv2
import numpy as np
def int_from_img(filename):
img = cv2.imread(filename)
with open(filename, 'rb') as f:
binary = f.read()
arr = np.asarray(bytearray(binary), dtype=np.uint8)
img = cv2.imdecode(arr, -1)
Luminance = 0.299*img[:,:,2] + 0.587*img[:,:,1] + 0.114*img[:,:,0]
return Luminance
Luminance = int_from_img("imege_file_path")
プログラム最終行の"imege_file_path"に画像のpathを入力するとLuminanceに輝度画像が格納されます。
実行結果
例として化学っぽい画像を変換してみました。
元画像1
プログラムの変換後
以上です。
-
https://www.pexels.com/ja-jp/
からダウンロードしたフリー画像。 ↩