2012-10-10 37 views
2

我正在使用C++来处理图像。这种格式可以保存8/16/32位整数和32/64位浮点数组。像素大小(可变类型)由标题标志给出。 当我读取使用cfitsio库[http://heasarc.gsfc.nasa.gov/fitsio/]我得到字符数组保持所述图像的所有像素此图像中的一个:C++图像阵列类型

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

这显然是丑陋的,而不是非常灵活。

非常感谢您的帮助!

回答

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,它们实现了许多图像处理算法。他们严格基于模板,并提供完整的功能和良好的学习资料。