一.GUI程序设计 如果想要开始使用Matlab进行GUI编程,首先需要进入Matlab的GUI界面对GUI有一个基本的认识。 1.guide:创建或编辑UI文件
guide;% 会打开 GUIDE,这是一个 UI 设计环境。从“Quick Start”对话框中,您可以选 择打开以前创建的 UI 或使用其中一个模板创建新 UI guide(filename);%在GUIDE中打开指定的 MATLAB® 图窗文件进行编辑。如果图窗文件不 在 MATLAB 路径上,请指定完整路径。一次只能打开一个 filename guide(figs);%在 GUIDE 设计环境中使用单独的副本分别打开 figs 中的每个 Figure 对 象。如果要编辑 GUIDE 中已保存到变量的一个或多个预先存在的图窗,请使用此语法。如上图所示,使用guide命令后,会出现GUI图形构件框和创建GUI程序
在出现的GUI图形界面里是Matlab公司为我们提供的相关构件,大家可以自己探索。设置好自己需要的图形构件后可以点击RUN则可以生成用户所要求的GUI界面。 可以使用对其设置使得所创建的图形构件进行对齐操作 2.关于GUI图形界面与GUI函数的练习 我们还可以改变图形构件的外观参数,注意Tag选项存放是该构件的标识符,用于程序可以识别出它所控制的是哪个按钮。
当按下UI界面的某一按钮构件后,会执行GUI程序下的callback函数 注意:用户插入callback函数的位置也有指定要求 练习一——构件如下GUI程序 滑动A和B滑块并显示计算出其加和 参考实现: 首先绘制出如下UI界面
注意将SLIDE构件中的MAX和MIN分别改为100和0
然后在就是在GUI程序中对应构件的callback处插入程序语句了
% --- Executes on slider movement. function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider %插入内容 a=get(handles.slider1,'value');%获取slide1当前的值 handles.myData1=a;%将a存入一个数据库中存储起来 guidata(hObject,handles);%将该数据存储好 b=get(handles.slider2,'value');%获取slider2当前的值value并赋予b handles.myData2=b; guidata(hObject,handles); f=handles.myData2;%将myData2中的值赋于f %b=get(handles.slider2,'value'); c=int16(a+f);%a+f后使用int16()函数变为整型变量 txt1=['A+B=',num2str(c)];%使用num2str()将数值抓换为字符串格式 set(handles.text8,'String',txt1);%使用set函数设置handles.text7中的String属性 %插入内容 % --- Executes during object creation, after setting all properties. function slider1_CreateFcn(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background. if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end % --- Executes on slider movement. function slider2_Callback(hObject, eventdata, handles) % hObject handle to slider2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider %插入内容 a=get(handles.slider1,'value'); handles.myData1=a; guidata(hObject,handles); b=get(handles.slider2,'value'); handles.myData2=b; guidata(hObject,handles); g=handles.myData1; %a=get(handles.slider1,'value'); c=int16(g+b); txt1=['A+B=',num2str(c)]; set(handles.text8,'String',txt1); %插入内容 % --- Executes during object creation, after setting all properties. function slider2_CreateFcn(hObject, eventdata, handles) % hObject handle to slider2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background. if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end相关知识点: 1.存储UI构件的数据
guidata(obj,data); data = guidata(obj);存储或检索 UI 数据 %如果 obj 是图窗,则 guidata(obj,data) 将指定的数据存储在其应用程序数据中;如 %果它是另一个组件,则存储在 obj 的父图窗的应用程序数据中。有关详细信息,请参阅 %guidata 如何管理数据。 %data = guidata(obj) 返回之前存储的数据,如果未存储任何内容,则返回空矩阵2.int16():将数据转换为int16格式,整数
a=int16(c);%Convert fi object to signed 16-bit integer3.num2str():将数值转换为字符串格式
s = num2str(A);%将数值数组转换为表示数字的字符数组。输出格式取决于原始值的量 %级。num2str 对使用数值为绘图添加标签和标题非常有用。 s = num2str(A,precision);%返回表示数字的字符数组,最大有效位数由 precision 指定。 s = num2str(A,formatSpec);%将 formatSpec 指定的格式应用到 A 所有元素。程序执行效果: 接下来将GUI打包成exe格式,则可不依赖于matlab实现了,注意:有关使用神经网络构件的GUI程序打包成exe会出现问题 4.deploytool:打包GUI程序为exe 添加需要打包的程序 然后开始打包 二.图像处理基础操作 相关函数: 1.imread():从图形文件中读取图像
A = imread(filename);%从 filename 指定的文件读取图像,并从文件内容推断出其格 %式。如果 filename 为多图像文件,则 imread 读取该文件中的第一个图像。 A = imread(filename,fmt);%另外还指定具有 fmt 指示的标准文件扩展名的文件的格 %式。如果 imread 找不到具有 filename 指定的名称的文件,则会查找名为 filename.fmt 的文件。2.imshow():显示图像
imshow(I);%在图窗中显示灰度图像 I。imshow 使用图像数据类型的默认显示范围,并优 %化图窗、坐标区和图像对象属性以便显示图像 imshow(I,[low high]);%显示灰度图像 I,以二元素向量 [low high] 形式指定显示范围。 imshow(RGB);%在图窗中显示真彩色图像 RGB。 imshow(BW);%在图窗中显示二值图像 BW。对于二值图像,imshow 将值为 0(零)的像素 %显示为黑色,将值为 1 的像素显示为白色3.imtool():启动图像编辑器
imtool(I);%displays the grayscale image I in the Image Viewer app, using %the default display range of the image data type.5.immultiply():对图像做乘法
Z = immultiply(X,Y);%使得一个图像X点乘以另一个图像Y或点乘一个常数,结果为Z, %注意:若Y为图像,则需与X相同尺寸大小6.imadd():对图像做加法
Z = imadd(X,Y);%使得一个图像X的各项于图像Y的对应各项相加,或使其相加一个常数项 %Y,输出为Z7.imhist():显示图像的直方图
[counts,binLocations] = imhist(I);%显示图像直方图,并返回counts(有多少个像素 bins),并返回binLocations(返回每个bins里的数目)。8.histeq():使用直方图均衡增强对比度
J = histeq(I,n);%变换灰度图像 I,以使输出灰度图像 J 具有 n 个 bin 的直方图大致 %平坦。当 n 远小于 I 中的离散灰度级数时,J 的直方图更平坦。 J = histeq(I);%变换灰度图像 I,以使输出灰度图像 J 的直方图具有 64 个 bin 且大致平坦9.imrotate():旋转图像
J = imrotate(I,angle);%旋转I图像angle角度10.imwrite():将图像写入图形文件中
imwrite(A,filename);%将图像数据 A 写入 filename 指定的文件,并从扩展名推断出文件格式。imwrite 在当前文件夹中创建新文件。输出图像的位深取决于 A 的数据类型和文件格式。对于大多数格式来说: 如果 A 属于数据类型 uint8,则 imwrite 输出 8 位值。 如果 A 属于数据类型 uint16 且输出文件格式支持 16 位数据(JPEG、PNG 和 TIFF),则 imwrite 将输出 16 位的值。如果输出文件格式不支持 16 位数据,则 imwrite 返回错误。 如果 A 是灰度图像或者属于数据类型 double 或 single 的 RGB 彩色图像,则 imwrite 假设动态范围是 [0,1],并在将其作为 8 位值写入文件之前自动按 255 缩放数据。如果 A 中的数据是 single,则在将其写入 GIF 或 TIFF 文件之前将 A 转换为 double。 如果 A 属于 logical 数据类型,则 imwrite 会假定数据为二值图像并将数据写入位深为 1 的文件(如果格式允许)。BMP、PNG 或 TIFF 格式以输入数组形式接受二值图像。 如果 A 包含索引图像数据,则应另外指定 map 输入参数。11.graythresh():使用 Otsu 方法计算全局图像阈值
T = graythresh(I);%使用 Otsu 方法 [1] 根据灰度图像 I 计算全局阈值 T。Otsu 方 %法选择一个阈值,使阈值化的黑白像素的类内方差最小化。全局阈值 T 可与 imbinarize %结合使用以将灰度图像转换为二值图像12.im2bw():基于阈值将图像转换为二值图像
BW = im2bw(I,level);%将灰度图像 I 转换为二值图像 BW,方法是将输入图像中亮度大 %于 level 的所有像素替换为值 1(白色),将所有其他像素替换为值 0(黑色)。 %此范围与图像的类的可能信号级别相关。因此,0.5 的 level 值对应于类的最小值和最大 %值之间的中等强度值。13.imopen():开运算 开运算属于形态学图像处理bai,是先du腐蚀后膨胀,作用是:zhi可以使边界平滑,消除细小的尖刺,断开dao窄小的连接,保持面积大小不变等。
练习二—减小图像的亮度而不改变对比度 程序参考实现
clear; I=imread('rice.png'); K=imadd(I,-20);%降低亮度而不改变对比度 subplot(2,2,1); imhist(I); subplot(2,2,2); imshow(I); J=imdivide(I,2);%改变亮度同时改变对比度 subplot(2,2,3); imhist(K); subplot(2,2,4); imshow(K);程序效果: 练习三—减小图像的亮度同时改变对比度 参考实现:
clear; I=imread('rice.png'); K=imadd(I,-20); subplot(2,2,1); imhist(I); subplot(2,2,2); imshow(I); J=imdivide(I,2); subplot(2,2,3); imhist(J); subplot(2,2,4); imshow(J);程序效果: 练习四—自己构建增强对比度函数来增强图像的对比度 参考实现: 主程序:
clc; clear; I=imread('pout.tif'); Z=myOwnContrast(I,255,0); subplot(1,2,1); imshow(I); %K=histeq(I); matlab自带增强对比度函数 subplot(1,2,2); imshow(Z);函数:
function Z=myOwnContrast(I,maxNew,minNew) Z=uint8(zeros(size(I,1),size(I,2))); for i=1:size(I,1) for j=1:size(I,2) Z(i,j)=((maxNew-minNew)/(max(max(I))-min(min(I))))*(I(i,j)-min(min(I)))... +minNew; end end程序效果: 练习三—不使用im2bw函数将图像转换成黑白图像 参考实现:
clc; clear; I=imread('pout.tif'); Z=uint8(zeros(size(I,1),size(I,2))); %level=graythresh(I); %Z=im2bw(I,level); for i=1:size(I,1) for j=1:size(I,2) if I(i,j)<=mean(mean(I))%以图像的均值作为阈值 % if I(i,j)<=level Z(i,j)=0; else Z(i,j)=1; end end end Z=logical(Z); subplot(2,2,1); imshow(I); subplot(2,2,2); imhist(I); subplot(2,2,3); imshow(Z) subplot(2,2,4); imhist(Z);程序效果:
