一、简介
基于matlab霍夫曼图像压缩重建,霍夫曼编码完全依据字符出现的概率来构造异字头的平均长度最短的码字,有时称之为最佳编码。霍夫曼编码将使用次数较多的代码用长度较短的编码代替,将使用次数较少的代码用较长的编码代替,并且确保编码的唯一可解性。其根本原则是压缩编码的长度最小,也就是权值和最小。
二、部分源码
function SaveImg_Callback(hObject, eventdata, handles)
% 保存
if isequal(handles.ImgH, 0) && isequal(handles.ImgL, 0)
msgbox('请进行压缩处理!', '提示信息');
return;
end
if ~isequal(handles.ImgH, 0)
SaveImage(handles.ImgH);
end
if ~isequal(handles.ImgL, 0)
SaveImage(handles.ImgL);
end
msgbox('处理结果保存成功!', '提示信息');
function Exit_Callback(hObject, eventdata, handles)
close();
function CompressAlgorithm_Callback(hObject, eventdata, handles)
function Huffman_Callback(hObject, eventdata, handles)
if isequal(handles.Img, 0)
msgbox('请载入图像!', '提示信息');
return;
end
if isequal(handles.ImgH, 0)
dataImg = handles.Img;
if ndims(dataImg) == 3
dataImg = rgb2gray(dataImg);
end
sz = size(dataImg);
[zipped,info] = Mat2Huff(dataImg);
unzipped = Huff2Mat(zipped, info);
dataImg = double(reshape(dataImg, sz));
unzipped = double(reshape(unzipped, sz));
info_dataImg = whos('dataImg');
info_zipped = whos('zipped');
info_unzipped = whos('unzipped');
S = PSNR(dataImg, unzipped);
str0 = sprintf('-----------------霍夫曼压缩-----------------\n');
str1 = sprintf('原始数据维数为:%s,占用空间大小为:%d\n', num2str(info_dataImg.size), info_dataImg.bytes);
str2 = sprintf('解压数据维数为:%s,占用空间大小为:%d\n', num2str(info_unzipped.size), info_unzipped.bytes);
str3 = sprintf('压缩数据维数为:%s,占用空间大小为:%d\n', num2str(info_zipped.size), info_zipped.bytes);
str4 = sprintf('压缩比为:%.3f%%\n', info_zipped.bytes/info_dataImg.bytes*100);
str5 = sprintf('PSNR:%.3f\n', S);
strH = [str0 str1 str2 str3 str4 str5];
set(handles.textInfo, 'String', strH);
tm = im2uint8(mat2gray(unzipped));
axes(handles.axes2); imshow(tm, []);
handles.strH = strH;
handles.ImgH = tm;
guidata(hObject, handles);
else
set(handles.textInfo, 'String', handles.strH);
axes(handles.axes2); imshow(mat2gray(handles.ImgH), []);
end
三、运行结果
四、matlab版本
MATLAB R2019a
五、学习与交流
文中不足之处请大家多多指教,学习与交流可以联系企鹅:3752243968
文中部分源码仅供参考,若需要全部代码可以私信(有偿)