2015-04-27 17 views
3

У меня есть следующий код: MATLABVectorize MATLAB петля

meanv = [rmean,gmean,bmean]; 
for i = 1:1:image_info.Height 
    for j = 1:1:image_info.Width  % for every pixel 
     x = image_rgb(i,j,1:3); 
     pix_color = [x(:,:,1),x(:,:,2),x(:,:,3)]; 
     d = dist(meanv,pix_color'); 
     if d <= threshold 
      S(i,j) = 1; 
     end 
    end 
end 

, приведенный выше фрагмент является частью программы, которая, из RGB изображений, сегменты объекта или цветов из нескольких точек, отмеченного пользователем. Сегментация достигается с помощью евклидова расстояния до среднего значений точек, отмеченных пользователем. Для каждого пикселя, если расстояние меньше заданного порога, тогда этот пиксель является белым в сегментированном изображении. В противном случае, черный.

Код работает хорошо, но он немного медленный. Как я могу воспользоваться тем фактом, что MATLAB намного быстрее с векторами и матрицами, чем с использованием циклов? Иными словами, код может быть - векторный:?

+2

Для справки в будущем полезно описать, что ваш код достигает в простых словах. – Setsu

+0

@ Сетсу да, теперь я читаю его, и ты прав. Сообщение отредактировано. –

ответ

4

Подход № 1 С bsxfun -

%// Get image size 
[m,n,r] = size(image_rgb) 

%// Calculate squared distances 
M = sum(bsxfun(@minus,reshape(image_rgb,[],3),meanv).^2,2) 

%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size 
S = reshape(M <= threshold^2 ,m,n) 

Подход № 2 С matrix-multiplication based euclidean distance calculations -

%// Get image size 
[m,n,r] = size(image_rgb) 

%// Calculate squared distances 
A = reshape(image_rgb,[],3); 
Bt = meanv(:); 
M = [A.^2 ones(size(A)) -2*A ]*[ones(size(Bt)) ; Bt.^2 ; Bt] 

%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size 
S = reshape(M<= threshold^2,m,n) 

Быстрые тесты во время выполнения: Запуск коды на случайном 512 x 512 x 3 изображение: image_rgb = randi(255,512,512,3), то время автономной работы были -

---------------------------------- With Original Approach 
Elapsed time is 5.850163 seconds. 
---------------------------------- With BSXFUN 
Elapsed time is 0.006737 seconds. 
-------------------------- With Matrix-multiplication based Eucl. dist 
Elapsed time is 0.015704 seconds. 

Больше причин пойти на vectorization!

+0

Ничего себе. Простой, лаконичный и элегантный! Спасибо Дивакар. –

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