?? 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 + -