Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 切片三维图像_C#_Math - Fatal编程技术网

C# 切片三维图像

C# 切片三维图像,c#,math,C#,Math,我正在尝试对图像的3d表示进行切片。已知以下因素: 尺寸X 维度的 尺寸Z 体素[] 体素[]是一组表示像素灰度的U像素 现在我需要在所有可能的方向上切割它。让我们说x,y或z 我有这方面的树实现,但它们有一个问题,它们不能处理不同的维度。(除get Z Slice外,此功能工作正常) 方法如下: private ushort[] GetZSlice(int z, ushort[] voxels, int DimensionX, int DimensionY) { var res

我正在尝试对图像的3d表示进行切片。已知以下因素:

  • 尺寸X
  • 维度的
  • 尺寸Z
  • 体素[]
体素[]是一组表示像素灰度的U像素

现在我需要在所有可能的方向上切割它。让我们说x,y或z

我有这方面的树实现,但它们有一个问题,它们不能处理不同的维度。(除get Z Slice外,此功能工作正常)

方法如下:

private ushort[] GetZSlice(int z, ushort[] voxels, int DimensionX, int DimensionY)
{
   var res = new ushort[DimensionX * DimensionY];
   for(int j = 0; j < DimensionY; j++)
   {
       for(int i = 0; i < DimensionX; i++)
       {
           res[j*DimensionX + i] = voxels[z*DimensionX*DimensionY + j*DimensionX + i];
       }
   }
   return res;
}
private ushort[]GetZSlice(int z,ushort[]voxels,int DimensionX,int DimensionY)
{
var res=新的ushort[DimensionX*DimensionY];
对于(int j=0;j
这个方法非常有效,它不符合我选择的尺寸

接下来的两种方法,以x或y作为深度,提出了一个更难的问题

private ushort[] GetYSlice(int y, ushort[] voxels, int DimensionX, int DimensionY, int DimensionZ)
{
    var res = new ushort[DimensionX * DimensionZ];
    for( int i = 0; i < DimensionX; i++)
    {
        for( int j = 0; j < DimensionX; j++)
        {
            res[j + i*DimensionX] = voxels[j * DimensionZ * DimensionY + Y*DimensionZ + i]
        }
    }
    return res;
}

private ushort[] GetXSlice(int x, ushort[voxels], int DimensionX, int DimensionY, int DimensionZ)
{
   var res = new short[DimensionY * DimensionZ];
   for(int i = 0; i < DimensionY; i++)
   {
       for(int j = 0; j < DimensionZ; j++)
       {
           res[j + i*DimensionZ] = voxels[i*DimensionY + j*DimensionZ*DimensionX + x]
       }
   }
   return res;
} 
private ushort[]GetYSlice(int y,ushort[]voxels,int DimensionX,int DimensionY,int DimensionZ)
{
var res=新的ushort[DimensionX*DimensionZ];
对于(int i=0;i

如何改进后两种方法,使其适用于不相等的维度?

为什么不使用基向量生成通用切片函数?这将远远不是代码管理

基本上,您得到了
U,V
轴,每个轴都映射到
X,Y
Z
。切片
W
是第三个未使用的轴。因此,您只需循环U、V并保持
W
不变。每个
U,V
都有一个基向量
(ux,uy,uz)
(vx,vy,vz)
,它描述了
x,y,z
坐标中的增量变化

我在C++中将其编码到我的LED立方体中

//---------------------------------------------------------------------------
类LED_立方体
{
公众:
int xs,ys,zs,***地图;
LED_cube(){xs=0;ys=0;zs=0;map=NULL;}
LED_cube(LED_cube&a){xs=0;ys=0;zs=0;map=NULL;*this=a;}
~LED_cube(){u free();}
LED_cube*运算符=(const LED_cube*a){*this=*a;返回this;}
LED_立方体*运算符=(常数LED_立方体&a);
void _free();
void resize(int_xs、int_ys、int_zs);
void cls(int col);//清除列为0x00BBGGRR的多维数据集
void sphere(int x0,int y0,int z0,int r,int col);//使用col 0x00BBGGRR绘制球面
void slice(char*uv,int slice,int col);//使用col 0x00BBGGRR绘制(XY,XZ,YZ)切片
void glDraw();//通过OpenGL将立方体渲染为0,0,0处的1x1x1立方体
};
//---------------------------------------------------------------------------
无效LED_立方体::切片(字符*uv,整数切片,整数列)
{
//从uv字符串中检测基向量
int-ux=0,uy=0,uz=0,us=0;
intvx=0,vy=0,vz=0,vs=0;
int x=切片,y=切片,z=切片,u,v,x0,y0,z0;
如果(uv[0]=='X'){X=0;ux=1;us=xs;}
如果(uv[0]='Y'){Y=0;uy=1;us=ys;}
如果(uv[0]='Z'){Z=0;uz=1;us=zs;}
如果(uv[1]=='X'){X=0;vx=1;vs=xs;}
如果(uv[1]='Y'){Y=0;vy=1;vs=ys;}
如果(uv[1]='Z'){Z=0;vz=1;vs=zs;}
//渲染切片

如果((x>=0)&&(x=0)&&&(y=0)&&&(z)非常感谢您,这对您帮助很大!