Rendering del volume: come posso trasformare un file .raw in un'isosurface opengl-friendly?

StackOverflow https://stackoverflow.com/questions/9367227

Domanda

Voglio creare un visualizzatore 3D di set di dati medici di volume .raw usando tetrahedra in marcia.

ho trovato Questa attuazione sulla licenza GPL Sembra carino e si basa sulle informazioni di Paul Bourke, ma non so come lavorare con un file .raw, che ho trovato Le persone si caricano come una trama 3D.

//assuming that the data at hand is a 256x256x256 unsigned byte data
int XDIM=256, YDIM=256, ZDIM=256;
const int size = XDIM*YDIM*ZDIM;
bool LoadVolumeFromFile(const char* fileName) {

    FILE *pFile = fopen(fileName,"rb");
   if(NULL == pFile) {
    return false;
   }

   GLubyte* pVolume=new GLubyte[size]; //<- here pVolume is a 1D byte array 
   fread(pVolume,sizeof(GLubyte),size,pFile);
   fclose(pFile);

   // now pVolume is passed to a 3d texture 

    //load data into a 3D texture


glGenTextures(1, &textureID);
   glBindTexture(GL_TEXTURE_3D, textureID);

   // set the texture parameters
   glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
   glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
   glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
   glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

   glTexImage3D(GL_TEXTURE_3D,0,GL_INTENSITY,XDIM,YDIM,ZDIM,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,pVolume);
   delete [] pVolume;
   return true;




}

Non so se dovrei nemmeno: a) accedere ai valori direttamente da pValue b) Accedili dopo averli carichi a una trama 3D

Non ho idea di come dovrei indicizzare Pvolume per ottenere l'intensità dell'isosuperficie ad ogni x, y, z. Se Pvolume è un array 1D. So che le coordinate X, Y sono mappate da un array 1D usando una divisione e un modulo, ma come mappare x, y, z?

D'altra parte, se carico il file .raw come una trama 3D farebbe

GltexCoord3f

Dammi l'isovalo in una data x, y, z?

Chiarimento: la domanda non è "OpenGL può disegnare un'isosufficiente direttamente da questo?" La domanda è come indicizzare gli isolevi sulla geometria .raw, necessaria per valutare correttamente ciascun tetraedro. Sull'immagine si può vedere che ogni caso di tetraedro è contrassegnato in base al fatto che l'isosurfaccia sia al di sopra o sotto. L'isosurface è indicizzato sulle sue coordinate x, y, z sul file .raw, come posso accedervi per ogni x, y, z sul set di dati? GltexCoord3f mi darà la sua intensità su un dato x, y, z? È meglio fare direttamente la conversione di ascia, y, z dall'array pvolume?

enter image description here

È stato utile?

Soluzione

L'isosurface è indicizzato sulle sue coordinate x, y, z sul file .raw, come posso accedervi per ogni x, y, z sul set di dati?

Caricando l'immagine come un array 3D e indicizzandola. Non caricandolo come una trama OpenGL.

GltexCoord3f mi darà la sua intensità su un dato x, y, z?

No. AS la documentazione afferma, glTexCoord3f Fornisce semplicemente una serie di coordinate di trama al vertice successivo da emettere. Non restituisce nulla, non causa ancora nulla. Tutto ciò che fa è impostare lo stato all'interno di OpenGL.

È meglio fare direttamente la conversione di ascia, y, z dall'array pvolume?

Sì. Le informazioni in OpenGL dovrebbero generalmente viaggiare in una direzione: dall'utente allo schermo. Esistono funzioni OpenGL per alimentare le informazioni OpenGL che utilizzerà per rendere qualcosa. È così che OpenGL funziona meglio.

Qualsiasi tipo di back-tracking (leggere immagini alla CPU, ecc.) È un percorso lento.

Altri suggerimenti

Penso che tu stia confondendo alcune cose qui. OpenGL non è una libreria di elaborazione delle immagini. È un'API di rasterizer. Le trame 3D non sono intese come qualcosa su cui si carica i dati e ricevono un accesso arbitrario. Carichi le trame 3D per mapparle sulle superfici o utilizzarle nel rendering del volume diretto.

L'estrazione di isosuperfici è al di fuori dell'ambito di OpenGL.

File grezzo significa solo che non esiste un intestazione e devi conoscere il layout dei dati prima di poter fare qualcosa con esso. Devi sapere

  • larghezza
  • altezza
  • profondità
  • byte per valore Il valore / i su x, y, z può quindi essere trovato all'offset dei dati

    (larghezza*altezza*z + larghezza*y + z)*(byte)

Isovalue indica solo tutti i pixel del set di dati pari a un determinato valore. Normalmente sei interessato a pixel che sono vicini da ciascuno un pixel sotto e sopra Isovalue. Per una determinazione efficiente, determinare prima il gradiente del campo scalare per ciascun pixel. Quindi testare i pixel vicini lungo il gradiente se sono al di sopra o sotto l'isovalo. Nessun OpenGL coinvolto qui!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top