2021.09.22
【Webマガジン Vol.42- Sep., 2021】Column: Teledyne FLIR / Bosonと可視カメラ映像の、画像処理による位置合わせ
WEBマガジン
<目次>
・はじめに
・作業環境
・確認内容
・終わりに
はじめに
Teledyne FLIRではIR(赤外線)画像とEO(可視)画像を重ね合わせる MSX と言う技術があり、画像処理を用いてそれと同様の事が出来ないか試みました。
可視カメラからの画像を、エッジ等赤外線画像にはない要素を抽出して赤外線カメラからの画像に加える事により、画像の鮮明度を上げてみます。
◆参考
https://www.flir.jp/discover/professional-tools/what-is-msx/
作業環境
次の2つのカメラとPython3.8.2、OpenCV4.1.1を利用しWindows10 Visual Studio Codeを使って開発しました。
- サーマルカメラ
FLIR Boson 20320H092(QVGA、FOV=92°)を使用しました。 - 可視カメラ
当社で製作した、Teledyne e2v Sapphire WVGAカメラモジュールを利用しました。
確認内容
画像処理にPython OpenCVライブラリを使用して、以下の考察を行いました。
1. 赤外線画像と可視画像を重ねる
2. 解像度等の2つの画像のズレを減らす
——————————————————-
1. 赤外線画像と可視画像を重ねる
a) そのまま重ねる
やはりと言いますか、単に重ねただけですとゴチャゴチャとしてしまいよくわからない絵になります。
b) 重ね合わせの割合調整や、特徴強調をEO画像に加えて重ねる
可視画像から赤外線画像にはない要素を抽出して、適量で混ぜる事を検討します。画像の特徴を強調する処理としては、以下がありました。
・エッジ抽出(ラプラシアンフィルタ)
輝度変化が急激に変化している部分をエッジとして、その変化を抽出するのに微分フィルタを用いる 。基本となる1次微分フィルタは、ある方向例えば水平方向の画素値の変化の傾きを得るというもの。ラプラシアンフィルタは水平垂直2次微分の和。前進差分・後退差分の2回微分をとる。通常は、ガウシアンフィルタで画像をぼかしてからラプラシアンフィルタ処理を行う、ラプラシアンオブガウスという使い方をする。 ガウシアンフィルタは指定した領域毎に中央部分の重みが大きくなるような平均値を算出することで、ぼかしたような画像が得られる。
<ソース例>
frame = cv2.GaussianBlur(frame, (3, 3), 2)
frame = cv2.Laplacian(frame, cv2.CV_32F)
frame = cv2.convertScaleAbs(frame)
frame *= 8
・Cannyのエッジ検出器
特徴はヒステリシスを使ったしきい値処理を行い、エッジが弱い箇所があっても周囲のエッジ情報で補間。その度合いを、閾値によって調整する。
閾値は2つで、それらの間に入るエッジが結果として出力される。
<ソース例>
Canny = cv2.Canny(Canny, 10, 200)
・強調(アンシャープマスク)
フィルタリングを利用して、画像をシャープにします。実際には、以下の処理をしています。
画像をぼかして元画像と差分を取る。その画像をK倍して元画像に足し込む。この作業を実施することによって、エッジが強調されます。
<ソース例>
blurred_img = cv2.GaussianBlur(unsharp, (9,9), GauSigma)
unsharp = cv2.addWeighted(unsharp, 1.0+paramK, blurred_img, -unsharpK, 0)
・膨張を利用した方法
一般的なエッジ関連の処理ではないですが、結果的にはこれが最もすっきりしていて綺麗に出力されました。
以上を各々単体で確認、そして赤外線画像に重ねて確認を行い、膨張を利用した方法を使用する事としました。
スマートフォンを撮影して二つの画像を重ねたもの。
大きい方が可視画像に膨張処理を加えたもの、小さい方が赤外線画像。
2. 解像度等の2つの画像のズレを減らす
・2つの画像を重ねる際の位置合わせの為に、画像に対して移動回転拡大縮小処理を行います。
OpenCVでアフィン変換が可能なので、その最適な設定値が分かれば合わせ込む事が出来ると考えます。
<ソース例>
Corrh, Corrw, ch = img.shape
CorrM = cv2.getRotationMatrix2D((Corrw/2,Corrh/2), angle, scale)
CorrM[0][2] -= x
CorrM[1][2] -= y
IR = cv2.warpAffine(IR, CorrM, (Corrw, Corrh))
・この設定値つまり画像のズレ量を見つけ出す方法として以下の方法があり、OpenCVを使用して確認出来ました。
RIPOC(回転不変位相限定相関) 2つの画像からどれぐらいズレているかを推定する方法
・フーリエ変換と極座標変換をうまく組み合わせ相関情報を抽出する事で、平行移動・回転・拡大縮小の値が得られる。
・それらの値を用いて、アフィン変換により合わせる。
・ただし、2つの画像自体は同じであること。
以上から、次の2点を確認しました。
2-1. RIPOC(回転不変位相限定相関)
2-2. 手動で平行移動・回転・拡大縮小をして合わせ込む
上記2点について、ご説明します。
2-1. RIPOC(回転不変位相限定相関)
実際試した結果、赤外線画像と可視画像は見た目が似ているだけで全く別物(別データ)であるため、期待した結果が得られませんでした。
そこで、エッジ検出処理後にその図形の描画をすることで特徴を単純化(余計なノイズを排除)し、その図形差をRIPOC処理で算出する事でズレを減らすことを検討しました。
理由としては、以下の前提条件があるためです。
a. 2つのカメラ画像の違いが、平行移動・回転・スケール変換で解決できる。
b. 被写体が赤外線画像・可視画像それぞれでほぼ同じ形状で捉えられる。
結果として、かなり近いところまで合わせ込む事が出来ました。
2-2. 手動で平行移動・回転・拡大縮小をして合わせ込む
これは2つを重ねた画像を見ながらパラメータを入力していき、ズレ分を埋めていく方法です。
リアルタイムに数値が入力出来て、更新された数値で直ちに処理が反映・補正される事が必要で、PySimpleGUIライブラリを使用しました。
・評価のために便利なPython GUI PySimpleGUI https://pysimplegui.readthedocs.io/en/latest/
液晶テレビを撮影。 可視画像にグレースケール化・膨張処理を行い、手動で平行移動・回転・拡大縮小調整をしたものと、赤外線画像を合成割合の設定をして重ねたもの。
終わりに
まだまだ改良の余地はありますが、第1弾として、テスト環境構築・基本画像処理・次への課題を確認出来ました。
本記事に関するご質問やご要望等ございましたら、ページ下部のWEBマガジンお問い合わせフォームより、お気軽にお問い合わせください。