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