Image Processing Toolbox에 액세스 할 수없는 경우이를 수행하는 또 다른 방법은 각 점의 위쪽, 오른쪽, 아래쪽 및 왼쪽 첫 번째 차이를 나타내는 4 개의 행렬을 작성한 다음 4 개 행렬 모두에서 해당 요소를 검색하는 것입니다. (즉 요소가 모든 인접 요소를 초과합니다).
>> sizeA = 3;
A = randi(255, sizeA)
A =
254 131 94
135 10 124
105 191 84
패드 제로 요소와 국경 :
>> A2 = zeros(sizeA+2) * -Inf;
A2(2:end-1,2:end-1) = A
A2 =
0 0 0 0 0
0 254 131 94 0
0 135 10 124 0
0 105 191 84 0
0 0 0 0 0
가 네 첫 차 행렬을 구축 여기
는
는 테스트 데이터를 생성 ... 나눌 생각입니다 :
>> leftDiff = A2(2:end-1,2:end-1) - A2(2:end-1,1:end-2)
leftDiff =
254 -123 -37
135 -125 114
105 86 -107
>> topDiff = A2(2:end-1,2:end-1) - A2(1:end-2,2:end-1)
topDiff =
254 131 94
-119 -121 30
-30 181 -40
>> rightDiff = A2(2:end-1,2:end-1) - A2(2:end-1,3:end)
rightDiff =
123 37 94
125 -114 124
-86 107 84
>> bottomDiff = A2(2:end-1,2:end-1) - A2(3:end,2:end-1)
bottomDiff =
119 121 -30
30 -181 40
105 191 84
얻어진 매트릭스 생성
indexKeep = find(leftDiff >= 0 & topDiff >= 0 & rightDiff >= 0 & bottomDiff >= 0)
: 모든 함수에이 포장 1000 난수는 100x100 행렬에서 테스트 후
>> B = zeros(sizeA);
B(indexKeep) = A(indexKeep)
B =
254 0 0
0 0 124
0 191 0
를 알고리즘이 나타나는 0
는 이웃 모두를 초과하는 요소를 찾아 매우 빠르다 :
>> tic;
for ii = 1:1000
A = randi(255, 100);
B = test(A);
end; toc
Elapsed time is 0.861121 seconds.
정확히 내가 무엇을 찾고 있었는지 ... 나는 그 성능이 루프보다 좋기를 바랍니다. :) 감사합니다. gnovie – Shan
+1 imdilate가 여전히 더 빠를 것 같아요. – Jonas
@ Jonas : [IMDILATE 성능은 MATLAB의 마지막 몇 가지 버전에서 몇 가지 중요한 개선 사항을 보았 기 때문에] 속도에 관해서는 옳을 수도 있습니다. (http://blogs.mathworks.com/steve/2010/04/23/more- r2010a- 성능 향상 - 이미지 처리 도구 상자 /). – gnovice