グレースケール化 cvtColor()



pythonで画像をグレースケール化する方法を紹介します。

今回使用した画像・コード一式はgoogle driveに保存しておりますので必要に応じてお使いください。

作成したコード

import cv2
import glob
import matplotlib.pyplot as plt
%matplotlib inline
#画像の読み込み・表示
filename = glob.glob("curry*")
img = cv2.imread(filename[0])
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img2)
#グレースケール化
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("grayscale.bmp",img)
plt.imshow(img)
plt.gray()

コマンド実施例

コマンド実施前後で画像を比較しました。
元の画像のカレーは美味しそうですが、グレーにすると何とも言えないですね。

cv2.cvtColor()の使用方法

cv2.cvtColorは画像の色空間※を変換するコマンドです。
色を変換するということでconvert colorの略になっていますね。

一応記しておきますが、RGB, HSV, HLS, Lab, Luv, Gray (,Bayer)に変換できるそうです。
私自身RGBとGray以外使ったことないのですが、データによってということがあるのでしょうか・・・

※色空間とは
座標で表されるような色の空間を指します。
例えばRGBの場合だと、赤緑青の三次元の空間で色が表されています。

実用例に基づくコマンド解説

今回の例では下記のコマンドを使用しています。
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.cvtColor()内を見ていただくと、いずれもimg, cv2.COLOR_○○2△△となっています。
これはimgに対して、〇〇の色空間から△△の色空間に変換するということを意味しています。
数字の"2"は英語の"to"をもじっているのだと思います。

cv2.COLOR_BGR2RGBによる変換

一つ目の例として示すcv2.COLOR_BGR2RGBは、下図のような変換となります。
ただRGBが入れ替わっただけですが、これをしないとmatplotlibで表示した際に変な色になってしまいます。


cv2.COLOR_BGR2RGBの変換イメージ

cv2.COLOR_BGR2GRAYによる変換

2つ目の例のcv2.COLOR_BGR2GRAYは、下図のような変換となります。
3つあった次元が1つへと統合することで情報量が1/3になります。

cv2.COLOR_BGR2GRAYのイメージ


参考:cv2.COLOR_GRAY2BGRによる変換

反対に、cv2.COLOR_GRAY2BGRとすることで、グレースケールの画像からRGB画像を生成することができます。


グレースケール化とは

RGBの3チャンネルの値を1チャンネルに統合する処理となります。
RGB画像からグレースケール画像には次の式で変換します。

\begin{aligned}gray=blue\times 0.11+green\times 0.59+red\times 0.3\end{aligned}

トップの画像はmatplotlibで表示したものですが、黄色に違和感がありますね。
普通にopencvで保存等をしていれば問題ないかと思います。

色味の比較

画像処理では情報量の多いRGB画像ではなく、情報量が少なく処理の簡単な1チャンネルの画像を取り扱うことが多々あります。
今後紹介する二値化など、グレースケール画像の使用を前提としているような処理もあるので、グレースケール化は基本中の基本だと思います。

今回使用した画像:???カレー/欧風カリーM

何カレーか忘れちゃいましたが、欧風カリーMさんというお店のカレーです。
こじんまりとした雰囲気の良いカレー屋さんでした。

コメント