2017-04-22 339 views
1

我想在Matlab xyz三维空间中旋转2D图像。我想旋转图像围绕x轴角度θ= i。我用旋转矩阵(定义here)乘法的方式这样做:三维图像旋转(Matlab)

这是我的代码:

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. 

那么究竟是什么问题,我该如何解决?

我很困惑,因为这个代码工作很好,当专门到两个维度。任何解释都非常感谢。

回答

0

问题是您的输入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); 

enter image description here

此外,你可以使用rotxroty,并rotz,容易产生旋转矩阵。

UPDATE

,如果你想在3D空间中旋转图像二维平面上,你并不需要使用插值,可以这样做:

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 

enter image description here

+0

谢谢你非常。但是由此产生的图像叠加在原始图像上。它并不真正在三维世界坐标中旋转。通过在Matlab的FEX上将代码与'image3'结合使用可以以某种方式实现这一点?到目前为止,这是图像的样子:https://i.stack.imgur.com/MDi9m.jpg – Ciprian

+0

用'interp3'旋转的2D图像的z尺寸实际上是**颜色**尺寸(RGB) ,因此结果看起来像是“叠加”的图像。如果您想在3D空间中旋转图像2D平面,您可以查看我的编辑 – user2999345

+0

谢谢。这很有道理。最后一个问题:当前代码将图像旋转到其边缘。是否有一个简单的修改,可以使图像围绕其中心点旋转?或者我们需要通过移动它们来手动对图像进行居中?例如,对于0°和90°,图像的中心不重合:https://i.stack.imgur.com/MM55y.jpg – Ciprian