收藏 分销(赏)

数字图像处理实验matlab4.doc

上传人:a199****6536 文档编号:2580215 上传时间:2024-06-01 格式:DOC 页数:12 大小:164.54KB 下载积分:8 金币
下载 相关 举报
数字图像处理实验matlab4.doc_第1页
第1页 / 共12页
数字图像处理实验matlab4.doc_第2页
第2页 / 共12页


点击查看更多>>
资源描述
数字图像处理实验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
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服