图像统计编码演示程序的设计_毕业设计论文(编辑修改稿)内容摘要:

4)在合并运算时,概率大的符号用编码 0 表示,概率小的符号用编码 1 表示。 5)记录下概率为 1 处到当前信号源符号之间的 0, l 序 列,从而得到每个符号的编码。 ②算术编码中: 主程序调用 arithencode 函数对 symbol进行算术编码; 再调用 arithdecode 对算术编码进行解码。 算术编码不是将单个信源符号映射成一个码字,而是把整个信源表示为实数线上的 0 到 1 之间的一个区间,其长度等于该序列的概率。 再在该区间选择一个代表性的小数,转化成二进制作为实际的编码输出。 消息序列中的每个元素 第 6 页 共 19 页 都要缩短为一个区间。 消息序列中元素越多,所得到的区间就越小。 当区间变小时,就需要更多的数位来表示这个区间。 采用算术编码,每个符号的平均编码长度可以为小数。 系统方框图 ① Huffman 编码: ②算术编码: 开始 加载图像 将图像转换成无符号的 8 位整数 调用 Huffman 编码程 序进行压缩 调用 Huffman 解码程 序进行解码 结束 子程序:函数调用 显示图像,原始图像和经编码解码后的图像显示压缩比 第 7 页 共 19 页 各功能模块的主要实现程序 用 Matlab程序实现 Huffman 编码 clear X = imread(39。 39。 )。 %从 MAT 文件下载到工作空间 data = uint8(X)。 %将该图 片定义为无符号 8 为整数 [zipped, info] =huffencode(data)。 %调用 Huffman 编码程序进行压缩 unzipped = huffdecode(zipped, info)。 %调用 Huffman 解码程序进行解码 subplot(121)。 imshow(data)。 %显示原图像 subplot(122)。 imshow(unzipped)。 %显示经编码、解码后的图像 erms = pare(data( :),unzipped( :)) %计算两幅图,得均方根误差 cr = whos data unzipped zipped function [zipped, info] = huffencode(vector) %函数声明, huffencode 对输入矩阵 vector 进行Huffman 编码 %输入和输出都是 uint8 格式 if~isa(vector, 39。 uint839。 ) %若矩阵 vector 是给定类时,为真 error(39。 input argument must be a uint8 vector39。 )。 %跳出函数并显示信息 end [m ,n] = size(vector)。 %检查矩阵的阶数 vector = vector( :)39。 %将矩阵按列排列 f = frequency(vector)。 %计算各符号出现的概率 symbols = find(f~=0)。 %查找概率不为零符号的下标 f = f(symbols)。 第 8 页 共 19 页 [f, sortindex] = sort(f)。 %将符号按照出现的概率大小排列 symbols = symbols(sortindex)。 len = length(symbols)。 %求矩阵的长度 symbols_index = num2cell(1: len)。 %把数字数组变换为单元阵列 codeword_tmp = cell(len, 1)。 while length(f)1 %生成 Huffman 树,得到码字编码表 index1 = symbols_index{1}。 index2 = symbols_index{2}。 codeword_tmp(index1) = addnode(codeword_tmp(index1), uint8(0))。 codeword_tmp(index2) = addnode(codeword_tmp(index2), uint8(1))。 f = [sum(f(1:2)) f(3: end)]。 symbols_index = [{[index1,index2]} symbols_index(3:end)]。 [f, sortindex] = sort(f)。 %将各符号的概率列向重新排列 symbols_index = symbols_index(sortindex)。 end codeword = cell(256,1)。 %建立单元阵列 codeword(symbols) = codeword_tmp。 len = 0。 for index = 1:length(vector) %得到整个图像所有比特数 len = len + length(codeword{double(vector(index)) +1})。 end string = repmat(uint8(0),1,len)。 pointer = 1。 for index = 1:length(vector) %对输入图像所有比特数 code = codeword{double(vector(index)) +1}。 len = length(code)。 string(pointer+(0:len1)) = code。 pointer = pointer + len。 end len = length(string)。 pad = 8mod(len, 8)。 %非 8 整数倍时,最后补 pad 个零 if pad0 string = [string uint8(zeros(1,pad))]。 end codeword = codeword(symbols)。 codelen = zeros(size(codeword))。 weights = 2.^(0:23)。 maxcodelen = 0。 for index = 1:length(codeword) len = length(codeword{index})。 if lenmaxcodelen maxcodelen = len。 end if len0 code = sum(weights(codeword{index} ==1))。 code = bitset(code,len+1)。 codeword{index} = code。 codelen(index) = len。 end 第 9 页 共 19 页 end codeword = [codeword{:}]。 %计算压缩后的向量 cols = length(string)/8。 %将字符串的长度除以 8,得到列数 string = reshape(string,8,cols)。 %对这个字符串阶数重组, 8 行, cols 列 weights = 2.^(0:7)。 zipped = uint8(weights*doub。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。