maak een 3D-beeld van coördinaten en intensiteitswaarden

Ik probeer een 3D-array met een grootte van 1000x1000x1000 te maken met alle elementen (corresponderend met voxels) die nul zijn en vervolgens een willekeurige waarde in het bereik van 2000 tot 2001 in plaats van 0 toe te wijzen aan bepaalde specifieke elementen in de array en deze uiteindelijk op te slaan als een binair bestand.

De array met de naam "coord" is de Nx3 matrixcoördinaten (x, y, z) van de punten waarvoor ik ze nodig heb om de willekeurige waarde in de 3D-array te krijgen.))

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

Mijn doel is om de 3D-matrix te exporteren in een binair formaat (anders dan het standaard binaire formaat van MATLAB), zodat ik het kan gebruiken met andere programma's. Dit is wat ik tot nu toe heb gedaan:

  laadcoördinatie;
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, 'dichstbijzijnde');
h = figuur;
Plot3 (a, b, c, 'ro')
% =========================================%
fid = fopen ( 'data.bin', 'w');
fwrite (fid, vq, 'single');
fclose (fid);
 

In de bovenstaande code zijn a, b en c de coördinaten van elk punt en d is de overeenkomstige intensiteitswaarde voor het gewenste bereik. Hoewel het mogelijk is om een ​​3D-net te maken (met meshgrid) en vervolgens de intensiteitswaarden voor mesh-punten te interpoleren (met behulp van griddata3), zouden het eindresultaat (vq) niet de werkelijke punten (ai, bi, ci) en overeenkomstige intensiteiten zijn, maar eerder een geïnterpoleerde set van punten die vrij nuttig is voor visualisatiedoeleinden (bijvoorbeeld als je een 3D-oppervlak wilt passen dat past in de werkelijke gegevens). Ik probeer simpelweg een manier te vinden om de feitelijke datapunten en hun intensiteiten op te slaan in een bestand en het te exporteren. Alle hulp wordt zeer op prijs gesteld.

0

2 antwoord

Wat dacht je van iets als:

%# 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;
1
toegevoegd
Heel erg bedankt Amro. Dit is inderdaad een goede afweging voor mijn probleem. Maar ik moet de coördinaten hebben met drijvende-komma-precisie in het gegevensbestand. Anders heb ik erover nagedacht ze ook af te ronden.
toegevoegd de auteur regex99, de bron

Als u bestanden wilt opslaan die kunnen worden geïmporteerd in een visualisatiesoftware, is een reeks Tiff-bestanden hoogstwaarschijnlijk handig, d.w.z.

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

Houd er rekening mee dat als u een dubbele array met dimensies van 1000 x 1000 x 1000 maakt, u 8 GB aaneengesloten RAM-geheugen nodig heeft.

1
toegevoegd
Heel erg bedankt voor je snelle antwoord. Dit is zeker een goed idee voor het exporteren van de gegevens en visualisatie. Ik zit echter in één stap vast voordat ik exporteer, met de juiste gegevenspunten in het bestand. Zoals ik al zei, "berekent" de interpolatiemethode enkele nieuwe punten in een raster en kent ze waarden toe (op basis van de interpolatiemethode). Maar wat ik zoek is in plaats daarvan de feitelijke gegevens en hun intensiteitswaarden schrijven.
toegevoegd de auteur regex99, de bron