永发信息网

对灰度图像进行霍夫曼编码,用Matlab怎么实现啊?

答案:1  悬赏:10  手机版
解决时间 2021-08-13 16:27
对灰度图像进行霍夫曼编码,用Matlab怎么实现啊?
最佳答案

给你一段程序,自己研究下吧!
clc
clear
close all;
%定义HufData/Len为全局变量的结构体
global HufData;
global Len
disp('计算机正在准备输出哈夫曼编码结果,请耐心等待……');
%原始码字的灰度
a=imread('kids.tif');

%分区画出原始图像和灰度直方图
figure;
subplot(1,2,1)
imshow(a);
%取消坐标轴和边框
axis off
box off
title('MATLAB自带图像','fontsize',13);
subplot(1,2,2);
axis off
box off
imhist(a);
title('图像灰度直方图','fontsize',13);
%图像的灰度统计
GrayStatistics=imhist(a);
GrayStatistics=GrayStatistics';
GrayRatioo=GrayStatistics/sum(GrayStatistics);
GrayRatioNO=find(GrayRatioo~=0);
Len=length(GrayRatioNO);
%初始化灰度集,防止系统随即赋予其垃圾值
GrayRatio=ones(1,Len);

for i=1:Len
GrayRatio(i)=GrayRatioo(i);
end

GrayRatio=abs(sort(-GrayRatio));
%将图像灰度概率赋予结构体
for i=1:Len
HufData(i).value=GrayRatio(i);
end

% 哈夫曼编码/霍夫曼编码
HuffmanCode(Len);
%输出码字

zippedHuffman=1;
for i=1:Len
tmpData=HufData(i).code;
str='';
for j=1:length(tmpData)
str=strcat(str,num2str(tmpData(j)));
zippedHuffman=zippedHuffman+1;
end
disp(strcat('a',num2str(i),'= ',str))
end
i;
%计算计算机一共输出多少个哈夫曼编码/霍夫曼编码
zippedHuffman;
%计算在删去0灰度级压缩之前的原始图像字节容量
unzipped_delete=i*8;

%计算压缩比率
ratio_delete=zippedHuffman/unzipped_delete;

%计算图像的压缩比率
ad=num2str(ratio_delete*100);
str2=strcat(ad,'%');
disp(strcat('哈夫曼编码压缩比率','= ',str2))

%子程序:哈夫曼编码/霍夫曼编码函数HuffmanCode.m
function HuffmanCode(OriginSize)
global HufData;
global Len
for i=1:Len
%%霍夫曼编码树左边纪录为1
HufData(i).left=1;
%%霍夫曼编码树右边纪录为0
HufData(i).right=0;
%%输出码初始化为0
HufData(i).code=[];
%%排序列表初始化
SortList(i).symbol=i;
SortList(i).value=HufData(i).value;
end
%初始化原始消息数目
newsymbol=OriginSize;
for n=OriginSize:-1:2
%将N个消息进行排序
SortList=sortdata(SortList,n);
%将最后两个出现概率最小的消息合成一个消息
newsymbol=newsymbol+1;
HufData(newsymbol).value=SortList(n-1).value+SortList(n).value;
HufData(newsymbol).left=SortList(n-1).symbol;
HufData(newsymbol).right=SortList(n).symbol;
%将消息添加到列队的最后,为N-1个消息重新排序作好准备
SortList(n-1).symbol=newsymbol;
SortList(n-1).value=HufData(newsymbol).value;
end
%遍历霍夫曼树,获得霍夫曼编码/哈夫曼编码
visit(newsymbol,Len,[]);
end

%子程序:冒泡排序法函数sortdata.m
function reData=sortdata(SortList,n)
%根据消息概率进行排序
for k=n:-1:2
for j=1:k-1
min=SortList(j).value;
sbl=SortList(j).symbol;
if(min0)
%遍历右分支接点输出0,这里采用子函数嵌套调用
ocode2=[ocode 0];
visit(HufData(node).right,n,ocode2);
end
end
end


我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
测手机号值多少钱13904040474?
这个世界是什么比较唯心的,什么比较神秘的,精
QQ空间问问动态问题
请知道的告诉我下,省内招考的公务员中某个乡
qq通讯录密码忘了怎么办?
五常市哈尔滨自行车商店地址在什么地方,想今
表达爱却不能爱的诗词,表达爱意的诗词 5分
怎么弄心情?
常州医保卡密码是多少,医保卡的初始密码是多
求死神电脑桌面
淘宝卖家侵权怎么处理,淘宝店图片侵权怎么办
义马市三门峡常青专业美发中心地址在哪,我要
霍尔母为什么可以跳过两米40?
关于对读书有益的演讲,“读书有益”和“读书
这个班级的同学是全校开间学雷锋活动最好的班
推荐资讯
岳阳楼区岳阳奇家岭街道蔡家社区卫生服务站地
please get everything ready for the sports
我现在在没在家
逆战塔防什么武器好,CF手游青花瓷武器有哪些
保定限号违章怎么处罚,保定限号出行没有被抓
谁告诉我当你感到茫然时该怎么办?
大学还军训吗?
罗振宇奇葩说经典语录,如何评价罗振宇在《奇
欢迎盆栽新成员的句子,过几天我们团队会有新
爸爸得了红皮性银屑病
怀孕六个多月体重从128斤到140斤算不算严重超
请问一下用may提问,回答是否定的可用哪些词?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?