图象DCT变换的MATLAB实现
global gmain Data; [fname,pname]uigetfile*.jpg,打开文件; if fname0 return; end [Data,map]imreadfname;读取图像数据 newrgb2grayData; imwritenew,new.bmp,bmp Dataim2bwData,map,0.6;im2bw转为二进制 阈值0.6 DataData;逻辑格式转为浮点格式 Datargb2grayData; subplot1,2,1; 打算显示两幅图像 imshowData; function DCTcode; global Data;全局变量,用于共享图像数据 [m,n]sizeData; fiddct.bin,w; 创建dct.bin用存储DCT和BTC混合编码后的二进制文件。 补0使尺寸为4的整数倍以便分块 m14*ceilm/4;n14*ceiln/4; Datatempzerosm1,n1; Datatemp1m,1nData; fwritefid,m1,long;fwritefid,n1,long; 在文件中记录图像大小 blockzeros4,4; 4X4大小的子带 for j14n for i14m for t013 for p013 block1t,1pDatatempit,jp; 取出4X4数据块 end end 对变换后数据进编码后存储或发送,只取其中的2X2数据 DctBlockdct2block; 存储(发送)编码文件 fwritefid,DctBlock1,1,bit12;直流重量,用12bit量化 fwritefid,DctBlock1,2,bit9;用9bit量化非直流重量 fwritefid,DctBlock2,1,bit9; fwritefid,DctBlock2,2,bit9; end end fclosefid; function IDctcode; fiddct.bin,r; mfreadfid,1,long;nfreadfid,1,long; datazerosm,n;用于存放图像数据 tempzeros4,4; blockzeros4,4; 读取方块数据 for j14n for i14m block1,1freadfid,1,bit12; block1,2freadfid,1,bit9; block2,1freadfid,1,bit9; block2,2freadfid,1,bit9; tempidct2block; for t013 for p013 Datait,jptemp1t,1p; end end end end datauint8Data; subplot1,2,2; imshowdata;显示图像 fclosefid;