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
一、矩阵的表示方法
1、矩阵元素必须在”[]”内;
2、矩阵的同行元素之间用空格(或”,”)隔开;
3、矩阵的行与行之间用””(或回车符)隔开;
4、矩阵的元素可以是数值、变量、表达式或函数;
5、矩阵的尺寸不必预先定义。
二、矩阵的运算
1、算术运算
MATLAB的基本算术运算有:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)、’(转置)。运算是在矩阵意义下进行的,单个数据的算术运算只是一种特例。
(1)矩阵加减运算假定有两个矩阵A和B,则可以由A+B和A-B实现矩阵的加减运算。运算规则是:若A和B矩阵的维数相同,则可以执行矩阵的加减运算,A和B矩阵的相应元素相加减。如果A与B的维数不相同,则MATLAB将给出错误信息,提示用户两个矩阵的维数不匹配。
(2)矩阵乘法假定有两个矩阵A和B,若A为m*n矩阵,B为n*p矩阵,则C=A*B为m*p矩阵。
(3)矩阵除法在MATLAB中,有两种矩阵除法运算:\和/,分别表示左除和右除。如果A矩阵是非奇异方阵,则A\B和B/A运算可以实现。
A\B等效于A的逆左乘B矩阵,也就是inv(A)*B,而B/A等效于A矩阵的逆右乘B矩阵,也就是B*inv(A)。对于含有标量的运算,两种除法运算的结果相同。对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系,一般A\B≠B/A。
(4)矩阵的乘方一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量。
(5)矩阵的转置对实数矩阵进行行列互换,对复数矩阵,共轭转置,特殊的, *** 作符.’共轭不转置(见点运算);
(6)点运算在MATLAB中,有一种特殊的运算,因为其运算符是在有关算术运算符前面加点,所以叫点运算。点运算符有.*、./、.\和.^。两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵的维参数相同。
2、关系运算
MATLAB提供了6种关系运算符:&lt(小于)、&lt=(小于或等于)、&gt(大于)、&gt=(大于或等于)、==(等于)、~=(不等于)。关系运算符的运算法则为:
(1)当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0;
(2)当参与比较的量是两个维数相同的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成;
(3)当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。
3、逻辑运算
MATLAB提供了3种逻辑运算符:&(与)、|(或)和~(非)。逻辑运算的运算法则为:
(1)在逻辑运算中,确认非零元素为真,用1表示,零元素为假,用0表示;
(2)设参与逻辑运算的是两个标量a和b,那么,a&b a,b全为非零时,运算结果为1,否则为0。a|b a,b中只要有一个非零,运算结果为1。~a当a是零时,运算结果为1;当a非零时,运算结果为0。
(3)若参与逻辑运算的是两个同维矩阵,那么运算将对矩阵相同位置上的元素按标量规则逐个进行。最终运算结果是一个与原矩阵同维的矩阵,其元素由1或0组成;
(4)若参与逻辑运算的一个是标量,一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行。最终运算结果是一个与矩阵同维的矩阵,其元素由1或0组成;
(5)逻辑非是单目运算符,也服从矩阵运算规则;
(6)在算术、关系、逻辑运算中,算术运算优先级最高,逻辑运算优先级最低。
扩展资料:1.获取矩阵元素
可以通过下标(行列索引)引用矩阵的元素,如Matrix(m,n)。
也可以采用矩阵元素的序号来引用矩阵元素。
矩阵元素的序号就是相应元素在内存中的排列顺序。
在MATLAB中,矩阵元素按列存储。
序号(Index)与下标(Subscript)是一一对应的,以m*n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i。
其相互转换关系也可利用sub2ind和ind2sub函数求得。
2.矩阵拆分
利用冒号表达式获得子矩阵:
(1)A(:,j)表示取A矩阵的第j列全部元素;A(i,:)表示A矩阵第i行的全部元素;A(i,j)表示取A矩阵第i行、第j列的元素。
(2)A(i:i+m,:)表示取A矩阵第i~i+m行的全部元素;A(:,k:k+m)表示取A矩阵第k~k+m列的全部元素,A(i:i+m,k:k+m)表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素。
此外,还可利用一般向量和end运算符来表示矩阵下标,从而获得子矩阵。end表示某一维的末尾元素下标。
利用空矩阵删除矩阵的元素:
在MATLAB中,定义[]为空矩阵。给变量X赋空矩阵的语句为X=[]。注意,X=[]与clear X不同,clear是将X从工作空间中删除,而空矩阵则存在于工作空间中,只是维数为0。
3、特殊矩阵
(1)魔方矩阵魔方矩阵有一个有趣的性质,其每行、每列及两条对角线上的元素和都相等。对于n阶魔方阵,其元素由1,2,3,…,n2共n2个整数组成。MATLAB提供了求魔方矩阵的函数magic(n),其功能是生成一个n阶魔方阵。
(2)范得蒙矩阵范得蒙(Vandermonde)矩阵最后一列全为1,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积。可以用一个指定向量生成一个范得蒙矩阵。在MATLAB中,函数vander(V)生成以向量V为基础向量的范得蒙矩阵。
(3)希尔伯特矩阵在MATLAB中,生成希尔伯特矩阵的函数是hilb(n)。使用一般方法求逆会因为原始数据的微小扰动而产生不可靠的计算结果。MATLAB中,有一个专门求希尔伯特矩阵的逆的函数invhilb(n),其功能是求n阶的希尔伯特矩阵的逆矩阵。
(4)托普利兹矩阵托普利兹(Toeplitz)矩阵除第一行第一列外,其他每个元素都与左上角的元素相同。生成托普利兹矩阵的函数是toeplitz(x,y),它生成一个以x为第一列,y为第一行的托普利兹矩阵。这里x,y均为向量,两者不必等长。toeplitz(x)用向量x生成一个对称的托普利兹矩阵。
(5)伴随矩阵MATLAB生成伴随矩阵的函数是compan(p),其中p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后。
(6)帕斯卡矩阵我们知道,二次项(x+y)n展开后的系数随n的增大组成一个三角形表,称为杨辉三角形。由杨辉三角形表组成的矩阵称为帕斯卡(Pascal)矩阵。函数pascal(n)生成一个n阶帕斯卡矩阵。
参考资料:
百度百科——帕斯卡矩阵
百度百科——MATLAB
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)