c++;图像数组类型 我正在使用C++进行FIT图像处理。此格式可以保存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);

c++;图像数组类型 我正在使用C++进行FIT图像处理。此格式可以保存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);,c++,image,casting,C++,Image,Casting,然后我可以通过类型转换获得像素的“真”值。即,要获得32位整数的第I个像素值,我将执行以下操作: int32_t pixelValue = ((int32_t*) lArray)[i]; 我想知道处理这个问题的最简洁的方法是什么,因为我不知道在编写代码时像素的类型是什么 我现在做的是这样的: switch(bytepix){ case 1:{ int8_t *vecVal = ((int8_t*) array ); } break; case 2

然后我可以通过类型转换获得像素的“真”值。即,要获得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;
  }
}
开关(bytepix){
案例1:{
int8_t*向量=((int8_t*)数组);
}
打破
案例2:{
int16_t*向量=((int16_t*)数组);
}
打破
案例4:{
int32_t*向量=((int32_t*)数组);
}
打破
案例8:{
int64_t*vecVal=((int64_t*)数组);
}
打破
违约:

CUT

你所要做的就是泛型编程。它是一个基本的概念,它分割算法和它所操作的类型。它在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;
...
模板
void ProcessImage(像素*数组,常量int arr_长度){
...
}
然后用相应的像素大小来调用它:

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:
ProcessImage(重新解释投射(数组),排列长度);
打破
案例2:
ProcessImage(重新解释投射(数组),排列长度);
打破
...
有几点想法:

  • 你使用C++,但是写C风格代码。我建议你熟悉C++ STL、容器和算法,它们正是图像处理所需要的。
  • <> LI>对于Cfsisio库有一个C++替代方案,它可能更适合你。
  • 像这样的库实现了很多图像处理算法。它们大量基于模板,提供了完整的功能和良好的学习材料

  • 你所要做的就是泛型编程。它是一个基本的概念,它分割算法和它所运行的类型。它在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;
    ...
    
    模板
    void ProcessImage(像素*数组,常量int arr_长度){
    ...
    }
    
    然后用相应的像素大小来调用它:

    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:
    ProcessImage(重新解释投射(数组),排列长度);
    打破
    案例2:
    ProcessImage(重新解释投射(数组),排列长度);
    打破
    ...
    
    有几点想法:

  • 你使用C++,但是写C风格代码。我建议你熟悉C++ STL、容器和算法,它们正是图像处理所需要的。
  • <> LI>对于Cfsisio库有一个C++替代方案,它可能更适合你。
  • 像这样的库实现了很多图像处理算法。它们大量基于模板,提供了完整的功能和良好的学习材料