c ++图像数组类型

时间:2012-10-10 02:31:30

标签: c++ image casting

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

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);

然后我可以通过类型转换获得像素的“真实”值。 I.E.为了获得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;
  }
}

这显然是丑陋而且不够灵活。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分: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. cfitsio库有一个C ++ CCfits替代方案,可能更适合您。
  3. Boost::GIL等库可以实现很多图像处理算法。它们主要基于模板,提供完整的功能和良好的学习材料。