嗯...我不是 100% 了解这些东西,但这是一个有趣的问题并且与我的工作相关,所以我想我会尝试一下。
编辑:我试过一次,没有使用内置插件。那是我原来的答案。然后我意识到你可以很容易地做到这一点:
您的问题的简单答案是使用关于z 轴的正确旋转矩阵:
R = [cos(theta) -sin(theta) 0;
sin(theta) cos(theta) 0;
0 0 1];
这是另一种方法(我的原始答案):
我将分享我所做的;希望这对你有用。我只在 2D 中完成(虽然应该很容易扩展到 3D)。请注意,如果要在平面内旋转图像,则需要使用当前编码的不同旋转矩阵。您需要绕Z 轴旋转。
我没有使用那些 matlab 内置插件。
我参考了http://en.wikipedia.org/wiki/Rotation_matrix以获取一些信息。
im = double(imread('cameraman.tif')); % must be double for interpn
[x y] = ndgrid(1:size(im,1), 1:size(im,2));
rotation = 10;
theta = rotation*pi/180;
% calculate rotation matrix
R = [ cos(theta) -sin(theta);
sin(theta) cos(theta)]; % just 2D case
% calculate new positions of image indicies
tmp = R*[x(:)' ; y(:)']; % 2 by numel(im)
xi = reshape(tmp(1,:),size(x)); % new x-indicies
yi = reshape(tmp(2,:),size(y)); % new y-indicies
imrot = interpn(x,y,im,xi,yi); % interpolate from old->new indicies
imagesc(imrot);
我现在的问题是:“你如何改变旋转图像的原点?显然,我正在旋转左上角 (0,0)。
编辑 2针对提问者的评论,我再次尝试。
这次我解决了一些问题。现在我使用与原始问题相同的转换矩阵(关于 x)。
我通过重做我在图像中心执行ndgrid
s(放置 0,0,0)的方式来围绕图像的中心旋转。我还决定展示图像的 3 个平面。这不在最初的问题中。中间平面是感兴趣的平面。要获得中间平面,您可以省略零填充并将第三个ndgrid
选项重新定义为 just1
而不是-1:1
.
im = double(imread('cameraman.tif')); % must be double for interpn
im = padarray(im, [0 0 1],'both');
[x y z] = ndgrid(-floor(size(im,1)/2):floor(size(im,1)/2)-1, ...
-floor(size(im,2)/2):floor(size(im,2)/2)-1,...
-1:1);
rotation = 1;
theta = rotation*pi/180;
% calculate rotation matrix
R = [ 1 0 0 ;
0 cos(theta) -sin(theta);
0 sin(theta) cos(theta)];
% calculate new positions of image indicies
tmp = R*[x(:)'; y(:)'; z(:)']; % 2 by numel(im)
xi = reshape(tmp(1,:),size(x)); % new x-indicies
yi = reshape(tmp(2,:),size(y)); % new y-indicies
zi = reshape(tmp(3,:),size(z));
imrot = interpn(x,y,z,im,xi,yi,zi); % interpolate from old->new indicies
figure;
subplot(3,1,1);imagesc(imrot(:,:,1)); axis image; axis off;
subplot(3,1,2);imagesc(imrot(:,:,2)); axis image; axis off;
subplot(3,1,3);imagesc(imrot(:,:,3)); axis image; axis off;