基於霍夫曼圖像圖像壓縮重建 霍夫曼編碼,又稱為哈夫曼編碼、赫夫曼編碼,是一種用於無損數據壓縮的熵編碼(權編碼)算法。 基於小波變換的 RGB 圖像壓縮matlab代碼

最近在折騰圖像壓縮的時候,發現霍夫曼編碼和小波變換這對組合挺有意思。直接拿MATLAB試了試手,結果意外地好玩——雖然壓縮率不算頂尖,但整個流程特別適合用來理解原理。今天就跟大夥兒嘮嘮這個實操過程。

霍夫曼編碼説白了就是給高頻出現的像素值分配短碼,低頻的長碼。比如一張圖裏白色特別多,那就用"01"這種短二進制表示白色。而小波變換這貨厲害在能把圖像信息分層,高頻部分(細節)和低頻部分(輪廓)拆得明明白白。這倆一結合,壓縮效果就出來了。

【圖像壓縮】基於霍夫編碼、行程編碼、DCT、FFT、算術編碼、t預測編碼實現圖像壓縮附matlab代碼_壓縮率

先上主菜,看看怎麼用MATLAB整活:

% 讀取圖像並轉換顏色空間
orig_img = imread('peppers.png');
ycbcr_img = rgb2ycbcr(orig_img);

% 小波分解
[LL, LH, HL, HH] = dwt2(ycbcr_img(:,:,1), 'haar');

這裏先把RGB轉成YCbCr不是閒得慌。Y通道(亮度)人眼敏感,CbCr(色度)相對不敏感。後面的壓縮主要在Y通道搞事情,色度通道可以適當擺爛。小波分解用最基礎的haar小波,LL是低頻分量,剩下三個都是高頻細節。

接下來是重頭戲——量化。這個閾值我隨便設的,實際應用得調參:

% 量化高頻分量
quant_step = 15;
LH_q = round(LH/quant_step);
HL_q = round(HL/quant_step);
HH_q = round(HH/quant_step);

量化步長越大,數據越容易變成零,壓縮率越高但畫質撲街。這裏把高頻分量除以15再取整,原本0-255的像素值被壓縮到0-17左右。不過注意這個操作是有損的,這也是為什麼霍夫曼要放在後面——先做有損壓縮再做無損編碼。

霍夫曼編碼部分得統計符號頻率。MATLAB自帶的huffman函數不太友好,得自己折騰字典:

% 合併所有量化後的數據
all_data = [LL(:); LH_q(:); HL_q(:); HH_q(:)];

% 統計符號頻率
symbols = unique(all_data);
counts = histcounts(all_data, [symbols; max(symbols)+1]);
prob = counts/length(all_data);

% 生成霍夫曼字典
dict = huffmandict(symbols, prob);

% 編碼
compressed_data = huffmanenco(all_data, dict);

這裏有個坑:原始數據要是整數,但MATLAB的huffmandict對符號類型敏感。遇到過好幾次因為數據類型不對導致編碼失敗的情況,後來學乖了都先轉成uint8。

【圖像壓縮】基於霍夫編碼、行程編碼、DCT、FFT、算術編碼、t預測編碼實現圖像壓縮附matlab代碼_#css3_02

解碼重建就是倒着走一遍流程:

% 霍夫曼解碼
decoded_data = huffmandeco(compressed_data, dict);

% 拆分數據
len = numel(LL);
Y_LL = reshape(decoded_data(1:len), size(LL));
Y_LH = reshape(decoded_data(len+1:2*len), size(LH)) * quant_step;
% ...類似處理其他分量

% 小波重構
reconstructed_Y = idwt2(Y_LL, Y_LH, Y_HL, Y_HH, 'haar');

這裏有個騷操作:解碼出來的數據要乘回量化步長。但因為之前做過取整操作,重建的高頻分量會有誤差——這也是圖像損失的主要來源。不過人眼對高頻細節不敏感,實際看起來影響不大。

最後算個壓縮率收尾:

original_size = whos('orig_img').bytes;
compressed_size = ceil(length(compressed_data)/8); % 轉字節
cr = original_size / compressed_size;

實測512x512的測試圖能到3:1左右的壓縮率,PSNR大概28dB。想再提升的話可以搞多級小波分解,或者用更復雜的熵編碼。不過對於教學演示來説,這個簡單版本已經夠説明問題——畢竟壓縮的本質就是扔掉不重要的,再聰明地編碼剩下的。

整個過程最爽的時刻是看着重建後的圖像雖然有點模糊,但關鍵輪廓都在。這種在壓縮率和質量之間走鋼絲的感覺,大概就是做信號處理的樂趣所在吧。

【圖像壓縮】基於霍夫編碼、行程編碼、DCT、FFT、算術編碼、t預測編碼實現圖像壓縮附matlab代碼_MATLAB_03