2012-10-10 73 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,它們實現了許多圖像處理算法。他們嚴格基於模板,並提供完整的功能和良好的學習資料。