📄 hyperspectralimagcode.h
字号:
#include "wfun.h"
// 高光谱图像编解码器
/*
使用方法: 压缩
1、加载高光谱数据。
a、支持三种形式的高光谱数据文件格式(BSQ_H、BIP_H、BIL_H)及各波段独立文件格式。
b、从格式文件的头部获取数据各类参数,独立文件形式必须输入压缩所需格式信息。
c、配置预测波段。(配置信息来自预先的设定)
2、为各波段创建编码器。
a、编码器实际上是用来独立保存各波段编码的上下文信息(包括波段预测所需上下文)。
b、创建的同时要根据单波段相关参数及预测配置初始化编码器。
3、为压缩码流准备缓冲区及存放文件。(缓冲区大小取决于压缩图像块的大小)
4、执行压缩循环
a、建立压缩块循环。
b、创建压缩块信息头。
c、建立图像行循环
d、建立波段循环
e、取某行某波段数据
f、用相应的波段编码器编码该图像行数据,码流汇入总码流。
g、下一个波段。
h、下一个图像行
i、导出压缩块码流。
j、下一个压缩图像块
5、释放码流及各波段编码器缓冲区。
解压缩
1、加载高光谱压缩码流。
a、从码流中获取高光谱数据文件格式(BSQ_H、BIP_H、BIL_H)及各波段独立文件格式。
b、从码流中获取高光谱数据参数。
c、从码流中获取配置预测波段。
2、为高光谱图像准备缓冲区
3、为各波段创建编码器。
a、解码器实际上是用来独立保存各波段编码的上下文信息(包括波段预测所需上下文)。
b、创建的同时要根据单波段相关参数及预测配置初始化编码器(在加载码流时已获得)。
4、执行解压缩循环
a、建立解压缩块循环。
b、获取块信息头及块长度,同时也可获得下一个块码流的位置
c、建立图像行循环
d、建立波段循环
e、解压缩某行某波段压缩码流
f、将解压缩图像及辅助数据存入到拽定位置。
g、下一个波段。
h、下一个图像行
i、块码流指针指向下一个块
j、下一个图像块码流
5、释放码流及各波段编码器缓冲区。
*/
#define BSQ_H 0
#define BIP_H 1
#define BIL_H 2
#define BFILE 3
#define MAXBANDNUMBER 512
#define MAXBITPERPIXEL 16
struct stLineAuxData
{
int ladWidth; //in BYTE. 辅助数据每行的个数
int ladHeight; // 辅助数据的行数
};
struct stAuxMsg
{
int iImageWidth; // 图象宽度----每行的图象象素数
int iImageHeight; // 图象高度----图象的行数
int iImageBand; // 图象的波段数
int iFlyingSpeed; // 飞机的飞行地速
int iFlyingAltitude; // 航高
int iScanSpeed; // 线扫描速率
int iBitPerPixel; //8bit or 12 bit 数据记录的位数(每个象素的数据所占的数据位数)
int iFOV; // 瞬时视场
stLineAuxData stLineAuxDataInfo; //辅助数据信息
int iDataStartPosition; // 文件中图象数据的起始位置
int iImageFormat; //format of image. 图象文件格式
int iReserved1; // 保留
int iReserved2; // 保留
int iReserved3; // 保留
int iReserved4; // 保留
int iReserved5; // 保留
int iReserved6; // 保留
int iReserved7; // 保留
int iReserved8; // 保留
int iReserved9; // 保留
BYTE byteUnknow[512-21*4];// 保留
};
class CAdvanceJepgLSOneLineCode;
class CHyperspectralImageCode
{
public:
//基本数据格式
BYTE HyperspectralDataFormat;//高光谱数据格式
short int BandNumber;//波段数
short int Height;//单波段图像总行数
short int Width;//单波段图像每行象素数
short int OnePixelBytes;//单波段图像每象素字节数
short int OnePixelBits;//单波段图像每象素比特数
//高光谱数据格式
CMapFile HMF;//文件映射内存
stAuxMsg *lpHead;
CString HFileName;
LPBYTE lpImageData;
int HImageWidth; // 图象宽度----每行的图象象素数
int HImageHeight; // 图象高度----图象的行数
int HImageBand; // 图象的波段数
int HBitPerPixel; //8bit or 12 bit 数据记录的位数(每个象素的数据所占的数据位数)
int HDataStartPosition; // 文件中图象数据的起始位置
int HImageFormat; //format of image. 图象文件格式
int OneLineAuxDataWidth;//in Pixel
//纯图像
LPBYTE *lpImageIndex;//各波段图像地址表
CMapFile **lpIMF;//单波段文件映射内存
//最小压缩模块
CAdvanceJepgLSOneLineCode **lpCompressUnit;
//码流缓冲区
LPBYTE lpCodeStreamBuf,lpBlockHead;
int StreamBufLength;
//中间控制变量
short int AllowMaxError;//允许的最大误差
short int LinesPerCompressBlock;//每块图像行数
//码流文件
CString CompressFile;
CMapFile CMF;
//波段预测配置表
short int *lpPredictTable;
CHyperspectralImageCode();
~CHyperspectralImageCode();
//压缩过程及公共过程
BOOL LoadHyperspectralImageFile(LPCTSTR pHFile,int OneLineImageAuxDataL);//OMIS相关图像格式时
//纯图像格式时,任何高光谱数据都可以先转化为单波段纯图像格式再行压缩.
BOOL LoadHyperspectralImageFile(LPCTSTR *lpIFileList,int BandN,int H,int W,int Bytes,int Bits);
//直接从原始数据中取得指针
LPBYTE GetOneLineImageData(int Band,int Line);
//从原始数据中取得数据装入到指定缓冲
void GetOneLineImageData(LPBYTE lpOneLineBuf,int Band,int Line);
//从原始数据中取得每行辅助数据装入到指定缓冲
int GetOneLineAuxData(LPBYTE lpOneLineBuf,int Band,int Line);
//为输出码流准备缓冲
void PrepareCodeStreamBuf(int OneBlockLines,LPCTSTR CodeFileName,int AllowError=0);
void ClearCodeStreamBuf();
//根据波段数创建相应数量的压缩对象
void CreatCompressObject();
//从输入的字符串中装入
void LoadPredictTable(LPCTSTR lpAsc);
//创建高光谱数据压缩信息头,返回头字节数
int CreatHyperspectralCompressHead(LPBYTE lpBuf,LPBYTE &lpAuxBuf,int &AuxBufL);
//创建高光谱数据块压缩信息头,返回头字节数
int CreatBlockCompressHead(LPBYTE lpBuf,int Maxerr,int LineBG,int LineN);
//执行压缩操作
void DoCompress(int AllowMaxErr,double *lpErrMsePerPixel=NULL,double *lpBitPerPixel=NULL);
void AppendDataToFile(void *lpBuf,int Bytes);//将数据附加到文件尾部
void WriteDataToFile(void *lpBuf,int Bytes);//写数据到文件
void EndHyperspectralCode();//中止高光谱编码器
//解压缩过程
BOOL LoadCompressBitStream(LPCTSTR CompressFile);//加载压缩码流
int LoadBlockCompressHead(LPBYTE lpCodeStream,int &AllowMaxErr,int &LineBG,int &LineN);
//准备压缩图像缓冲
BOOL PrepareConstructionImageBuf(LPCTSTR lpHyperspectralImageFile);
BOOL PrepareConstructionImageBuf(LPCTSTR *lpBandImageFile);
//设置一行重建图像数据
void SetOneLineImageData(LPBYTE lpOneLineBuf,int Band,int Line);
//设置一行辅助数据
int SetOneLineAuxData(LPBYTE lpOneLineBuf,int Band,int Line);
//完成解压缩全过程
void DoUnCompress();
};
//含预测的多波段图像压缩实例
BOOL HyperspectralImageCompress(LPCTSTR lpHyperspectralImageFile,
LPCTSTR lpPredictBandConfig,
LPCTSTR CompressFile,
int AllowMaxError,
int LinesPerBlock,
int OneLineImageAuxDataL,
double *lpErrMsePerPixel,
double *lpBitPerPixel);
BOOL HyperspectralImageCompress(LPCTSTR *lpHyperspectralImageFile,
LPCTSTR lpPredictBandConfig,
LPCTSTR CompressFile,
int BandNumber,
int Height,
int Width,
int BitsPerPixel,
int BytesPerPixel,
int AllowMaxError,
int LinesPerBlock,
double *lpErrMsePerPixel,
double *lpBitPerPixel);
//含预测的多波段图像解压缩实例
BOOL HyperspectralImageUnCompress(LPCTSTR lpHyperspectralImageFile,
LPCTSTR CompressFile);
BOOL HyperspectralImageUnCompress(LPCTSTR *lpHyperspectralImageFile,
LPCTSTR CompressFile);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -