三维图像旋转 (Matlab)

Image Rotation in Three Dimensions (Matlab)

我正在尝试在 Matlab xyz 3-D 中旋转 2D 图像 space。我想将图像 I 绕 x 轴旋转一个角度 θ=i。我是通过与旋转矩阵(定义为 here)相乘来做到这一点的:

这是我的代码:

x = linspace(-1,1,size(I,1));
[x0,y0,z0] = meshgrid(x,x,1);
R = [1 0 0; 0 cosd(-i) -sind(-i); 0 sind(-i) cosd(-i)];
xy = [x0(:),y0(:), z0(:)]*R';
X = reshape(xy(:,1),size(x0));
Y = reshape(xy(:,2),size(y0));
Z = reshape(xy(:,3),size(z0));
rotatedI = interp3(x0,y0,z0,I,X,Y,Z, 'nearest');
rotatedI(isnan(rotatedI)) = 0;

我得到的错误是在插值行中:

Error using griddedInterpolant
Interpolation requires at least two sample points in each
dimension.

那么这里到底是什么问题,我该如何解决?

我很困惑,因为这段代码在专门用于二维时工作正常。非常感谢任何解释。

问题是您输入的 z 网格 z0 包含单个值 (1),而您想要的 z 网格 Z 包含多个值。因此无法将此单个值插入多个值。

您可以为输入 z 网格分配多个值,以便可以进行插值。

I = im2double(imread('cameraman.tif'));
I = cat(3,I,I,I);
i = 10;
x = linspace(-1,1,size(I,1));
[x0,y0,z0] = meshgrid(x,x,-1:1); % 3 z values
R = [1 0 0; 0 cosd(-i) -sind(-i); 0 sind(-i) cosd(-i)];
xy = [x0(:),y0(:), z0(:)]*R;
X = reshape(xy(:,1),size(x0));
Y = reshape(xy(:,2),size(y0));
Z = reshape(xy(:,3),size(z0));
rotatedI = interp3(x0,y0,z0,I,X,Y,Z, 'nearest');
rotatedI(isnan(rotatedI)) = 0;
imshow(rotatedI);

此外,您可以使用rotxrotyrotz轻松生成旋转矩阵。

更新

如果你想在 3D 中旋转图像 2D 平面space你不需要使用插值,可以做类似的事情:

I = im2double(imread('cameraman.tif'));
i = 10;
x = linspace(-1,1,size(I,1));
[x0,y0,z0] = meshgrid(x,x,-1:1); % 3 z values
[x0,y0,z0] = meshgrid(x,x,1); % 3 z values
R = [1 0 0; 0 cosd(-i) -sind(-i); 0 sind(-i) cosd(-i)];
xy = [x0(:),y0(:), z0(:)]*R;
X = reshape(xy(:,1),size(x0));
Y = reshape(xy(:,2),size(y0));
Z = reshape(xy(:,3),size(z0));
warp(X,Y,Z,I);
grid on