数字图像处理小工具
时间:2024/4/18
内容:数字图像处理 大作业
工具:matlab
文档结构:
一、设计要求
二、功能介绍
三、项目结构
四、实现过程
一、设计要求
基本功能:
1)导入图片;
2)彩色图像灰度化;
3)灰度图像二值化;
4)两幅图像叠加;
5)两幅图像相减;
6)图像的灰度变换(指数变换、对数变换);
7)显示原图像直方图;将原图像直方图均衡化,显示处理后图像;显示处理后图像直方图;处理前后对比效果显示在一张图中
8)对图像分别添加高斯噪声和椒盐噪声,并分别用均值滤波器、中值滤波器、高斯滤波器处理,并将处理结果显示在一张图中;
9)分别采用robert和二阶算子提取图像边缘,并将处理结果显示在一张图中;
10)从频域对图像做平滑处理和提取边缘,并将处理结果显示在一张图中;
11)对原图做运动模糊,并进行图像复原处理,将原图、模糊图、恢复后的模糊图显示在一张结果图中;
12)对图像进行腐蚀、膨胀、开运算、闭运算处理,并将处理结果显示在一张图中;
13)主要要求:提取红苹果
建议方法:
a)将已知图像进行消噪处理
b)对彩色图像进行目标和背景分析
c)通过阈值法(检测红色)将图像进行分割
d)进行形态学处理,提取目标
14)硬币检测及计数
建议方法:
a)图像分割;
b)边缘检测、滤波去噪;
c)连通区域检测,判断硬币个数;
15)这里还会补充一个任务,现在还没想好。。。。
16)用Matlab设计实现图形化界面,调用后台函数完成设计,函数可以调用Matlab工具箱中的函数,也可以自己编写函数。设计完成后,点击GUI图形界面上的菜单或者按钮,在某些图像处理操作中能够接收参数,进行必要的交互式操作后,最终能显示运行结果。
二、功能介绍
补充.
三、项目结构
补充.
四、实现过程
先掌握对图形界面各个对象的使用,再组合在一起完成数字图像处理小工具。
初识图形化界面
1.目标
认识图形化界面基础文件结构和基本基础步骤,了解使用图形化界面制作小工具的基本流程。
2.步骤
(1)认识文件结构
先了解GUIDE的使用方法及文件结构,再通过图形化界面实现小工具。
GUI文件由.fig和.m文件组成。.fig文件是界面的布局设计,.m文件是GUI的核心,
当创建.fig文件后就会自动的生成配套的.m文件。.m文件共由4部分组成:主函数,Opening函数,Output函数,Callback回调函数。
(2)绘制图形化界面
执行guide命令,进入图形化界面编辑窗口,保存GUI界面到当前文件夹(生成.fig文件,对应全部GUI可视化界面)。
绘制基础界面,双击图形对象设置各自的Tag属性(Tag属性是每个图形对象的唯一标志),保存并运行(生成.m文件,对应GUI界面上的功能操作)。
(3)编写代码
右键图形对象,点击各自的"查看回调"按钮,就能定位到编辑器中的函数添加对应的代码来实现功能了;
图形界面局部功能分解
上传图
1.目标
点击”上传图像“实现图像上传。
2.实现
(1)图形化界面
绘制图形化界面,并设置对象的Tag值。
序号 | 类型 | Tag | String(如果有) |
---|---|---|---|
0 | Figure | figure1 | |
1 | Axes | axes1 | |
2 | pushbutton | pushbutton1 | 上传图 |
(2)代码
function pushbutton1_Callback(hObject, eventdata, handles)
%----------------------------------------上传图 新增代码
[filename,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','image files(*.bmp;*.jpg;*.png;*.jpeg)';...
'*.*','all file(*.*)'},...
'pick an image');%获取文件名、路径
fpath=[pathname filename];%将文件名和目录名组合成一个完整的路径
img_src=imread(fpath);%通过路径读取图片
setappdata(handles.axes1,'img_src',img_src);%保存原图
axes(handles.axes1);%指定操作窗口
imshow(img_src);%显示图片
3.效果
灰度图
1.目标
图像处理小工具中,有许多需要通过点击按钮实现对图像切换的操作,且变换后的图像显示在原来的区域。
以灰度图为例,点击”灰度图“,图像由原图切换为灰度图。
2.实现
(1)图形化界面
上述基础,新增”灰度图“按钮,并添加Tag值。
序号 | 类型 | Tag | String(如果有) |
---|---|---|---|
0 | Figure | figure1 | |
1 | Axes | axes1 | |
2 | pushbutton | pushbutton1 | 上传图 |
3 | pushbutton | pushbutton2 | 灰度图 |
(2)代码
function pushbutton1_Callback(hObject, eventdata, handles)
%----------------------------------------上传图
[filename,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','image files(*.bmp;*.jpg;*.png;*.jpeg)';...
'*.*','all file(*.*)'},...
'pick an image');%获取文件名、路径
fpath=[pathname filename];%将文件名和目录名组合成一个完整的路径
img_src=imread(fpath);%通过路径读取图片
setappdata(handles.axes1,'img_src',img_src);%保存原图
axes(handles.axes1);%指定操作窗口
imshow(img_src);%显示图片
%---------------------------------------灰度图 新增代码
imgray=im2gray(img_src);
setappdata(handles.axes1,'imgray',imgray);%保存灰度图
function pushbutton2_Callback(hObject, eventdata, handles)
%---------------------------------------灰度图 新增代码
imgray=getappdata(handles.axes1,'imgray');%获取灰度图
axes(handles.axes1);%操作指定窗口
imshow(imgray);%保存灰度图
3.效果
二值化
1.目标
图像处理小工具中,有许多需要通过调节阈值实现对图像变换的操作,且变换后的图像显示在原来的区域。
以图像二值化为例,拖动滑块,也可以输入数值,使图像变换为对应阈值下的二值图像。
2.实现
(1)图形化界面
上述基础,新增滑动条、静态文本、可编辑文本框,并添加Tag值。
序号 | 类型 | Tag | String(如果有) |
---|---|---|---|
0 | Figure | figure1 | |
1 | Axes | axes1 | |
2 | pushbutton | pushbutton1 | 上传图 |
3 | pushbutton | pushbutton2 | 灰度图 |
4 | text | text1 | 基于阈值将图像转换为二值图像val= |
5 | edit | edit1 | 0~1 |
6 | slider | slider1 |
(2)代码
function slider1_Callback(hObject, eventdata, handles)
%----------------------------------------------%二值化 滑动条 新增代码
val=get(hObject,'Value');%获取滚动条数值
set(handles.edit1,'String',num2str(val));%把滚动条值赋给文本
axes(handles.axes1);%指定当前处理坐标轴区域
img_src=getappdata(handles.axes1,'img_src');%获取应处理的图像
img_bw=im2bw(img_src,val);%图像二值化处理
imshow(img_bw);%在当前指定的坐标轴区域,显示处理后的二值化图像
function edit1_Callback(hObject, eventdata, handles)
%----------------------------------------------%二值化 文本框 新增代码
val = str2double(get(hObject,'String'));%获取文本值转为double
%%Determine whether val is a number between 0 and 1.
if isnumeric(val) && length(val)==1 && ...%是数值数据类型的数组且长度为1
val >= get(handles.slider1,'Min') && ... %大于等于滑动条的最小值
val <= get(handles.slider1,'Max') %小于等于滑动条的最大值
set(handles.slider1,'Value',val); %把文本值赋给滑动条的'value'属性
end
3.效果
由子界面处理主界面图像(异界面间数据传递global)
1.目标
点击父界面的”子界面“按钮,调出子界面,通过子界面实现对主界面图像的变换。
2.实现
(1)图形化界面
上述基础,新增”子界面“按钮、”父界面“静态文本,并添加Tag值。
序号 | 类型 | Tag | String(如果有) |
---|---|---|---|
0 | Figure | figure1 | |
1 | Axes | axes1 | |
2 | pushbutton | pushbutton1 | 上传图 |
3 | pushbutton | pushbutton2 | 灰度图 |
4 | text | text1 | 基于阈值将图像转换为二值图像val= |
5 | edit | edit1 | 0~1 |
6 | slider | slider1 | |
7 | pushbutton | pushbutton3 | 子界面 |
8 | text | text2 | 父界面 |
新建图形化界面,绘制并添加Tag值,保存,目录自动生成test2.fig和test.m。
序号 | 类型 | Tag | String(如果有) |
---|---|---|---|
0 | Figure | figure2 | |
1 | text | text1 | 子界面 |
3 | pushbutton | pushbutton1 | 灰度图 |
4 | text | text2 | 基于阈值将图像转换为二值图像val= |
5 | edit | edit1 | 0~1 |
6 | slider | slider1 | |
7 | pushbutton | pushbutton2 | 原图 |
(2)代码
test.m
function pushbutton1_Callback(hObject, eventdata, handles)
%----------------------父界面-------------------上传图
[filename,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','image files(*.bmp;*.jpg;*.png;*.jpeg)';...
'*.*','all file(*.*)'},...
'pick an image');%获取文件名、路径
fpath=[pathname filename];%将文件名和目录名组合成一个完整的路径
img_src=imread(fpath);%通过路径读取图片
setappdata(handles.axes1,'img_src',img_src);%保存原图
axes(handles.axes1);%指定操作窗口
imshow(img_src);%显示图片
%----------------------父界面-------------------灰度图
imgray=im2gray(img_src);
setappdata(handles.axes1,'imgray',imgray);%保存灰度图
%----------------------父界面-------------------数据传递 新增代码
setappdata(handles.figure1,'img_src',img_src);%保存原图
setappdata(handles.figure1,'imgray',imgray);%保存灰度图
set(handles.axes1,'Units','normalized')%数值归一化处理
pos=get(handles.axes1,'Position');%获取原坐标区位置
handles.h_axes = axes(...%在父界面上重新绘制显示图像的坐标区
'Parent', handles.figure1, ... % 规定父对象为figure1---重要
'Units', 'Normalized', ... % 规定尺度单位为百分比---重要
'Position', [pos(1) pos(2) pos(3) pos(4)]); % 规定图形出现位置---重要
setappdata(handles.figure1,"h_axes",handles.h_axes);
global h_axes;
h_axes=getappdata(handles.figure1,"h_axes");
imshow(img_src);%显示图片
function pushbutton3_Callback(hObject, eventdata, handles)
%----------------------父界面-------------------子界面 新增代码
test2;
test2.m
function test2_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
%----------------------子界面-------------------初始化 提示信息
disp('OpeningFcn...test2')
%----------------------子界面-------------------数据传递
h_figure1=findall(figure(test),'Tag','figure1');% 得到父界面的句柄
h_figure1=guihandles(h_figure1);%返回该对象及其所有子对象(父界面上的所有对象)必不可少
setappdata(handles.figure2,'h_figure1',h_figure1);%保存父界面句柄
img_src=getappdata(h_figure1.figure1,'img_src');%获取原图
imgray=getappdata(h_figure1.figure1,'imgray');%获取灰度图
setappdata(handles.figure2,'img_src',img_src);%设置原图
setappdata(handles.figure2,'imgray',imgray);%设置灰度图
function pushbutton1_Callback(hObject, eventdata, handles)
%----------------------子界面-------------------灰度图 新增代码
global h_axes;
axes(h_axes);
imgray=getappdata(handles.figure2,'imgray');%从父界面获取灰度图
imshow(imgray);%显示灰度图
set(handles.edit1,'String',0);%文本值归零
set(handles.slider1,'Value',0)%滑动条值归零
function pushbutton2_Callback(hObject, eventdata, handles)
%----------------------子界面-------------------原图 新增代码
global h_axes;
axes(h_axes);%指定操作窗口 为父对象为figure1的Axes
im_src=getappdata(handles.figure2,'img_src');%获取原图
imshow(im_src);%显示原图
set(handles.edit1,'String',0);%文本值归零
set(handles.slider1,'Value',0)%滑动条值归零
function edit1_Callback(hObject, eventdata, handles)
%----------------------子界面-------------------%二值化 文本框 新增代码
val = str2double(get(hObject,'String'));%获取文本值转为double
%%Determine whether val is a number between 0 and 1.
if isnumeric(val) && length(val)==1 && ...%是数值数据类型的数组且长度为1
val >= get(handles.slider1,'Min') && ... %大于等于滑动条的最小值
val <= get(handles.slider1,'Max') %小于等于滑动条的最大值
set(handles.slider1,'Value',val); %把文本值赋给滑动条的'value'属性
end
function slider1_Callback(hObject, eventdata, handles)
%----------------------子界面-------------------%二值化 滑动条 新增代码
val=get(hObject,'Value');%获取滚动条数值
set(handles.edit1,'String',num2str(val));%把滚动条值赋给文本
global h_axes;
axes(h_axes);
img_src=getappdata(handles.figure2,'img_src');%获取原图
img_bw=im2bw(img_src,val);%图像二值化处理
imshow(img_bw);%在当前指定的坐标轴区域,显示处理后的二值化图像
3.效果
通过按钮实现同一界面下的面板切换
1.目标
通过点击按钮实现在同一界面下,切换不同的面板,在不同面板上对图像进行灰度对数变换操作,并显示在主界面窗口。
2.实现
(1)图形化界面
上述基础,新增”子界面“按钮、”父界面“静态文本,并添加Tag值。
序号 | 类型 | Tag | String(如果有) |
---|---|---|---|
0 | Figure | figure2 | |
1 | text | text1 | 子界面 |
3 | pushbutton | pushbutton1 | 灰度图 |
4 | text | text2 | 基于阈值将图像转换为二值图像val= |
5 | edit | edit1 | 0~1 |
6 | slider | slider1 | |
7 | pushbutton | pushbutton2 | 原图 |
8 | pushbutton | pushbutton3 | 面板1 |
9 | pushbutton | pushbutton4 | 面板2 |
10 | Panel | uipanel1 | 面板1 |
11 | Panel | uipanel2 | 面板2 |
12 | text | text3 | 灰度对数变换 a= |
13 | text | text4 | 灰度对数变换 b= |
14 | edit | edit2 | 0~100 |
15 | edit | edit3 | 0~1 |
16 | slider | slider2 | |
17 | slider | slider3 | |
(2)代码 |
test2.m
function test2_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
%-----------------------------------------初始化 提示信息
disp('OpeningFcn...test2')
%-----------------------------------------数据传递
%h_figure=findobj('Tag','figure1');% 得到父界面的句柄%--------出错
h_figure1=findall(figure(test),'Tag','figure1');% 得到父界面的句柄
h_figure1=guihandles(h_figure1);%返回该对象及其所有子对象(父界面上的所有对象)必不可少
setappdata(handles.figure2,'h_figure1',h_figure1);%保存父界面句柄
img_src=getappdata(h_figure1.figure1,'img_src');%获取原图
imgray=getappdata(h_figure1.figure1,'imgray');%获取灰度图
setappdata(handles.figure2,'img_src',img_src);%设置原图
setappdata(handles.figure2,'imgray',imgray);%设置灰度图
%-----------------------------------------面板切换 新增代码
handles.TabColor=get(handles.uipanel1,'BackgroundColor');
handles.selectedTabColor=handles.TabColor-0.2;%选中颜色
handles.unselectedTabColor=handles.TabColor-0.1;%未选中颜色
setappdata(handles.figure2,'selectedTabColor',handles.selectedTabColor);
setappdata(handles.figure2,'unselectedTabColor',handles.unselectedTabColor);
% Set units to normalize for easier handling
set(handles.uipanel1,'Units','normalized')
set(handles.uipanel2,'Units','normalized')
set(handles.uipanel1,'Visible','on')
set(handles.uipanel2,'Visible','off')
set(handles.pushbutton3,'BackgroundColor',handles.selectedTabColor)
set(handles.pushbutton4,'BackgroundColor',handles.unselectedTabColor)
function pushbutton3_Callback(hObject, eventdata, handles)
%----------------------------------------------面板切换 面板1 新僧代码
set(handles.uipanel1,'Visible','on')
set(handles.uipanel2,'Visible','off')
unselectedTabColor=getappdata(handles.figure2,'unselectedTabColor');
selectedTabColor=getappdata(handles.figure2,'selectedTabColor');
set(handles.pushbutton3,'BackgroundColor',selectedTabColor);
set(handles.pushbutton4,'BackgroundColor',unselectedTabColor);
pan1pos=get(handles.uipanel1,'Position');
set(handles.uipanel1,'Position',pan1pos);
function pushbutton4_Callback(hObject, eventdata, handles)
%----------------------------------------------面板切换 面板2
set(handles.uipanel1,'Visible','off')
set(handles.uipanel2,'Visible','on')
unselectedTabColor=getappdata(handles.figure2,'unselectedTabColor');
selectedTabColor=getappdata(handles.figure2,'selectedTabColor');
set(handles.pushbutton3,'BackgroundColor',unselectedTabColor);
set(handles.pushbutton4,'BackgroundColor',selectedTabColor);
pan1pos=get(handles.uipanel1,'Position');
set(handles.uipanel2,'Position',pan1pos);
function edit2_Callback(hObject, eventdata, handles)
%----------------------------------------------文本框 灰度对数变换 a=
a = str2double(get(hObject,'String'));%获取文本值转为double
%%Determine whether val is a number between 0 and 1.
if isnumeric(a) && length(a)==1 && ...%是数值数据类型的数组且长度为1
a >= get(handles.slider2,'Min') && ... %大于等于滑动条的最小值
a <= get(handles.slider2,'Max') %小于等于滑动条的最大值
set(handles.slider2,'Value',a); %把文本值赋给滑动条的'value'属性
end
function edit3_Callback(hObject, eventdata, handles)
%----------------------------------------------文本框 灰度对数变换 b=
b = str2double(get(hObject,'String'));%获取文本值转为double
%%Determine whether val is a number between 0 and 1.
if isnumeric(b) && length(b)==1 && ...%是数值数据类型的数组且长度为1
b >= get(handles.slider3,'Min') && ... %大于等于滑动条的最小值
b <= get(handles.slider3,'Max') %小于等于滑动条的最大值
set(handles.slider3,'Value',b); %把文本值赋给滑动条的'value'属性
end
function slider2_Callback(hObject, eventdata, handles)
%----------------------------------------------滑动条 灰度对数变换 a=
img_src=getappdata(handles.figure2,'img_src');%获取原图
image_matrix=img_src(:,:,1);%矩阵
image_matrix=double(image_matrix);
[height,width,channels]=size(img_src);
G=zeros(height,width);
gray_map = zeros(1,256);%灰度映射表,灰度在0到255之间
a=get(hObject,'Value');
b=get(handles.slider3,'Value');
set(handles.edit2,'String',num2str(a));%把滚动条值赋给文本
%计算灰度映射表
for i=1:256
y=log(1+i)/b+a;
if(y<0)
y=0;
elseif(y>255)
y=255;
end
gray_map(i)=round(y);
end
for i=1:height
for j=1:width
T = image_matrix(i,j);
if(T==0)
G(i,j)=gray_map(1);
else
G(i,j)=gray_map(T);
end
end
end
image_out = uint8(G);
global h_axes;
axes(h_axes);%指定操作窗口 为父对象为figure1的Axes
imshow(image_out);
function slider3_Callback(hObject, eventdata, handles)
%----------------------------------------------滑动条 灰度对数变换 b=
img_src=getappdata(handles.figure2,'img_src');%获取原图
image_matrix=img_src(:,:,1);%矩阵
image_matrix=double(image_matrix);
[height,width,channels]=size(img_src);
G=zeros(height,width);
gray_map = zeros(1,256);%灰度映射表,灰度在0到255之间
b=get(hObject,'Value');
a=get(handles.slider2,'Value');
set(handles.edit3,'String',num2str(b));%把滚动条值赋给文本
%计算灰度映射表
for i=1:256
y=log(1+i)/b+a;
if(y<0)
y=0;
elseif(y>255)
y=255;
end
gray_map(i)=round(y);
end
for i=1:height
for j=1:width
T = image_matrix(i,j);
if(T==0)
G(i,j)=gray_map(1);
else
G(i,j)=gray_map(T);
end
end
end
image_out = uint8(G);
global h_axes;
axes(h_axes);%指定操作窗口 为父对象为figure1的Axes
imshow(image_out);
3.效果
承.
上述对图形界面局部功能进行分解,实现了上传图、灰度图、二值化、父子界面数据传递、同界面下面板切换基础功能。
下述数字图像处理小工具则基于上述几项功能复用变换得到。
数字图像处理小工具整体功能实现
上传图像
1.目标
点击图形化界面的“上传图像”按钮,实现从本地上传图片,在左右图窗中分别显示原图、直方图。
2.实现
(1)图形化界面
绘制基础界面,设置各自的Tag属性。
保存文件为imgTool.fig,运行,生成文件imgTool.m。
序号 | 类型 | Tag | String(如果有) |
---|---|---|---|
0 | Figure | figure1 | |
1 | Panel | uipanel1 | 原图 |
3 | Panel | uipanel2 | 正处理 |
4 | Panel | uipanel3 | 已处理 |
5 | Axes | axes1 | |
6 | Axes | axes2 | |
7 | Axes | axes3 | |
8 | Axes | axesh1 | |
9 | Axes | axesh2 | |
10 | Axes | axesh3 | |
11 | pushbutton | bt1 | 原图 |
12 | pushbutton | bt2 | 已处理 |
13 | pushbutton | bt3 | 上传图像 |
14 | pushbutton | bt4 | 处理图像 |
(2)代码
function imgTool_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
%----------------------------------------------------------初始化
set(handles.bt1,'Enable','off');%未打开图片时不能点击
set(handles.bt2,'Enable','off');%未打开图片时不能点击
set(handles.bt4,'Enable','off');%未打开图片时不能点击
function bt3_Callback(hObject, eventdata, handles)
%----------------------------------------------------------%上传图像
[filename,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','image files(*.bmp;*.jpg;*.png;*.jpeg)';...
'*.*','all file(*.*)'},...
'pick an image');%获取文件名、路径
fpath=[pathname filename];%将文件名和目录名组合成一个完整的路径
img_src=imread(fpath);%通过路径读取图片
setappdata(handles.axes2,'img_src',img_src);%保存原图
setappdata(handles.figure1,'img_src',img_src);%保存原图
set(handles.bt1,'Enable','on');%打开图片时可用
set(handles.bt2,'Enable','on');%打开图片时可用
set(handles.bt4,'Enable','on');%打开图片时可用
axes(handles.axes2);%显示原图 右
imshow(img_src);
axes(handles.axesh2);%显示直方图
[a,b]=imhist(img_src);
plot(b,a)
axes(handles.axes1);%显示原图 左
imshow(img_src);
axes(handles.axesh1);%显示直方图
[a,b]=imhist(img_src);
plot(b,a)
3.效果
处理图像
1.目标
上传完毕后,点击主界面“处理图像”,打开次界面,能够在次界面中对图像进行各种变换并显示在主界面窗口。
2.实现
(1)图形化界面
新建Blank GUI,绘制基础界面,设置各自的Tag属性。
保存文件为imgTool_box.fig,运行,生成文件imgTool_box.m。
序号 | 类型 | Tag | String/Title(如果有) |
---|---|---|---|
1 | Axes | axes2 |
序号 | 类型 | Tag | String/Title(如果有) | 类型 | Tag | String/Title(如果有) |
---|---|---|---|---|---|---|
1 | Panel | uipanel0 | pushbutton | bt1 | 工具箱1 | |
2 | Panel | uipanel1 | pushbutton | bt2 | 工具箱2 | |
3 | Panel | uipanel2 | pushbutton | bt3 | 工具箱3 | |
4 | Panel | uipanel3 | pushbutton | btsave | 保存至已处理 | |
5 | Panel | pbw | 二值处理 | pushbutton | btbk | 撤销 |
6 | Panel | plog | 灰度对数变换 | pushbutton | btfwd | 重做 |
7 | Panel | pexp | 灰度指数变换 | pushbutton | btorigin | 原图 |
8 | Panel | pnoise | 添加噪声 | pushbutton | btgray | 灰度图 |
9 | Panel | pmotion | 运动模糊 | pushbutton | bthisteq | 均衡化 |
10 | Panel | pnoisesub | pnoisesub | pushbutton | btadd | 相加 |
11 | Panel | pmotionsub | 去模糊滤波 | pushbutton | btsub | 相减 |
12 | Panel | plowpass | 低通平滑 | pushbutton | btdilate | 膨胀运算 |
13 | Panel | phighpass | 高通锐化 | pushbutton | bterode | 腐蚀运算 |
14 | Panel | pedge1 | 边缘提取 一阶微分算子 | pushbutton | btopen | 开运算 |
15 | Panel | pedge2 | 边缘提取 二阶微分算子 | pushbutton | btclose | 闭运算 |
16 | Panel | pstrel | 结构元素 strel | |||
17 | Panel | pdiamond | diamond | radiobutton | rbtdiamond | diamond |
18 | Panel | poctangon | octangon | radiobutton | rbtoctangon | octangon |
19 | Panel | psquare | square | radiobutton | rbtsquare | square |
20 | Panel | pdisk | disk | radiobutton | rbtdisk | disk |
21 | Panel | pline | line | radiobutton | rbtline | line |
22 | Panel | prectangle | rectangle | radiobutton | rbtrectangle | rectangle |
23 | ButtonGroup | btgroup | 按钮组 |
序号 | 类型 | Tag | String/Title(如果有) | 类型 | Tag | 类型 | Tag |
---|---|---|---|---|---|---|---|
1 | text | text1 | v: | slider | sbw | edit | ebw |
2 | text | text2 | a: | slider | slog1 | edit | elog1 |
3 | text | text3 | b: | slider | slog2 | edit | elog2 |
4 | text | text4 | a: | slider | sexp1 | edit | eexp1 |
5 | text | text5 | b: | slider | sexp2 | edit | eexp2 |
6 | text | text6 | c: | slider | sexp3 | edit | eexp3 |
7 | text | text7 | 高斯noise: | slider | snoise1 | edit | enoise1 |
8 | text | text8 | 椒盐noise: | slider | snoise2 | edit | enoise2 |
9 | text | text9 | 长度len: | slider | smotion1 | edit | emotion1 |
10 | text | text10 | 角度theta: | slider | smotion2 | edit | emotion2 |
11 | text | text11 | 均值matrix: | slider | snoisesub1 | edit | enoisesub1 |
12 | text | text12 | 中值matrix: | slider | snoisesub2 | edit | enoisesub2 |
13 | text | text13 | 高斯sigma: | slider | snoisesub3 | edit | enoisesub3 |
14 | text | text14 | vwnr nsr: | slider | smotionsub1 | edit | emotionsub1 |
15 | text | text15 | verg noise: | slider | smotionsub2 | edit | emotionsub2 |
16 | text | text16 | lucy numit: | slider | smotionsub3 | edit | emotionsub3 |
17 | text | text17 | 理想 D0: | slider | slow1 | edit | elow1 |
18 | text | text18 | 巴特沃斯 D0: | slider | slow2 | edit | elow2 |
19 | text | text19 | 指数 D0: | slider | slow3 | edit | elow3 |
20 | text | text20 | 理想 D0: | slider | shigh1 | edit | ehigh1 |
21 | text | text21 | 巴特沃斯 D0: | slider | shigh2 | edit | ehigh2 |
22 | text | text22 | 数 D0: | slider | shigh3 | edit | ehigh3 |
23 | text | text23 | Roberts D0: | slider | sedge1 | edit | eedge1 |
24 | text | text24 | Prewitt D0: | slider | sedge2 | edit | eedge2 |
25 | text | text25 | Sobel D0: | slider | sedge3 | edit | eedge3 |
26 | text | text26 | Laplace t: | slider | sedge21 | edit | eedge21 |
27 | text | text27 | LoG t: | slider | sedge22 | edit | eedge22 |
28 | text | text28 | Canny t: | slider | sedge23 | edit | eedge23 |
29 | text | text29 | r: | slider | sdiamond | edit | ediamond |
30 | text | text30 | r: | slider | soctangon | edit | eoctangon |
31 | text | text31 | w: | slider | ssquare | edit | square |
32 | text | text32 | r: | slider | sdisk1 | edit | edisk1 |
33 | text | text33 | n: | slider | sdisk2 | edit | edisk2 |
34 | text | text34 | len: | slider | sline1 | edit | eline1 |
35 | text | text35 | deg: | slider | sline2 | edit | eline2 |
36 | text | text36 | m: | slider | srectangle1 | edit | erectangle1 |
37 | text | text37 | n: | slider | srectangle2 | edit | erectangle2 |
(2)代码
function bt4_Callback(hObject, eventdata, handles)%处理图像
imgTool_box;
imgTool_box.m
function imgTool_box_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
%---------------------------------------------------------------------初始化
disp('imgTool_box_OpeningFcn');
%---------------------------------------------------------------------按钮禁用
set(handles.btbk,'Enable','off');%未处理图片时不能点击
set(handles.btfwd,'Enable','off');%未处理图片时不能点击
%---------------------------------------------------------------------面板切换
handles.TabColor=get(handles.uipanel1,'BackgroundColor');
handles.selectedTabColor=handles.TabColor-0.2;%选中颜色
handles.unselectedTabColor=handles.TabColor-0.1;%未选中颜色
setappdata(handles.figure2,'selectedTabColor',handles.selectedTabColor);%设置属性
setappdata(handles.figure2,'unselectedTabColor',handles.unselectedTabColor);
set(handles.uipanel1,'Units','normalized')
set(handles.uipanel2,'Units','normalized')
set(handles.uipanel3,'Units','normalized')
set(handles.uipanel1,'Visible','on')
set(handles.uipanel2,'Visible','off')
set(handles.uipanel3,'Visible','off')
set(handles.bt1,'BackgroundColor',handles.selectedTabColor)
set(handles.bt2,'BackgroundColor',handles.unselectedTabColor)
set(handles.bt3,'BackgroundColor',handles.unselectedTabColor)
%---------------------------------------------------------------------
guidata(hObject, handles);
function bt1_Callback(hObject, eventdata, handles)%工具箱1
disp('bt1_Callback');
%---------------------------------
set(handles.uipanel1,'Visible','on')
set(handles.uipanel2,'Visible','off')
set(handles.uipanel3,'Visible','off')
unselectedTabColor=getappdata(handles.figure2,'unselectedTabColor');
selectedTabColor=getappdata(handles.figure2,'selectedTabColor');
set(handles.bt1,'BackgroundColor',selectedTabColor);
set(handles.bt2,'BackgroundColor',unselectedTabColor);
set(handles.bt3,'BackgroundColor',unselectedTabColor);
pan1pos=get(handles.uipanel1,'Position');
set(handles.uipanel1,'Position',pan1pos);
%---------------------------------------------------------------------
function bt2_Callback(hObject, eventdata, handles)%工具箱2
disp('bt2_Callback');
%---------------------------------
set(handles.uipanel1,'Visible','off')
set(handles.uipanel2,'Visible','on')
set(handles.uipanel3,'Visible','off')
unselectedTabColor=getappdata(handles.figure2,'unselectedTabColor');
selectedTabColor=getappdata(handles.figure2,'selectedTabColor');
set(handles.bt1,'BackgroundColor',unselectedTabColor);
set(handles.bt2,'BackgroundColor',selectedTabColor);
set(handles.bt3,'BackgroundColor',unselectedTabColor);
pan1pos=get(handles.uipanel1,'Position');
set(handles.uipanel2,'Position',pan1pos);
%---------------------------------------------------------------------
function bt3_Callback(hObject, eventdata, handles)%工具箱3
disp('bt3_Callback');
%---------------------------------
set(handles.uipanel1,'Visible','off')
set(handles.uipanel2,'Visible','off')
set(handles.uipanel3,'Visible','on')
unselectedTabColor=getappdata(handles.figure2,'unselectedTabColor');
selectedTabColor=getappdata(handles.figure2,'selectedTabColor');
set(handles.bt1,'BackgroundColor',unselectedTabColor);
set(handles.bt2,'BackgroundColor',unselectedTabColor);
set(handles.bt3,'BackgroundColor',selectedTabColor);
pan1pos=get(handles.uipanel1,'Position');
set(handles.uipanel3,'Position',pan1pos);
%---------------------------------------------------------------------
3.效果
主界面&界面切换
1.目标
点击“原图”“已处理”按钮实现对应界面切换功能。
2.实现
imgTool.m
function imgTool_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
%-----------------------------------------------------------------------初始化
disp('imgTool_OpeningFcn');
%-----------------------------------------------------------------------归一化处理
set(handles.uipanel1,'Units','normalized');
set(handles.uipanel3,'Units','normalized');
set(handles.uipanel2,'Units','normalized');
set(handles.axes1,'Units','normalized')
set(handles.axes2,'Units','normalized')
set(handles.axes3,'Units','normalized')
set(handles.axesh1,'Units','normalized')
set(handles.axesh2,'Units','normalized')
set(handles.axesh3,'Units','normalized')
%---------------------------------------------------------------------面板切换
handles.TabColor=get(handles.uipanel1,'BackgroundColor');
handles.selectedTabColor=handles.TabColor-0.2;%选中颜色
handles.unselectedTabColor=handles.TabColor-0.1;%未选中颜色
setappdata(handles.figure1,'selectedTabColor',handles.selectedTabColor);%设置属性
setappdata(handles.figure1,'unselectedTabColor',handles.unselectedTabColor);
set(handles.uipanel1,'Visible','on')
set(handles.uipanel3,'Visible','off')
set(handles.bt1,'BackgroundColor',handles.selectedTabColor)
set(handles.bt2,'BackgroundColor',handles.unselectedTabColor)
%--------------------------------------------------------
guidata(hObject, handles);
function bt1_Callback(hObject, eventdata, handles)%原图
disp('bt1_Callback');
%---------------------------------
set(handles.uipanel1,'Visible','on')
set(handles.uipanel3,'Visible','off')
unselectedTabColor=getappdata(handles.figure1,'unselectedTabColor');
selectedTabColor=getappdata(handles.figure1,'selectedTabColor');
set(handles.bt1,'BackgroundColor',selectedTabColor);
set(handles.bt2,'BackgroundColor',unselectedTabColor);
pan1pos=get(handles.uipanel1,'Position');
set(handles.uipanel1,'Position',pan1pos);
function bt2_Callback(hObject, eventdata, handles)%已处理
disp('bt2_Callback');
%---------------------------------
set(handles.uipanel1,'Visible','off')
set(handles.uipanel3,'Visible','on')
unselectedTabColor=getappdata(handles.figure1,'unselectedTabColor');
selectedTabColor=getappdata(handles.figure1,'selectedTabColor');
set(handles.bt1,'BackgroundColor',unselectedTabColor);
set(handles.bt2,'BackgroundColor',selectedTabColor);
pan1pos=get(handles.uipanel1,'Position');
set(handles.uipanel3,'Position',pan1pos);
3.效果
处理&保存&撤销&重做
1.目标
次界面,对图像进行处理,实现“原图”“灰度图”“均衡化”“保存至已处理”“撤销”“重做”按钮功能。
2.实现
imgTool.m
function bt3_Callback(hObject, eventdata, handles)
%---------------------------------------------------------%上传图像 图形化界面按钮
disp('bt3_Callback');
%---------------------------------
[filename,pathname]=uigetfile(...
{'*.bmp;*.jpg;*.png;*.jpeg','image files(*.bmp;*.jpg;*.png;*.jpeg)';...
'*.*','all file(*.*)'},...
'pick an image');%获取文件名、路径
fpath=[pathname filename];%将文件名和目录名组合成一个完整的路径
img_src=imread(fpath);%通过路径读取图片
setappdata(handles.axes2,'img_src',img_src);%保存原图
setappdata(handles.figure1,'img_src',img_src);%保存原图
axes(handles.axes2);%显示原图 右
imshow(img_src);
axes(handles.axesh2);%显示直方图
[a,b]=imhist(img_src);
plot(b,a)
axes(handles.axes1);%显示原图 左1
imshow(img_src);
axes(handles.axesh1);%显示直方图
[a,b]=imhist(img_src);
plot(b,a)
axes(handles.axes3);%显示原图 左2
imshow(img_src);
axes(handles.axesh3);%显示直方图
[a,b]=imhist(img_src);
plot(b,a)
% --------------------------------------------------------------------设置灰度图 建坐标区
imgray=im2gray(img_src);
setappdata(handles.figure1,'imgray',imgray);%保存灰度图
%--------------------------------------------------------设置全局变量 h_axes2
pos2=get(handles.axes2,'Position');%获取原坐标区位置
handles.h_axes2 = axes(...%在父界面上重新绘制显示图像的坐标区
'Parent', handles.uipanel2, ... % 规定父对象为uipanel2---重要
'Units', 'Normalized', ... % 规定尺度单位为百分比---重要
'Position', [pos2(1) pos2(2) pos2(3) pos2(4)]); % 规定图形出现位置---重要
setappdata(handles.figure1,"h_axes2",handles.h_axes2);
global h_axes2;
h_axes2=getappdata(handles.figure1,"h_axes2");
imshow(img_src);%显示图片
%--------------------------------------------------------设置全局变量 h_axesh2
posh2=get(handles.axesh2,'Position');%获取原坐标区位置
handles.h_axesh2 = axes(...%在父界面上重新绘制显示图像的坐标区
'Parent', handles.uipanel2, ... % 规定父对象为uipanel2---重要
'Units', 'Normalized', ... % 规定尺度单位为百分比---重要
'Position', [posh2(1) posh2(2) posh2(3) posh2(4)]); % 规定图形出现位置---重要
setappdata(handles.figure1,"h_axesh2",handles.h_axesh2);
global h_axesh2;
h_axesh2=getappdata(handles.figure1,"h_axesh2");
[a,b]=imhist(img_src);
plot(b,a);%显示直方图
%--------------------------------------------------------设置全局变量 h_axes3
pos3=get(handles.axes3,'Position');%获取原坐标区位置
handles.h_axes3 = axes(...%在父界面上重新绘制显示图像的坐标区
'Parent', handles.uipanel3, ... % 规定父对象为figure1---重要
'Units', 'Normalized', ... % 规定尺度单位为百分比---重要
'Position', [pos3(1) pos3(2) pos3(3) pos3(4)]); % 规定图形出现位置---重要
setappdata(handles.figure1,"h_axes3",handles.h_axes3);
global h_axes3;
h_axes3=getappdata(handles.figure1,"h_axes3");
%--------------------------------------------------------设置全局变量 h_axesh3
posh3=get(handles.axesh3,'Position');%获取原坐标区位置
handles.h_axesh3= axes(...%在父界面上重新绘制显示图像的坐标区
'Parent', handles.uipanel3, ... % 规定父对象为uipanel2---重要
'Units', 'Normalized', ... % 规定尺度单位为百分比---重要
'Position', [posh3(1) posh3(2) posh3(3) posh3(4)]); % 规定图形出现位置---重要
setappdata(handles.figure1,"h_axesh3",handles.h_axesh3);
global h_axesh3;
h_axesh2=getappdata(handles.figure1,"h_axesh3");
%--------------------------------------------------------
guidata(hObject, handles);
imgTool_box.m
function imgTool_box_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
%---------------------------------------------------------------------初始化
disp('imgTool_box_OpeningFcn');
%---------------------------------------------------------------------按钮禁用
set(handles.btbk,'Enable','off');%未处理图片时不能撤销
set(handles.btfwd,'Enable','off');%未处理图片时不能重做
%---------------------------------------------------------------------面板切换
handles.TabColor=get(handles.uipanel1,'BackgroundColor');
handles.selectedTabColor=handles.TabColor-0.2;%选中颜色
handles.unselectedTabColor=handles.TabColor-0.1;%未选中颜色
setappdata(handles.figure2,'selectedTabColor',handles.selectedTabColor);%设置属性
setappdata(handles.figure2,'unselectedTabColor',handles.unselectedTabColor);
set(handles.uipanel1,'Units','normalized')
set(handles.uipanel2,'Units','normalized')
set(handles.uipanel3,'Units','normalized')
set(handles.uipanel1,'Visible','on')
set(handles.uipanel2,'Visible','off')
set(handles.uipanel3,'Visible','off')
set(handles.bt1,'BackgroundColor',handles.selectedTabColor)
set(handles.bt2,'BackgroundColor',handles.unselectedTabColor)
set(handles.bt3,'BackgroundColor',handles.unselectedTabColor)
%---------------------------------------------------------------------设置属性 原图 灰度图
h_figure1=findall(figure(imgTool),'Tag','figure1');% 得到父界面的句柄
h_figure1=guihandles(h_figure1);%返回该对象及其所有子对象(父界面上的所有对象)必不可少
setappdata(handles.figure2,'h_figure1',h_figure1);%保存父界面句柄
img_src=getappdata(h_figure1.figure1,'img_src');%获取原图
imgray=getappdata(h_figure1.figure1,'imgray');%获取灰度图
setappdata(handles.figure2,'img_src',img_src);%设置原图
setappdata(handles.figure2,'imgray',imgray);%设置灰度图
%---------------------------------------------------------------------
guidata(hObject, handles);
function btsave_Callback(hObject, eventdata, handles)%保存至已处理
disp('btsave_Callback');
%---------------------------------
imgcurr=getappdata(handles.figure2,'imgcurr');%获取当前图
global h_axes3;
axes(h_axes3);
imshow(imgcurr);%显示当前图
global h_axesh3;
axes(h_axesh3);
[a,b]=imhist(imgcurr);
plot(b,a);%显示直方图
setappdata(handles.uipanel2,'imphase',imgcurr);%设置已处理图
guidata(hObject, handles);
function btbk_Callback(hObject, eventdata, handles)%撤销
disp('btbk_Callback');
%---------------------------------
global phase;
global count;
global cbk;
global cfwd;
cbk=cbk-1;%可撤销次数-1
cfwd=cfwd+1;%可重做次数+1
set(handles.btfwd,'Enable','on');%启用重做按钮
count=count-1;
fprintf('count: %d\n',count);
if cbk==0
set(handles.btbk,'Enable','off');%禁用撤销按钮
img_src=getappdata(handles.figure2,'img_src');
setappdata(handles.figure2,'imgcurr',img_src);%保存当前图
global h_axes2;
axes(h_axes2);
imshow(img_src);%显示原图
global h_axesh2;
axes(h_axesh2);
[a,b]=imhist(img_src);
plot(b,a);%显示直方图
else
imgbk=phase(:,:,count);%获取撤销图
setappdata(handles.figure2,'imgcurr',imgbk);%保存当前图
guidata(hObject, handles);
global h_axes2;
axes(h_axes2);
imshow(imgbk);%显示撤销图
global h_axesh2;
axes(h_axesh2);
[a,b]=imhist(imgbk);
plot(b,a);%显示直方图
end
function btfwd_Callback(hObject, eventdata, handles)%重做
disp('btfwd_Callback');
%---------------------------------
global phase;
global count;
global cbk;
global cfwd;
cfwd=cfwd-1;%可重做次数-1
cbk=cbk+1;%可撤销次数+1
set(handles.btbk,'Enable','on');%启用撤销按钮
count=count+1;
fprintf('count: %d',count);
if cfwd==0
set(handles.btfwd,'Enable','off');%不能重做
fprintf('count: %d\n',count);
end
imfwd=phase(:,:,count);%获取重做图
setappdata(handles.figure2,'imgcurr',imfwd);%保存当前图
global h_axes2;
axes(h_axes2);
imshow(imfwd);%显示重做图
global h_axesh2;
axes(h_axesh2);
[a,b]=imhist(imfwd);
plot(b,a);%显示直方图
function btorigin_Callback(hObject, eventdata, handles)%原图
disp('btorigin_Callback');
%---------------------------------
img_src=getappdata(handles.figure2,'img_src');%从父界面获取原图
global h_axes2;
axes(h_axes2);
imshow(img_src);%显示原图
global h_axesh2;
axes(h_axesh2);
[a,b]=imhist(img_src);
plot(b,a);%显示直方图
%---------------------------------
global count;
global cbk;
global cfwd;
count=1;
fprintf('count: %d\n',count);
cbk=0;%可撤销次数归零
cfwd=0;%可重做次数归零
set(handles.btbk,'Enable','off');%不允许撤销
set(handles.btfwd,'Enable','off');%不允许重做
setappdata(handles.figure2,'imgcurr',img_src);%保存当前图
%---------------------------------
set(handles.ebw,'String',0);%文本值归零
set(handles.sbw,'Value',0)%滑动条值归零
function btgray_Callback(hObject, eventdata, handles)%灰度图
disp('btgray_Callback');
%---------------------------------
imgray=getappdata(handles.figure2,'imgray');%从父界面获取灰度图
global h_axes2;
axes(h_axes2);
imshow(imgray);%显示灰度图
global h_axesh2;
axes(h_axesh2);
[a,b]=imhist(imgray);
plot(b,a);%显示直方图
%---------------------------------
global phase;
global count;
global cbk;
global cfwd;
cbk=cbk+1;%可撤销次数+1
cfwd=0;%可重做次数归零
set(handles.btbk,'Enable','on');%允许撤销
set(handles.btfwd,'Enable','off');%不允许重做
setappdata(handles.figure2,'imgcurr',imgray);%保存当前图
imgcurr=getappdata(handles.figure2,'imgcurr');
count=count+1;
fprintf('count: %d\n',count);
phase(:,:,count)=imgcurr;%更新阶段图
%---------------------------------
set(handles.ebw,'String',0);%文本值归零
set(handles.sbw,'Value',0)%滑动条值归零
function bthisteq_Callback(hObject, eventdata, handles)%均衡化
disp('bthisteq_Callback');
%---------------------------------
imgray=getappdata(handles.figure2,'imgray');%从父界面获取灰度图
imghist=histeq(imgray,256);%均衡化
global h_axes2;
axes(h_axes2);
imshow(imghist);%显示均衡化
global h_axesh2;
axes(h_axesh2);
[a,b]=imhist(imghist);
plot(b,a);%显示直方图
%---------------------------------
global phase;
global count;
global cbk;
global cfwd;
cbk=cbk+1;%可撤销次数+1
cfwd=0;%可重做次数归零
set(handles.btbk,'Enable','on');%允许撤销
set(handles.btfwd,'Enable','off');%不允许重做
setappdata(handles.figure2,'imgcurr',imghist);%保存当前图
imgcurr=getappdata(handles.figure2,'imgcurr');
count=count+1;
fprintf('count: %d\n',count);
phase(:,:,count)=imgcurr;%更新阶段图
%---------------------------------
set(handles.ebw,'String',0);%文本值归零
set(handles.sbw,'Value',0)%滑动条值归零
%-------------------------------------------------------------------------------------二值处理
function sbw_Callback(hObject, eventdata, handles)%二值处理 滑块
disp('sbw_Callback');
%---------------------------------
val=get(hObject,'Value');%获取滚动条数值
set(handles.ebw,'String',num2str(val));%把滚动条值赋给文本
global h_axes2;
axes(h_axes2);
imgray=getappdata(handles.figure2,'imgray');%获取灰度图
img_bw=im2bw(imgray,val);%二值化处理
imshow(img_bw);%显示处理后的二值化图像
global h_axesh2;
axes(h_axesh2);
[a,b]=imhist(img_bw);
plot(b,a);%显示直方图
%---------------------------------
global count;
global cbk;
global cfwd;
count=1;
fprintf('count: %d\n',count);
cbk=0;%可撤销次数归零
cfwd=0;%可重做次数归零
set(handles.btbk,'Enable','off');%不允许撤销
set(handles.btfwd,'Enable','off');%不允许重做
setappdata(handles.figure2,'imgcurr',img_bw);%保存当前图
guidata(hObject, handles);
function ebw_Callback(hObject, eventdata, handles)%二值处理 文本
disp('ebw_Callback');
%---------------------------------
val = str2double(get(hObject,'String'));%获取文本值转为double
if isnumeric(val) && length(val)==1 && ...%是数值数据类型的数组且长度为1
val >= get(handles.sbw,'Min') && ... %大于等于滑动条的最小值
val <= get(handles.sbw,'Max') %小于等于滑动条的最大值
set(handles.sbw,'Value',val); %把文本值赋给滑动条的'value'属性
end
global h_axes2;
axes(h_axes2);
imgray=getappdata(handles.figure2,'imgray');%获取灰度图
img_bw=im2bw(imgray,val);%二值化处理
imshow(img_bw);%显示处理后的二值化图像
global h_axesh2;
axes(h_axesh2);
[a,b]=imhist(img_bw);
plot(b,a);%显示直方图
%---------------------------------
global count;
global cbk;
global cfwd;
count=1;
fprintf('count: %d\n',count);
cbk=0;%可撤销次数归零
cfwd=0;%可重做次数归零
set(handles.btbk,'Enable','off');%不允许撤销
set(handles.btfwd,'Enable','off');%不允许重做
setappdata(handles.figure2,'imgcurr',img_bw);%保存当前图
guidata(hObject, handles);
3.效果
补充.
参考教程:
1一个实例搞定MATLAB界面编程
2MATLAB 利用GUIDE设计GUI时,M文件中函数结构以及功能
3Matlab GUI学习01:图形对象及其操作
4matlab gui 教学,新手入门教程(二)滑动条使用和显示
5针对在axes中交叉使用imhist和imshow的问题
6GUI中有的按键在figure1显示有的会弹出figure2?
7MATLAB GUI中的handles
8matlab 不同GUI之间的交互/不同GUI之间的数据传递_matlab gui不同界面之间数据传递-CSDN博客
9Matlab底层算法实现图像灰度对数,指数,幂次变换
10通过matlab编程,对该图像分别添加高斯噪声和椒盐噪声(参数自定),并使用均值滤波、高斯滤波和中值滤波进行去噪。
11Matlab中size函数用法总结_matlab size函数-CSDN博客
12Matlab图像处理-均值滤波,中值滤波和高斯滤波。-CSDN博客
13图像处理:边缘提取算法(边缘提取算子总结)——Matlab代码实现_在图像上实现sobel、prewitt、roberts、canny和log的边缘提取-CSDN博客
14图像边缘检测:一阶微分算子、二阶微分算子、Canny边缘检测 | 码农家园 (codenong.com)
15数字图像处理 频率域平滑 MATLAB实验_(1) 读入原图像test.tif并显示 ; (2) 对原图像添加高斯噪声; (3)采用理想低通滤波-CSDN博客
16图像边缘检测 Laplacian边缘检测
17基于MATLAB的运动模糊图像恢复技术-CSDN博客
18C++中1e9(初始化、无穷大)解析
19[图像处理][Matlab] strel函数详解-CSDN博客
20数字图像处理–形态学_se = strel(‘disk’,r,n)-CSDN博客
21matlab gui实现无限次撤销与反撤销_matlab设置撤销gui操作-CSDN博客
22matlab创建三维数组的三种方法_如何创建三维数组-CSDN博客
23理解 MATLAB 中的三维数组的基本概念和用法_matlab创建三维数组-CSDN博客
24Matlab中实现两张图片的叠加显示效果_matlab将两张图片叠加-CSDN博客
25matlab:三维数组(附完整源代码)_matlab创建三维数组-CSDN博客
26Matlab自学笔记八:多维数组、高维数组的概念、索引方法、常用函数、维度简化_matlab中数组的维度什么意思-CSDN博客