0

这里那里,

我目前正在处理一个 C# 项目,我需要使用SimpleITK库创建一个片段,其中我的图像矩阵ArrayIn将与一个数字进行比较DoubleVar

然后,对于每个元素,如果 的值ArrayIn大于 DoubleVar 之一,则我的输出图像的相应元素ArrayOut将为 1。如果不是,则该元素将为 0。矩阵ArrayOut是二进制 Image ,带有 1 和 0。AArrayOut 的大小将与输入的大小相同。我需要使用该功能Getbufferasint16(),但我不能这样做。

以下代码是意图的一部分,但没有结果

uint8_t *buffer = (my image) ->GetBufferAsUInt16();
buffer[c + numComponents*(x+ xSize* (y*+ySize*z))];
4

1 回答 1

1

请找到这个关于如何在 C# 中从 SimpleITK 访问缓冲区的新示例: http ://www.itk.org/SimpleITKDoxygen/html/ImageGetBuffer_8cs-example.html

您需要使用Marshal类将非托管代码与 C# 数据安全地接口,或使用不安全块:

  input = SimpleITK.Cast(input, PixelId.sitkFloat32);
  // calculate the nubmer of pixels
  VectorUInt32 size = input.GetSize();
  int len = 1;
  for (int dim = 0; dim < input.GetDimension(); dim++) {
    len *= (int)size[dim];
  }
  IntPtr buffer = input.GetBufferAsFloat();
  // There are two ways to access the buffer:
  // (1) Access the underlying buffer as a pointer in an "unsafe" block
  // (note that in C# "unsafe" simply means that the compiler can not
  // perform full type checking), and requires the -unsafe compiler flag
  unsafe {
    float* bufferPtr = (float*)buffer.ToPointer();
    // Now the byte pointer can be accessed as per Brad's email
    // (of course this example is only a 2d single channel image):
    // This is a 1-D array but can be access as a 3-D. Given an
    // image of size [xS,yS,zS], you can access the image at
    // index [x,y,z] as you wish by image[x+y*xS+z*xS*yS],
    // so x is the fastest axis and z is the slowest.
    for (int j = 0; j < size[1]; j++) {
      for (int i = 0; i < size[0]; i++) {
        float pixel = bufferPtr[i + j*size[1]];
        // Do something with pixel here
      }
    }
  }
  // (2) Copy the buffer to a "safe" array (i.e. a fully typed array)
  // (note that this means memory is duplicated)
  float[] bufferAsArray = new float[len]; // Allocates new memory the size of input
  Marshal.Copy(buffer, bufferAsArray, 0, len);
  double total = 0.0;
  for (int j = 0; j < size[1]; j++) {
    for (int i = 0; i < size[0]; i++) {
      float pixel = bufferAsArray[i + j*size[1]];
      total += pixel;
    }
  }
于 2014-01-28T00:07:15.583 回答