Ваш код работает правильно для меня.
Одна из ваших проблем заключается в том, что вы не выделяете picture_out
Он создается при первом назначении ему значения и расширяется каждый раз, когда вы назначаете ему другое значение. Первое значение, которое вы назначаете ему, определяет его тип. Если вы назначите 0
(a double
), он станет массивом double
. Если вы присвоите значение из picture_in
(a uint8
), оно станет массивом uint8
. В зависимости от того, в каком направлении вы сдвинете изображение, произойдет одно или другое.
A uint8
изображение имеет значения 0-255. Это ваши входные значения. double
изображение может хранить значения практически любой величины, но MATLAB всегда предполагает, что такое изображение имеет значения в диапазоне 0-1. Поскольку вы помещаете значения в диапазоне 0-255 в массив double
, MATLAB при вызове imagesc
будет предполагать, что все, что больше 1, должно быть 1, и поэтому покажет вам полностью белое изображение.
Итак, когда вы сдвигаете изображение влево, вы получаете uint8
выходное изображение, и оно будет отображаться правильно. Когда вы смещаете изображение вправо, вы получаете double
выходное изображение, и оно будет отображать все белое.
Решение состоит в том, чтобы правильно распределить массив перед циклами:
picture_out = zeros(size(picture_in),'uint8');
Это дополнительно ускорит ваш код.
Нежелательный совет:
Вы должны научиться использовать петли for
, они намного проще, чем петли while
. Вместо:
k=0;
while k<Q
% do something
k=k+1;
end
вы получите
for k = 1:Q
% do something
end
Кроме того, вместо цикла с k=0
, в то время как k<Q
, в MATLAB более естественно выполнять цикл с k=1
при k<=Q
, как в цикле for
выше.
Однако во многих случаях вам вообще не нужно выполнять цикл. Ваш код может быть переписан намного эффективнее как
picture_out = zeros(size(picture_in),'uint8');
picture_out(:,1+tx:end,:) = picture_in(:,1:end-tx,:);
(для случая tx>0
; вы можете изменить индексирование для смещения в другую сторону.)
В качестве альтернативы используйте circshift
:
picture_out = circshift(picture_in,tx,2);
Здесь tx
также может быть отрицательным.