www.gusucode.com > GUI界面设计的学习材料源码程序 > code/matlab代码/dct_y1_zuizhong1.m
function dct_encode() %生成主框架 DctDemoFig=figure( ... %设置调用句柄 'menu','none',...%设置取消菜单 'color',[0.4,0.8,0.95],... %设置主框架颜色 'position',[103.8 50.923 890.2 650.538],... %设置位置和面积大小 'Name',' DCT 图像变换压缩_GXUT', ...%设置名字 'NumberTitle','off', 'HandleVisibility', 'on', ...%设置名字是否需要符号 'tag', '2D DCT Image Compression Demo', ...% 设置调用标题 'Visible','off', 'Resize', 'off',... %设置可见性和可收缩性 'Colormap', gray(256));%设置颜色范围 %==================================== top=0.92; left=0.785; btnWid=0.175; btnHt=0.06; spacing=0.025; frmBorder=0.02; frmBottom=0.05; frmHeight = 0.46; %==================================== %-------------------------- %应用按钮 labelStr='应用'; applyHndl=uicontrol( ...%设置调用句柄 'BusyAction','Queue','Interruptible','off',... 'Style','pushbutton', ...%设置控件类型 'Units','normalized', ... 'Position',[0.149 0.40 0.131 0.054], ...%设置位置 'String',labelStr, ... %设置控件名字 'Enable', 'on', ... %设置可用性 'Callback','dctdemo(''ApplyDCT'')');%设置调用功能函数函数 a1=uicontrol( ...%设置调用句柄 'BusyAction','Queue','Interruptible','off',... 'Style','pushbutton', ...%设置控件类型 'Units','normalized', ... 'Position',[0.149 0.20 0.131 0.054], ...%设置位置 'String','DCT变换', ... %设置控件名字 'Enable', 'on', ... %设置可用性 'Callback','pinp');%设置调用功能函数函数 %==================================== % 图像下拉条 hImgPop=uicontrol( ...%设置调用句柄 'Parent', DctDemoFig, ...%设置从属关系 'BusyAction','Queue','Interruptible','off',... 'Style','popupmenu', ...%设置控件类型 'BackgroundColor',[.8 .8 .8], ...%设置背景颜色 'Units','normalized', ... 'Position',[0.149 0.266 0.131 0.054], ...%设置位置 'String','Saturn|Pepper|Pout|Trees|Quarter|Circuit', ...%设置下拉选项 'Tag','ImagesPop', ... %设置调用得句柄 'Callback','dctdemo(''LoadNewImage'')');%设置调用功能函数 %==================================== % 图像选择标签 h = uicontrol( ...%设置调用句柄 'Parent', DctDemoFig, ...%设置从属关系 'BusyAction','Queue','Interruptible','off',... 'Style','text', ... %设置控件类型 'Units','normalized', ... 'Position',[0.149 0.32 0.131 0.045], ...%设置位置 'Horiz','center', ...%设置位置角度 'Background',[0.45 0.45 0.45], ...%设置背景颜色 'Foreground','white', ...%设置前端颜色 'String','选择图像:'); %==================================== % 信息按钮 labelStr='Info'; callbackStr='helpwin dctdemo'; yPos=frmBottom; helpHndl=uicontrol( ...%设置调用句柄 'Parent', DctDemoFig, ...%设置从属关系 'BusyAction','Queue','Interruptible','off',... 'Style','pushbutton', ...%设置控件类型 'Units','normalized', ... 'Position',[0.85 0.145 0.131 0.054], ...%设置位置 'String',labelStr, ...%设置控件名字 'Enable', 'off', ...%设置可用性 'Callback',callbackStr);%调用功能函数 %==================================== % 关闭按钮 labelStr='关闭'; callbackStr='close(gcf)'; yPos=frmBottom; closeHndl=uicontrol( ...%设置调用句柄 'Parent', DctDemoFig, ...%设置从属关系 'BusyAction','Queue','Interruptible','off',... 'Style','pushbutton', ...%设置控件类型 'Units','normalized', ... 'Position',[0.85 0.045 0.131 0.054], ...%设置位置 'Enable', 'off', ...%设置可用性 'String',labelStr, ...%设置控件名字 'Callback',callbackStr);%调用功能函数 %=================================== % 滚动条 barHeight = 0.04; barWidth = btnWid+2*frmBorder; sbBottom=top-barWidth-2*barHeight; sbLeft = left-frmBorder; textWidth = barWidth/2; scrollPos = [0.095 0.548 0.256 0.045]; callbackStr = 'dctdemo(''SliderUpdate'')'; hSlider = uicontrol( ...%设置调用句柄 'Parent', DctDemoFig, ...%设置从属关系 'BusyAction','Queue','Interruptible','off',... 'Style','slider', ...%设置控件类型 'Units','normalized', ... 'Position',scrollPos, ...%设置位置 'Value',64, ...%初始化变量值 'min',1, ...%设置输出最小值 'max',64, ...%设置输出最大值 'Interruptible','off', ... 'Callback',callbackStr);%调用功能函数 %----------------------------------------------------------- % 左右选取值的显示实现 c = get(DctDemoFig,'Color'); if [.298936021 .58704307445 .114020904255]*c'<.5, fgColor = [1 1 1]; else fgColor = [0 0 0]; end rangePos = [0.095 0.49 0.256 0.045]; %最小值显示实现 uicontrol( ... 'Parent', DctDemoFig, ...%设置从属关系 'BusyAction','Queue','Interruptible','off',... 'Style','text', ...%设置控件类型 'Units','normalized', ... 'Position',rangePos, ...%设置位置 'Horiz','left', ... 'Background',c, ...%设置颜色 'Foreground',fgColor, ...%设置颜色 'String','1');%设置初时值为1 rangePos = [0.1 0.49 0.25 0.045]; %设置最大值显示 uicontrol( ...%设置调用句柄 'Parent', DctDemoFig, ...%设置从属关系 'BusyAction','Queue','Interruptible','off',... 'Style','text', ...%设置控件类型 'Units','normalized', ... 'Position',rangePos, ...%设置位置 'Horiz','right', ...%设置值的位置 'Background',c, ...%设置颜色 'Foreground',fgColor, ...%设置颜色 'String','64'); %================================== % 8x8系数块的选择 h8x8 = axes( ...%设置调用句柄 'BusyAction','Queue','Interruptible','off',... 'Units','normalized', ... 'Position',[0.11 0.609 0.227 0.3], ...%设置位置 'XTick',[],'YTick',[], ...%设置坐标标尺显示为空 'ydir','reverse', ...%设置y坐标的显示方式 'Box','on', ...%设置坐标网格 'xlim',[1 9], ...%设置坐标x取值范围 'ylim',[1 9], ...%设置坐标y取值范围 'clim',[0 0.2], ...%设置颜色 'DataAspectRatio',[1 1 1]); title('DCT 能量系数');%设置标题 hSurf=surface(ones(9),'facecolor','flat','edgecolor',[1 0 0]);%在8x8系数块上话网格表面 %--------------------------- %选中的系数显示 hNumCof = uicontrol(... %设置调用句柄 'BusyAction','Queue','Interruptible','off',... 'Style','text', ...%设置控件类型 'Units','normalized', ... 'Position',[0.099 0.453 0.248 0.047], ...%设置位置 'Horiz','center', ...%设置设置水平显示 'Background',[0.4,0.8,0.95], ...%设置背景颜色 'Foreground',[1 0 1], ...%设置颜色 'String','64 Coefficients Selected');%设置字体颜色 %------------------------------------------- %原来图像显示坐标 hTrueAx = axes( ...%设置调用句柄 'units', 'pixels', ... 'BusyAction','Queue','Interruptible','off',... 'ydir', 'reverse', ...%设置y轴显示方式 'XLim', [.5 128.5], ...%设置x轴取值范围,也是象素范围 'YLim', [.5 128.5],...%设置y轴取值范围,即象素范围 'CLim', [0 1], ...%设置颜色 'XTick',[],'YTick',[], ...%设置坐标轴标尺为空 'Position', [400 394 200 200]); %原来图像图像数据 blank = repmat(uint8(0),128,128);%128*128空矩阵 hTrueImage = image('Parent', hTrueAx,...%设置调用句柄 'CData', blank, ...%设置颜色矩阵为空 'BusyAction','Queue','Interruptible','off',... 'CDataMapping', 'scaled', ... 'Xdata', [1 128],...%设置颜色取值范围 'Ydata', [1 128],...%设置颜色取值范围 'EraseMode', 'none'); %----------------------------------------------- %处理后图像显示坐标 hNewAx = axes( ...%设置调用句柄 'units', 'pixels', ... 'BusyAction','Queue','Interruptible','off',... 'ydir', 'reverse', ...%设置y轴显示方式 'XLim', [.5 128.5], ...%设置x轴取值范围,也是象素范围 'YLim', [.5 128.5],...%设置y轴取值范围,即象素范围 'CLim', [0 1], ...%设置颜色 'XTick',[],'YTick',[], ...%设置坐标轴标尺为空 'Position', [650 394 200 200]);%设置坐标轴显示位置 title('处理后图像'); %处理后图像信息 hNewImage = image('Parent', hNewAx,...%设置调用句柄,及从属关系 'CData', blank, ...%设置颜色矩阵为空 'BusyAction','Queue','Interruptible','off',... 'CDataMapping', 'scaled', ... 'Xdata', [1 128],...%设置颜色取值范围 'Ydata', [1 128],...%设置颜色取值范围 'EraseMode', 'none'); %---------------------------------- %图像损失坐标 hErrAx = axes(...%设置调用句柄 'units', 'pixels', ... 'BusyAction','Queue', 'Interruptible','off',... 'ydir', 'reverse', ...%设置y轴显示方式 'XLim', [.5 128.5], ...%设置x轴取值范围,也是象素范围 'YLim', [.5 128.5],...%设置y轴取值范围,即象素范围 'CLim', [-0.8 0.8], ...%设置颜色 'XTick',[],'YTick',[], ...%设置坐标轴标尺为空 'Position', [650 143 200 200]); title('图像损失信息'); %损失数据¨ hErrImage = image('Parent', hErrAx,...%设置调用句柄,及从属关系 'CData', blank, ...%设置颜色矩阵为空 'BusyAction','Queue','Interruptible','off',... 'CDataMapping', 'scaled', ... 'Xdata', [1 128],...%设置颜色取值范围 'Ydata', [1 128],...%设置颜色取值范围 'EraseMode', 'none'); %---------------------------------------------- % 状态条 % rangePos = [64 3 280 15]; rangePos = [0 .01 .75 .05]; hStatus = uicontrol( ...%设置调用句柄 'Parent', DctDemoFig, ...%设置从属关系 'BusyAction','Queue','Interruptible','off',... 'Style','text', ...%设置类型 'Units','normalized', ... 'Position',rangePos, ...%设置位置 'Horiz','center', ...%设置水平摆放 'Background',c, ...%设置颜色 'Foreground',[.8 0 0], ...%设置颜色 'Tag', 'Status', ...%设置调用标题 'String','状态条');%设置名字 %------------------------- %生成频域能量显示区坐标区 hTrueZF = axes( ...%设置调用句柄 'units', 'pixels', ... 'BusyAction','Queue','Interruptible','off',... 'ydir', 'reverse', ...%设置y轴显示方式 'XLim', [.5 128.5], ...%设置x轴取值范围,也是象素范围 'YLim', [.5 128.5],...%设置y轴取值范围,即象素范围 'XTick',[],'YTick',[], ...%设置坐标轴标尺为空 'Position', [400 143 200 200]);%设置位置 title('原始图像频域图'); %生成频域能量显示区颜色区 hTrueZFimage = image('Parent', hTrueZF,... 'CData', blank, ... 'BusyAction','Queue','Interruptible','off',... 'CDataMapping', 'scaled', ... 'Xdata', [1 128],... 'Ydata', [1 128],... 'EraseMode', 'none'); %------------------------------------------------------------- set(DctDemoFig,'defaultaxesposition',[0.10 0.1 0.60 0.85])%设置主框架显示的位置 setstatus(DctDemoFig, 'Initializing DCT Demo...'); set(DctDemoFig, 'Pointer', 'watch'); drawnow set(DctDemoFig, 'Visible','on');%设置其为可见 % 初始化图像句柄,用结构语句实现 handles.TrueImage = hTrueImage;%原图颜色区句柄 handles.NewImage = hNewImage; %生成图颜色区句柄 handles.ErrImage = hErrImage;%图像差颜色句柄 handles.h8x8 = h8x8; %8*8块矩阵句柄 handles.Slider = hSlider; %滑动条句柄 handles.Surface = hSurf; %表面格矩阵句柄 handles.ImgPop = hImgPop; %图像下拉条 handles.TrueAx = hTrueAx;%原图坐标句柄 handles.NewAx = hNewAx;%处理后图像坐标句柄 handles.ErrAx = hErrAx;%图像差坐标句柄 handles.NumCof = hNumCof;%能量系数句柄 handles.TrueZF = hTrueZF;%频域坐标区句柄 handles.TrueZFimage=hTrueZFimage;%频域颜色区句柄 set(DctDemoFig, 'UserData',handles);%把以上初始化的句柄赋值给DctDemoFig LoadNewImage(DctDemoFig) %导入图像 set(DctDemoFig, 'HandleVisibility','Callback') set([helpHndl closeHndl applyHndl], 'Enable', 'on');%设置各个控件可用 return %------------------------------------ %导入图像函数 function LoadNewImage(DemoFig) if nargin<1 %输入数据为0,则进行下一步操作 DemoFig = gcbf;%获取当前图形窗口句柄并赋值给DemoFig end set(DemoFig,'Pointer','watch'); handles = get(DemoFig,'UserData');%获取当前窗口句柄数据并做赋值 hTrueImage=handles.TrueImage;%当前图像数据赋值给当前颜色区进行操作 hTrueAx = handles.TrueAx;%获取当前图像坐标并赋值给原图像坐标轴 hTrueZF=handles.TrueZF;%当前图像频域赋值给当前频域坐标区进行操作 hTrueZFimage=handles.TrueZFimage;%当前图像频域赋值给当前频域颜色区进行操作 hImgPop=handles.ImgPop;%图像下拉条 v = get(hImgPop,{'value','String'}); name = deblank(v{2}(v{1},:)); setstatus(DemoFig, ['导入图像:' name ' ']); drawnow %选择图像 switch name case 'Saturn', saturn = []; %确保图像名字不被占用或者有值,保证调用到系统图像 load imdemos saturn %导入图像 img = double(saturn)/256;%double型处理 set(handles.ErrAx, 'CLim', [-.45 .45]); %进行DCT变换并显示频谱图 case 'Pout', pout = []; %确保图像名字不被占用或者有值,保证调用到系统图像 load imdemos pout img = double(pout)/255; set(handles.ErrAx, 'CLim', [-.33 .33]); %进行DCT变换并显示频谱图 case 'Trees', trees = []; %确保图像名字不被占用或者有值,保证调用到系统图像 load imdemos trees img = double(trees)/255; set(handles.ErrAx, 'CLim', [-.72 .72]); %进行DCT变换并显示频谱图 case 'Quarter', quarter = []; %确保图像名字不被占用或者有值,保证调用到系统图像 load imdemos quarter img = double(quarter)/255; set(handles.ErrAx, 'CLim', [-.52 .52]); case 'Circuit', circuit = []; %确保图像名字不被占用或者有值,保证调用到系统图像 load imdemos circuit img = double(circuit)/255; set(handles.ErrAx, 'CLim', [-.32 .32]); case 'Pepper', pepper = []; %确保图像名字不被占用或者有值,保证调用到系统图像 load imdemos pepper img = double(pepper)/255; set(handles.ErrAx, 'CLim', [-.65 .65]); %进行DCT变换并显示频谱图 otherwise error('DCTDEMO: Unknown Image Option!'); end %------------------------------ %------------------------------- set(hTrueImage, 'Cdata', img);%把导入的图像加载到原图像显示区 set(get(hTrueAx,'title'),'string',['原始图像 ' name ]); %设置名字 blank = repmat(uint8(0),128,128); set(handles.NewImage, 'Cdata', blank);%初始化处理后图像颜色区为空 set(handles.ErrImage, 'Cdata', blank);%初始化图像差颜色区为空 set(handles.TrueZFimage, 'Cdata', blank); drawnow MakeDCT(DemoFig);%调用MakeDCT函数 SliderUpdate(DemoFig);%调用SliderUpdate函数 ApplyDCT(DemoFig);%调用ApplyDCT函数 return; %MakeDCT(DemoFig) %实现调用滑条数据做为矩阵块的数目 %并调用矩阵块形成的矩阵以选中能力系数 function MakeDCT(DemoFig) setstatus(DemoFig, 'Computing DCT...'); handles = get(DemoFig,'UserData'); hTrueImage=handles.TrueImage; hNewImage=handles.NewImage; h8x8=handles.h8x8; hImgPop=handles.ImgPop;%图像下拉条 hSlider=handles.Slider;%获取滑动条输出数据做选择多少个矩阵格 hSurf=handles.Surface;%获取矩阵格形成的选取能量系数矩阵参数 hTrueZF=handles.TrueZF;%频域坐标区句柄 hTrueZFimage=handles.TrueZFimage;%频域颜色区句柄 %---------------------------------------------- I = getimage(hTrueImage);%获取导入的图像以便进行处理 J=double(I)/0.1; J=dct2(J); m=log(abs(J)); set(hTrueZFimage , 'Cdata', m);%显示频谱到显示区 drawnow %------------------------------------------------- dctm = dctmtx(8);%产生8*8矩阵块矩阵算子 % Old call: imageDCT = blkproc(I,[8 8],'dct2'); imageDCT = blkproc(I,[8 8],'P1*x*P2',dctm,dctm.');%对图像进行分块,把其分为8*8小块 DCTvar = im2col(imageDCT,[8 8],'distinct').';%重调图像块为列 n = size(DCTvar,1); DCTvar = (sum(DCTvar.*DCTvar) - (sum(DCTvar)/n).^2)/n; [dum,order] = sort(DCTvar);% 按照一定顺序排列 set(hTrueImage,'UserData',imageDCT) set(hSlider,'UserData',[DCTvar;order]) return % ApplyDCT 子函数 function ApplyDCT(DemoFig) if nargin<1 DemoFig = gcbf; end set(DemoFig,'Pointer','watch'); drawnow; handles = get(DemoFig,'UserData'); hTrueImage=handles.TrueImage; hNewImage=handles.NewImage; hErrImage=handles.ErrImage; h8x8=handles.h8x8; hSlider=handles.Slider; hSurf=handles.Surface; hNewAx=handles.NewAx; hImgPop=handles.ImgPop;%图像下拉条 hTrueZF=handles.TrueZF;%频域坐标区句柄 hTrueZFimage=handles.TrueZFimage;%频域颜色区句柄 imageDCT = get(hTrueImage,'UserData'); %--------------------------------------- %----------------------------------------- if isempty(imageDCT), MakeDCT(DemoFig); imageDCT = get(hTrueImage,'UserData'); end %------------------------- %-------------------------------------------------- setstatus(DemoFig, '重构 image...'); drawnow; % 获取系数矩阵 mask = get(hSurf,'Cdata'); % 产生8*8矩阵 dctm = dctmtx(8); %重构和显示图像 % newImage = blkproc(imageDCT,[8 8],'idct2(x.*P1)',mask(1:8,1:8)); newImage = blkproc(imageDCT,[8 8],'P1*(x.*P2)*P3',dctm.',mask(1:8,1:8),dctm); set(hNewImage, 'CData', newImage); drawnow; trueImage = getimage(hTrueImage); set(hErrImage, 'CData', trueImage-newImage); error = (trueImage.^2 - newImage.^2); MSE = sum(error(:))/prod(size(trueImage));%求均方误差 if MSE < 1e-10, MSE=0; end msestr = sprintf('%0.3g',MSE); setstatus(DemoFig, ['重建图像的均方误差MSE是 ' msestr ' .']); set(DemoFig,'Pointer','arrow'); drawnow return % 滚动条具体函数 function SliderUpdate(DemoFig) if nargin<1 DemoFig = gcbf; end handles = get(DemoFig,'UserData'); hSlider=handles.Slider; hSurf=handles.Surface; axHndl=gca; v = 64-floor(get(hSlider,'value')); var = get(hSlider,'UserData'); DCTvar = var(1,:); order = var(2,:); if v==63 set(handles.NumCof, 'String', [int2str(64-v) ' Coefficient Selected']); else set(handles.NumCof, 'String', [int2str(64-v) ' Coefficients Selected']); end mask = ones(8,8); mask(order(1:v)) = zeros(1,v); im8x8 = zeros(9,9); im8x8(1:8,1:8) = mask; set(hSurf,'Cdata',im8x8); if nargin==0 setstatus(DemoFig, '请按 ''应用'' 键重新构建图像.'); end return