Matlab GUI 学习笔记 Ⅰ
1. Foreword
- Matlab 是严格意义上的编程语言吗?曾经有人告诉我他是通过 Matlab 学会了面对对象编程,我是不信的,但这依然不妨碍它在特殊领域的强大功能。因为选修了这1个学分的 Matlab GUI 设计,亦有人表达了对Previous Matlab Blog的一些情绪,便写上一些 Matlab GUI 编程学习的心得。
- 标题虽为Matlab GUI 学习笔记 Ⅰ,亦可成为称为图像处理技术应用实践 - 课程设计 1 指北。
- 本文所用环境为 Matlab R2018a 中文版。
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:
[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:
[SaveImagePathName] = uigetdir(\'C:\\Users\\Public\\Pictures\\Sample Pictures\',\'请选择文件夹\');
filepath=fullfile(SaveImagePathName,\'result.jpg\');
imwrite(ResultImage,filepath,\'jpg\');
3.2.3 显示图片
axes()
定位显示axesimshow()
显示图片- Code:
axes(findobj(\'tag\', \'axes1\'));
InputImage=imread(FirstImageFullPath);
imshow(InputImage);
3.3 Transition
实现效果 :
3.3.1 平移
imdilate()
函数实现图像平移- Code:
se=translate(strel(1),[100,100]);
ResultImage=imdilate(InputImage,se);
3.3.2 用户交互
inputdlg()
函数打开对话框与用户交互- 根据获得的返回值设置参数
- 后文函数中涉及到用户交互部分略去
- Code:
defaulta={\'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语句嵌套判断切换按钮标题:
now = get(hObject,\'String\');
if now == \'剪切\'
set(hObject,\'String\',\'确定\');
else
set(hObject,\'String\',\'剪切\');
end
3.6.2 剪切图像
- 使用
imrect()
创建图像选区
e.g.imrect(句柄,选区大小); getPosition()
获得位置imcrop()
剪辑图像- Code:
h=imrect(handles.axes1, [10 10 100 100]);
pos=getPosition(h);
ResultImage=imcrop(InputImage, pos);
3.6.3 其他功能
getAPI()
获得函数句柄addNewPositionCallback()
添加监听器makeConstrainToRectFcn()
监听器事件
api = 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 投影
- 见书。
- 参考
3.8 Affine & Transformation & ... & Postscript
No longer.