XY 平面中 3D 数据的旋转(Matlab)
Rotation of 3D data in XY plane (Matlab)
我有一个 3D 数组,其中包含作为空间位置(x 和 y 坐标)函数的概率值。当我使用 imagesc 或 surf 绘制此数组时,我得到一个具有最大值的椭圆轮廓。我想围绕 XY 平面中最大概率点旋转数据,使 Y 轴平行于椭圆的长轴(我使用 regionprops 计算)。我不想使用 imrotate 或几何对象旋转来旋转图像或表面,因为我需要包含旋转数据的数组。如果我知道绕 Z 轴的旋转角度(通过 regionprops 获得),我怎么能做到这一点?
编辑:这是我用来围绕中心旋转矩阵的代码。然而,当我使用 surf 绘制结果时,我得到了最奇怪的结果...
% Translation and anti-translation matrix
translate = [1 0 0 -centroide(1); 0 1 0 -centroide(2); 0 0 1 0; 0 0 0 1];
anti_translate = [1 0 0 centroide(1); 0 1 0 centroide(2); 0 0 1 0; 0 0 0 1];
% Rotation matrix
rotate = [cosd(-orientation) -sind(-orientation) 0 0; sind(-orientation) cosd(-orientation) 0 0; 0 0 1 0; 0 0 0 1];
% Temporary cell array for data transformation
data_vector = cell(size(RCb,1),size(RCb,2),size(RCb,3));
% Cell array for transformed data storage
transformed_data = cell(size(RCb,3),1);
for i = 1:(size(RCb,3))
transformed_data{i} = zeros(3, size(RCb,1)*size(RCb,2));
end
for i = 1:size(RCb,3) % temporal dimension
for j = 1:size(RCb,2) % x dimension
for k = 1:size(RCb,1) % y dimension
% [x y z] vector
data_vector{k,j,i} = [j,k,RCb(k,j,i),1]';
% translation
data_vector{k,j,i} = translate*data_vector{k,j,i};
% rotation
data_vector{k,j,i} = rotate*data_vector{k,j,i};
% anti-translation
data_vector{k,j,i} = anti_translate*data_vector{k,j,i};
data_vector{k,j,i} = data_vector{k,j,i}(1:3);
transformed_data{i}(:,((j-1)*size(RCb,1)+k)) = data_vector{k,j,i};
end
end
end
%%%% Test %%%% : image at 100 ms
figure,
imagesc(transformed_data{100}(2,:),transformed_data{100}(1,:),transformed_data{100}(3,:));
我得到这张图片:
我做错了什么?
您是否尝试过 rotz
绕 z 轴旋转的旋转矩阵,请查看文档 here。
否则,您可以将矩阵与以下矩阵相乘 R
并旋转角度 γ :
注意,Matlab 中的函数cos
和sin
是基于弧度的。您可以使用学位 cosd
。
我有一个 3D 数组,其中包含作为空间位置(x 和 y 坐标)函数的概率值。当我使用 imagesc 或 surf 绘制此数组时,我得到一个具有最大值的椭圆轮廓。我想围绕 XY 平面中最大概率点旋转数据,使 Y 轴平行于椭圆的长轴(我使用 regionprops 计算)。我不想使用 imrotate 或几何对象旋转来旋转图像或表面,因为我需要包含旋转数据的数组。如果我知道绕 Z 轴的旋转角度(通过 regionprops 获得),我怎么能做到这一点?
编辑:这是我用来围绕中心旋转矩阵的代码。然而,当我使用 surf 绘制结果时,我得到了最奇怪的结果...
% Translation and anti-translation matrix
translate = [1 0 0 -centroide(1); 0 1 0 -centroide(2); 0 0 1 0; 0 0 0 1];
anti_translate = [1 0 0 centroide(1); 0 1 0 centroide(2); 0 0 1 0; 0 0 0 1];
% Rotation matrix
rotate = [cosd(-orientation) -sind(-orientation) 0 0; sind(-orientation) cosd(-orientation) 0 0; 0 0 1 0; 0 0 0 1];
% Temporary cell array for data transformation
data_vector = cell(size(RCb,1),size(RCb,2),size(RCb,3));
% Cell array for transformed data storage
transformed_data = cell(size(RCb,3),1);
for i = 1:(size(RCb,3))
transformed_data{i} = zeros(3, size(RCb,1)*size(RCb,2));
end
for i = 1:size(RCb,3) % temporal dimension
for j = 1:size(RCb,2) % x dimension
for k = 1:size(RCb,1) % y dimension
% [x y z] vector
data_vector{k,j,i} = [j,k,RCb(k,j,i),1]';
% translation
data_vector{k,j,i} = translate*data_vector{k,j,i};
% rotation
data_vector{k,j,i} = rotate*data_vector{k,j,i};
% anti-translation
data_vector{k,j,i} = anti_translate*data_vector{k,j,i};
data_vector{k,j,i} = data_vector{k,j,i}(1:3);
transformed_data{i}(:,((j-1)*size(RCb,1)+k)) = data_vector{k,j,i};
end
end
end
%%%% Test %%%% : image at 100 ms
figure,
imagesc(transformed_data{100}(2,:),transformed_data{100}(1,:),transformed_data{100}(3,:));
我得到这张图片:
我做错了什么?
您是否尝试过 rotz
绕 z 轴旋转的旋转矩阵,请查看文档 here。
否则,您可以将矩阵与以下矩阵相乘 R
并旋转角度 γ :
注意,Matlab 中的函数cos
和sin
是基于弧度的。您可以使用学位 cosd
。