0

すべての要素 (ボクセルに対応) がゼロのサイズ 1000x1000x1000 の 3D 配列を作成し、配列内の特定の要素に 0 ではなく 2000 ~ 2001 の範囲のランダムな値を割り当て、最終的にそれをバイナリーファイル。

「coord」という名前の配列は、3D 配列でランダムな値を割り当てるために必要なポイントの Nx3 マトリックス座標 (x、y、z) です。))

座標マトリックスのすべての x、y、z 値は浮動小数点数であることに注意してください: 0<=x<=1000 0<=y<=1000 0<=z<=1000

私の目的は、3D 行列を (MATLAB の既定のバイナリ形式以外の) バイナリ形式でエクスポートして、他のプログラムで使用できるようにすることです。これまで私がやってきたことは次のとおりです。

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 は目的の範囲の対応する強度値です。(meshgrid を使用して) 3D メッシュを作成し、(griddata3 を使用して) メッシュ ポイントの強度値を補間することは可能ですが、最終結果 (vq) は実際のポイント (ai、bi、ci) および対応する強度ではありません。むしろ、視覚化の目的に非常に役立つ補間されたポイントのセットです (たとえば、実際のデータに適合する 3D サーフェスを適合させたい場合)。実際のデータポイントとその強度をファイルに保存してエクスポートする方法を見つけようとしています。どんな助けでも大歓迎です。

4

2 に答える 2

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が必要になることに注意してください。

于 2012-06-24T01:44:17.000 に答える
1

次のようなものはどうですか:

%# 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;
于 2012-06-24T07:07:30.990 に答える