数字图像处理小工具 matlab

数字图像处理小工具

时间: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值。
上传图1

序号类型TagString(如果有)
0Figurefigure1
1Axesaxes1
2pushbuttonpushbutton1上传图

(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
上传图3
灰度图
1.目标
图像处理小工具中,有许多需要通过点击按钮实现对图像切换的操作,且变换后的图像显示在原来的区域。
以灰度图为例,点击”灰度图“,图像由原图切换为灰度图。
2.实现
(1)图形化界面
上述基础,新增”灰度图“按钮,并添加Tag值。灰度图1

序号类型TagString(如果有)
0Figurefigure1
1Axesaxes1
2pushbuttonpushbutton1上传图
3pushbuttonpushbutton2灰度图

(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.效果
灰度图2灰度图3
二值化
1.目标
图像处理小工具中,有许多需要通过调节阈值实现对图像变换的操作,且变换后的图像显示在原来的区域。
以图像二值化为例,拖动滑块,也可以输入数值,使图像变换为对应阈值下的二值图像。
2.实现
(1)图形化界面
上述基础,新增滑动条、静态文本、可编辑文本框,并添加Tag值。
二值化1

序号类型TagString(如果有)
0Figurefigure1
1Axesaxes1
2pushbuttonpushbutton1上传图
3pushbuttonpushbutton2灰度图
4texttext1基于阈值将图像转换为二值图像val=
5editedit10~1
6sliderslider1

(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.效果
二值化2
由子界面处理主界面图像(异界面间数据传递global)
1.目标
点击父界面的”子界面“按钮,调出子界面,通过子界面实现对主界面图像的变换。
2.实现
(1)图形化界面
上述基础,新增”子界面“按钮、”父界面“静态文本,并添加Tag值。
数据传递1

序号类型TagString(如果有)
0Figurefigure1
1Axesaxes1
2pushbuttonpushbutton1上传图
3pushbuttonpushbutton2灰度图
4texttext1基于阈值将图像转换为二值图像val=
5editedit10~1
6sliderslider1
7pushbuttonpushbutton3子界面
8texttext2父界面

新建图形化界面,绘制并添加Tag值,保存,目录自动生成test2.fig和test.m。
数据传递2

序号类型TagString(如果有)
0Figurefigure2
1texttext1子界面
3pushbuttonpushbutton1灰度图
4texttext2基于阈值将图像转换为二值图像val=
5editedit10~1
6sliderslider1
7pushbuttonpushbutton2原图

(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
数据传递3数据传递4
通过按钮实现同一界面下的面板切换
1.目标
通过点击按钮实现在同一界面下,切换不同的面板,在不同面板上对图像进行灰度对数变换操作,并显示在主界面窗口。
2.实现
(1)图形化界面
上述基础,新增”子界面“按钮、”父界面“静态文本,并添加Tag值。
面板切换1

序号类型TagString(如果有)
0Figurefigure2
1texttext1子界面
3pushbuttonpushbutton1灰度图
4texttext2基于阈值将图像转换为二值图像val=
5editedit10~1
6sliderslider1
7pushbuttonpushbutton2原图
8pushbuttonpushbutton3面板1
9pushbuttonpushbutton4面板2
10Paneluipanel1面板1
11Paneluipanel2面板2
12texttext3灰度对数变换 a=
13texttext4灰度对数变换 b=
14editedit20~100
15editedit30~1
16sliderslider2
17sliderslider3
(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.效果
面板切换2
面板切换3
面板切换4
面板切换5


承.
上述对图形界面局部功能进行分解,实现了上传图、灰度图、二值化、父子界面数据传递、同界面下面板切换基础功能。
下述数字图像处理小工具则基于上述几项功能复用变换得到。


数字图像处理小工具整体功能实现
上传图像
1.目标
点击图形化界面的“上传图像”按钮,实现从本地上传图片,在左右图窗中分别显示原图、直方图。

2.实现
(1)图形化界面
绘制基础界面,设置各自的Tag属性。
保存文件为imgTool.fig,运行,生成文件imgTool.m。
上传图像1

序号类型TagString(如果有)
0Figurefigure1
1Paneluipanel1原图
3Paneluipanel2正处理
4Paneluipanel3已处理
5Axesaxes1
6Axesaxes2
7Axesaxes3
8Axesaxesh1
9Axesaxesh2
10Axesaxesh3
11pushbuttonbt1原图
12pushbuttonbt2已处理
13pushbuttonbt3上传图像
14pushbuttonbt4处理图像

(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.效果
上传图像2上传图像3
上传图像4
处理图像
1.目标
上传完毕后,点击主界面“处理图像”,打开次界面,能够在次界面中对图像进行各种变换并显示在主界面窗口。

2.实现
(1)图形化界面
新建Blank GUI,绘制基础界面,设置各自的Tag属性。
保存文件为imgTool_box.fig,运行,生成文件imgTool_box.m。
处理图像1

序号类型TagString/Title(如果有)
1Axesaxes2
序号类型TagString/Title(如果有)类型TagString/Title(如果有)
1Paneluipanel0pushbuttonbt1工具箱1
2Paneluipanel1pushbuttonbt2工具箱2
3Paneluipanel2pushbuttonbt3工具箱3
4Paneluipanel3pushbuttonbtsave保存至已处理
5Panelpbw二值处理pushbuttonbtbk撤销
6Panelplog灰度对数变换pushbuttonbtfwd重做
7Panelpexp灰度指数变换pushbuttonbtorigin原图
8Panelpnoise添加噪声pushbuttonbtgray灰度图
9Panelpmotion运动模糊pushbuttonbthisteq均衡化
10Panelpnoisesubpnoisesubpushbuttonbtadd相加
11Panelpmotionsub去模糊滤波pushbuttonbtsub相减
12Panelplowpass低通平滑pushbuttonbtdilate膨胀运算
13Panelphighpass高通锐化pushbuttonbterode腐蚀运算
14Panelpedge1边缘提取 一阶微分算子pushbuttonbtopen开运算
15Panelpedge2边缘提取 二阶微分算子pushbuttonbtclose闭运算
16Panelpstrel结构元素 strel
17Panelpdiamonddiamondradiobuttonrbtdiamonddiamond
18Panelpoctangonoctangonradiobuttonrbtoctangonoctangon
19Panelpsquaresquareradiobuttonrbtsquaresquare
20Panelpdiskdiskradiobuttonrbtdiskdisk
21Panelplinelineradiobuttonrbtlineline
22Panelprectanglerectangleradiobuttonrbtrectanglerectangle
23ButtonGroupbtgroup按钮组
序号类型TagString/Title(如果有)类型Tag类型Tag
1texttext1v:slidersbweditebw
2texttext2a:sliderslog1editelog1
3texttext3b:sliderslog2editelog2
4texttext4a:slidersexp1editeexp1
5texttext5b:slidersexp2editeexp2
6texttext6c:slidersexp3editeexp3
7texttext7高斯noise:slidersnoise1editenoise1
8texttext8椒盐noise:slidersnoise2editenoise2
9texttext9长度len:slidersmotion1editemotion1
10texttext10角度theta:slidersmotion2editemotion2
11texttext11均值matrix:slidersnoisesub1editenoisesub1
12texttext12中值matrix:slidersnoisesub2editenoisesub2
13texttext13高斯sigma:slidersnoisesub3editenoisesub3
14texttext14vwnr nsr:slidersmotionsub1editemotionsub1
15texttext15verg noise:slidersmotionsub2editemotionsub2
16texttext16lucy numit:slidersmotionsub3editemotionsub3
17texttext17理想 D0:sliderslow1editelow1
18texttext18巴特沃斯 D0:sliderslow2editelow2
19texttext19指数 D0:sliderslow3editelow3
20texttext20理想 D0:slidershigh1editehigh1
21texttext21巴特沃斯 D0:slidershigh2editehigh2
22texttext22数 D0:slidershigh3editehigh3
23texttext23Roberts D0:slidersedge1editeedge1
24texttext24Prewitt D0:slidersedge2editeedge2
25texttext25Sobel D0:slidersedge3editeedge3
26texttext26Laplace t:slidersedge21editeedge21
27texttext27LoG t:slidersedge22editeedge22
28texttext28Canny t:slidersedge23editeedge23
29texttext29r:slidersdiamondeditediamond
30texttext30r:slidersoctangonediteoctangon
31texttext31w:sliderssquareeditsquare
32texttext32r:slidersdisk1editedisk1
33texttext33n:slidersdisk2editedisk2
34texttext34len:slidersline1editeline1
35texttext35deg:slidersline2editeline2
36texttext36m:slidersrectangle1editerectangle1
37texttext37n:slidersrectangle2editerectangle2

(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.效果
处理&保存&撤销&重做处理&保存&撤销&重做2

补充.


参考教程:
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博客


  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值