2013-02-22 136 views
1

我有一個二進制圖像,可以說512x512px。我想計算配對相關性g(x)。到目前爲止,我正在以原始方式按照原始方式逐行執行:計算圖像對的相關性

function Cr = pairCorr(image) 

domains = imread(image); % read image 
domains(domains>0) = 1; % make sure its binary by setting 1 to values > 0 
size = length(domains(:, 1)); % image size 

for i=1:size 
    line = domains(:, i); % take one line... 
    for j=1:size % and for each distance... 
     s = line(1:end-size+j); 
     Cr(i, j) = mean(s); %...calculate Cr as mean 
    end 
end 

Cr = mean(Cr); % average all lines 

任何想法如何做得更快? 謝謝!

+0

你試過這個:http://nabil.mabrouk.perso.neuf.fr/spip.php?article14? – Dan 2013-02-22 09:36:35

回答

1

你的代碼(從環上)似乎是一樣

Cr = mean(bsxfun(@rdivide, cumsum(domains), (1:n)')); 

在我的n是你size。不要在matlab中使用size作爲變量名,因爲它是一個非常有用的函數。比如你去length(domains(:,1)),但你可能已經size(domains, 2)

什麼是我的代碼,這樣做的:

cumsum(domains)發現的累加值沿着每列。所以這就像整個矩陣一次性完成你的for j=1:size s = line(1:end-size+j); Cr(i, j) = mean(s); end。但用sum而不是mean。因此,爲了將累積和的矢量轉換爲平均值,我們必須將每個元素除以列號。所以我們要除以矢量1:n。 bsxfun允許我們對矩陣的每個維度進行操作。因此,在每個列的2D情況下,它允許用另一個恆定列(即(1:n)')來劃分(即@rdivide)。

下面是測試顯示等價:

n = 512; 
A = rand(n); 
A(A > 0.5) = 1; 
A(A <= 0.5) = 0 

tic 
Cr1 = mean(bsxfun(@rdivide, cumsum(A)', (1:n))); 
toc 

tic 
for i=1:n 
    line = A(:, i); 
    for j=1:n 
     s = line(1:end-n+j); 
     Cr2(i, j) = mean(s); 
    end 
end 
Cr2 = mean(Cr2) 
toc 

mean(mean(Cr1 == Cr2)) 

結果:

Elapsed time is 0.016396 seconds. 
Elapsed time is 75.2006 seconds. 

所以,雖然這僅僅是1點來看,它給你的像4500倍加速這是非常好的,我認爲

+0

對不起,更新了代碼中的錯誤。現在它是正確的。還添加了時間測試 – Dan 2013-02-22 11:14:34