设某信源产生有五种符号u1、u2、u3、u4和u5,对应概率P1=04,P2=01,P3=P4=02,P5=01。
霍夫曼编码是变长编码,思路:对概率大的编的码字短,概率小的编的码字长,这样一来所编的总码长就小,这样编码效率就高。上面那样求是不对的,除非你这6个码字是等概率的,各占1/6。应该用对应的概率其对应得码长,再求和。
实际应用中
除采用定时清洗以消除误差扩散和采用缓冲存储以解决速率匹配以外,主要问题是解决小符号集合的统计匹配,例如黑(1)、白(0)传真信源的统计匹配,采用0和1不同长度游程组成扩大的符号集合信源。游程,指相同码元的长度(如二进码中连续的一串0或一串1的长度或个数)。
按照CCITT标准,需要统计2×1728种游程(长度),这样,实现时的存储量太大。事实上长游程的概率很小,故CCITT还规定:若l表示游程长度,则l=64q+r。
2 JPEG基本原理
JPEG对灰度图像的压缩处理过程如图1所示。JPEG对灰度图像的压缩处理过程主要包括:图像分割,离散余弦变换(DCT),量化(Quantization),“z”形排序(Zigzag Scan),差分脉冲编码调制(Differential Pulse CodeModulation,DPCM)对直流系数(Dc),行程长度编码(Run—kngth Encoding,RLE)对交流系数(Ac),霍夫曼(Hufman)编码等。
图像压缩过程如图1所示。
JPEG标准的特点是离散余弦变换,它可以将8×8图像的空间表达式转换为频率域,经二维DCT变换后,第零行零列是低频分量,其余为高频分量。
3.1 JPEG压缩模块设计
按照压缩流程,JPEG压缩实现可以划分为三个模块:DCT变换模块,主控模块,编码输出模块。压缩模块组成如图3所示:DCT变换模块:把输入其中的像素值进行DCT变换。主控模块:控制数据的读写并送入DCT变换模块,对变换后的数据进行量化,量化完后进行z扫描。编码输出模块:对经过扫描和量化的数据进行编码并输出。
3 压缩系统的构成和实现
图像压缩的过程:首先把图像分为8×8的块,然后进行二维DCT变换,变换之后的数据高频和低频分开;接着开始z扫描,z扫描是一个排序过程,它可以让高频和低频分量按照编码的需要排列;Z扫描之后的数据需要量化后才能编码,量化是使数据量减少达到压缩目的重要环节(量化表见表1);最后对扫描后的数据编码,低频分量用差分脉冲编码和低频霍夫曼编码,高频分量用行程长度编码。图像压缩系统的结构图如2所示,由数据流控制模块、外部存储器接口模块、存储待压缩数据RAM、JPEG压缩模块、压缩数据接收模块、数据发送模块组成:
1)数据流控制模块:控制数据流的方向。
2)外部存储器接口模块:提供SRAM的读写控制时序。
3)接收压缩数据模块:接收压缩模块发送来的数据并且通过读写SRAM控制模块存储到SRAM里面。
4)数据发送模块:产生和数传约定的时序并把压缩数据发出。
3.1 JPEG压缩模块设计
按照压缩流程,JPEG压缩实现可以划分为三个模块:DCT变换模块,主控模块,编码输出模块。压缩模块组成如图3所示:DCT变换模块:把输入其中的像素值进行DCT变换。主控模块:控制数据的读写并送入DCT变换模块,对变换后的数据进行量化,量化完后进行z扫描。编码输出模块:对经过扫描和量化的数据进行编码并输出。
3.2 编码模块实现细节
下面举例分别介绍对直流分量和交流分量不同的编码规则。
假设DC值为一l5,它的霍夫曼码字由AB两部分组成,A为其长度的霍夫曼编码,B为其数值的幅度。首先通过查找表查找其绝对值范围为4,即其值可以用一个四位的二进制数来表示;然后用查到的4在直流霍夫曼码表中查找相应的霍夫曼编码,其对应的霍夫曼编码为一个三位的二进制数101,那么这个DC系的编码为它值的长度对应的霍夫曼编码再加上其幅度。对于一15幅度为0000(最高位为符号位,0为负,1为正)。计算幅值的过程:在长度为4的范围有16个值,即从一l5到15,用4位二进制补码来表示为0001、0010、0011、0100、0101、0110、0111、1000、1000、1001、1010、1011、1100、1101、1110、1111。负数的幅值就是其绝对值的4位二进制表示的反码,反码等于补码减1,0000,0001,0010,0011,0100,0101,0110,0111,0111,1000,1001,1010,1011,1100,1101,1110,1111。这样DC值为一15的编码即为1010000。交流系数和直流系数相比多了零行程编码。零行程编码的步骤:按照扫描之后的顺序逐个检测交流系数,并用变量来记录零系数的个数,遇到非零系数时首先观察它和前一个非零系数之间有多少个零系数,如果超过了16个则对前16个零单独编码,在霍夫曼码表中有单独的ZRL代码对它编码,然后观察剩余零的个数是否超过16个,如果超过仍然执行上一步 *** 作,如果小于16则把剩余零的个数和非零交流系作为参数对应霍夫曼码表进行编码。
Huffman编码又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变[字长]编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据[字符]出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。
假设4个字符出现频次不同,具体如下:
上面那个例子可以按照上面的算法逻辑进行编码,得到的总长度为
70×1+3×3+20×3+37×2=213Mbit
给你一段程序,自己研究下吧!\x0d\\x0d\clc\x0d\clear\x0d\closeall;\x0d\%定义HufData/Len为全局变量的结构体\x0d\globalHufData;\x0d\globalLen\x0d\disp('计算机正在准备输出哈夫曼编码结果,请耐心等待');\x0d\%原始码字的灰度\x0d\a=imread('kidstif');\x0d\\x0d\%分区画出原始图像和灰度直方图\x0d\figure;\x0d\subplot(1,2,1)\x0d\imshow(a);\x0d\%取消坐标轴和边框\x0d\axisoff\x0d\boxoff\x0d\title('MATLAB自带图像','fontsize',13);\x0d\subplot(1,2,2);\x0d\axisoff\x0d\boxoff\x0d\imhist(a);\x0d\title('图像灰度直方图','fontsize',13);\x0d\%图像的灰度统计\x0d\GrayStatistics=imhist(a);\x0d\GrayStatistics=GrayStatistics';\x0d\GrayRatioo=GrayStatistics/sum(GrayStatistics);\x0d\GrayRatioNO=find(GrayRatioo~=0);\x0d\Len=length(GrayRatioNO);\x0d\%初始化灰度集,防止系统随即赋予其垃圾值\x0d\GrayRatio=ones(1,Len);\x0d\\x0d\fori=1:Len\x0d\GrayRatio(i)=GrayRatioo(i);\x0d\end\x0d\\x0d\GrayRatio=abs(sort(-GrayRatio));\x0d\%将图像灰度概率赋予结构体\x0d\fori=1:Len\x0d\HufData(i)value=GrayRatio(i);\x0d\end\x0d\\x0d\%哈夫曼编码/霍夫曼编码\x0d\HuffmanCode(Len);\x0d\%输出码字\x0d\\x0d\zippedHuffman=1;\x0d\fori=1:Len\x0d\tmpData=HufData(i)code;\x0d\str='';\x0d\forj=1:length(tmpData)\x0d\str=strcat(str,num2str(tmpData(j)));\x0d\zippedHuffman=zippedHuffman+1;\x0d\end\x0d\disp(strcat('a',num2str(i),'=',str))\x0d\end\x0d\i;\x0d\%计算计算机一共输出多少个哈夫曼编码/霍夫曼编码\x0d\zippedHuffman;\x0d\%计算在删去0灰度级压缩之前的原始图像字节容量\x0d\unzipped_delete=i8;\x0d\\x0d\%计算压缩比率\x0d\ratio_delete=zippedHuffman/unzipped_delete;\x0d\\x0d\%计算图像的压缩比率\x0d\ad=num2str(ratio_delete100);\x0d\str2=strcat(ad,'%');\x0d\disp(strcat('哈夫曼编码压缩比率','=',str2))\x0d\\x0d\%子程序:哈夫曼编码/霍夫曼编码函数HuffmanCodem\x0d\functionHuffmanCode(OriginSize)\x0d\globalHufData;\x0d\globalLen\x0d\fori=1:Len\x0d\%%霍夫曼编码树左边纪录为1\x0d\HufData(i)left=1;\x0d\%%霍夫曼编码树右边纪录为0\x0d\HufData(i)right=0;\x0d\%%输出码初始化为0\x0d\HufData(i)code=[];\x0d\%%排序列表初始化\x0d\SortList(i)symbol=i;\x0d\SortList(i)value=HufData(i)value;\x0d\end\x0d\%初始化原始消息数目\x0d\newsymbol=OriginSize;\x0d\forn=OriginSize:-1:2\x0d\%将N个消息进行排序\x0d\SortList=sortdata(SortList,n);\x0d\%将最后两个出现概率最小的消息合成一个消息\x0d\newsymbol=newsymbol+1;\x0d\HufData(newsymbol)value=SortList(n-1)value+SortList(n)value;\x0d\HufData(newsymbol)left=SortList(n-1)symbol;\x0d\HufData(newsymbol)right=SortList(n)symbol;\x0d\%将消息添加到列队的最后,为N-1个消息重新排序作好准备\x0d\SortList(n-1)symbol=newsymbol;\x0d\SortList(n-1)value=HufData(newsymbol)value;\x0d\end\x0d\%遍历霍夫曼树,获得霍夫曼编码/哈夫曼编码\x0d\visit(newsymbol,Len,[]);\x0d\end\x0d\\x0d\%子程序:冒泡排序法函数sortdatam\x0d\functionreData=sortdata(SortList,n)\x0d\%根据消息概率进行排序\x0d\fork=n:-1:2\x0d\forj=1:k-1\x0d\min=SortList(j)value;\x0d\sbl=SortList(j)symbol;\x0d\if(min<SortList(j+1)value)\x0d\SortList(j)value=SortList(j+1)value;\x0d\SortList(j+1)value=min;\x0d\SortList(j)symbol=SortList(j+1)symbol;\x0d\SortList(j+1)symbol=sbl;\x0d\end\x0d\end\x0d\end\x0d\reData=SortList;\x0d\end\x0d\\x0d\%子程序:遍历哈夫曼编码/霍夫曼编码树搜索函数visitm\x0d\functionvisit(node,n,ocode)\x0d\globalHufData\x0d\ifnode0)\x0d\%遍历左分支接点输出1,这里采用子函数嵌套调用\x0d\ocode1=[ocode1];\x0d\visit(HufData(node)left,n,ocode1);\x0d\end\x0d\if(HufData(node)right>0)\x0d\%遍历右分支接点输出0,这里采用子函数嵌套调用\x0d\ocode2=[ocode0];\x0d\visit(HufData(node)right,n,ocode2);\x0d\end\x0d\end\x0d\end
以上就是关于哈夫曼编码码长怎么算全部的内容,包括:哈夫曼编码码长怎么算、急求助 用matlab对一幅图像进行算数编码 RLE编码 霍夫曼编码 香农编码编程 急求、哈夫曼编码(Huffman编码)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)