2

背景ストーリー:

これは古いスクリプトです。同じオブジェクトのわずかに異なる 2 つの画像を比較して、カメラ自体のデータを取得する必要がありました。このスクリプトをオクターブで書いて試してみましたが、後で、オクターブの代わりに matlab を使用したよりも、matlab の方がはるかに高速に実行されることがわかりました。最近、オクターブをもう一度チェックすることにしましたが、速度比はまだ 1:1000 です。

質問:

  1. このアルゴリズムをベクトル化するにはどうすればよいですか?
  2. matlab (オクターブの対比) には、このコードを自動ベクトル化して 1000 倍高速に実行する方法がありますか? カラー画像 420X420 ピクセル サイズの場合、0.1 対 100 秒ですか?

脚本:

color_depth = 8;
number_of_colors = 3;
number_of_grey_levels = 2^color_depth;
Double_Distribution_0 =zeros(number_of_grey_levels,number_of_grey_levels,number_of_colors);
frame_A = 1+int16(imread('Path\image_A.tif'));
frame_1 = 1+int16(imread('Path\image_1.tif'));
[height,width]=size(frame_A(:,:,1));
number_of_pixels = width*height;

for k = 1:number_of_colors
    tic
    for i = 1:height
        for j = 1:width
                Double_Distribution_0(frame_1(i,j,k),frame_A(i,j,k),k) = 1 + Double_Distribution_0(frame_1(i,j,k),frame_A(i,j,k),k);
        end
    end
   toc
end
4

3 に答える 3

3

1) はい、Shai によっても説明されているように、コードをベクトル化できます。ただし、彼のソリューションには frame_1 と frame_A のカラー インデックスがないことに注意してください。これでうまくいくはずです:

for k=1:number_of_colors
    f_1 = frame_1(:,:,k);
    f_A = frame_A(:,:,k);
    Double_Distribution_0(:,:,k) = accumarray( {f_1(:), f_A(:)}, 1,...
                                   [number_of_grey_levels, number_of_grey_levels] );

end

2) Matlab が Octave よりも何倍も高速な理由は、リリース 6.5 以降、Matlab が JIT コンパイラを使用して単純な for ループなどを大幅に高速化しているためです。JIT について詳しくない場合は、こちらをご覧ください。最後に確認したところ、Octave はまだ独自の JIT に取り組んでいましたが、まだ時間がかかると思います :-)。

Octave バージョンが上記のコードの恩恵を受けるかどうかは、Octave でどのように記述されたかによって異なります。大きなメリットが期待できます。

于 2013-01-02T20:25:48.913 に答える
1

あなたのコードを正しく理解していれば、2 つのフレームのジョイント カラー分布の 2D ヒストグラムが作成されます。

for k=1:number_of_colors
     Double_Distribution_0(:,:,k) = accumarray( {frame_1(:), frame_A(:)}, 1,...
                               [number_of_grey_levels, number_of_grey_levels] );
end
于 2012-12-25T06:19:17.787 に答える
1

お二方とも素早いご回答ありがとうございます。

どういうわけか構文の一部が機能しませんでしたが、短縮すると次のようになりました。

Double_Distribution_0(:,:,k) = accumarray({frame_1(:,:,k),frame_A(:,:,k)},1);

私は望んでいたものを手に入れました (結果を古いコードと比較して)。

于 2013-01-25T14:57:32.523 に答える