【Python】OpenCVでカラー画像をグレースケール画像に変換する

OpenCVではカラー画像をグレースケール画像に変換することができます。今回はその方法について紹介ます。

カラー画像をグレースケール画像に変換する

まずは結論からです。

使用する画像

以下のようなカラー画像を読み込みます。

import cv2

image = cv2.imread('input/fox.jpg')
fox.jpg

cv2.cvtColor

カラー画像をグレースケール画像に変換するには、cv2.cvtColorを用います。第一引数に元の画像、第二引数にはcv2.COLOR_BGR2GRAYを指定します。

image_gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

cv2.imshow("fox_gray", image_gray)

cv2.waitKey(0)
cv2.destroyAllWindows()
fox_gray

cv2.cvtColorでは、グレースケール画像への変換だけでなく、RGBやHSVなどカラー画像での色空間の変換も可能です。カラー画像における色空間については以下記事をご覧ください。

カラー画像データとグレースケール画像データの違いについて

そもそもカラー画像データとグレースケール画像ではデータの構造自体が異なります。

カラー画像は3次元、グレースケール画像は2次元データとなる

カラー画像とグレースケール画像ではそもそも情報量が異なります。画像データは基本的に表形式(2次元)データで扱われます。上のキツネの画像はサイズが820×1232なので、行数820、列数1232の表としてデータを保持します。

ここで1つ1つのピクセル情報(表データでいう1つのセル)に着目します。グレースケールの場合は0(黒)~ 255(白)の間の数値だけで色を表現することができます。なので、820×1232の表が1つあれば情報をすべて表現することができます。

グレースケール画像データイメージ
image_grayの表データ(一部)
img_gray

一方カラー画像の場合はというと、RGBの場合R、G、Bの3つの色情報をもとに1つのピクセルの色が決まります。なので、R、G、Bそれぞれに対して820×1232の情報を保持する必要があります。なので、カラー画像は820×1232×3の3次元データとなります。

カラー画像データイメージ
image

グレースケールからカラーへの復元は不可

上述の点から、カラー画像からグレースケール画像への変換は情報量をそぎ落とすことになります。したがって、カラー画像とグレースケール画像の変換は一方通行となり、一度グレースケールに変換した画像を再びカラー画像に戻すことはできません。

ただし、グレースケールをRGBで表現することはできるので、3次元データのグレースケール画像を作成することは可能です。

まとめ

PythonのOpenCVでカラー画像をグレースケール画像に変換する方法を紹介しました。

カラー画像とグレースケール画像のデータ構造の違いに注意しながら活用してください^^

ではでは👋