2

我正在使用 C++ 处理适合的图像。这种格式可以保存 8/16/32 位整数和 32/64 位浮点数组。像素大小(变量类型)由标头标志给出。当我使用 cfitsio 库 [http://heasarc.gsfc.nasa.gov/fitsio/] 读取其中一张图像时,我得到一个包含图像所有像素的 char 数组:

char* array = new char[npix*bytepix]; // bytepix is the number of bytes per pixel
fits_read_img(infptr, datatype, first, npix, &nulval, lArray, &anynul, &status);

然后我可以通过类型转换获得像素的“真实”值。IE 来获取 32 位整数的第 i 个像素的值,我会这样做:

int32_t pixelValue = ((int32_t*) lArray)[i];

我想知道一般来说最紧凑的处理方式是什么,因为我不知道编写代码时像素类型是什么。

我目前做的是这样的:

switch(bytepix){
    case 1:{
      int8_t *vecVal = ((int8_t*) array );
    }
      break;
    case 2:{
      int16_t *vecVal = ((int16_t*) array );
    }
      break;
    case 4:{
      int32_t *vecVal = ((int32_t*) array );
    }
      break;
    case 8:{
      int64_t *vecVal = ((int64_t*) array );
    }
      break;
    default:
      cout << "error\n";
      break;
  }
}

这显然是丑陋的,而且不是很灵活。

非常感谢你的帮助!

4

1 回答 1

0

您正在尝试做的事情称为泛型编程。这是一个基本概念,将算法和它所操作的类型分开。C++ 支持模板函数模板类,整个 C++ 标准模板库都基于它。

基本上,独立于 FITS 像素大小实现您的处理功能:

template<typename Pixel>
void ProcessImage(Pixel *array, const int arr_length) {
  ...
}

然后用相应的像素大小调用它:

...
case 1:
  ProcessImage<int8_t>(reinterpret_cast<int8_t *>(array), arr_length);
  break;
case 2:
  ProcessImage<int16_t>(reinterpret_cast<int16_t *>(array), arr_length);
  break;
...

几个想法:

  1. 您使用 C++,但编写 C 风格的代码。我建议你熟悉 C++ STL、容器和算法,它们正是图像处理所需要的。
  2. 有一个 C++ CCfits替代 cfitsio 库可能更适合您。
  3. Boost::GIL等库实现了很多图像处理算法。它们在很大程度上基于模板,并提供完整的功能和良好的学习材料。
于 2012-10-10T04:55:54.263 回答