【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):
     # チャンネル分解
     r, g, b = 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
    gray1 = rgb_to_gray(img)
    
    # 結果を出力
    cv2.imwrite("gray1.jpg", gray1)

    
if __name__ == "__main__":
    main()

方法②

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

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

実行結果

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

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

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

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

シェア&フォローお願いします!