%mat2huff源函数
function =mat2huff(x)
%mat2huff编码一个矩阵
%使用符号概率在最大值和最小值之间建立单位宽度直方图。
%编码数据返回一个结构y
%y:
%y.code x的Huffman编码值,储存在16比特向量。y的其他领域包括额外的解码信息,包括:
%y.min x的最小值加32768
%y.size x的大小
%y.hist x的直方图
%如果x是logical,uint8,uint16,uint32,int8,int16,或者double的整数值,可以直接输入到mat2muff中。
%x的最小值必须是int16.
%如果x是非整值的double。例如:一个图像的值在0和1之间,首先x的大小应该接近整数的范围。
%例如y=mat2huff(255*x)是256灰度级编码
%note:
%Huffman的编码数是round(max(x(:)))-round(min(x(:)))+1.输出x的产生合理的长度.x的行数和列数的最大维数和最小维数是65535.
if ndims(x)~=2 | ~isreal(x) | (~isnumeric) & ~islogical(x))
error('X must be a 2-D real numeric or logical matrix.');
end
%输入x的类型
y.size=uint32(size(x));
%找到x的范围并储存最小值+32768作为一个uint16.
x=round(double(x));
xmin=min(x(:));
xmax=max(x(:));
pmin=double(int16(xmin)); y.min=pmin;
%使用x的最小值和最大值之间之间的单位宽度bin计算x的直方图h,并缩放该直方图,以使其为uint16向量。
x=x(:)';
h=histc(x,xmin,xmax);
if max(h)>65535
h=65535*h/max(h);
end
h=uint16(h);y.hist=h;
%编码输入矩阵和储存结果
map=huffman(double(h));%做Huffman编码图
hx=map(x(:)-xmin+1);%产生单元数组
hx=hx(:)';%转成字符数组
hx(hx=='')=[];%删除空格符
ysize=ceil(length(hx)/16);%计算编码大小
hx16(1:length(hx))=hx;%分配模16向量
hx16=hx16'-'0';%在长度上做hx模16
twos=pow2(15:-1:0);%重建
y.code=uint16(sum(hx16.*twos(ones(ysize,1),:),2))';%转变二维字符串为十进制
mat2huff.m
最新推荐文章于 2023-05-12 22:19:44 发布
本文详细解析MATLAB脚本mat2huff.m,该脚本用于将矩阵数据转换为哈夫曼编码。主要内容包括哈夫曼编码的基本原理、mat2huff的实现过程以及使用示例,帮助读者理解如何利用MATLAB进行数据压缩。
摘要由CSDN通过智能技术生成