Refractor loading FITS so it can load RGB images
This commit is contained in:
+38
-73
@@ -159,90 +159,55 @@ bool loadFITS(QString path, ImageInfoData &info, RawImage **image, QImage *qimag
|
|||||||
{
|
{
|
||||||
int imgtype;
|
int imgtype;
|
||||||
int naxis;
|
int naxis;
|
||||||
long naxes[2];
|
long naxes[3];
|
||||||
fits_get_img_param(file, 2, &imgtype, &naxis, naxes, &status);
|
fits_get_img_param(file, 3, &imgtype, &naxis, naxes, &status);
|
||||||
|
|
||||||
if(naxis >= 2 && naxis <= 3 && status == 0)
|
if(naxis >= 2 && naxis <= 3 && status == 0)
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> bits8;
|
int cvtype;
|
||||||
std::vector<uint16_t> bits16;
|
int fitstype;
|
||||||
std::vector<uint32_t> bits32;
|
std::vector<cv::Mat> cvimg;
|
||||||
std::vector<float> bits32f;
|
|
||||||
long fpixel[3] = {1,1,1};
|
long fpixel[3] = {1,1,1};
|
||||||
|
switch(imgtype)
|
||||||
|
{
|
||||||
|
case BYTE_IMG:
|
||||||
|
cvtype = CV_8U;
|
||||||
|
fitstype = TBYTE;
|
||||||
|
break;
|
||||||
|
case SHORT_IMG:
|
||||||
|
cvtype = CV_16U;
|
||||||
|
fitstype = TUSHORT;
|
||||||
|
break;
|
||||||
|
case FLOAT_IMG:
|
||||||
|
cvtype = CV_32F;
|
||||||
|
fitstype = TFLOAT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
size_t size = naxes[0]*naxes[1];
|
size_t size = naxes[0]*naxes[1];
|
||||||
size_t w = naxes[0];
|
size_t w = naxes[0];
|
||||||
size_t h = naxes[1];
|
size_t h = naxes[1];
|
||||||
if(qimage)
|
|
||||||
*qimage = QImage(naxes[0], naxes[1], QImage::Format_Grayscale8);
|
|
||||||
|
|
||||||
info.append(StringPair(QObject::tr("Width"), QString::number(naxes[0])));
|
info.append(StringPair(QObject::tr("Width"), QString::number(naxes[0])));
|
||||||
info.append(StringPair(QObject::tr("Height"), QString::number(naxes[1])));
|
info.append(StringPair(QObject::tr("Height"), QString::number(naxes[1])));
|
||||||
|
|
||||||
switch(imgtype)
|
for (int i=1; i==1 || i<=naxes[2]; i++)
|
||||||
{
|
{
|
||||||
case BYTE_IMG:
|
cv::Mat tmp(h, w, cvtype);
|
||||||
bits8.resize(size);
|
fpixel[2] = i;
|
||||||
fits_read_pix(file, TBYTE, fpixel, size, NULL, &bits8[0], NULL, &status);
|
fits_read_pix(file, fitstype, fpixel, size, NULL, tmp.ptr(), NULL, &status);
|
||||||
if(status)break;
|
cvimg.push_back(tmp);
|
||||||
if(qimage)
|
}
|
||||||
{
|
|
||||||
for(size_t i=0; i<h; i++)
|
if(cvimg.size() == 1)
|
||||||
memcpy(qimage->scanLine(i), &bits8[i*w], w*sizeof(uint8_t));
|
{
|
||||||
}
|
*image = new RawImage(cvimg[0]);
|
||||||
if(image)
|
}
|
||||||
{
|
if(cvimg.size() == 3)
|
||||||
*image = new RawImage(naxes[0], naxes[1], RawImage::UINT8);
|
{
|
||||||
memcpy((*image)->data(), &bits8[0], sizeof(uint8_t)*h*w);
|
cv::Mat rgb;
|
||||||
}
|
cv::merge(cvimg, rgb);
|
||||||
break;
|
*image = new RawImage(rgb);
|
||||||
case SHORT_IMG:
|
|
||||||
bits16.resize(size);
|
|
||||||
fits_read_pix(file, TUSHORT, fpixel, size, NULL, &bits16[0], NULL, &status);
|
|
||||||
if(status)break;
|
|
||||||
if(qimage)
|
|
||||||
{
|
|
||||||
for(size_t i=0; i<h; i++)
|
|
||||||
{
|
|
||||||
uchar *scanline = qimage->scanLine(i);
|
|
||||||
for(size_t o=0;o<w;o++)
|
|
||||||
scanline[o] = bits16[i*w+o] >> 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(image)
|
|
||||||
{
|
|
||||||
*image = new RawImage(naxes[0], naxes[1], RawImage::UINT16);
|
|
||||||
memcpy((*image)->data(), &bits16[0], sizeof(uint16_t)*h*w);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case LONG_IMG:
|
|
||||||
/*bits32.resize(size);
|
|
||||||
fits_read_pix(file, TUINT, fpixel, size, NULL, &bits32[0], NULL, &status);
|
|
||||||
if(status)break;
|
|
||||||
if(qimage)
|
|
||||||
{
|
|
||||||
for(size_t i=0; i<h; i++)
|
|
||||||
{
|
|
||||||
uchar *scanline = qimage->scanLine(i);
|
|
||||||
for(size_t o=0;o<w;o++)
|
|
||||||
scanline[o] = bits32[i*w+o] >> 24;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(image)
|
|
||||||
{
|
|
||||||
*image = new RawImage(naxes[0], naxes[1], RawImage::FLOAT32);
|
|
||||||
memcpy((*image)->data(), &bits8[0], sizeof(uint32_t)*h*w);
|
|
||||||
}*/
|
|
||||||
break;
|
|
||||||
case FLOAT_IMG:
|
|
||||||
bits32f.resize(size);
|
|
||||||
fits_read_pix(file, TFLOAT, fpixel, size, NULL, &bits32f[0], NULL, &status);
|
|
||||||
if(status)break;
|
|
||||||
if(image)
|
|
||||||
{
|
|
||||||
*image = new RawImage(naxes[0], naxes[1], RawImage::FLOAT32);
|
|
||||||
memcpy((*image)->data(), &bits32f[0], sizeof(float)*h*w);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -287,13 +252,13 @@ void LoadRunable::run()
|
|||||||
if(m_file.endsWith(".CR2", Qt::CaseInsensitive))
|
if(m_file.endsWith(".CR2", Qt::CaseInsensitive))
|
||||||
{
|
{
|
||||||
timer.start();
|
timer.start();
|
||||||
loadRAW(m_file, info, &rawImage, &img);
|
loadRAW(m_file, info, &rawImage, nullptr);
|
||||||
raw = true;
|
raw = true;
|
||||||
qDebug() << "LoadRaw" << timer.elapsed();
|
qDebug() << "LoadRaw" << timer.elapsed();
|
||||||
}
|
}
|
||||||
else if(m_file.endsWith(".FIT", Qt::CaseInsensitive) || m_file.endsWith(".FITS", Qt::CaseInsensitive))
|
else if(m_file.endsWith(".FIT", Qt::CaseInsensitive) || m_file.endsWith(".FITS", Qt::CaseInsensitive))
|
||||||
{
|
{
|
||||||
loadFITS(m_file, info, &rawImage, &img);
|
loadFITS(m_file, info, &rawImage, nullptr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
+6
-11
@@ -55,6 +55,11 @@ RawImage::RawImage(int w, int h, ImgType type)
|
|||||||
m_img.create(h, w, Type2CV(type));
|
m_img.create(h, w, Type2CV(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RawImage::RawImage(cv::Mat &img)
|
||||||
|
{
|
||||||
|
m_img = img;
|
||||||
|
}
|
||||||
|
|
||||||
RawImage::RawImage(const RawImage &d)
|
RawImage::RawImage(const RawImage &d)
|
||||||
{
|
{
|
||||||
d.m_img.copyTo(m_img);
|
d.m_img.copyTo(m_img);
|
||||||
@@ -161,17 +166,7 @@ uint32_t RawImage::size() const
|
|||||||
|
|
||||||
RawImage::ImgType RawImage::type() const
|
RawImage::ImgType RawImage::type() const
|
||||||
{
|
{
|
||||||
switch(m_img.type())
|
return CV2Type(m_img.type());
|
||||||
{
|
|
||||||
case CV_8U:
|
|
||||||
return UINT8;
|
|
||||||
case CV_16U:
|
|
||||||
return UINT16;
|
|
||||||
case CV_32F:
|
|
||||||
return FLOAT32;
|
|
||||||
default:
|
|
||||||
return UNKNOWN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void* RawImage::data()
|
void* RawImage::data()
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ public:
|
|||||||
};
|
};
|
||||||
RawImage();
|
RawImage();
|
||||||
RawImage(int w, int h, ImgType type);
|
RawImage(int w, int h, ImgType type);
|
||||||
|
RawImage(cv::Mat &img);
|
||||||
RawImage(const RawImage &d);
|
RawImage(const RawImage &d);
|
||||||
bool imageStats(double *mean, double *stdDev, double *median, double *min, double *max) const;
|
bool imageStats(double *mean, double *stdDev, double *median, double *min, double *max) const;
|
||||||
void rect(int &x, int &y, int w, int h, std::vector<double> &r) const;
|
void rect(int &x, int &y, int w, int h, std::vector<double> &r) const;
|
||||||
|
|||||||
Reference in New Issue
Block a user