【初学者向け】PythonとOpenCVによる画像処理超入門②(~カラー画像とグレースケール画像、グレースケール変換~)

PythonとOpenCVによる画像処理超入門
こんにちは、都内のスタートアップでデータ分析屋をしている、やじろべえ(@yajirobe_papa)です。
前回までは、画像処理の基礎と画素値へのアクセスまでやりましたね。
本記事では、カラー画像とグレースケール画像について書いていきます!
✔本記事の内容
  • カラー画像とグレースケール画像
  • OpenCVを使ってカラー画像からグレースケール画像へ変換
  • OpenCVを使って画素の保存

 

カラー画像とグレースケール画像

人間の可視領域と様々な電磁波
前回の記事で当たり前のようにカラーチャンネルといった用語を使いましたが、本記事ではここら辺をもう少し深堀していきますね。
まず最初にとは何でしょう?
色は色だよ、赤とか黄色とか
こう思われる人もいるかもしれません。
もちろんこれは間違いではないのですが、ここではもう少し理工学的な説明をしたいと思います。
人間の眼は、特定の波長領域(約400~800nm)の電磁波が入ると、色の光として認識します。
そして、この人間が認識出来る電磁波のことを可視光と呼びます。
つまり、電磁波そのものに色がついているわけではなく、人間の眼(網膜)がこの波長領域の電磁波を検出すると、脳内でその波長に応じた色として認識するわけです。
これが色の正体です。
もちろん人間が認識出来ない電磁波も世の中にはたくさんあり、例えば赤外線や紫外線といったものがありますね。
赤外線は、人間がとして認識する波長よりも長く認識出来ない電磁波のことを言います。

紫外線は、人間がとして認識する波長よりも短く認識出来ない電磁波のことを言います。

(紫外線よりも更に短い波長になってくるとレントゲン検査でよく使われるX線やガンマ線になります。)
可視光や電磁波については下記のKONIKAさんの記事とかが参考になると思います。
加法混色と減法混色
複数の色の光を混ぜ合わせることで別の光の色をつくることを混色と言い、混色には、加法混色と減法混色の二種類があります。
加法混色は、通常、赤(R)・緑(G)・青(B)の三つの色の光を用いて、白いスクリーンの上に色の光を重ねて投影することで別の色を作ります。
出典:wikipedia
一方、減法混色は、シアン(C)・マゼンタ(M)・イエロー(Y)を原色として、色つきフィルタを通して白色光を見るような方法で別の色を作ります。
出典:wikipedia
カラー画像
これまでの説明で赤(R)・緑(G)・青(B)を原色として加法混色を利用すれば、様々な色が作り出せることがわかりました。
これをデジタル画像に適用すると、下図のように、ある画素の位置に赤・緑・青の三つの原色の量を持たせることで様々な色を表すことが出来るようになるわけです。
RGBカラー画像を構成する色情報をカラーチャンネルと呼び、それぞれの色成分を赤成分(Rチャンネル)、緑成分(Gチャンネル)、青成分(Bチャンネル)と呼ぶこともあります。
また、画素値を8ビット(1バイト)で表せるとき、0~255までの整数値を取っていることになり、このような画像を8bit画像と呼んだりします。
グレースケール画像
RGBカラー画像に対して、グレースケール画像とは白から黒の濃淡で表した画像です。
そのため、色情報は含まず8bit画像の場合は0~255までの明るさ情報だけで表現されています。
グレースケール変換
さて、実は画像処理をやっているとカラー画像をグレースケール画像へ変換することを頻繁に行います。
なぜかと言うと、これまでの説明でもわかる通りグレースケール画像はカラー画像に比べて情報量が1/3と少ないからです。
データ量が少ないとコンピュータで処理させるときは計算速度といった観点でなにかと便利です。
では、カラー画像をグレースケール変換するにはどうしたらよいのでしょう?
すごくざっくり説明すると、カラー画像の各画素の色情報RGBを混ぜ合わせて一つの値にすることです。
どのくらいの配分でRGBを混ぜ合わせるかについては、いくつかやり方はありますが最もメジャーなのは下式を使ったやり方です。
$$ Gray = Red × 0.299 + Green × 0.587 + Blue × 0.114 $$
各画素に対してこの計算処理を行うことでグレースケール画像に変換するわけですが、OpenCVでは既にこの処理が関数として実装されているのでコードにして一行で済みますのでご安心を!

OpenCVを使ってカラー画像からグレースケール画像へ変換

今回も以下の画像を元画像としてグレースケール画像へ変換してみます。
OpenCVを使ってカラー画像からグレースケール画像へ変換するには、cv2.cvtColor関数を使います。
cv2.cvtColor関数は以下のように使います。
   cv2.cvtColor(画像ファイル, 変換形式指定)
第二引数(変換形式指定)は、画像処理でよく使われる色変換がOpenCV内で既に実装済なので、使いたい変換形式を選ぶだけです。
今回はBGRカラー画像をグレースケール画像に変換したいので、cv2.COLOR_BGR2GRAYを指定してあげます。
また、グレースケール変換した後は画像を保存して確認してみましょう。画像の保存には、cv2.imwrite関数を使います。
では、やってみましょう。
img = cv2.imread('./space-shuttle.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite('gray_img.jpg', gray_img)
ちゃんとグレースケール画像に変換されていますね!

✔カラー画像からグレースケール画像変換のまとめ
  • cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) → BGRカラー画像をグレースケール変換
  • cv2.imwrite → 画像の保存(書き出し

 

まとめ

今回は、カラー画像とグレースケール画像について解説をし、OpenCVでグレースケール変換を行いました。
また、グレースケール変換した画像を書き出しして確認までしました。
次回は画像の統計量を記事にしたいと思います!次回からはいよいよ画像処理っぽくなってきますよ!
第三回記事書きました!
では、今回はこの辺で!

参考文献

 

人気記事

タイトルとURLをコピーしました