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