简体   繁体   中英

create 3D image from coordinates and intensity values

I am trying to create a 3D array of size 1000x1000x1000 with all the elements (corresponding to voxels) being zero and then assign a random value in the 2000 to 2001 range instead of 0 to some specific elements in the array and finally store it as a binary file.

The array named "coord" is the Nx3 matrix coordinates (x,y,z) of the points that I need them to be assigned the random value in the 3D array.))

I should mention that all the x,y,z values of the coordinate matrix are floating point numbers with: 0<=x<=1000 0<=y<=1000 0<=z<=1000

My aim is to export the 3D matrix in a binary format (other than MATLAB's default binary format) so that I can use it with other programs. Here is what I've been up to so far:

 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); 

In the above code a, b and c are the coordinates of each point and d is the corresponding intensity values for the desired range. While it is possible to create a 3D mesh (using meshgrid) and then interpolate the intensity values for mesh points (using griddata3), the final result (vq) would not be the actual points (ai,bi,ci) and corresponding intensities , but rather an interpolated set of points which is pretty useful for visualization purposes (for instance if you like to fit a 3D surface which fits through actual data). I am simply trying to find a way to store the actual data-points and their intensities into a file and export it. Any help is highly appreciated.

If you want to save to files that will allow importing into a visualization software, a series of Tiff files will most likely be convenient, ie

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

Note that if you create a double array of dimensions 1000x1000x1000, you'll need 8GB of contiguous RAM.

How about something like:

%# 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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM