⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hyperspectralimagcode.h

📁 改进的JPEG-LS算法
💻 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 + -