0

我想使用行进四面体创建 .raw 体积医疗数据集的 3D 可视化器。

在 GPL 许可证上发现这个实现看起来不错,并且基于 Paul Bourke 的信息,但我不知道如何使用 .raw 文件,我发现人们将其加载为 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;




}

我不知道我是否应该:a)直接从 pValue 访问值 b)在将它们加载到 3D 纹理后访问它们

我不知道我应该如何索引 pVolume 以获得每个 x、y、z 的等值面强度。如果 pVolume 是一维数组。我知道 x,y 坐标是使用除法和模块从一维数组映射的,但是我将如何映射 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

我认为你在这里混淆了一些事情。OpenGL 不是图像处理库。这是一个光栅化 API。3D 纹理并不意味着您可以将数据加载到其中并被授予任意访问权限。您加载 3D 纹理以将它们映射到表面上,或在直接体积渲染中使用它们。

提取等值面超出了 OpenGL 的范围。

RAW 文件只是意味着没有标题,您必须先了解数据布局,然后才能对其进行处理。你得知道

  • 宽度
  • 高度
  • 深度
  • 每个值的字节然后可以在数据偏移处找到 x、y、z 处的值

    (宽*高*z + 宽*y + z)*(字节)

等值仅表示数据集的所有像素等于给定值。通常,您对低于和高于等值的每个像素相邻的像素感兴趣。为了有效地确定,首先确定每个像素的标量场的梯度。然后你沿着梯度测试相邻像素是否高于或低于等值。这里不涉及OpenGL!

于 2012-02-20T19:48:50.527 回答
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 回答