图象DCT变换的MATLAB实现_精品文档.doc
《图象DCT变换的MATLAB实现_精品文档.doc》由会员分享,可在线阅读,更多相关《图象DCT变换的MATLAB实现_精品文档.doc(2页珍藏版)》请在冰豆网上搜索。
globalgmainData;
[fname,pname]=uigetfile('*.jpg','打开文件');
iffname==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);
functionDCTcode;
globalData;%全局变量,用于共享图像数据
[m,n]=size(Data);
fid=fopen('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大小的子带
forj=1:
4:
n
fori=1:
4:
m
fort=0:
1:
3
forp=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);
functionIDctcode;
fid=fopen('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);
%读取方块数据
forj=1:
4:
n
fori=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);
fort=0:
1:
3
forp=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);