2011-08-15 16 views
2

私はグレースケールの200x200イメージを持っており、イメージ内の各8x8ウィンドウの輝度のヒストグラムを計算したいと思います。どのようにすれば速く計算できますか?私は現在ループ用に使用していますが、それはとても遅いです。グリッド上でのヒストグラムの高速計算

I = imread('image.jpg'); 
for i=1:8:height-7 
    for j=1:8:width-7 
     patch = I(i:i+7,j:j+7); 
     % compute histogram for the patch 
    end 
end 

答えて

5

あなたは画像処理ツールボックスを持っている場合は、あなたのループのコンパイルされ、一般的なバージョンで機能blockprocを使用することができます。私の現在のコードは次のようになります。コールバック関数をヒストグラム計算に定義するだけです。

B = blockproc(I, [8 8], @myhistfun) 
0

私は以下のコードがあなたの質問に答えるかもしれないと思います。このトリックは、ループ内の関数を呼び出すことではなく、すべての配列を事前に割り当てることです。例えば、ループ加速に関する詳細はhttp://www.quantiphile.com/2010/10/16/optimizing-matlab-code/を参照してください。とにかく、私のマシンの加速ループの下では17倍高速です。

% image size 
height = 800; 
width = 1200; 
window = 8; 

% histogram bin centers 
bin_centers = 0.05:0.1:1; 

% here a random image as input 
img = rand(height, width); 

% verion using accelerated loops (for this to work there cannot be any 
% function calls to not built-in functions) 
tic 
img3 = zeros(window^2, height*width/window^2); 
ind = 1; 
for i=1:window:height 
    for j=1:window:width 
     patch_ = img(i:i+window-1,j:j+window-1); 
     img3(:,ind) = patch_(:); 
     ind = ind + 1; 
    end 
end 
hist_img3 = hist(img3, bin_centers); 
toc 


% probably version of user499372 calling hist function within the loop 
tic 
hist_img4 = zeros(size(hist_img3)); 
ind = 1; 
for i=1:window:height 
    for j=1:window:width 
     patch_ = img(i:i+window-1,j:j+window-1); 
     hist_img4(:,ind) = hist(patch_(:), bin_centers); 
     ind = ind + 1; 
     % compute histogram for the patch 
    end 
end 
toc 

% test the results 
all(all(hist_img3==hist_img4)) 
関連する問題