2017-01-08 244 views
1

我想知道如何使用Matlab R2016b沿Z轴旋转2D图像并在执行此过程后获取图像。在Matlab上将2D图像转换为旋转的3D图像

例如,让我们这个2D图像:

enter image description here

现在,我将其旋转45°大致为:

enter image description here

而现在,90°:

enter image description here

你知道是否可以在Matlab R2016b中执行相同的操作吗?

非常感谢您的帮助

图片来源:https://www.youtube.com/watch?v=m89mVexWQZ4

+1

是的,它是可能的。甚至有一个答案,并详细描述了如何在这个网站上做到这一点,但不幸的是,这个问题被搁置了。你的研究成果是什么?你有什么尝试? – beaker

+0

嗨,谢谢你的回答:)真可惜...这个答案现在已经非常有用了。我尝试使用投影变换,但它没有按预期工作。此外,我想通过Matlab中的投影变换检索不可能的旋转角度。我能做什么 ? –

+1

对于如何解决这个*如果没有* 3-D绘图,并改为使用图像转换,请参阅[这个问题](https://stackoverflow.com/q/47273993/52738) – gnovice

回答

4

是的,它是可能的。最简单的做法是将图像以3D形式映射到y = 0平面上,然后将摄像机旋转到所需的方位角或相对于轴的角度。一旦你这样做了,你可以使用getframe/cdata成语来实际捕获变量本身的实际图像数据。之所以这样做,是因为我将用于显示图像的方法是通过surf命令绘制3D曲面图,但这里的轴是进出轴的轴的屏幕。轴x轴是水平轴,当显示数据时轴将是垂直轴。

首先使用诸如imread之类的东西读取图像,然后您需要定义映射到3D平面的图像的4个角,然后旋转相机。您可以使用view功能帮助您通过调整方位角(第一个参数)并将仰角保持为0来旋转摄像头。

类似这样的东西可以起作用。我将使用辣椒形象,是图像处理工具箱的一部分:

im = imread('peppers.png'); % Read in the image 
ang = 45; % Rotate clockwise by 45 degrees 

% Define 4 corners of the image 
X = [-0.5 0.5; -0.5 0.5]; 
Y = [0 0; 0 0]; 
Z = [0.5 0.5; -0.5 -0.5]; 

% Place the image on the y = 0 plane 
% Turn off the axis and rotate the camera 
figure; 
surf(X, Y, Z, 'CData', im, 'FaceColor', 'texturemap'); 
axis('off'); 
view(ang, 0); 

% Get the image data after rotation 
h = getframe; 
rot_im = h.cdata; 

rot_im包含旋转图像。为了欣赏图像的旋转,我们可以实时循环0到360度的角度。在每个角度,我们可以使用view动态旋转相机并使用drawnow来更新数字。我还更新了该图的标题,以向您展示每次更新时的角度。造成这种情况的代码如下以及保存为GIF动画输出:

for ang = 0 : 360 
    view(ang, 0); 
    pause(0.01); 
    drawnow; 
    title(sprintf('Angle: %d degrees', ang)); 
end