OpenCV

【OpenCV-Python】デモザイキング(Bayer変換)

デモザイキング(Demosaicing)とは、一般的なカラーカメラでは、センサの各画素に下図のようなBayerパターンと呼ばれる配置で、フィルタが配置されています。

この状態で画像を撮影すると、画像そのものはモノクロ画像の市松模様のようなノイズがのったような画像が撮影されます。

OpenCV 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

 

(参考)

OpenCV: Color Space Conversions

 

コード例

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()

実行結果

OpenCV Demosaicing デモザイキング Bayer変換

 

バイリニア補間で行うデモザイキングは昔からあったので、知っていましたが、

Variable Number of Gradients や Edge-Aware

というのがあることを最近知って、???となったのですが、詳しい処理アルゴリズムについては分かりませんでしたが、処理結果の比較を行いました。

 

RAWデータ

OpenCV Demosaicing デモザイキング Bayer変換

Bilinearの処理結果

OpenCV Demosaicing デモザイキング Bayer変換

一部拡大

OpenCV Demosaicing デモザイキング Bayer変換

エッジの部分(鼻の赤い部分の輪郭など)がギザギザしていたり、擬色(本来無いはずの色)が確認できます。

 

VNG(Variable Number of Gradients)の処理結果

OpenCV Demosaicing デモザイキング Bayer変換

一部拡大

OpenCV Demosaicing デモザイキング Bayer変換

Bilinearと比べて、エッジ部分のギザギザが抑えられ、擬色も低減されています。

 

EA(Edge-Aware)の処理結果

OpenCV Demosaicing デモザイキング Bayer変換

一部拡大

OpenCV Demosaicing デモザイキング Bayer変換

鼻の脇の水色部分の黒い線の模様を見ると、VNGと比べて線が滑らかになっているように見えます。

ヒゲの部分のように、細かいパターンが潰れがちです。

 

処理時間の比較

2048×2048画素のRAWデータを私のPC(i7-7700 2.8GHz)で試してみたところ、1000回処理行った時の平均処理時間は以下の通りでした。

処理アルゴリズム 処理時間(mSec)
Bilinear 3.2
Variable Number of Gradients 45
Edge-Aware 47

 

Bilinear以外の処理は、そこそこキレイな画像になりますが、カメラで撮影した画像をリアルタイムで処理しようとすると、Bilinear一択になりそうです。

参考リンク

【Kinect SDK】RawBayerデータとは?
先日、Kinect for Windows SDK Ver1.6が公開されましたが、Ver1.6からRawBayerデータという物が取得できるようになりました。 そもそもRawBayerデータというのはRaw(生データ、何も加工されていない...
カラーカメラはモノクロカメラを兼ねない
「カラーカメラはモノクロカメラを兼ねない」と言って、モノクロ画像が欲しいなら、カラーカメラで画像を撮影して、モノクロ画像に変換すればいいのでは?! と私が工業用のカメラを扱う業界に属するようになる前はそう思っていました。 実際、カラーカメラ...
OpenCV: Color Space Conversions
【OpenCV-Python】cvtColor(色変換)
OpenCVでカラー→モノクロ変換、カラーのデータの並びを入れ替えるBGR⇔RGB変換、色抽出の前処理として使われるHSV変換や、Bayer画像をカラー画像に変換するなど、主にカラー画像の変換を行うにはcvtColor()関数を用います。 ...
【OpenCV-Python】cvtColorでBayer変換するときの定数
一般的なカラーカメラでは、モノクロのセンサの各画素にBayerと呼ばれるパターンのカラーフィルタが配置された状態で、画像を撮影しています。 このパターンはGRBG(詳細は後述) このフィルタが配置された状態で撮影した画像は、下図のように、市...

コメント

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