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)数字图像的变换:普通傅里叶变换(ft)与逆变换(ift)、快速傅里叶变换(fft)与逆变换(ifft)、离散余弦变换(DCT),小波变换。2) 数字图像直方图的统计及绘制等;
clc
Y=imread('C:\zhengzhi.jpg')
length(size(Y))==3
s=rgb2gray(Y)
imshow(Y)
title('原图')%figure1
Y=rgb2gray(Y)
figureimshow(Y)title('原始图像')% figue2
[J,T] = histeq(Y)
figureimshow(J)title('增强图像')% figue3
figure imhist(Y,64)title('原始图像直方图')% figue4
figure imhist(J,64)title('均衡化图像直方图')% figue5
clear all
Y=imread('C:\zhengzhi.jpg')%导入图片%傅里叶变换
Y=rgb2gray(Y)
figure(1)
imshow(Y)
title('灰度化后的图像')
Y1=fftshift(fft2(Y))
figure(2)
Y2=abs(Y1)
imshow(Y2,[])
title('傅里叶变换的图像')
figure(3)
Y2=abs(ifft2(Y1))/255
imshow(Y2)
title('傅里叶逆变换的图像')
J=fft2(double(s))%快速傅里叶变换
K=fftshift(fft2(double(s)))
F=ifft2(K)%快速傅里叶变换
figure%figure6
imshow(J)
title('FFT变换结果')
figure%figure7
imshow(log(abs(K)+1),[])
title('零点平移')
figure %figure8
imshow(abs(F),[])
title('IFFT变换结果')
% 图象的DCT变换
RGB=imread('C:\zhengzhi.jpg')
figure%figure9
subplot(1,2,1)
imshow(RGB)
title('彩色原图')
a=rgb2gray(RGB)
subplot(1,2,2)
imshow(a)
title('灰度图')
figure%figure10
b=dct2(a)
imshow(log(abs(b)),[]),colormap(jet(64)),colorbar
title('DCT变换结果')
figure%figure11
b(abs(b)<10)=0
% idct
c=idct2(b)/255
imshow(c)
title('IDCT变换结果')
小波变换
clear
I= imread('C:\zhengzhi.jpg')
X=rgb2gray(I)
subplot (121)
imshow(X)
title ('原始图像') %画出原图像
[c,s] =wavedec2 (X, 2, 'sym4')
%进行二层小波分解
len = length ( c) %处理分解系数,突出轮廓,弱化细节
for I = 1: len
if (c( I )>350)
c( I ) = 2*c (I )
else
c( I ) = 0.5*c( I )
end
end
nx =waverec2 ( c, s, 'sym4')
%分解系数重构
subplot(122)
image( nx)
title('增强图像')
%画出增强图像
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)