1

画像内のオブジェクトの位置を検出するために2D相関アルゴリズムを実装しようとしていますが、組み込みの関数推定2D相関を使用したくありません。

これが私のコードです:

I=imread('image.tif');      % image is a black image contains white letters.
h=imread('template.tif');   %template is a small image taken from the original image, it contains one white letter.
I=double(I);
h=double(h);
[nrows ncolumns]=size(I);
[nrows2 ncolumns2]=size(h);
C=zeros(nrows,ncolumns);

for u=1:(nrows-nrows2+1)
   for v=1:(ncolumns-ncolumns2+1)
       for x=1:nrows2
           for y=1:ncolumns2
               C(u,v)=C(u,v)+(h(x,y)*I(u+x-1,v+y-1));
           end
       end
  end
end

[maxC,ind] = max(C(:));
[m,n] = ind2sub(size(C),ind)   % the index represents the position of the letter.

output_image=(3.55/4).*C./100000;
imshow(uint8(output_image));

私はそれが働いていると思います!しかし、それは非常に遅いです。

アルゴリズムを高速化するために、次のコードをより良いコードに置き換えるにはどうすればよいですか?

   for x=1:nrows2
       for y=1:ncolumns2
           C(u,v)=C(u,v)+(h(x,y)*I(u+x-1,v+y-1));
       end
   end

私は毎回次の2つの行列があると思っています

h(1:nrows2,1:ncolumns2)I(u:u+nrows2-1,v:v+ncolumns2-1)

別の質問、何か改善はありますか?

ありがとう。

4

3 に答える 3

2

可能な限り、行列演算を使用してみてください。したがって、次のようなものを試してください。

rowInds = (1:nrows2)-1;
colInds = (1:ncolumns2)-1;

temp = h.*I(u+rowInds,v+colInds);
C(u,v) = sum(temp(:));

それ以外の:

for x=1:nrows2
    for y=1:ncolumns2
        C(u,v)=C(u,v)+(h(x,y)*I(u+x-1,v+y-1));
    end
end
于 2012-11-24T17:45:37.210 に答える
0

はい、多くの改善があります。forループはまったく必要ありません。matlabの関数を使用したくないので、を使用xcorr2できますconv2私がここで与えた答えを参照してください。

于 2012-11-24T17:23:57.507 に答える
0

相互相関定理に従って、フーリエ領域で相互相関を決定するのはどうですか?それは劇的な速度の増加を保証するはずです。

于 2012-11-24T17:51:34.097 に答える