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

デモザイキング(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一択になりそうです。

参考リンク

【Kinect SDK】RawBayerデータとは?

カラーカメラはモノクロカメラを兼ねない

https://docs.opencv.org/3.4/d8/d01/group__imgproc__color__conversions.html

【OpenCV-Python】cvtColor(色変換)

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

【C#エラー】System.BadImageFormatException 間違ったフォーマットのプログラムを読み込もうとしました。

ライブラリ(DLL)を使ったアプリケーションを作成しようとすると、

 

アプリケーションはブレークモードになっています

System.BadImageFormatException: ‘間違ったフォーマットのプログラムを読み込もうとしました。

 

 

と表示される場合があります。

このBadImageFormatという部分がDLLが32bitもしくは64bitで作られたものを、C#アプリケーションから異なるbit(32bit)で作成し、DLLを参照した場合にこのエラーが表示されます。

最近のVisual Studioでは、C#のアプリケーションはデフォルトで32bitで作成されるため、とくにC言語で作られた64bitのDLLを使用している場合に、このエラーが発生しやすいです。

 

回避方法は、Visual Studioでプロジェクト名を右クリックし、プロパティを選択します。

表示されたプロパティ画面において、左側のビルドを選択し、右側に表示されている 32ビットを選ぶ のチェックを外します。

構成の部分でDebugReleaseの設定があるので、両方のチェックを外してください。

 

この状態で、再度ビルドを行うと、間違ったフォーマットのプログラムを読み込もうとしました。というエラーメッセージは表示されなくなります。

 

この32ビットを選ぶ の設定はVisual Studioのバージョンによって異なります。

少なくともVisual Studio 2019以降では、32ビットを選ぶが初期設定となっているので、最近のVisual StudioでDLLを使ったアプリを作成する場合は注意が必要です。

【C#エラー】ファイルForm.resxを処理できませんでした。インターネットまたは制限付きゾーン内にあるか、ファイルにWebマークがあるためです。

メールに添付したプログラムをVisual Studioで開き、ビルドをすると以下のようなメッセージが表示されました。

 

ファイルForm.resxを処理できませんでした。インターネットまたは制限付きゾーン内にあるか、ファイルにWebマークがあるためです。これらのファイルを処理するにはWebマークを削除してください。

 

Visual StudioでForm.resxファイルのプロパティを探してもWebマークらしきものがありません。

 

そこで、エクスプローラーでエラーの出ているファイル(ここではForm1.resx)を右クリックし、プロパティを表示し、

 

このファイルは他のコンピューターから取得したものです。このコンピューターを保護するため、このファイルへのアクセスはブロックされる可能性があります。

 

の右側にある 許可する にチェックを入れ、 適用 をクリックします。

 

これで、再度Visual Studioでビルドするとエラーが無くなります。

【OpenCV-Python】Tkinter GUI Sample

OpenCVのPython版でもC#のようなウィンドウのGUIプログラムを作りたい!

ということで、GUIにTkinterを使って、簡単なサンプルプログラムを作成しました。

 

ここで公開しているコードは自由に変更して使って頂いてもらって構いません。
どこかで公開する場合は、参照元を書いて頂けると嬉しいです。
エラー処理は甘めなので、自己責任でお願いします。

 

機能的には画像ファイル(日本語ファイルを含む)を開いてtkinterのCanvas上に画像を表示します。

画像は、マウス操作で上下左右の移動と、マウスホイールで拡大縮小が可能になっています。

マウスのダブルクリックで画像全体を表示します。

 

OpenCVの処理そのものは二値化とガウシアンフィルタのみの至ってシンプルなものなので、いろいろと追加してお試しください。

 

ソースコードはこちら↓

 

GitHubにもソースコードは上げておきました。

https://github.com/ImagingSolution/OpenCVTkinterGUISample

 

関連記事

【Python】画像ビューア(ズーム(拡大/縮小)、移動表示)

【Python/tkinter】ウィジェットの配置(pack)

【Python/tkinter】ウィジェットの配置(grid)

【Python/tkinter】Label(ラベル)

【Python/tkinter】Button(ボタン)

【Python/tkinter】Entry(テキストボックス)

【Python/tkinter】Menu(メニュー)

【Python/tkinter】Frame(フレーム)

【Python/tkinter】Canvas(キャンバス)の作成

【OpenCV/Python】日本語の画像ファイル読込・保存

【Python】画像データ(NumPy,Pillow(PIL))の相互変換