I=imread('lena.bmp')%待编码的矩阵
imshow(I)
thresh = graythresh(I)%自动确定二值化阈值
I2 = im2bw(I,thresh) %对图像二值化
imshow(I2)
[m,n]=size(I2) %计算矩阵大小
I2=double(I2)
p_table=tabulate(I2(:))%统计矩阵中元素出现的概率,第一列为矩阵元素,第二列为个数,第三列为概率百分数
color=p_table(:,1)'
p=p_table(:,3)'/100 %转换成小数表示的概率
psum=cumsum(p_table(:,3)')%计算数组各行的累加值
allLow=[0,psum(1:end-1)/100]%由于矩阵中元素只有两种,将[0,1)区间划分为两个区域allLow和 allHigh
allHigh=psum/100
numberlow=0 %定义算术编码的上下限numberlow和numberhigh
numberhigh=1
for k=1:m %以下计算算术编码的上下限,即编码结果
for kk=1:n
data=I2(k,kk)
low=allLow(data==color)
high=allHigh(data==color)
range=numberhigh-numberlow
tmp=numberlow
numberlow=tmp+range*low
numberhigh=tmp+range*high
end
end
fprintf('算术编码范围下限为%16.15f\n\n',numberlow)
fprintf('算术编码范围上限为%16.15f\n\n',numberhigh)
Mat=zeros(m,n) %解码
for k=1:m
for kk=1:n
temp=numberlow<low
temp=[temp 1]
indiff=diff(temp)
indiff=logical(indiff)
Mat(k,kk)=color(indiff)
low=low(indiff)
high=allHigh(indiff)
range=high - low
numberlow=numberlow-low
numberlow=numberlow/range
end
end
给你一段程序,自己研究下吧!
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(min<SortList(j+1).value)
SortList(j).value=SortList(j+1).value
SortList(j+1).value=min
SortList(j).symbol=SortList(j+1).symbol
SortList(j+1).symbol=sbl
end
end
end
reData=SortList
end
%子程序:遍历哈夫曼编码/霍夫曼编码树搜索函数visit.m
function visit(node,n,ocode)
global HufData
if node<=n
%如果没有哈夫曼编码/霍夫曼编码树的子接点直接输出原始码,这里为空码([])
HufData(node).code=ocode
else
if(HufData(node).left>0)
%遍历左分支接点输出1,这里采用子函数嵌套调用
ocode1=[ocode 1]
visit(HufData(node).left,n,ocode1)
end
if(HufData(node).right>0)
%遍历右分支接点输出0,这里采用子函数嵌套调用
ocode2=[ocode 0]
visit(HufData(node).right,n,ocode2)
end
end
end
我做过一个。编码:
% b1%%%输入代码中出现的字符,按ASCII排序
% m1%%%b1中字符在codes中首次出现的位置
% n1%%%codes中字符在b1中出现的位置
function coding_callback(Incodes)
global decod
clc
digits(16)%%设置输出编码的小数点位数
Incodes=input('please input the encoding string:\n','s')
Incodes=['state tree']
[b1, m1, n1] = unique(Incodes, 'first')
Incodes(sort(m1))
length(b1)
for ii=1:length(b1)
a(ii)=length(find(n1(1:end)==ii))
rate(ii)=a(ii)/length(n1)%%%b1中每个字符出现的概率区间
low1(1)=0%%%b1区间下限
high1(1)=rate(1) %%%b1区间上限
if ii>1
low1(ii)=high1(ii-1)
high1(ii)=low1(ii)+rate(ii)
end
end
% high1 %%%每个字符的上限
% low1%%%每个字符的下限
% rate%%%每个字符所占有比例
%%%%%算术编码过程%%%%%%
judge=n1(1)
rang(1)=high1(judge)-low1(judge)
low(1)=low1(judge)
high(1)=high1(judge)
for jj=2:length(Incodes)
judge=n1(jj)
low(jj)=low(jj-1)+low1(judge).*rang(jj-1) %%%%codes中第jj个字符编码后的下限
high(jj)=low(jj-1)+high1(judge).*rang(jj-1)%%%%codes中第jj个字符编码后的上限
rang(jj)=high(jj)-low(jj) %%%%codes中第jj个字符编码后的区间
end
r=vpa(rang)
x=vpa(low(length(Incodes)))
y=vpa(high(length(Incodes)))
decod=(x+y)./2
set(decod,'string',num2str(decod))
save Code.mat x y r decod low1 high1 b1 Incodes rate
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)