天天看點

數字圖像處理學習——第八章 圖像壓縮 (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)

繼續閱讀