【问题标题】:create 3D image from coordinates and intensity values从坐标和强度值创建 3D 图像
【发布时间】:2012-06-25 21:31:37
【问题描述】:

我正在尝试创建一个大小为 1000x1000x1000 且所有元素(对应于体素)为零的 3D 数组,然后将 2000 到 2001 范围内的随机值而不是 0 分配给数组中的某些特定元素,最后存储它是一个二进制文件。

名为“coord”的数组是点的 Nx3 矩阵坐标 (x,y,z),我需要为它们分配 3D 数组中的随机值。))

我应该提到坐标矩阵的所有 x,y,z 值都是浮点数:0

我的目标是以二进制格式(MATLAB 的默认二进制格式除外)导出 3D 矩阵,以便我可以将其与其他程序一起使用。 到目前为止,这是我所做的:

load coord;
a=coord(:,1);
b=coord(:,2);
c=coord(:,3);
d=rand(1000,1)*2000;
dd = 0:2:1000;
[xq,yq,zq] = meshgrid(dd,dd,dd);
vq = griddata3(a,b,c,d,xq,yq,zq,'nearest');
h=figure;
plot3(a,b,c,'ro')
%=========================================%
fid=fopen('data.bin','w');
fwrite(fid,vq,'single');
fclose(fid);

在上面的代码中,a、b 和 c 是每个点的坐标,d 是所需范围的相应强度值。虽然可以创建 3D 网格(使用 meshgrid)然后插入网格点的强度值(使用 griddata3),但最终结果 (vq) 不会是实际点 (ai,bi,ci) 和相应的强度,而是一组对可视化非常有用的插值点(例如,如果您想拟合适合实际数据的 3D 表面)。 我只是想找到一种将实际数据点及其强度存储到文件中并将其导出的方法。 非常感谢任何帮助。

【问题讨论】:

    标签: image matlab graphics 3d


    【解决方案1】:

    如果您想保存到允许导入可视化软件的文件,一系列 Tiff 文件很可能会很方便,即

    maxValue = 2000; % this is the maximum signal that can possibly occur
                     % according to your code
    
    for z = 1:size(vq,3)
       %# convert slice z to 16 bit
       currentSlice = vq(:,:,z);
       currentSlice = uint16(round(currentSlice/maxValue))
       %# save to file
       imwrite(currentSlice, sprintf('testImg_z%04i.tif',z),'tif');
    end
    

    请注意,如果您创建一个尺寸为 1000x1000x1000 的双精度数组,则需要 8GB 的​​连续 RAM。

    【讨论】:

    • 非常感谢您的快速回复。这对于导出数据和可视化来说无疑是一个好主意。但是,我在导出之前陷入了一步,即将正确的数据点写入文件。正如我所提到的,插值方法“计算”网格中的一些新点并为它们分配值(基于插值方法)。但是,我所追求的是写入实际数据及其强度值。
    【解决方案2】:

    怎么样:

    %# 3D array
    voxels = zeros([1000 1000 1000]);
    
    %# round points coordinates, and clamp to valid range [1,1000]
    load coords
    coords = round(coords);
    coords = min(max(coords,1),1000);
    
    %# convert to linear indices
    idx = sub2ind(size(voxels), coords(:,1), coords(:,2), coords(:,3));
    
    %# random values in the 2000 to 2001 range
    v = rand(size(idx)) + 2000;
    
    %# assign those values to the chosen points
    voxels(idx) = v;
    

    【讨论】:

    • 非常感谢 Amro。对于我的问题,这确实是一个很好的权衡。但是,我需要在数据文件中有浮点精度的坐标。否则,我也考虑过将它们四舍五入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    相关资源
    最近更新 更多