数字图像处理实验matlab4.docx
《数字图像处理实验matlab4.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验matlab4.docx(15页珍藏版)》请在冰豆网上搜索。
![数字图像处理实验matlab4.docx](https://file1.bdocx.com/fileroot1/2023-6/2/d3bc34a0-2f68-49d7-8922-ad944bd487e8/d3bc34a0-2f68-49d7-8922-ad944bd487e81.gif)
数字图像处理实验matlab4
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)从最后一列概率编码,从而得到最终编码。
具体过程如下图所示:
概率压缩过程:
初始信源
信源的消减步骤
符号
概率
123456
S0
0.25
0.250.250.250.35*0.4*0.6*
0.210.210.210.250.350.4
0.190.190.190.210.25
0.160.160.19*0.19
0.080.11*0.16
0.060.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哈夫曼概率压缩过程
编码过程:
初始信源
对消减信源的赋值
符号
概率编码
123456
S0
0.2501
0.25010.25010.25010.35*000.4*10.6*0
0.21100.21100.21100.25010.35000.41
0.19110.19110.19110.21100.2501
0.160010.160010.19*0000.1911
0.0800010.11*00000.160001
0.06000000.080001
0.05*00001
S4
0.2110
S1
0.1911
S7
0.16001
S2
0.080001
S3
0.0600000
S6
0.03000010
S5
0.02000011
表3-2哈夫曼算法编码过程
算法流程
此处并没有采用概率排序,
而是采用对灰度像素个数
排序,这是因为计算概率无
疑增大了计算量,因此用灰
度级的像素个数替代
图3-1哈夫曼算法程序流程图
程序:
clc;
clear;
closeall;
A=[33444452
41122154
43444452
45250312
15033564
23112212
03655720
31221506];
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);
fori=1:
4
forj=1:
4
H(i,j)=K(i,j);
end
end
fori=1:
4
forj=5:
8
H(i,j)=K1(i,j-4);
end
end
fori=5:
8
forj=1:
4
H(i,j)=K2(i-4,j);
end
end
fori=5:
8
forj=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);
fori=1:
4
forj=1:
4
A1(i,j)=M(i,j);
end
end
fori=1:
4
forj=5:
8
A1(i,j)=M1(i,j-4);
end
end
fori=5:
8
forj=1:
4
A1(i,j)=M2(i-4,j);
end
end
fori=5:
8
forj=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','');
[mnl]=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);
fort=1:
l
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化结构数组
fori=1:
8
pix(i).number=1;
pix(i).huidu=i-1;
pix(i).bianma='';
end
%统计每种灰度像素的个数记录在pix数组中
fori=1:
m
forj=1:
n
k=I(i,j,t)+1;
pix(k).number=1+pix(k).number;
end
end
%按灰度像素个数从大到小排序
fori=1:
7
forj=i+1:
8
ifpix(i).numbertemp=pix(j);
pix(j)=pix(i);
pix(i)=temp;
end
end
end
fori=8:
-1:
1
ifpix(i).number~=0
break;
end
end
num=i;
count(t)=i;%记录每层灰度级
%定义用于求解的矩阵
clearhuffman
huffman(num,num)=struct('huidu',0.0,...
'number',0.0,...
'bianma','');
huffman(num,:
)=pix(1:
num);
%矩阵赋值
fori=num-1:
-1:
1
p=1;
%算出队列中数量最少的两种灰度的像素个数的和
sum=huffman(i+1,i+1).number+huffman(i+1,i).number;
forj=1:
i
%如果当前要复制的结构体的像素个数大于sum就直接复制
ifhuffman(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
%开始给每个灰度值编码
fori=1:
num-1
obj=0;
forj=1:
i
ifhuffman(i,j).huidu==-1
obj=j;
break;
else
huffman(i+1,j).bianma=huffman(i,j).bianma;
end
end
ifhuffman(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
forj=obj+1:
i
huffman(i+1,j-1).bianma=huffman(i,j).bianma;
end
end
fork=1:
count(t)
huf_bac(t,k)={huffman(num,k)};%保存
end
end
%写出灰度编码表
fort=1:
l
forb=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
%解码
%按原图像数据,写出相应的编码,也就是将原数据用哈夫曼编码替代
fort=1:
l
fori=1:
m
forj=1:
n
forb=1:
count(t)
ifI(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('解码后图');
对应编码:
00001
1001
210
3011
411
5010
600000
700001
矩阵的编码
11001001101000101011,
110111111111101010,
1101010010000101100110,
00101000010110110100000011,
10011001001101000110,
00010110000001001000001100001,
0110011010001010000100000,
解码矩阵:
M=
33444452
41122154
43444452
45250312
15033564
23112212
03655720
31221506
仅供个人用于学习、研究;不得用于商业用途。
Forpersonaluseonlyinstudyandresearch;notforcommercialuse.
NurfürdenpersönlichenfürStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'étudeetlarechercheuniquementàdesfinspersonnelles;pasàdesfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文