PythonとOpenCVを用いて画像をグレースケール変換する方法をソースコード付きで解説します。
グレースケール変換とは
グレースケール変換とは、以下のようにカラー画像をモノクロ調に変換する処理です。
→変換→
単に「写真をレトロな雰囲気にしたい」という画像加工的な使い方でも用いられますが、以下のとおり画像解析でも重要なテクニックとなります。
画像中から顔を探索するなど、計算コストの重い処理を行う場合、カラー画像(24ビット、RGB)をグレースケール画像(8ビット)に変換することで計算効率を向上させることが多いです。
(1画素あたりのデータ量が24bitから8bitとなるため、単純に考えると処理速度は3倍になります)
→変換→ →顔を探索→
参考:【Python版OpenCV】Haar Cascadeで顔検出、アニメ顔検出、顔にモザイク処理
カラー画像の画素値をグレースケールに変換する場合、RGBのいずれか1つの要素値を抽出、RGBの値の平均値を用いるなど様々な方法があります。
変換式の例(加重平均法)
代表例としては、RGB各要素に一定の重み付けをして平均をとるNTSC(テレビ放送規格)加重平均法があります。計算式は以下のとおりです。
$$ Gray = (Red\times 0.30) + (Green\times 0.59) + (Blue\times 0.11) $$
Red(赤)、Green(緑)、Blue(青)はRGBカラー画像の画素値、Grayはグレースケール画像の画素値です。
計算例
例えば、Red(0, 0)=255, Green(0, 0)=12, Blue(0, 0)=35のとき、Gray(0, 0)の画素値は以下のように87となります。
$$ Gray(0, 0)=Red(0, 0)\times 0.3 + Green(0, 0)\times 0.59 + Blue(0, 0)\times 0.11 $$
$$ =(255 \cdot 0.3) + (12 \cdot 0.59) + (35 \cdot 0.11)=87.43\simeq 87 $$
今回は、変換処理の部分をPython版OpenCVの「cvtColorメソッドで実装する方法」と「自分で実装する方法」を両方紹介します。
サンプルコード①変換処理の部分をcvtColorメソッドで実装
変換処理の部分をcvtColorメソッドで実装する場合のサンプルプログラムのソースコードです。
ポイント
OpenCVでは、cv2.cvtColorメソッドでRGBの画像をグレースケール変換できます。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imは入力画像(RGB)、grayは出力画像(グレースケール)となります。
サンプルコード②変換処理の部分を自分で実装
実行結果
→変換→
コメント
方法1のソースコードについて
OpenCVのimreadを使うと、得られる配列はB,G,Rの順になりませんか?
だとすると、rgb_to_gray()内のBとRの扱いは、逆になりませんか?
※匿名様
コメントありがとうございます。
ご指摘いただいた通りですので修正致しました。