Метод Getbuffer в библиотеках SimpleITK для чтения изображения и вывода другого

Здесь,

В настоящее время я работаю над проектом C#, и мне нужно создать фрагмент, используя SimpleITK библиотеки, в которых моя матрица изображений ArrayIn будет сравниваться с числом DoubleVar,

Тогда, если для каждого элемента значение ArrayIn больше, чем DoubleVar, соответствующий элемент моего выходного изображения ArrayOut будет 1. Если нет, то этот элемент будет 0. Матрица ArrayOut это двоичное изображение, с единицами и нулями. Размер AArrayOut будет таким же, как у входа. Мне нужно использовать функцию Getbufferasint16() но я не могу этого сделать.

Следующий код является частью намерений, но без результата

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

1 ответ

Решение

Пожалуйста, найдите этот новый пример того, как получить доступ к буферу из SimpleITK в C#: 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;
    }
  }
Другие вопросы по тегам