我有一张已转换为双矩阵的图像。我想水平移动它,但我不知道该怎么做。我试图操纵位置,但事实证明我只是操纵颜色。
有没有办法可以引用像素位置,然后添加一个常量来执行移位?
Using the Image Processing Toolbox, you can apply a spatial transformation:
img = imread('pout.tif');
T = maketform('affine', [1 0 0; 0 1 0; 50 100 1]); %# represents translation
img2 = imtransform(img, T, ...
'XData',[1 size(img,2)], 'YData',[1 size(img,1)]);
subplot(121), imshow(img), axis on
subplot(122), imshow(img2), axis on
您可以使用circshift
来执行循环移位,im = circshift(im, [vShift hShift])
.
假设您的图像是矩阵 A 并且您想将 x 列包装到左侧:
A = [A(x+1:end,:) A(1:x,:)];
如果您没有工具箱但仍想进行亚像素移动,您可以使用此功能。它制作了一个在 x 和 y 上移动单个像素的过滤器,并将该过滤器应用于图像。
function [IM] = shiftIM(IM,shift)
S = max(ceil(abs(shift(:))));
S=S*2+3;
filt = zeros(S);
shift = shift + (S+1)/2;
filt(floor(shift(1)),floor(shift(2)))=(1-rem(shift(1),1))*(1-rem(shift(2),1));
filt(floor(shift(1))+1,floor(shift(2)))=rem(shift(1),1)*(1-rem(shift(2),1));
filt(floor(shift(1)),floor(shift(2))+1)=(1-rem(shift(1),1))*rem(shift(2),1);
filt(floor(shift(1))+1,floor(shift(2)+1))=rem(shift(1),1)*rem(shift(2),1);
IM=conv2(IM, filt, 'same');
end
%to test
IM = imread('peppers.png');IM = mean(double(IM),3);
for ct = 0:0.2:10
imagesc(shiftIM(IM,[ct/3,ct]))
pause(0.2)
end
%it should shift to the right in x and y