2

私はC++を使用してFITS画像を扱っています。この形式は、8/16/32ビットの整数と32/64ビットの浮動小数点配列を保持できます。ピクセルサイズ(変数タイプ)は、ヘッダーフラグによって指定されて含まれます。cfitsioライブラリ[http://heasarc.gsfc.nasa.gov/fitsio/]を使用してこの画像の1つを読み取ると、画像のすべてのピクセルを保持する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. cfitsioライブラリに代わるC++ CCfitsがあり、より適している可能性があります。
  3. 多くの画像処理アルゴリズムを実装するBoost::GILなどのライブラリがあります。これらはテンプレートに大きく基づいており、完全な機能と優れた学習教材の両方を提供します。
于 2012-10-10T04:55:54.263 に答える