?? hyperspectralimagcode.h
字號(hào):
#include "wfun.h"
// 高光譜圖像編解碼器
/*
使用方法: 壓縮
1、加載高光譜數(shù)據(jù)。
a、支持三種形式的高光譜數(shù)據(jù)文件格式(BSQ_H、BIP_H、BIL_H)及各波段獨(dú)立文件格式。
b、從格式文件的頭部獲取數(shù)據(jù)各類參數(shù),獨(dú)立文件形式必須輸入壓縮所需格式信息。
c、配置預(yù)測(cè)波段。(配置信息來(lái)自預(yù)先的設(shè)定)
2、為各波段創(chuàng)建編碼器。
a、編碼器實(shí)際上是用來(lái)獨(dú)立保存各波段編碼的上下文信息(包括波段預(yù)測(cè)所需上下文)。
b、創(chuàng)建的同時(shí)要根據(jù)單波段相關(guān)參數(shù)及預(yù)測(cè)配置初始化編碼器。
3、為壓縮碼流準(zhǔn)備緩沖區(qū)及存放文件。(緩沖區(qū)大小取決于壓縮圖像塊的大小)
4、執(zhí)行壓縮循環(huán)
a、建立壓縮塊循環(huán)。
b、創(chuàng)建壓縮塊信息頭。
c、建立圖像行循環(huán)
d、建立波段循環(huán)
e、取某行某波段數(shù)據(jù)
f、用相應(yīng)的波段編碼器編碼該圖像行數(shù)據(jù),碼流匯入總碼流。
g、下一個(gè)波段。
h、下一個(gè)圖像行
i、導(dǎo)出壓縮塊碼流。
j、下一個(gè)壓縮圖像塊
5、釋放碼流及各波段編碼器緩沖區(qū)。
解壓縮
1、加載高光譜壓縮碼流。
a、從碼流中獲取高光譜數(shù)據(jù)文件格式(BSQ_H、BIP_H、BIL_H)及各波段獨(dú)立文件格式。
b、從碼流中獲取高光譜數(shù)據(jù)參數(shù)。
c、從碼流中獲取配置預(yù)測(cè)波段。
2、為高光譜圖像準(zhǔn)備緩沖區(qū)
3、為各波段創(chuàng)建編碼器。
a、解碼器實(shí)際上是用來(lái)獨(dú)立保存各波段編碼的上下文信息(包括波段預(yù)測(cè)所需上下文)。
b、創(chuàng)建的同時(shí)要根據(jù)單波段相關(guān)參數(shù)及預(yù)測(cè)配置初始化編碼器(在加載碼流時(shí)已獲得)。
4、執(zhí)行解壓縮循環(huán)
a、建立解壓縮塊循環(huán)。
b、獲取塊信息頭及塊長(zhǎng)度,同時(shí)也可獲得下一個(gè)塊碼流的位置
c、建立圖像行循環(huán)
d、建立波段循環(huán)
e、解壓縮某行某波段壓縮碼流
f、將解壓縮圖像及輔助數(shù)據(jù)存入到拽定位置。
g、下一個(gè)波段。
h、下一個(gè)圖像行
i、塊碼流指針指向下一個(gè)塊
j、下一個(gè)圖像塊碼流
5、釋放碼流及各波段編碼器緩沖區(qū)。
*/
#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. 輔助數(shù)據(jù)每行的個(gè)數(shù)
int ladHeight; // 輔助數(shù)據(jù)的行數(shù)
};
struct stAuxMsg
{
int iImageWidth; // 圖象寬度----每行的圖象象素?cái)?shù)
int iImageHeight; // 圖象高度----圖象的行數(shù)
int iImageBand; // 圖象的波段數(shù)
int iFlyingSpeed; // 飛機(jī)的飛行地速
int iFlyingAltitude; // 航高
int iScanSpeed; // 線掃描速率
int iBitPerPixel; //8bit or 12 bit 數(shù)據(jù)記錄的位數(shù)(每個(gè)象素的數(shù)據(jù)所占的數(shù)據(jù)位數(shù))
int iFOV; // 瞬時(shí)視場(chǎng)
stLineAuxData stLineAuxDataInfo; //輔助數(shù)據(jù)信息
int iDataStartPosition; // 文件中圖象數(shù)據(jù)的起始位置
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:
//基本數(shù)據(jù)格式
BYTE HyperspectralDataFormat;//高光譜數(shù)據(jù)格式
short int BandNumber;//波段數(shù)
short int Height;//單波段圖像總行數(shù)
short int Width;//單波段圖像每行象素?cái)?shù)
short int OnePixelBytes;//單波段圖像每象素字節(jié)數(shù)
short int OnePixelBits;//單波段圖像每象素比特?cái)?shù)
//高光譜數(shù)據(jù)格式
CMapFile HMF;//文件映射內(nèi)存
stAuxMsg *lpHead;
CString HFileName;
LPBYTE lpImageData;
int HImageWidth; // 圖象寬度----每行的圖象象素?cái)?shù)
int HImageHeight; // 圖象高度----圖象的行數(shù)
int HImageBand; // 圖象的波段數(shù)
int HBitPerPixel; //8bit or 12 bit 數(shù)據(jù)記錄的位數(shù)(每個(gè)象素的數(shù)據(jù)所占的數(shù)據(jù)位數(shù))
int HDataStartPosition; // 文件中圖象數(shù)據(jù)的起始位置
int HImageFormat; //format of image. 圖象文件格式
int OneLineAuxDataWidth;//in Pixel
//純圖像
LPBYTE *lpImageIndex;//各波段圖像地址表
CMapFile **lpIMF;//單波段文件映射內(nèi)存
//最小壓縮模塊
CAdvanceJepgLSOneLineCode **lpCompressUnit;
//碼流緩沖區(qū)
LPBYTE lpCodeStreamBuf,lpBlockHead;
int StreamBufLength;
//中間控制變量
short int AllowMaxError;//允許的最大誤差
short int LinesPerCompressBlock;//每塊圖像行數(shù)
//碼流文件
CString CompressFile;
CMapFile CMF;
//波段預(yù)測(cè)配置表
short int *lpPredictTable;
CHyperspectralImageCode();
~CHyperspectralImageCode();
//壓縮過(guò)程及公共過(guò)程
BOOL LoadHyperspectralImageFile(LPCTSTR pHFile,int OneLineImageAuxDataL);//OMIS相關(guān)圖像格式時(shí)
//純圖像格式時(shí),任何高光譜數(shù)據(jù)都可以先轉(zhuǎn)化為單波段純圖像格式再行壓縮.
BOOL LoadHyperspectralImageFile(LPCTSTR *lpIFileList,int BandN,int H,int W,int Bytes,int Bits);
//直接從原始數(shù)據(jù)中取得指針
LPBYTE GetOneLineImageData(int Band,int Line);
//從原始數(shù)據(jù)中取得數(shù)據(jù)裝入到指定緩沖
void GetOneLineImageData(LPBYTE lpOneLineBuf,int Band,int Line);
//從原始數(shù)據(jù)中取得每行輔助數(shù)據(jù)裝入到指定緩沖
int GetOneLineAuxData(LPBYTE lpOneLineBuf,int Band,int Line);
//為輸出碼流準(zhǔn)備緩沖
void PrepareCodeStreamBuf(int OneBlockLines,LPCTSTR CodeFileName,int AllowError=0);
void ClearCodeStreamBuf();
//根據(jù)波段數(shù)創(chuàng)建相應(yīng)數(shù)量的壓縮對(duì)象
void CreatCompressObject();
//從輸入的字符串中裝入
void LoadPredictTable(LPCTSTR lpAsc);
//創(chuàng)建高光譜數(shù)據(jù)壓縮信息頭,返回頭字節(jié)數(shù)
int CreatHyperspectralCompressHead(LPBYTE lpBuf,LPBYTE &lpAuxBuf,int &AuxBufL);
//創(chuàng)建高光譜數(shù)據(jù)塊壓縮信息頭,返回頭字節(jié)數(shù)
int CreatBlockCompressHead(LPBYTE lpBuf,int Maxerr,int LineBG,int LineN);
//執(zhí)行壓縮操作
void DoCompress(int AllowMaxErr,double *lpErrMsePerPixel=NULL,double *lpBitPerPixel=NULL);
void AppendDataToFile(void *lpBuf,int Bytes);//將數(shù)據(jù)附加到文件尾部
void WriteDataToFile(void *lpBuf,int Bytes);//寫數(shù)據(jù)到文件
void EndHyperspectralCode();//中止高光譜編碼器
//解壓縮過(guò)程
BOOL LoadCompressBitStream(LPCTSTR CompressFile);//加載壓縮碼流
int LoadBlockCompressHead(LPBYTE lpCodeStream,int &AllowMaxErr,int &LineBG,int &LineN);
//準(zhǔn)備壓縮圖像緩沖
BOOL PrepareConstructionImageBuf(LPCTSTR lpHyperspectralImageFile);
BOOL PrepareConstructionImageBuf(LPCTSTR *lpBandImageFile);
//設(shè)置一行重建圖像數(shù)據(jù)
void SetOneLineImageData(LPBYTE lpOneLineBuf,int Band,int Line);
//設(shè)置一行輔助數(shù)據(jù)
int SetOneLineAuxData(LPBYTE lpOneLineBuf,int Band,int Line);
//完成解壓縮全過(guò)程
void DoUnCompress();
};
//含預(yù)測(cè)的多波段圖像壓縮實(shí)例
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);
//含預(yù)測(cè)的多波段圖像解壓縮實(shí)例
BOOL HyperspectralImageUnCompress(LPCTSTR lpHyperspectralImageFile,
LPCTSTR CompressFile);
BOOL HyperspectralImageUnCompress(LPCTSTR *lpHyperspectralImageFile,
LPCTSTR CompressFile);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -