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

답변

1

코드는 내 nsize입니다

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

와 동일하게 될 것으로 보인다. 매우 유용한 함수이기 때문에 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을 수행하는 것과 같습니다. 그러나 mean 대신 sum을 사용합니다. 따라서 누적 합계 벡터를 변환하려면 각 요소를 열 번호로 나누어야합니다. 그래서 우리는 벡터 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. 

이것은 단지 하나 실행에 대해하지만 그래서 당신에게 내 생각은 꽤 좋은 같은 4500의 최대 속도를 제공

+0

죄송합니다. 코드에서 오류가 업데이트되었습니다. 이제는 맞습니다. 또한 시간 테스트를 추가했습니다. – Dan