2013-02-22 141 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