⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doublecode.h

📁 改进的JPEG-LS算法
💻 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 + -