【OpenCV-Python】cvtColorでBayer変換するときの定数

一般的なカラーカメラでは、モノクロのセンサの各画素にBayerと呼ばれるパターンのカラーフィルタが配置された状態で、画像を撮影しています。

このパターンはGRBG(詳細は後述)

 

このフィルタが配置された状態で撮影した画像は、下図のように、市松模様のノイズが入った状態のモノクロ画像となります。

 

 

この画像をRAWデータBayerデータと私は呼んでいます。
(RAWデータというと、圧縮されていないデータを差す場合もあるので、Bayerデータという事が多いです。)

 

最近の工業用のカラーカメラでは、カラーカメラでありながら、このBayerデータのモノクロ画像として取得される場合が多くなりました。

そのため、別途、FPGAやソフトでBayerデータから、カラー画像へ変換する必要があるのですが、OpenCVでは、cvtColor関数を使うと、カラー画像に変換してくれます。

cv.cvtColor(src, code[, dst[, dstCn]]) -> dst

codeの部分には、Bayerデータの画像の左上の2x2画素が、R,G,Bのどの色に対応しているか?で、BGGR, GBRG, GRBG, RGGB のいずれかを指定します。

 

(参考)https://docs.opencv.org/4.9.0/de/d25/imgproc_color_conversions.html

 

しかしながら、ここに、ちょっとした落とし穴がありました。

codeの部分には、最も単純な変換方法では、以下の定数の中から指定します。

(参考)https://docs.opencv.org/4.9.0/d8/d01/group__imgproc__color__conversions.html

 

COLOR_BayerBG2BGR, COLOR_BayerGB2BGR, COLOR_BayerRG2BGR, COLOR_BayerGR2BGR,
COLOR_BayerBG2RGB, COLOR_BayerGB2RGB, COLOR_BayerRG2RGB, COLOR_BayerGR2RGB

は、昔からあった定数で、のちに

COLOR_BayerBGGR2BGR, COLOR_BayerGBRG2BGR,
COLOR_BayerRGGB2BGR, COLOR_BayerGRBG2BGR,
COLOR_BayerBGGR2RGB, COLOR_BayerGBRG2RGB,
COLOR_BayerRGGB2RGB, COLOR_BayerGRBG2RGB

が、あらたに定義されました。

 

例えば COLOR_BayerBGGR2BGR であれば、画像の左上の2 x 2画素のパターンが BGGR となります。

しかし!

COLOR_BayerBGGR2BGR に対応した昔ながらの定数が COLOR_BayerBG2BGR か?というと、そうではありません。

 

ここで、もう一度、この定義を見直します。

 

数学で、 A=B かつ B=C ならば C=A の理屈で、定数を見ると、

 

COLOR_BayerBGGR2BGR = COLOR_BayerRG2BGR

COLOR_BayerRG2BGR = COLOR_BayerBG2RGB

より

COLOR_BayerBGGR2BGR = COLOR_BayerBG2RGB

となります。

 

つまり、画像の左上の2×2画素のパターンが、この↓パターンのとき、

COLOR_BayerBGGR2BGR、COLOR_BayerRG2BGR、COLOR_BayerBG2RGB

のいづれかを指定する必要があります。

 

このパターンで、COLOR_BayerRG2BGRを指定するのは少し無理があるし、COLOR_BayerBG2RGBを指定するのは、気持ち悪い。

※cvtColorで指定する定数は、メモリに配置されている順番で、通常カラー画像の場合、BGRを指定します。

 

全てのパターンを書き出すと

COLOR_BayerRGGB2BGR = COLOR_BayerBG2BGR = COLOR_BayerRG2RGB
COLOR_BayerGRBG2BGR = COLOR_BayerGB2BGR = COLOR_BayerGR2RGB
COLOR_BayerBGGR2BGR = COLOR_BayerRG2BGR = COLOR_BayerBG2RGB
COLOR_BayerGBRG2BGR = COLOR_BayerGR2BGR = COLOR_BayerGB2RGB

となっています。

 

Bayerの4つのパターンを指定するとき、OpenCV以外で一般的には、画像の左上の2x2画素の色のうち、左上、右上の順で画素の色を指定する場合が多いのですが、出力の色の順(BGR)を信じるのであれば、OpenCVでは、2x2画素中の右下、左下の順で色を指定している事になります。

色のパターン(左上、右上の順)を信じるのであれば、出力する色の順の指定はR,G,Bの順となってしまいますが、実際にはB,G,Rの順入っていると思うと辻褄が合います。

 

が、やっぱり気持ち悪いので、画像の左上の2x2画素の色を使った

 

COLOR_BayerBGGR2BGR
COLOR_BayerGBRG2BGR
COLOR_BayerRGGB2BGR
COLOR_BayerGRBG2BGR

 

を使うようにしましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください