数字图像处理实验matlab4.docx

上传人:b****4 文档编号:24927728 上传时间:2023-06-02 格式:DOCX 页数:15 大小:83.05KB
下载 相关 举报
数字图像处理实验matlab4.docx_第1页
第1页 / 共15页
数字图像处理实验matlab4.docx_第2页
第2页 / 共15页
数字图像处理实验matlab4.docx_第3页
第3页 / 共15页
数字图像处理实验matlab4.docx_第4页
第4页 / 共15页
数字图像处理实验matlab4.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数字图像处理实验matlab4.docx

《数字图像处理实验matlab4.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验matlab4.docx(15页珍藏版)》请在冰豆网上搜索。

数字图像处理实验matlab4.docx

数字图像处理实验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).number

temp=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.

 толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях. 

以下无正文

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1