質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Q&A

解決済

1回答

2708閲覧

テンプレートマッチングのコードが重すぎる、MATLAB

akaz

総合スコア1

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

0グッド

0クリップ

投稿2020/07/11 14:32

前提・実現したいこと

学生です。現在MATLABを用いて、テンプレートマッチングの勉強をしています。
自分なりに計算方法SSDをコードで書いてみたのですが
いざ画像でやろうとすると、重くてコンパイルが終わりません。

発生している問題・エラーメッセージ

エラーなし

該当のソースコード

function [min,zahyou] = patamati(a,b) sizeA = size(a); sizeB = size(b); if(sizeB(1,1)*sizeB(1,2) > sizeA(1,1)*sizeA(1,2)) nige = a; a = b; b = nige; end %入力の順番自由 sizeA = size(a); sizeB = size(b); x = 0; wa = zeros; min = 256^2 * sizeB(1,1) * sizeB(1,2); %minの初期値は8bit最大 for k = 0:(sizeA(1,1)-sizeB(1,1)) for l = 0:(sizeA(1,2)-sizeB(1,2)) x = x + 1; wa(x) = 0; for i = 1:sizeB(1,1) for j = 1:sizeB(1,2) wa(x) = wa(x) + (a(i+k,j+l) - b(i,j))^2; %差の二乗を加算 end end if(wa(x) < min) min = wa(x); zahyou = [k+1,l+1]; %zahyouはマッチしたときの左上の座標 end end end min = min / (sizeB(1,1)*sizeB(1,2)); %1ピクセル当たりの差 end

試したこと

①グレスケ画像(画像は4032×3024、テンプレートは904×383)
②バイナリ画像(サイズは同上)
③4×6のランダムな数値の行列と3×3のテンプレート

結果は③のみ出来ました。バイナリ画像でもできないのはおかしいと思い
質問させていただきました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

MATLABはインタプリタでコンパイルはしないので、単に実行に時間がかかる意味だと解釈します。

これは、さすがにループの繰り返し回数が多いのではないでしょうか。
画像は4032×3024、テンプレートは904×383でどれくらい計算が繰り返されるかを求めてみます。

まず、テンプレート一つ分の計算は904383=346232、つまりおよそ35万回の計算が行われます。これを(4032-904+1)(302-383+1)=8266818、つまりおよそ800万回繰り返します。つまり、全体でおよそ2.86e+12、つまり3兆回弱の計算が行われることになります。MATLABのforループは遅いので、3兆回も回していたら、何日もかかるでしょう。

基本的にはforループを使わないようにして、行列計算を行うようにします。たとえば、内側のijを使ったループは、こんな風に消せます。

MATLAB

1for k = 0:(sizeA(1,1)-sizeB(1,1)) 2 for l = 0:(sizeA(1,2)-sizeB(1,2)) 3 wa = (a((k+1):(k+sizeB(1,1)), (l+1):(l+sizeB(1,2))) - b) .^ 2; 4 wa = sum(wa(:)); 5 if(wa < min) 6 min = wa; zahyou = [k+1,l+1]; %zahyouはマッチしたときの左上の座標 7 end 8 end 9end

これだけで20から30倍は速くなると思いますが、外側の繰り返しが800万回もあるので、これでも数時間単位で時間がかかると思います。

外側のループの消したかったのですが、うまい方法が思いつきませんでした。計算方法を工夫するところから考えないといけないかもしれません。

投稿2020/07/11 23:01

Bearded-Ockham

総合スコア430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akaz

2020/07/12 01:27

回答ありがとうございます! 確かにうちのPCに3兆回の計算とは、酷なことをさせていました。 なるほど、もっとMATLABの演算方法を確認してみたいと思います。 それから画像サイズももっと小さくしてみます。 仮に画像サイズを1/10にしたとしても実行には数十分ほどかかってしまいそうですが、 テンプレートマッチングというのはそういうものなのでしょうか...
akaz

2020/07/12 09:38

画像サイズ1/5にしただけでも、実行に30秒かからなかったので とりあえずはこのままやってみようと思います。 改めて、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問