デモザイキング(Demosaicing)とは、一般的なカラーカメラでは、センサの各画素に下図のようなBayerパターンと呼ばれる配置で、フィルタが配置されています。
この状態で画像を撮影すると、画像そのものはモノクロ画像の市松模様のようなノイズがのったような画像が撮影されます。
この画像からカラー画像へ変換することをデモザイキング(Demosaicing) や、Bayer変換 と言います。
OpenCVでデモザイキングを行うにはcvtColor()関数の codeの部分にBayerパターンの配置の4種類、デモザイキング処理アルゴリズムの3種類の組み合わせの定数が用意されています。
●Demosaicing using bilinear interpolation
cv2.COLOR_BayerBG2BGR, cv2.COLOR_BayerGB2BGR, cv2.COLOR_BayerRG2BGR, cv2.COLOR_BayerGR2BGR
●Demosaicing using VNG(Variable Number of Gradients).
cv2.COLOR_BayerBG2BGR_VNG, cv2.COLOR_BayerGB2BGR_VNG, cv2.COLOR_BayerRG2BGR_VNG, cv2.COLOR_BayerGR2BGR_VNG
●EA(Edge-Aware) Demosaicing.
cv2.COLOR_BayerBG2BGR_EA, cv2.COLOR_BayerGB2BGR_EA, cv2.COLOR_BayerRG2BGR_EA, cv2.COLOR_BayerGR2BGR_EA
(参考)
https://docs.opencv.org/3.4/d8/d01/group__imgproc__color__conversions.html#ga57261f12fccf872a2b2d66daf29d5bd0
コード例
import cv2
# 画像ファイルの読み込み
src_img = cv2.imread("Mandrill_RAW.bmp", cv2.IMREAD_UNCHANGED)
# デモザイキング(COLOR_BayerRG2BGR, COLOR_BayerRG2BGR_VNG, COLOR_BayerRG2BGR_EAなど)
color_img = cv2.cvtColor(src_img, cv2.COLOR_BayerRG2BGR)
# 画像の表示
cv2.imshow("Src Image", src_img)
cv2.imshow("Demosaicing Image", color_img)
# キー入力待ち(ここで画像が表示される)
cv2.waitKey()
実行結果
バイリニア補間で行うデモザイキングは昔からあったので、知っていましたが、
Variable Number of Gradients や Edge-Aware
というのがあることを最近知って、???となったのですが、詳しい処理アルゴリズムについては分かりませんでしたが、処理結果の比較を行いました。
RAWデータ
Bilinearの処理結果
一部拡大
エッジの部分(鼻の赤い部分の輪郭など)がギザギザしていたり、擬色(本来無いはずの色)が確認できます。
VNG(Variable Number of Gradients)の処理結果
一部拡大
Bilinearと比べて、エッジ部分のギザギザが抑えられ、擬色も低減されています。
EA(Edge-Aware)の処理結果
一部拡大
鼻の脇の水色部分の黒い線の模様を見ると、VNGと比べて線が滑らかになっているように見えます。
ヒゲの部分のように、細かいパターンが潰れがちです。
処理時間の比較
2048×2048画素のRAWデータを私のPC(i7-7700 2.8GHz)で試してみたところ、1000回処理行った時の平均処理時間は以下の通りでした。
処理アルゴリズム | 処理時間(mSec) |
Bilinear | 3.2 |
Variable Number of Gradients | 45 |
Edge-Aware | 47 |
Bilinear以外の処理は、そこそこキレイな画像になりますが、カメラで撮影した画像をリアルタイムで処理しようとすると、Bilinear一択になりそうです。
参考リンク
https://docs.opencv.org/3.4/d8/d01/group__imgproc__color__conversions.html