资源描述
数字图像处理实验matlab4
———————————————————————————————— 作者:
———————————————————————————————— 日期:
12
个人收集整理 勿做商业用途
9,对图3实施正交变换编码和解码(采用离散傅立叶变换)。建议将图3分成4*4的4个子图象。
思路:先将图3数据读入模块,显示图像,将图分块进行DFT变换,显示图像,,在进行反变换恢复原数据,在进行哈夫曼编码编码,后解码。
原理:
傅立叶变换
傅立叶变换是数字图像处理中应用最广的一种变换,其中图像增强、图像复原
和图像分析与描述等,每一类处理方法都要用到图像变换,尤其是图像的傅立
叶变换.
离散傅立叶(Fourier)变换的定义:
二维离散傅立叶变换(DFT)为:
逆变换为:
式中,
在DFT变换对中, 称为离散信号 的频谱,而 称为幅度谱, 为相位角,功率谱为频谱的平方,它们之间的关系为:
图像的傅立叶变换有快速算法.
下面给出具体的Huffman编码算法。
(1)首先统计出每个符号出现的频率,例如S0到S7的出现频率分别为:0.25,0.19,0。08,0.06,0。21,0。02,0.03,0.16
(2)从左到右把上述频率按从大到小的顺序排列。
(3)将最小的两个数相加的值表上*号,其余的数据不变,然后将得到的数据排序
(4)重复(3),直到只有两个数据.
(5) 从最后一列概率编码,从而得到最终编码。
具体过程如下图所示:
概率压缩过程:
初始信源
信源的消减步骤
符号
概率
1 2 3 4 5 6
S0
0。25
0.25 0。25 0.25 0。35* 0。4* 0。6*
0。21 0。21 0.21 0.25 0.35 0。4
0.19 0。19 0.19 0.21 0。25
0.16 0.16 0。19* 0。19
0.08 0。11* 0。16
0。06 0.08
0.05*
S4
0。21
S1
0。19
S7
0.16
S2
0。08
S3
0。06
S6
0.03
S5
0。02
表 3-1 哈夫曼概率压缩过程
编码过程:
初始信源
对消减信源的赋值
符号
概率 编码
1 2 3 4 5 6
S0
0.25 01
0.25 01 0.25 01 0。25 01 0。35*00 0。4* 1 0.6* 0
0.21 10 0。21 10 0。21 10 0。25 01 0。35 00 0。4 1
0.19 11 0。19 11 0.19 11 0.21 10 0。25 01
0.16 001 0.16 001 0.19*000 0.19 11
0.08 0001 0。11* 0000 0.16 0001
0。06 00000 0.08 0001
0。05* 00001
S4
0。21 10
S1
0.19 11
S7
0。16 001
S2
0。08 0001
S3
0。06 00000
S6
0.03 000010
S5
0。02 000011
表 3-2 哈夫曼算法编码过程
读入图像
算法流程
初始化
统计每种灰度数
灰度数排序
此处并没有采用概率排序,
而是采用对灰度像素个数
按哈夫曼算法编码
排序,这是因为计算概率无
疑增大了计算量,因此用灰
将灰度编码表及原图的编码写入txt
度级的像素个数替代
图3—1 哈夫曼算法程序流程图
程序:
clc;
clear;
close all;
A=[3 3 4 4 4 4 5 2
4 1 1 2 2 1 5 4
4 3 4 4 4 4 5 2
4 5 2 5 0 3 1 2
1 5 0 3 3 5 6 4
2 3 1 1 2 2 1 2
0 3 6 5 5 7 2 0
3 1 2 2 1 5 0 6];
subplot(2,2,1),imshow(A);title(’原图’);
I=double(A);
P=A(1:4,1:4);
K=fft(P);
P1=A(1:4,5:8);
K1=fft(P1);
P2=A(5:8,1:4);
K2=fft(P2);
P3=A(5:8,5:8);
K3=fft(P3);
for i=1:4
for j=1:4
H(i,j)=K(i,j);
end
end
for i=1:4
for j=5:8
H(i,j)=K1(i,j-4);
end
end
for i=5:8
for j=1:4
H(i,j)=K2(i—4,j);
end
end
for i=5:8
for j=5:8
H(i,j)=K3(i-4,j-4);
end
end
subplot(2,2,2),imshow(H);title(’DFT变换后的频域图像’);
I=H(1:4,1:4);
M=ifft(I);
I1=H(1:4,5:8);
M1=ifft(I1);
I2=H(5:8,1:4);
M2=ifft(I2);
I3=H(5:8,5:8);
M3=ifft(I3);
for i=1:4
for j=1:4
A1(i,j)=M(i,j);
end
end
for i=1:4
for j=5:8
A1(i,j)=M1(i,j-4);
end
end
for i=5:8
for j=1:4
A1(i,j)=M2(i-4,j);
end
end
for i=5:8
for j=5:8
A1(i,j)=M3(i—4,j—4);
end
end
subplot(2,2,3),imshow(A1);title(’复原图像');
%编码
%读入图像,定义结构体,便于存储
I=A;
pix(8)=struct('huidu',0.0,.。.
'number',0。0,..。
'bianma',’’);
[m n l]=size(I);
fid=fopen('E:\学习\数字图像处理\huffman。txt',’w');%huffman。txt是灰度级及相应的编码表
fid1=fopen(’E:\学习\数字图像处理\huff_compara.txt
','w');%huff_compara.txt是编码表
huf_bac=cell(1,l);
for t=1:l
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %初始化结构数组
for i=1:8
pix(i)。number=1;
pix(i)。huidu=i-1;
pix(i).bianma='’;
end
%统计每种灰度像素的个数记录在pix数组中
for i=1:m
for j=1:n
k=I(i,j,t)+1;
pix(k).number=1+pix(k).number;
end
end
%按灰度像素个数从大到小排序
for i=1:7
for j=i+1:8
if pix(i).number<pix(j).number
temp=pix(j);
pix(j)=pix(i);
pix(i)=temp;
end
end
end
for i=8:-1:1
if pix(i)。number ~=0
break;
end
end
num=i;
count(t)=i;%记录每层灰度级
%定义用于求解的矩阵
clear huffman
huffman(num,num)=struct(’huidu’,0。0,.。.
'number',0.0,。..
’bianma’,’');
huffman(num,:)=pix(1:num);
%矩阵赋值
for i=num-1:—1:1
p=1;
%算出队列中数量最少的两种灰度的像素个数的和
sum=huffman(i+1,i+1).number+huffman(i+1,i)。number;
for j=1:i
%如果当前要复制的结构体的像素个数大于sum就直接复制
if huffman(i+1,p).number>sum
huffman(i,j)=huffman(i+1,p);
p=p+1;
else
%如果当前要复制的结构体的像素个数小于或等于sum就插入和的结构体
%灰度值为—1标志这个结构体的number是两种灰度像素的和
huffman(i,j).huidu=—1;
huffman(i,j)。number=sum;
sum=0;
huffman(i,j+1:i)=huffman(i+1,j:i-1);
break;
end
end
end
%开始给每个灰度值编码
for i=1:num—1
obj=0;
for j=1:i
if huffman(i,j)。huidu==-1
obj=j;
break;
else
huffman(i+1,j).bianma=huffman(i,j).bianma;
end
end
if huffman(i+1,i+1)。number〉huffman(i+1,i).number
%说明:大概率的编0,小概率的编1,概率相等的,标号大的为1,标号小的为0
huffman(i+1,i+1)。bianma=[huffman(i,obj).bianma '0’];
huffman(i+1,i)。bianma=[huffman(i,obj)。bianma ’1'];
else
huffman(i+1,i+1)。bianma=[huffman(i,obj)。bianma ’1'];
huffman(i+1,i)。bianma=[huffman(i,obj).bianma ’0’];
end
for j=obj+1:i
huffman(i+1,j—1)。bianma=huffman(i,j).bianma;
end
end
for k=1:count(t)
huf_bac(t,k)={huffman(num,k)}; %保存
end
end
%写出灰度编码表
for t=1:l
for b=1:count(t)
fprintf(fid,’%d’,huf_bac{t,b}。huidu);
fwrite(fid,’ ’);
fprintf(fid,'%s’,huf_bac{t,b}。bianma);
fwrite(fid,’ ’);
end
fwrite(fid,’%');
end
%解码
%按原图像数据,写出相应的编码,也就是将原数据用哈夫曼编码替代
for t=1:l
for i=1:m
for j=1:n
for b=1:count(t)
if I(i,j,t)==huf_bac{t,b}.huidu
M(i,j,t)=huf_bac{t,b}。huidu;%将灰度级存入解码的矩阵
fprintf(fid1,’%s’,huf_bac{t,b}.bianma);
fwrite(fid1,’ ’);%用空格将每个灰度编码隔开
break;
end
end
end
fwrite(fid1,',’);%用空格将每行隔开
end
fwrite(fid1,'%’);%用%将每层灰度级代码隔开
end
fclose(fid);
fclose(fid1);
M=uint8(M);
save('M’)%存储解码矩阵
M
subplot(2,2,4),imshow(A);title(’解码后图’);
对应编码:
0 0001
1 001
2 10
3 011
4 11
5 010
6 00000
7 00001
矩阵的编码
11 001 001 10 10 001 010 11 ,
11 011 11 11 11 11 010 10 ,
11 010 10 010 0001 011 001 10 ,
001 010 0001 011 011 010 00000 11 ,
10 011 001 001 10 10 001 10 ,
0001 011 00000 010 010 00001 10 0001 ,
011 001 10 10 001 010 0001 00000 ,
解码矩阵:
M =
3 3 4 4 4 4 5 2
4 1 1 2 2 1 5 4
4 3 4 4 4 4 5 2
4 5 2 5 0 3 1 2
1 5 0 3 3 5 6 4
2 3 1 1 2 2 1 2
0 3 6 5 5 7 2 0
3 1 2 2 1 5 0 6
展开阅读全文