实验:GUI设计图像空间变换系统
1. Foreword#
2. Task#
Matlab GUI编程,设计并实现一个图像空间变换系统。
要求:
能对图像进行平移、旋转、缩放、剪切、投影、仿射、变换以及各种复合变换;
能将各种变换后结果保存为图像文件;
各种变换可以采用按钮或者菜单的方式进行;
变换时的用户可以自行设置简单的变换参数。
3. Function#
3.1 Create#
在命令行窗口中输入
guide
选择新建 GUI 标签 Blank GUI(Default)中文版汉化的比较完整,左侧工具条中所有选项对应的控件都有其中文名称。
在面板上右击 -> 检查器 -> Name 即可修改窗体标题
主要用到AXES、BUTTON控件
3.2 File#
万事的起源。
实现效果 :
3.2.1 打开图片#
uigetdir 选择文件(夹)
imread()
读入图像Code:
Copy[ReadImageFileName,ReadImagePathName,ReadImageFilterIndex] = uigetfile({'*.jpg;*.png;*.tif','ImageFile(*.jpg;*.png;*.tif)';... '*.jpg','JPEGImageFile(*.jpg)';'*.*','AllFile(*.*)'},'ReadImage',... 'MultiSelect','off',... 'C:\Users\Public\Pictures\Sample Pictures'); FirstImageFullPath = fullfile(ReadImagePathName,ReadImageFileName); InputImage=imread(FirstImageFullPath);
3.2.2 保存图片#
uigetdir 选择文件(夹)
imwrite()
保存文件Code:
Copy[SaveImagePathName] = uigetdir('C:\Users\Public\Pictures\Sample Pictures','请选择文件夹'); filepath=fullfile(SaveImagePathName,'result.jpg'); imwrite(ResultImage,filepath,'jpg');
3.2.3 显示图片#
axes()
定位显示axesimshow()
显示图片Code:
Copyaxes(findobj('tag', 'axes1')); InputImage=imread(FirstImageFullPath); imshow(InputImage);
3.3 Transition#
实现效果 :
3.3.1 平移#
imdilate()
函数实现图像平移Code:
Copyse=translate(strel(1),[100,100]); ResultImage=imdilate(InputImage,se);
3.3.2 用户交互#
inputdlg()
函数打开对话框与用户交互根据获得的返回值设置参数
后文函数中涉及到用户交互部分略去
Code:
Copydefaulta={'100'}; a=inputdlg('请输入x轴参数','',1,defaulta);
3.4 rotate#
实现效果:
使用
imrotata()
函数Code :
ResultImage = imrotate(InputImage,90);
3.5 Scale#
实现效果:
使用
resize()
函数Code :
ResultImage=imresize(InputImage,1.5);
3.6 Clipping#
个人认为最难的部分。
最终实现效果:
3.6.1 按钮交互#
get(hObject,'String');
返回值为按钮的标题set(hObject,'String','ChangeToTitle');
改变按钮的标题使用if语句嵌套判断切换按钮标题:
Copynow = get(hObject,'String'); if now == '剪切' set(hObject,'String','确定'); else set(hObject,'String','剪切'); end
3.6.2 剪切图像#
使用
imrect()
创建图像选区
e.g.imrect(句柄,选区大小);getPosition()
获得位置imcrop()
剪辑图像Code:
Copyh=imrect(handles.axes1, [10 10 100 100]); pos=getPosition(h); ResultImage=imcrop(InputImage, pos);
3.6.3 其他功能#
getAPI()
获得函数句柄addNewPositionCallback()
添加监听器makeConstrainToRectFcn()
监听器事件
Copyapi = iptgetapi(h); api.addNewPositionCallback(@(p) title(mat2str(p,3))); %标题显示选区大小 fcn = makeConstrainToRectFcn('imrect',get(gca,'XLim'),get(gca,'YLim')); api.setPositionConstraintFcn(fcn); %防止选区超出axes范围
3.7 Projection#
实现效果:
3.7.1 提问框交互#
questdlg(Title,Text,choice,...,DafaultChoice)
提问框函数Code :
s = questdlg('请选择投影方式','参数','垂直','水平','垂直水平','垂直');
3.7.2 投影#
见书。
========================================
GUI使用总结:
1、matlab图形系统以图形对象为基本单元,图形对象称为图形句柄。
句柄可以通过底层函数来精细的进行控制,图形对象系统按树形结构管理。
2、图形对象的属性:
属性名:大小写混排,每个单词首字母为大写;
创建时改变属性:属性名、属性值
创建后改变属性:get(),set()
3、GUIDE接班概念:
函数建立GUI、使用向导建立GUI
属性,事件,响应,响应函数;
4、一些常用属性:
---edit文本编辑器:
TooltipString:提示文字
String:文本内容
Tag:控件索引变量名
---静态文本框:显示效果作用
5、CallBack回调函数:事件激发时,调用的函数;
CreateFcn函数:创建函数,对其背景色进行设置;无需改变;
6、num1=str2num(get((handles.edit_add1),'String'));
num2=str2num(get((handles.edit_add2),'String'));;%获取文本控件数据
r=num1+num2;
r=num2str(r);%转化为字符串
set(handles.result,'String',r);%设置:控件标号,属性,值
% guidata(hObject, handles);%将相应句柄数据更新保存,可有可无
7、对话框
8、;-------------------gui执行步骤-------------
第一步:进入function varargout = test(varargin)
在主函数中完成gui的创建(例如:figure、edit等控件),这其中如果控件的CreatFcn为自动默认%automatic时,主函数在初始阶段只调用一次;如果有CreatFcn,则在gui创建阶段,会多次调用主函数,通过主函数再调用各控件的CreatFcn,完成gui创建。
第二步:执行OpeningFcn(这也是在通过主函数调用),在OpeningFcn中完成变量的初始化与主程序输入变量varargin的处理。
第三步:执行OutputFcn(这也是在通过主函数调用),在OutputFcn中可以对输出变量varargout处理。
第四步:等待外界事件触发,主函数响应事件(例如:按键、鼠标事件),主函数调用回调函数Callback完成响应。
9、在axes中显示一副图片:
str='C:\Users\Administrator\Pictures\duck.jpg';
I=imread(str);
axes(handles.axes2);
imshow(I);
10、close%程序退出
11、清空坐标轴显示:
cla(handles.axes2);%清空坐标轴内容
12、清空edit文本框内容:
set(handles.address,'String',' ');%清空edit文本框
============================================
如何把gui文件编译成一个exe可执行文件?
按照上述4步,之后开始编译。
生成一个文件夹,里面有一个exe文件,就是编译成功的可执行文件。
(1)在没有安装MATLAB的电脑上运行exe文件时,必须先安装MCR(MATLAB Compiler Runtime),下载地址为:MCR官网: https://ww2.mathworks.cn/products/compiler/matlab-runtime.html
下载的MCR版本最好与生成exe文件的MATLAB版本对应或者更高,以确保能顺利运行。
(2)首次打开exe文件时,一般可能都要等待个一两分钟(电脑性能高低,等待时间会发生变化),这是正常现象,请耐心等待。如若等待时间过长,可打开任务管理器来查看exe文件是否顺利运行了。