PythonとOpenCVを用いて画像をグレースケール変換する方法をソースコード付きで解説します。
グレースケール変換とは
グレースケール変換とは、以下のようにカラー画像をモノクロ調に変換する処理です。
→変換→
単に「写真をレトロな雰囲気にしたい」という画像加工的な使い方でも用いられますが、以下のとおり画像解析でも重要なテクニックとなります。
【ポイント】
画像中から顔を探索するなど、計算コストの重い処理を行う場合、カラー画像(24ビット、RGB)をグレースケール画像(8ビット)に変換することで計算効率を向上させることが多いです。
(1画素あたりのデータ量が24bitから8bitとなるため、単純に考えると処理速度は3倍になります)
画像中から顔を探索するなど、計算コストの重い処理を行う場合、カラー画像(24ビット、RGB)をグレースケール画像(8ビット)に変換することで計算効率を向上させることが多いです。
(1画素あたりのデータ量が24bitから8bitとなるため、単純に考えると処理速度は3倍になります)
→変換→
→顔を探索→
参考:【Python版OpenCV】Haar Cascadeで顔検出、アニメ顔検出、顔にモザイク処理
カラー画像の画素値をグレースケールに変換する場合、RGBのいずれか1つの要素値を抽出、RGBの値の平均値を用いるなど様々な方法があります。
変換式の例(加重平均法)
代表例としては、RGB各要素に一定の重み付けをして平均をとるNTSC(テレビ放送規格)加重平均法があります。計算式は以下のとおりです。
Red(赤)、Green(緑)、Blue(青)はRGBカラー画像の画素値、Grayはグレースケール画像の画素値です。
計算例
例えば、Red(0, 0)=255, Green(0, 0)=12, Blue(0, 0)=35のとき、Gray(0, 0)の画素値は以下のように87となります。
グレースケール変換のアルゴリズムについては、以下ページで詳細を解説しています。

【画像処理】RGBカラーからグレースケールへ変換する計算式
RGBカラー画像をグレースケールへ色空間変換する原理や特徴、計算式についてまとめました。
今回は、変換処理の部分をPython版OpenCVの「cvtColorメソッドで実装する方法」と「自分で実装する方法」を両方紹介します。
解説動画
サンプルコード①変換処理の部分をcvtColorメソッドで実装
変換処理の部分をcvtColorメソッドで実装する場合のサンプルプログラムのソースコードです。
ポイント
OpenCVでは、cv2.cvtColorメソッドでRGBの画像をグレースケール変換できます。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imは入力画像(RGB)、grayは出力画像(グレースケール)となります。
サンプルコード②変換処理の部分を自分で実装
実行結果
→変換→
関連記ページ

【PythonとOpenCVで画像処理超入門】使い方とサンプルコードを解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
コメント
方法1のソースコードについて
OpenCVのimreadを使うと、得られる配列はB,G,Rの順になりませんか?
だとすると、rgb_to_gray()内のBとRの扱いは、逆になりませんか?
※匿名様
コメントありがとうございます。
ご指摘いただいた通りですので修正致しました。