5. 对话框 — dialog、uigetfile、uiputfile…(函数)
- 功能:对话框用于显示信息和获取输入数据
- 以下格式为常用格式,其他调用可是可以查表
1)空的模态对话框 — dialog
2)打开文件的对话框— uigetfile
- 格式:[文件名, 文件路径(, 筛选器索引)] = uigetfile(文件类型,对话框标题名,返回的文件类型);
3)保存文件的对话框 — uiputfile
- 格式:[文件名, 文件路径(, 筛选器索引)] = uiupfile(文件类型,对话框标题名,返回的文件类型);
4)通用信息对话框 — msgbox
-
格式:msgbox(需要显示的消息,对话框标题名,消息框中的图标(,对话框设置createmode));
createmode可以取‘modal’、‘non-modal’、‘replace’或结构体数组
5)错误信息对话框 — errordlg
-
格式:HANDLE = errordlg(需要显示的消息,对话框标题名(,对话框设置createmode));
createmode可以取‘modal’、‘non-modal’、‘replace’或结构体数组
-
例子:实现图像打开、显示、镜像变换与存储
clear,clc,close all; clc,clear,close all; hf = figure('Position',[400,400,600,400],'Name','demo13','NumberTitle','off','MenuBar','none'); ax1 = axes('Position',[0.1,0.1,0.4,0.8],'Box','on'); ax2 = axes('Position',[0.55,0.1,0.4,0.8],'Box','on'); hm1 = uimenu(hf,'Label','文件'); hm11 = uimenu(hm1,'Label','打开图像','CallBack',{@OpenImage_CallBack,ax1}); %只能打开matlabCode文件夹里面的文件 hm21 = uimenu(hm1,'Label','水平镜像','CallBack',{@ImagePro_CallBack, ax2}); hm31 = uimenu(hm1,'Label','保存图像','CallBack',{@SaveImage_CallBack}); hm2 = uimenu(hf,'label','退出','CallBack','close(hf)'); function OpenImage_CallBack(~,~,ax) %自定义打开图像菜单回调函数 fmt = {'*.jpg','JPEG image(*.jpg)';'*.*','All Files(*.*)'};%自定义打开图像菜单回调函数 [images,~] = uigetfile(fmt,'打开图像','*.jpg'); global Image; %j将变量声明为全局变量 Image = imread(images); axes(ax); imshow(Image),title('原始图像'); axis off; end function ImagePro_CallBack(~,~,ax) %自定义水平镜像菜单回调函数 global result; global Image; result = fliplr(Image); %水平镜像 axes(ax); imshow(result),title('水平镜像'); axis off; end function SaveImage_CallBack(~,~) %自定义保存图像菜单回调函数 global result; if isempty(result) %如果没有变换图像,则不需要保存。点击保存会跳出错误信息对话框 mode = struct('WindowStyle','nonmodal','Interpreter','tex'); %创建结构体mode,以指定模态窗口样式和TeX解释器 errordlg('没有变换图像','流程错误',mode); %创建一个错误对话框,指定结构体mode作为输入参数 else [FileName, PathName] = uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'另存为'); FileFullName = strcat(PathName, FileName); imwrite(result,FileFullName); end end
-
初始界面
- 文件下面的下拉标签,选取打开图像
- 将打开的图像进行水平镜像操作
-
保存图像
6)问题提示对话框 — questdlg
-
采用questdlg函数提出问题并接受用户的回’Yes’、‘No’、‘Cancel’、’ ’
-
格式:ButtonName = questdlg(问题信息,对话框标题,按钮);
-
例子:创建一个提示对话框,选择是否退出
clear,clc,close all;
hf = figure('Position',[400,400,600,400],'Name','demo13','NumberTitle','off','MenuBar','none');
ax1 = axes('Position',[0.1,0.1,0.4,0.8],'Box','on');
ax2 = axes('Position',[0.55,0.1,0.4,0.8],'Box','on');
hm1 = uimenu(hf,'Label','文件');
hm11 = uimenu(hm1,'Label','打开图像','CallBack',{@OpenImage_CallBack,ax1});
hm21 = uimenu(hm1,'Label','水平镜像','CallBack',{@ImagePro_CallBack, ax2});
hm31 = uimenu(hm1,'Label','保存图像','CallBack',{@SaveImage_CallBack});
hm2 = uimenu(hf,'label','退出','CallBack',{@close_CallBack, hf});
function OpenImage_CallBack(~,~,ax) %自定义打开图像菜单回调函数
fmt = {'*.jpg','JPEG image(*.jpg)';'*.*','All Files(*.*)'};%自定义打开图像菜单回调函数
[images,~] = uigetfile(fmt,'打开图像','*.jpg');
global Image; %将变量声明为全局变量
Image = imread(images);
axes(ax);
imshow(Image),title('原始图像');
axis off;
end
function ImagePro_CallBack(~,~,ax) %自定义水平镜像菜单回调函数
global result;
global Image;
result = fliplr(Image); %水平镜像
axes(ax);
imshow(result),title('水平镜像');
axis off;
end
function SaveImage_CallBack(~,~) %自定义保存图像菜单回调函数
global result;
if isempty(result) %如果没有变换图像,则不需要保存。点击保存会跳出错误信息对话框
mode = struct('WindowStyle','nonmodal','Interpreter','tex'); %创建结构体mode,以指定模态窗口样式和TeX解释器
errordlg('没有变换图像','流程错误',mode); %创建一个错误对话框,指定结构体mode作为输入参数
else
[FileName, PathName] = uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'另存为');
FileFullName = strcat(PathName, FileName);
imwrite(result,FileFullName);
end
end
function close_CallBack(~,~,hf)
ButtonName = questdlg('是否确定退出?','退出');
switch ButtonName
case 'Yes'
close(hf);
otherwise
msgbox('请继续使用','你好');
end
end
例子:把图像镜像的方法改一下,镜像前显示一个问题提示对话框
clear,clc,close all;
hf = figure('Position',[400,400,600,400],'Name','demo13','NumberTitle','off','MenuBar','none');
ax1 = axes('Position',[0.1,0.1,0.4,0.8],'Box','on');
ax2 = axes('Position',[0.55,0.1,0.4,0.8],'Box','on');
hm1 = uimenu(hf,'Label','文件');
hm11 = uimenu(hm1,'Label','打开图像','CallBack',{@OpenImage_CallBack,ax1}); %只能打开matlabCode文件夹里面的文件
hm21 = uimenu(hm1,'Label','水平镜像','CallBack',{@ImagePro_CallBack, ax2});
hm31 = uimenu(hm1,'Label','保存图像','CallBack',{@SaveImage_CallBack});
hm2 = uimenu(hf,'label','退出','CallBack',{@close_CallBack, hf});
function OpenImage_CallBack(~,~,ax) %自定义打开图像菜单回调函数
fmt = {'*.jpg','JPEG image(*.jpg)';'*.*','All Files(*.*)'};%自定义打开图像菜单回调函数
[images,~] = uigetfile(fmt,'打开图像','*.jpg');
global Image; %j将变量声明为全局变量
Image = imread(images);
axes(ax);
imshow(Image),title('原始图像');
axis off;
end
function ImagePro_CallBack(~,~,ax) %自定义水平镜像菜单回调函数
global result;
global Image;
ButtonName = questdlg('是否要进行镜像处理?','图像镜像处理');
switch ButtonName
case 'Yes'
result = fliplr(Image); %水平镜像
axes(ax);
imshow(result),title('水平镜像');
axis off;
otherwise
msgdlg('欢迎下次处理','你好');
end
end
function SaveImage_CallBack(~,~) %自定义保存图像菜单回调函数
global result;
if isempty(result) %如果没有变换图像,则不需要保存。点击保存会跳出错误信息对话框
mode = struct('WindowStyle','nonmodal','Interpreter','tex'); %创建结构体mode,以指定模态窗口样式和TeX解释器
errordlg('没有变换图像','流程错误',mode); %创建一个错误对话框,指定结构体mode作为输入参数
else
[FileName, PathName] = uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'另存为');
FileFullName = strcat(PathName, FileName);
imwrite(result,FileFullName);
end
end
function close_CallBack(~,~,hf)
ButtonName = questdlg('是否确定退出?','退出');
switch ButtonName
case 'Yes'
close(hf);
otherwise
msgbox('请继续使用','你好');
end
end
7)警告信息对话框 — warndlg
- 格式:HANDLE = warndlg(内容,对话框标题);
8)输入信息对话框 — inputdlg
-
格式:ANSWER = inputdlg(输入的字段,对话框标题,常数/列向量/行向量/2列矩阵,默认值);
-
例子:inputdlg对话框里面输入要求,根据结果实现图像处理。在上例的基础上,加一个阈值化和灰度化
(展示增加的代码)
hm3 = uimenu(hf,'Label','图像增强');
hm31 = uimenu(hm3,'Label','输入要求','CallBack',{@InputR_CallBack,ax2});
function InputR_CallBack(~,~,ax)
global Image;
global result;
prompt = {'请输入处理要求(阈值化或灰度化):','请输入参数(阈值或通道颜色通道):'};%两个输入窗口的提示信息
name = '输入要求'; %窗口标题
lines = 1; %输入窗口的行数为1
def = {'阈值化','128'}; %设置默认输入
answer = inputdlg(prompt,name,lines,def);
if length(answer) == 0
return;
end
method = string(answer{1}); %获取第一个输入,字符串表示
value = str2num(answer{2}); %获取第二个输入,数字表示
axes(ax);
switch method
case '阈值化'
value = value/255;
result = imbinarize(rgb2gray(Image),value);
imshow(result),title(method);
case '灰度化'
chan = uint8(value);
result = Image(:,:,chan);
imshow(result),title(method);
otherwise
warndlg('输入不合法!','警告');
end
end
- 初始界面
-
阈值化
-
灰度化
-
输入错误显示警告