グレースケール化 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さんというお店のカレーです。こじんまりとした雰囲気の良いカレー屋さんでした。
コメント
コメントを投稿