霍夫曼编码
mat2huff函数
function y = mat2huff( x )
%MAT2HUFF 编码了一个矩阵
% Y = MAT2HUFF(X) Huffman使用符号概率在单位宽度的直方图bins上编码了
%矩阵X ,范围在X 的最大值和最小值之间。被编码的数据作为结构体Y 被
%返回:
%Y.code X被Huffman编码的值,存储在一个uint16的向量里。Y 的其他
% 领域包括额外的解码信息,包括:
% Y.min X的最小值+32768
% Y.size X的大小
% Y.hist X的直方图
%可以作为输入的X的类型:logical, uint8,uint16,uint32,int8,int16
%或double.X的最小值必须被表示为int16
%
%如果X是一个非整数值的double类,例如一幅值在0,1之间
%的图像,在调用之前,首先将x缩放到适当的整数范围。例如,使用Y =
%MAT2HUFF(255*X)对256灰度级进行编码
%
%注意:Huffman编码单词的数目在round(max(X(:)))-
%rount(min(X(:))) +1之间。你可能需要缩放输入X
%以生成合理长度的代码。X的最大行列尺寸为65535.
if ndims(x) = 2 | ~isreal(x) | (~isnumeric(x) & islogical(x))
error('X must be a 2-D real numeric or logical matrix');
end
%存储输入x的大小
y.size = uint32(size(x));
%寻找x值的范围并存储他的最小值为unit16格式
x = round(double(x));
xmin = min(x(:));
xmax = max(x(:));
pmin = double(int16(xmin));
pmin = uint16(pmin + 32768); y.min = pmin;
%计算从xmin到xmax的输入直方图,单位宽度为unit,扩展到UINT16,并存储
x = x(:)';
h = histc(x,xmin:max);
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 = char(hx)'; %转换为字符数组
hx = hx(:)';
hx(hx == ' ') = []; %移除空格
ysize = ceil(length(hx) / 16); %计算编码大小
hx16 = repmat('0', 1, ysize * 16); %预分配模-16 向量
hx(1:length(hx)) = hx; %make hx modulo-16 in length
hx16 = reshape(hx16, 16,ysize); %重塑为16字节的词
hx16 = hx16' - '0'; %将二进制字符串转换为十进制
twos = pow2(15:-1:0);
y.code = uint16(sum(hx16 .*twos(ones(ysize, 1), :), 2))';
end