gpt4 book ai didi

matlab - 如何通过围绕其中心元素旋转一维数字向量来创建二维图像?

转载 作者:行者123 更新时间:2023-12-02 21:01:56 25 4
gpt4 key购买 nike

我有一个一维数字向量,它表示圆形对称物体的中心切割。向量本身围绕其中心元素对称。我想在 MATLAB 中通过围绕其中心元素旋转 1D 向量来创建原始对象的 2D 图像。

我尝试了以下代码(使用数字的虚拟原始向量),但是从生成的 2D 图像中获得的中心剪切与原始 1D 向量不匹配,如果运行代码就可以看出。我将不胜感激任何帮助!!!

close all; clc    

my1D_vector=[ zeros(1,20) ones(1,15) zeros(1,20)]; % original vector

len=length(my1D_vector);
img=zeros(len, len);
thetaVec=0:0.1:179.9; % angles through which to rotate the original vector
numRotations=length(thetaVec);

% the coordinates of the original vector and the generated 2D image:
x=(1:len)-(floor(len/2)+1);
y=x;

[X,Y]=meshgrid(x,y);

for ind_rotations=1:numRotations
theta=pi/180*thetaVec(ind_rotations);
t_theta=X.*cos(theta)+Y.*sin(theta);
cutContrib=interp1(x , my1D_vector , t_theta(:),'linear');
img=img+reshape(cutContrib,len,len);
end
img=img/numRotations;

figure('name','original vector');plot(x,my1D_vector,'b.-')
figure('name','generated 2D image'); imagesc(x,y,img); colormap(gray) ;

figure('name','comparison between the original vector and a center cut from the generated 2D image');
plot(x,my1D_vector,'b.-')
hold on
plot(x,img(find(x==0),:),'m.-')
legend('original 1D vector','a center cut from the generated 2D image')

enter image description here

enter image description here

最佳答案

我没有遵循你的代码,但是这个怎么样:

V = [ zeros(1,20) ones(1,15) zeros(1,20)]; % Any symmetrical vector
n = floor(numel(V)/2);

r = [n:-1:0, 1:n]; % A vector of distance (measured in pixels) from the center of vector V to each element of V

% Now find the distance of each element of a square 2D matrix from it's centre. @(x,y)(sqrt(x.^2+y.^2)) is just the Euclidean distance function.
ri = bsxfun(@(x,y)(sqrt(x.^2+y.^2)),r,r');

% Now use those distance matrices to interpole V
img = interp1(r(1:n+1),V(1:n+1),ri);

% The corners will contain NaN because they are further than any point we had data for so we get rid of the NaNs
img(isnan(img)) = 0; % or instead of zero, whatever you want your background colour to be

因此,我不是对角度进行插值,而是对半径进行插值。因此,r 表示距 V 每个元素中心的距离的一维向量。 ri 表示距二维中心的距离,这些是我们要插值的值。然后我只使用 rV 的一半,因为它们是对称的。

之后您可能需要将所有 NaN 设置为 0,因为您无法对角进行插值,因为它们的半径大于最远点的半径V

使用我得到的绘图代码

enter image description here

enter image description here

蓝色和洋红色曲线完全重叠。


说明

假设您的向量 V 只是一个 1×5 向量。那么下图显示了 rri 将会是什么:

enter image description here

我没有在图表上标记它,但r'将是中间的列。现在从代码中我们可以得到

ri = bsxfun(@(x,y)(sqrt(x.^2+y.^2)),r,r');

根据图表r = [2,1,0,1,2]所以现在对于每个像素我们都有到中心的欧几里得距离,所以像素(1,1)正在移动为 sqrt(r(1).^2+r(1).^2) ,即 sqrt(2.^2+2.^2) ,即sqrt(8) 如图所示。

您还会注意到我已将角像素“变灰”。这些像素比我们拥有数据的任何点距离中心更远,因为我们数据的最大半径(距中心的距离)为 2sqrt(8) > sqrt(5) > 2 因此您无法对这些数据进行插值,您必须进行推断才能获取它们的值。 interp1 对于这些点返回 NaN

为什么插值有效?将每个像素的位置视为引用像素的中心。现在,在此图中,红色圆圈是旋转外部元素(即 r==2)时发生的情况,绿色圆圈是进一步旋转元素 1 (即 r==1 )。您会看到,当我们旋转这两个半径时,获得 sqrt(2) 距离的像素(蓝色箭头)位于这两个半径之间,因此我们必须在这两个像素之间插入该距离。

enter image description here

关于matlab - 如何通过围绕其中心元素旋转一维数字向量来创建二维图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37810095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com