0

マーチング四面体を使用して、.rawボリューム医療データセットの3Dビジュアライザーを作成したいと思います。

この実装はGPLライセンスで見栄えがよく、Paul Bourkeの情報に基づいていますが、3Dテクスチャとして読み込まれる.rawファイルを使用して作業する方法がわかりません。

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




}

次のいずれかを行う必要があるかどうかわかりません。a)pValueから直接値にアクセスするb)3Dテクスチャにロードした後に値にアクセスする

各x、y、zで等値面強度を取得するためにpVolumeにインデックスを付ける方法がわかりません。pVolumeが1D配列の場合。x、y座標が除算とモジュールを使用して1D配列からマップされることは知っていますが、x、y、zをどのようにマップしますか?

一方、.rawファイルを3Dテクスチャとしてロードすると、

glTexCoord3f

与えられたx、y、zでの等値を教えてください。

明確化:問題は、「OpenGLはこれから直接等値面を描画できるか」ではありません。問題は、各四面体を適切に評価するために必要な.rawジオメトリのアイソレベルにインデックスを付ける方法です。画像では、等値面がその上にあるか下にあるかに基づいて、各四面体のケースにマークが付けられていることがわかります。等値面は、.rawファイルのx、y、z座標でインデックス付けされますが、データセットのx、y、zごとにどのようにアクセスできますか?glTexCoord3fは、与えられたx、y、zでの強度を教えてくれますか?pVolume配列から直接ax、y、z変換を行う方が良いですか?

ここに画像の説明を入力してください

4

2 に答える 2

1

等値面は、.raw ファイルの x、y、z 座標でインデックス付けされています。データセットの x、y、z ごとにアクセスするにはどうすればよいですか?

画像を 3D 配列として読み込み、インデックスを付けます。OpenGL テクスチャとしてロードすることによってではありません。

glTexCoord3f は、指定された x、y、z でその強度を教えてくれますか?

いいえ。ドキュメントに記載されているように、glTexCoord3f発行される次の頂点に一連のテクスチャ座標を提供するだけです。何も返さず、まだ何も起こりません。OpenGL 内で状態を設定するだけです。

pVolume 配列から直接 ax,y,z 変換を行う方が良いですか?

はい。OpenGL の情報は通常、ユーザーから画面への一方向に移動する必要があります。何かをレンダリングするために使用する OpenGL 情報を供給するための OpenGL 関数が存在します。これが、OpenGL が最もうまく機能する方法です。

あらゆる種類のバックトラッキング (画像を CPU に読み戻すなど) は遅いパスです。

于 2012-02-20T20:27:30.343 に答える
1

ここでいくつかのことを混乱させていると思います。OpenGL は画像処理ライブラリではありません。ラスタライザー API です。3D テクスチャは、データをロードするものではなく、任意のアクセス権が与えられます。3D テクスチャをロードしてサーフェスにマップするか、ダイレクト ボリューム レンダリングで使用します。

等値面の抽出は、OpenGL の範囲外です。

RAW ファイルは、ヘッダーがないことを意味するだけであり、何かを行う前にデータ レイアウトを知る必要があります。知っておく必要があります

  • 身長
  • 深さ
  • 値あたりのバイト数 x、y、z の値は、データ オフセットで見つけることができます。

    (幅*高さ*z + 幅*y + z)*(バイト)

Isovalue は、データセットのすべてのピクセルが特定の値に等しいことを意味します。通常、等値の上下に 1 ピクセルずつ隣接するピクセルに関心があります。効率的に決定するには、まず各ピクセルのスカラー フィールドの勾配を決定します。次に、グラデーションに沿って隣接するピクセルが等値の上または下にあるかどうかをテストします。ここには OpenGL は関係ありません。

于 2012-02-20T19:48:50.527 に答える