2015-01-12 21 views
0

Я написал функцию в Matlab, которая принимает изображение 'I' и две длины в записях и возвращает изображение 'output' того же размера, что и I, в котором пиксели I были переведены в соответствии с . Выполненный перевод является циклическим, то есть когда переведенный пиксель проходит d пикселей за пределы одного из размеров I, он помещается в положение d по оси, связанной с этим измерением.Векторизовать код в Matlab

Эта функция использует два цикла for, и я хотел бы ее векторизовать, чтобы быть выполненным быстрее.

function [ output ] = translated(I,horizontal_translation, vertical_translation) 

output=I; 
[H , W]=size(I); 
sx=horizontal_translation; sy=vertical_translation; 
for i=1:H 
    for j=1:W 
     if i+sx>H 
      i_=mod(i+sx,H); 
     else 
      i_=i+sx; 
     end 
     if j+sy>W 
      j_=mod(j+sy,W); 
     else 
      j_=j+sy; 
     end 
     output(i_,j_)=I(i,j); 
    end 
end 

end 
+0

Вам необязательно вызывать функцию по модулю вообще, просто '[sy: W 1: sy-1]' Также кажется, что H и W отменены? –

ответ

1

Отношение входа к выходу всегда следующим образом:

1 | 2 
----+---- 
3 | 4 

в

4 | 3 
----+---- 
2 | 1 

Таким образом, вы можете сделать это с четырьмя нарезанными заданий.

Все, что остается выяснить размер каждого из блоков, которые являются только sx и H - sx, соотв sy и W - sy.

Самый лучший вариант - просто позвоните в circshift, предоставленный MATLAB, который делает это за вас.

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