📄 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
{
public:
int PixN,ErrN;
BYTE PartW[MAX_HALF_PROBABILITY_FAST_SEAT+1],PartBit[MAX_HALF_PROBABILITY_FAST_SEAT+1];//半概率点对应初始区间宽度表
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 + -