2013-02-22 2 views
1

У меня есть двоичное изображение, скажем 512x512px. Я хочу рассчитать парную корреляцию g (x). До сих пор я это делаю, как примитив как inefective образом, построчно:Расчет парной корреляции для изображения

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

ответ

1

Ваш код (от петли на), кажется, чтобы быть таким же, как

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

где мой n твой size. Не используйте размер как имя переменной в matlab, так как это очень полезная функция. Например, вы пошли 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 позволяет выполнять операцию на каждом срезе размерности матрицы. Поэтому в двумерном случае на каждом столбце он позволяет разделить (то есть @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, который довольно хорошо, я думаю,

+0

Извините, обновлена ​​ошибка в коде. Теперь это правильно. Также добавлен тест времени – Dan

Смежные вопросы