前回はベクタライゼーション処理、今回は「画像の融合」です。フュージョンってやつ。お約束というか、例によってというか、ScilabのHelpファイルの処理例をそのまま動かそうとするとエラー。まあソフトウエアの更新とHelpファイルが一致してないのだと思います。一つ一つ動く条件を詰めていく?これも修行じゃ?そういうこと?
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
Image Registration and Image Fusion
今回からImage Registration and Image Fusionカテゴリの関数の練習に入ります。その初回は「直観的にわかるんじゃね」ということでImage fusionの方です。関数としては以下の2つ
-
- imfuse
- imphasecorr
このうち「各種の」画像融合を行ってくれる imfuse関数のHelp処理例に基づいてやりたいと思います。しかし問題がいくつか。まずHelp処理例の中で前処理的に呼ばれている imphasecorr 関数、確かに実体関数存在していて動作もするのですが、どこにもその使い方を記したページが見つかりません。処理例通りの引数で動作自体は行えるので、その通りの使い方で押し切ってます。ここで行われている処理は画像のフォーマットをimfuse関数にかけやすいように変換することみたいです。実際動作させてみると、それらしいパラメータを返してくれるのですが、実際にはそれらは「よくわからん」ので全無視。変換済画像Sのみ利用してます。
もう1個の問題は、処理例通り実行すると肝心の imfuse関数がエラーを返してくることです。こんな感じ。
なんだかな。。。文句を言っても始まらないので、ちょこっと試行錯誤して無理やり動かしました。imfuse関数は、以下の6つの処理に対応しているのですが、それぞれ入力に制約あり、融合する2つの画像のチャネル数があっていないとエラーになるものが多いです。処理例でエラーが起こるのはRGB画像(3チャネル)とGRAY画像(1チャネル)を関数に渡してしまったためかと思われます。以下は実験で動作した例です。
-
- colordiff、入力は双方グレイスケール、入力がグレイスケールでも結果はRGB
- composite、入力は双方グレイスケール、出力もグレイスケール
- diff、入力は双方グレイスケール、出力もグレイスケール
- cascade、入力片方はRGB、もう片方はグレイスケール、出力はグレイスケール
- max、入力は双方グレイスケール、出力もグレイスケール
- min、入力は双方グレイスケール、出力もグレイスケール
実験例がグレイスケール多めなのは、処理に使わせていただいている「レナ」様画像の片方がグレイスケールなので、そっちに合わせてるという事情です。
処理例
Helpファイルの処理例を下敷きにしつつも、勝手改造を加えて大幅拡張した処理例が以下に。
I1 = imread(fullpath(getIPCVpath() + "/images/lena.bmp")); I2 = imread(fullpath(getIPCVpath() + "/images/lena7030.bmp")); [S,TR,ROT,SC]=imphasecorr(I1,I2); I1G = rgb2gray(I1); yColordiff = imfuse(I1G,S,'colordiff'); yComposite = imfuse(I1G,S,'composite',0.5); yDiff = imfuse(I1G,S,'diff'); yCascade = imfuse(I1,S,'cascade'); yMax = imfuse(I1G,S,'max'); yMin = imfuse(I1G,S,'min'); scf(0); clf; subplot(251); title('ORG:I1'); imshow(I1); subplot(252); title('ORG:I2'); imshow(I2); subplot(253); title('imphasecorr'); imshow(S); subplot(254); title('Colordiff'); imshow(yColordiff); subplot(255); title('Composite'); imshow(yComposite); subplot(256); title('Diff'); imshow(yDiff); subplot(257); title('Cascade'); imshow(yCascade); subplot(258); title('Max'); imshow(yMax); subplot(259); title('Min'); imshow(yMin);こ
ここでレナ様画像のそれぞれは、以下のようです。
-
- I1 512×512サイズのRGB画像
- I2 256×256サイズのモノクロ画像
- S 512×512サイズのモノクロ画像
つまり、imphasecorr関数のここでの実体は、サイズとフォーマットの異なる画像2枚から、画像サイズは大きい方、チャネル数は少ない方に変換した第2の画像を出力するということです。
実行結果
なお、cascade以外の処理結果はすべて元画像と同じサイズですが、cascadeは2枚の画像を横に接続した結果が得られているので横幅は倍になってます。
フュージョンしてるみたい。ホントか?