?? doublecode.h
字號:
#define MAX_HALF_PROBABILITY_SEAT 16//最大半概率點位置,大于此值就直接采用二進制編碼
#define PART_WIDTH1_HALF_PROBABILITY_SEAT 5//設置寬度表用
#define PART_WIDTH2_HALF_PROBABILITY_SEAT 13
#define PART_WIDTH3_HALF_PROBABILITY_SEAT 32
#define PART_WIDTH4_HALF_PROBABILITY_SEAT 56
#define PART_WIDTH5_HALF_PROBABILITY_SEAT 96
#define PART_WIDTH6_HALF_PROBABILITY_SEAT MAX_HALF_PROBABILITY_SEAT+1
#define MAX_0_NUMBER 20//當區間數大于等于16時,不用此編碼方法,改用自然二進制
/*
關于行尾大誤差數的編碼規則
概率模型: <1>各象素相互獨立,<2>每象素是大誤差的概率為 p
模型估計: 主要是估計 p 值,定初值為 1/8,每行編碼結束時累計象素數(PixN)與大誤差數(ErrN),p=ErrN/PixN
實際使用值為 DoubleN=(PixN*16)/ErrN 意義是每(DoubleN/16)象素中含有一個大誤差,
*16 目的是提高精度
二項分布的半概率點確定:
設某行尾累積待檢大誤差的象素數為 N, 已檢出大誤差數為 en, 半概率點位置在 K
K=(N*16+[DoubleN/4])/DoubleN
半概率點所在區寬度確定:
此寬度由半概率點 K 決定, 由于函數關系不好列出, 采用查表方法, 建立對應表.
編碼過程: <1> 由象素數 N 和概率倒數值 DoubleN, 求 K 值.
<2> 由 K 值求 Huffman編碼的寬度表.
<3> 檢測待編碼的大誤差象素數所處的區間, 并編出首碼(0...01)0的個數是區間號.以1比特表示上下區.
<4> 根據區間的位置與寬度, 編碼大誤差數在區間的精確位置, 采用Huffman編碼, 這是尾碼部分.
<5> 更新PixN、ErrN值.
補充: 構造不同項數的 Huffman 碼表, 概率是按大到小排隊的, 但相差并不大, 這個表在幾何分布的編碼中也可用.
HuffcodingBit[6][7]存放碼表, HuffcodingL[6][7]存放碼長, 大于等于8時用自然二進
*/
#define MAX_HALF_PROBABILITY_FAST_SEAT 128//最大半概率點位置,大于此值就直接采用二進制編碼
#define PART_WIDTH1_HALF_PROBABILITY_FAST_SEAT 3//設置寬度表用
#define PART_WIDTH2_HALF_PROBABILITY_FAST_SEAT 24
#define PART_WIDTH4_HALF_PROBABILITY_FAST_SEAT 64
#define PART_WIDTH8_HALF_PROBABILITY_FAST_SEAT MAX_HALF_PROBABILITY_FAST_SEAT+1
#define MAX_0_NUMBER 20//當區間數大于等于16時,不用此編碼方法,改用自然二進制
class CDoubleErrorNumberFastCoding
{
private:
int PixN,ErrN;
BYTE PartW[MAX_HALF_PROBABILITY_FAST_SEAT+1],PartBit[MAX_HALF_PROBABILITY_FAST_SEAT+1];//半概率點對應初始區間寬度表
public:
BOOL UsingBinaryCode;//用以控制是采用二項分布Huffman編碼(FALSE), 還是自然二進制編碼(TRUE).
//Info
int BitNumber;
CDoubleErrorNumberFastCoding();
void Reset();
void Init();
int/*返回編碼比持數*/ OneEncodePass(int Number/*總象素數*/,int ErrorN/*待編碼的大誤差數*/,LPBYTE lpCodeBit,int Bitcp);
int/*返回大誤差數*/ OneDecodePass(int Number/*總象素數*/,LPBYTE lpCodeBit/*碼流指針*/,int Bitcp/*碼流比特位*/,int &CodeL);
int ReturnZeroBitNumber(LPBYTE lpCodeStream,int CodeBitcp);
int GetFromBitStream(LPBYTE lpCodeStream,int CodeBitcp,int b);
};
/*
關于行尾大誤差游程的編碼規則
概率模型: <1>各象素相互獨立,<2>每象素是大誤差的概率為 p,<3> 0 游程長為l時的概率為p*(1-p)^l
模型估計: 主要是估計 p 值, 設象素數為 N, 大誤差數為 en, p=en/N, 每編碼一個大誤差en與N各減1,
幾何分布的半概率點確定:
編碼區間寬度的估算 K=(N*log2)/en, (log2可以轉化為兩個整數的比值),
當 K>8 時, K 取最小的大于K的2冪
編碼過程: <1> 由象素數 N 和大誤差數 en, 求 K 值.
<2> 檢測待編碼的大誤差游程所處的區間, 并編出首碼(0...01)0的個數是區間號.以1比特表示大誤差的符號.
<3> 根據區間的寬度, 編碼大誤差數在區間的精確位置, 采用Huffman編碼, 這是尾碼部分.
<4> 更新N、en值.
補充: 構造不同項數的 Huffman 碼表, 概率是按大到小排隊的, 但相差并不大, 這個表在幾何分布的編碼中也可用.
HuffcodingBit[8][8]存放碼表, HuffcodingL[8][8]存放碼長, 大于等于8時用自然二進
*/
#define MAX_HALF_PROBABILITY_FAST_WIDTH 32//最大半概率寬度,大于此值就直接采用二進制編碼
class CDoubleErrorRunFastCoding
{//只提供單游程編碼手段
public:
BOOL UsingBinaryCode;//用以控制是采用二項分布Huffman編碼(FALSE), 還是自然二進制編碼(TRUE).
//Info
int BitNumber;
CDoubleErrorRunFastCoding();
void Reset();
void Init();
int GetHalfProbabilityWidth(int Number,int ErrorN,int &Bitn);
int/*返回編碼比持數*/ OneEncodePass(int Number/*總象素數*/,int ErrorN/*待編碼的大誤差數*/,int RunL,LPBYTE lpCodeBit,int Bitcp);
int/*返回大誤游程*/ OneDecodePass(int Number/*總象素數*/,int ErrorN/*待編碼的大誤差數*/,LPBYTE lpCodeBit/*碼流指針*/,int Bitcp/*碼流比特位*/,int &CodeL);
int ReturnZeroBitNumber(LPBYTE lpCodeStream,int CodeBitcp);
int GetFromBitStream(LPBYTE lpCodeStream,int CodeBitcp,int b);
};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -