gpt4 book ai didi

c - 从数组数据中获取平面切片

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:34 25 4
gpt4 key购买 nike

大家好

我将 3d 网格数据(来自多个 TIF 图像)读入结构如下:

typedef struct VolumeData{
int nx;
int ny;
int nz;
unsigned char *data; // size is nx*ny*nz
}

现在我想从这个一维网格数据中获取平面切片:

例如:

unsigned char* getXYPlaneStack(VolumeData *vol,int z); 

I could implement above function because the *data array stores image stack.

但我很难在其他轴上实现:

unsigned char* getYZPlaneStack(VolumeData *vol,int x);

unsigned char* getXZPlaneStack(VolumeData *vol,int y);

有什么简单的算法吗?提前致谢。

最佳答案

第二个和第三个函数都对您的数据集进行重新采样(它们基本上是在新的引用中表达您的图像)。

所以他们必须重新组织数据:

  1. 为 YZ 创建一个大小为 ny*nz 的新数组,为 XZ 创建一个大小为 nx*nz 的新数组
  2. 用位于给定平面的数据填充数组
  3. 返回指向新分配数组的指针

(在这种情况下,调用者负责释放新分配的内存。)

YZ 平面的算法是:

// I assume this sorting order:
// Z ^ Slices are
// / stacked along
// / the Z axis
// +-------> X
// |
// |
// Y v

// Assumes your data is stored in row major order:
// +-------> X +---------> X
// slice 0: | 0 1 2 | slice 1: | 6 7 8 | etc.
// | 3 4 5 | | 9 10 11 |
// Y v Y v
// Assumes x is the column index, y the row index, z the slice index.
// For example, you want element #9:
// - col 0 -> x = 0
// - row 1 -> y = 1
// - slice 1 -> z = 1
// I suggest you rename nx, ny, nz into nbCols, nbRows, nbSlices to make
// things explicit
index computeIndex(VolumeData *vol, int x, int y, int z)
{
int nx = vol->nx, // nb cols
ny = vol->ny, // nb rows
nz = vol->nz; // nb slices
int index = nx*ny*z // size of one slice, multiplied by slice index
+ nx*y // size of one row (nb cols), multiplied by row index
+ x; // offset in row (column index)
return index;
}

unsigned char* getYZPlaneStack(VolumeData *vol,int x)
{
int nx = vol->nx, // nb rows
ny = vol->ny, // nb columns
nz = vol->nz; // nb slices
unsigned char *newData = new unsigned char[ny*nz];
// Depth is now along the X axis
// +-----> Z
// |
// |
// Y v
for(int y = 0; y < ny; ++y) // For each row
for(int z = 0; z < nz; ++z ) // For each column
{
int i = computeIndex(vol, x, y, z);
newData[nz*y+z] = vol->data[i];
}
return newData;
}

关于c - 从数组数据中获取平面切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3004181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com