matlab中怎么恢复DCT变换的图像,图象DCT变换的MATLAB实现

41528d3028836879cd698677c3999917.gif图象DCT变换的MATLAB实现

global gmain Data; [fname,pname]=uigetfile( *.jpg , 打开文件 ); if fname==0 return; end [Data,map]=imread(fname);%读取图像数据 %new=rgb2gray(Data); %imwrite(new, new.bmp , bmp ) %Data=im2bw(Data,map,0.6);%im2bw转为二进制 阈值0.6 %Data=+Data;%逻辑格式转为浮点格式 Data=rgb2gray(Data); subplot(1,2,1); %准备显示两幅图像 imshow(Data); function DCTcode; global Data;%全局变量,用于共享图像数据 [m,n]=size(Data); fid=( dct.bin , w+ ); %创建dct.bin用存储DCT和BTC混合编码后的二进制文件。 %补0使尺寸为4的整数倍以便分块 m1=4*ceil(m/4);n1=4*ceil(n/4); Datatemp=zeros(m1,n1); Datatemp(1:m,1:n)=Data; % fwrite(fid,m1, long );fwrite(fid,n1, long ); %在文件中记录图像大小 block=zeros(4,4); % 4X4大小的子带 for j=1:4:n for i=1:4:m for t=0:1:3 for p=0:1:3 block(1+t,1+p)=Datatemp(i+t,j+p); %取出4X4数据块 end end %对变换后数据进编码后存储或发送,只取其中的2X2数据 DctBlock=dct2(block); %存储(发送)编码文件 fwrite(fid,DctBlock(1,1), bit12 );%直流分量,用12bit量化 fwrite(fid,DctBlock(1,2), bit9 );%用9bit量化非直流分量 fwrite(fid,DctBlock(2,1), bit9 ); fwrite(fid,DctBlock(2,2), bit9 ); end end fclose(fid); function IDctcode; fid=( dct.bin , r ); m=fread(fid,1, long );n=fread(fid,1, long ); data=zeros(m,n);%用于存放图像数据 temp=zeros(4,4); block=zeros(4,4); %读取方块数据 for j=1:4:n for i=1:4:m block(1,1)=fread(fid,1, bit12 ); block(1,2)=fread(fid,1, bit9 ); block(2,1)=fread(fid,1, bit9 ); block(2,2)=fread(fid,1, bit9 ); temp=idct2(block); for t=0:1:3 for p=0:1:3 Data(i+t,j+p)=temp(1+t,1+p); end end end end data=uint8(Data); subplot(1,2,2); imshow(data);%显示图像 fclose(fid);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值