天天看点

数字图像处理学习——第八章 图像压缩 (2)

霍夫曼编码

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

           
数字图像处理学习——第八章 图像压缩 (2)

继续阅读