一般的なカラーカメラでは、モノクロのセンサの各画素にBayerと呼ばれるパターンのカラーフィルタが配置された状態で、画像を撮影しています。
このフィルタが配置された状態で撮影した画像は、下図のように、市松模様のノイズが入った状態のモノクロ画像となります。
この画像を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
を使うようにしましょう!