2013-10-29 2 views
0

그래서 최근에 루프를위한 인덱스로 작업하려고합니다. 그리고 matlab에서 느리게 느껴집니다.Matlab, 중첩 된 For 루프 대신에 인덱스로 작업

그래서 다음을 변경하려고합니다. 이에

for i =1:size(l,1) 
     for j=1:size(l,2) 
        if l(i,j,1)>200 && l(i,j,2)<40 && l(i,j,3)<40 
          l(i,j,1)=144; 
          l(i,j,2)=0; 
          l(i,j,3)=0; 

        end 
     end 
end 

: 그것은 거의 작동하고 내가 사진을 볼 수 있지만

p1(:,:,1)= (200 < l(:, :,1) & 40 > l(:, :,2) & 40 > l(:, :,3)) ; 
p2(:,:,2)= (200 < l(:, :,1) & 40 > l(:, :,2) & 40 > l(:, :,3)); 
p3(:,:,3)= (200 < l(:, :,1) & 40 > l(:, :,2) & 40 > l(:, :,3)); 
pix(p1(:,:,1))=144; 
pix(p2(:,:,2))=0; 
pix(p3(:,:,3))=0; 

색상은 모두 사진에 다른 나타납니다. 나는 imshow (pix)가 imshow (l)와 완전히 똑같지는 않다는 것을 의미합니다. 나는 정말로 문제를 발견 할 수 없다.

+0

을이 아마 이미지 경우 최대 강도 값으로 분을 변경하기 때문에 무슨 일이 일어나고 칼라 맵의 스케일링입니다 ... – bla

+0

@natan 이해 해달라고 너 무슨 뜻이야? 첫 번째 부분에서 lines5 및 6을 삭제하고 코드의 두 번째 부분에서 2,3,5 및 6 행을 삭제합니다. 이미지는 완전히 동일하게 나타납니다. 이 문제에 대한 통찰력? –

답변

0

다음은 빠른 수정입니다. 참조 행렬 요소에 벡터를 사용하면 의도 한 것보다 많은 요소가 참조됩니다. 그것은 여전히 ​​하나의 루프를 가지고 있지만 원래의 방법보다 더 빠를 것입니다.

[ti,tj]=find(pix(:,:,1)>200 & pix(:,:,2)<40 & pix(:,:,3)<40); 
for k=1:length(ti) 
    pix(ti(k),tj(k),:)=[144 0 0]; 
end 
+0

죄송합니다.주의 :이 솔루션은 원하는 결과를 반환하지 않습니다. –

+0

사실 그것은 –

+0

다시 확인, 내 실수 (여기서 pix = l). –

0

이 잘 작동합니다 :

% This is how the data look like 
q = randi(256, [1000, 1000, 3]); 

% This is the desired outcome: 
tic 
qq = q; 
for i = 1:size(q, 1) 
     for j = 1:size(q, 2) 
        if ((q(i, j, 1) > 200) && (q(i, j, 2) < 40) && (q(i, j, 3) < 40)) 
          qq(i, j, 1) = 144; 
          qq(i, j, 2) = 0; 
          qq(i, j, 3) = 0; 
        end 
     end 
end 
toc 

% This is a faster solution  
tic 
p1(:, :, 1) = (q(:, :, 1) > 200) & (q(:, :, 2) < 40) & (q(:, :, 3) < 40); 
p2(:, :, 2) = p1(:, :, 1); 
p3(:, :, 3) = p1(:, :, 1); 
pix = q; 
pix(p1(:)) = 144; 
pix(p2(:)) = 0; 
pix(p3(:)) = 0; 
toc 

% Check that the solution returns the desired outcome:  
all(pix(:) == qq(:)) 
sum(pix(:) ~= qq(:))