2014-11-08 3 views
2

저는 컴퓨터 비전을 위해 Matlab에서 Square Distance Disparity Map 기반의 Sum of Distance를 구현할 것입니다. 현재 코드는 중첩 된 for 루프를 가지고 있으며 매우 느리게 실행됩니다. 더 효율적으로 벡터화에 대한 제안? 감사합니다Matlab의 불일치 맵 벡터화

%im1 and im2 are images and win1, win2 are window sizes 
for i=win1+1:1:bottom-win1 
    parfor j=win2+1:1:right-win2 
     %j=[win2+1:bottom-win2]; 
     template=im1(i-win1:i+win1,j-win2:j+win2); 
     arg1=conv2(im2.^2,ones(size(template))/2,'same'); 
     arg2=conv2(im2,rot90(template,2),'same'); 
     arg=arg1-arg2; 
     [xj]=find(arg==min(arg(:))); 

     disparityMap(i,j)=1-xj(1); 


    end 
end 
+0

이 방법을 쉽게 벡터화 할 수는 없지만 몇 가지 명백한 개선점이 있습니다. 'arg1'은'i '와'j '에 의존하지 않으므로 상수이므로 [루프 밖으로 이동] (http://en.wikipedia.org/wiki/Loop-invariant_code_motion)! 나는 당신이 또한 템플릿을 추출하기위한 인덱스를 조금 조정한다면 루프 앞에서 한 번만 완전한'im1'을 회전시킬 수 있다고 생각합니다. –

+0

컴퓨터 비전 시스템 도구 상자에서 '디스 패리티 (disparity)'기능을 사용할 수도 있습니다. – Dima

답변

1

세 가지 제안 가지 속도를 시도 :

  • 이동 외부 루프에 parfor 병렬 구조의 오버 헤드를 줄이기 위해;
  • 컴퓨팅 im2.^2 번 루프 이전과 루프 변수에 의존하지 않는 한이 또 다시 계산할 필요가없고, 임시 변수에 값을 저장 실제로
  • 이동 중 arg1의 전체 계산 루프는 단지 template의 크기에 의존하며 그 값은 아니며, 올바르게 보면 크기가 일정합니다.
  • 구조체를 에 대한 호출을 피하기 위해 [tmp, ind] = min(arg(:)) ; xj=ind2sub(size(arg), ind) 행으로 대체하고 인덱스를 간단히 계산할 수있는 동안 행렬을 다시 스캔하십시오.

안된하지만, 그것은 당신에게 시작 또한

arg1=conv2(im2.^2,ones([2*win1+1, 2*win2+1])/2,'same'); 
parfor i=win1+1:1:bottom-win1 
    for j=win2+1:1:right-win2 
     %j=[win2+1:bottom-win2]; 
     template=im1(i-win1:i+win1,j-win2:j+win2); 
     arg2=conv2(im2,rot90(template,2),'same'); 
     arg=arg1-arg2; 
     [tmp, ind] = min(arg(:)) ; 
     xj=ind2sub(size(arg), ind); 

     disparityMap(i,j)=1-xj(1); 

    end 
end 

확인 노동자의 수를 적절하게 선택되어 있는지 확인하고, 개선이 있는지 MEX하는 코드를 컴파일하려고를 제공해야합니다.