图象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);