【Python/OpenCV】グレースケール変換(cv2.cvtColor)

この記事では、PythonとOpenCVを用いて画像をグレースケール変換する方法をソースコード付きで解説します。

グレースケール変換

RGB画像をグレースケール画像に変換する場合は以下の式を利用します。

(1) \begin{eqnarray*} Gray = Red\times 0.3 + Green\times 0.59 + Blue\times 0.11 \end{eqnarray*}

Red(赤)、Green(緑)、Blue(青)はRGBカラー画像の画素値です。
Grayはグレースケール画像の画素値です。

関連記事
原理の詳細 【画像処理】RGBからグレースケールへの変換
OpenCVの導入方法 【Python3】OpenCV3をインストール
OpenCV入門 Python版OpenCV入門 サンプル集
画像処理の原理 【画像処理入門】アルゴリズム&プログラミング

また、OpenCVライブラリでは、cv2.cvtColorメソッドでRGBの画像をグレースケール変換できます。

書式

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
パラメータ名 説明
img 入力画像(RGB)
gray 出力画像(グレースケール)

今回は、「変換アルゴリズムを自前で実装する方法」と「cvtColorメソッドを利用する方法」を両方試してみました。

ソースコード(Python3)

サンプルプログラムのソースコードです。

方法①

#-*- coding:utf-8 -*-
import cv2

def rgb_to_gray(src):
     # チャンネル分解
     b, g, r = src[:,:,0], src[:,:,1], src[:,:,2]
     # R, G, Bの値からGrayの値に変換
     gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
     
     return gray   
    
def main():
    # 入力画像の読み込み
    img = cv2.imread("input.jpg")

    # 方法1
    gray = rgb_to_gray(img)
    
    # 結果を出力
    cv2.imwrite("gray.jpg", gray)

    
if __name__ == "__main__":
    main()

方法②

#-*- coding:utf-8 -*-
import cv2
    
def main():
    # 入力画像の読み込み
    img = cv2.imread("input.jpg")
    
    # 方法2       
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 結果を出力
    cv2.imwrite("gray.jpg", gray)
    
if __name__ == "__main__":
    main()

※動作には、OpenCVライブラリのインストールが必要です。

実行結果

サンプルプログラムの実行結果です。

■左から入力画像(input.jpg)、出力画像(gray1.jpg or gray2.jpg)

お借りした画像:プロ生ちゃん(暮井 慧)

関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング
関連記事

コメント

  1. 匿名 より:

    方法1のソースコードについて
    OpenCVのimreadを使うと、得られる配列はB,G,Rの順になりませんか?
    だとすると、rgb_to_gray()内のBとRの扱いは、逆になりませんか?

    • 管理人 より:

      ※匿名様
      コメントありがとうございます。
      ご指摘いただいた通りですので修正致しました。