计算图像的对相关性

时间:2013-02-22 08:19:29

标签: image matlab correlation

我有二进制图像,比方说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

知道怎么做得快一点吗? 谢谢!

1 个答案:

答案 0 :(得分: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情况下,它允许将(即@rdivide)除以另一个常量列,即(1:n)'

这是一个显示等价的测试:

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次,我认为非常好