1、 1 / 52用 MATLAB 进行图像处理算法的界面设计2 / 52目 录1.设计目的32.题目分析33.总体设计34.具体设计55.结果分析346.心得体会347.附录代码363 / 521、设计目的:综合运用 MATLAB 工具箱实现图像处理的 GUI 程序设计, 利用MATLAB 图像处理工具箱,设计和实现自己的 Photoshop 。2、题目分析 利用 matlab 的 GUI 程序设计一个简单实用的图像处理程序。该程序应具备图像处理的常用功能,以满足用户的使用。现设计程序有以下基本功能:1)图像的读取和保存。2)设计图形用户界面,让用户能够对图像进行任意的亮度和对比度变化调整,显示
2、和对比变换前后的图像。3)设计图形用户界面,让用户能够用鼠标选取图像感兴趣区域,显示和保存该选择区域。4)编写程序通过最近邻插值和双线性插值等算法将用户所选取的图像区域进行放大和缩小整数倍的操作,并保存,比较几种插值的效果。5)图像直方图统计和直方图均衡,要求显示直方图统计,比较直方图均衡后的效果。6)能对图像加入各种噪声,并通过几种滤波算法实现去噪并显示结果。7)额外功能。3、总体设计4 / 52图一软件的总体设计界面布局如上图所示,主要分为 2 个部分:显示区域与操作区域。显示区域:显示载入原图,以及通过处理后的图像。操作区域:通过功能键实现对图像的各种处理。在截图中可见,左部为一系列功能
3、按键如“还原” 、 “撤销” 、 “截图”等等 ;界面正中部分为图片显示部分,界面中下方为系列功能切换选择组。设计完成后运行的软件界面如下:图二与图一先比,运行后的界面更为简洁。利用“编辑”菜单可调出相应的功能键。例如:5 / 524、具体设计现介绍各个功能模块的功能与实现。4.1 菜单栏的设计。通过 Menu Editor 创建如下菜单,通过以下菜单来控制显示或隐藏功能按键6 / 52以“编辑”菜单中“图像变形”中的“图像翻转”为例说明实现用户界面功能键“图像翻转”的显示与隐藏。实现该功能的程序段如下:function tuxiangfanzhuan_Callback(hObject, ev
4、entdata, handles)% hObject handle to tuxiangfanzhuan (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)set(handles.uipanel7,Visible,on);if strcmp(get(gcbo, Checked),on)set(handles.uipanel7,Visible,on);set(gcbo, Che
5、cked, off);set(handles.uipanel7,Visible,off);else set(gcbo, Checked, on);end该段程序通过设置“图像翻转”功能键对应的句柄 uipanel7 中的“Visible”属性的开关来实现该功能键的显示隐藏。其他同理。4.2 图像的读取和保存。(1)利用“文件”菜单中的“打开” 、 “保存为”分别实现图片的读取与保存。7 / 52利用matlab中 “ uigetfile”、“imread” “imshow”实现图像文件的读取与显示:function openfile_Callback(hObject, eventdata, h
6、andles)% hObject handle to openfile (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)filename,pathname=uigetfile(*.jpg;*.bmp;*.tif;*.*,载入图像);if isequal(filename,0)|isequal(pathname,0)errordlg(没有选中文件,出错);return;els
7、e file=pathname,filename;global S %设置一个全局变量S,保存初始图像路径,以便之后的还原操作8 / 52S=file;x=imread(file);set(handles.axes1,HandleVisibility,ON);axes(handles.axes1);imshow(x);set(handles.axes1,HandleVisibility,OFF);axes(handles.axes2);imshow(x);handles.img=x;guidata(hObject,handles);end程序关键部分: 通过filename,pathname=
8、uigetfile(*.jpg;*.bmp;*.tif;*.*,载入图像)选择相应路径打开的图像;通过file=pathname,filename; x=imread(file); 读取选中的图像;最后,通过imshow(x)在显示区域上显示图像。(2)图像保存。利用“uiputfile”、“imwrite”函数实现图像文件的保存。function save_Callback(hObject, eventdata, handles)9 / 52% hObject handle to save (see GCBO)% eventdata reserved - to be defined in a
9、 future version of MATLAB% handles structure with handles and user data (see GUIDATA)sfilename ,sfilepath=uiputfile(*.jpg;*.bmp;*.tif;*.*,保存图像文件,untitled.jpg);if isequal(sfilename,sfilepath,0,0)sfilefullname=sfilepath ,sfilename;imwrite(handles.img,sfilefullname);elsemsgbox(你按了取消键,保存失败);end程序关键部分:通s
10、filename ,sfilepath=uiputfile(*.jpg;*.bmp;*.tif;*.*,保存图像文件,untitled.jpg)选择图像文件保存的路径与格式;然后,通过sfilefullname=sfilepath ,sfilename;imwrite(handles.img,sfilefullname); 实现对图像的保存。(3)程序的退出。function exit_Callback(hObject, eventdata, handles)% hObject handle to exit (see GCBO)% eventdata reserved - to be defi
11、ned in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)clc;close all;close(gcf);clear;4.3对图像进行任意的亮度和对比度变化调整,显示和对比变换前后的图像。10 / 52运行程序后,通过“编辑”菜单中的“常用处理”选中“亮度调节”在显示出相应的功能键后,通过载入读取图像,比并进行处理,效果如下:亮度处理前:亮度处理后:实现程序段如下:% - Executes on button press in radiobutton12.funct
12、ion radiobutton12_Callback(hObject, eventdata, handles)11 / 52% hObject handle to radiobutton12 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hint: get(hObject,Value) returns toggle state of radiobutton12glob
13、al Taxes(handles.axes2);T=getimage;prompt=调整倍数;defans=1;p=inputdlg(prompt,input,1,defans);p1=str2num(p1);y=imadjust(handles.img, , ,p1); %亮度调节imshow(y);handles.img=y;guidata(hObject,handles);对比度处理前:对比度处理后(增强 3 倍):12 / 52对比度减弱 1.5 倍后:实现程序段如下:function uipanel10_SelectionChangeFcn(hObject, eventdata, h
14、andles)% hObject handle to uipanel10 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global Tstr=get(hObject,string);axes(handles.axes2);switch strcase增强T=getimage;prompt=输入参数:;defans=1;p=inputdlg(prompt,input,1,
15、defans);p1=str2num(p1);f=immultiply(handles.img,p1); imshow(f);13 / 52handles.img=f;guidata(hObject,handles);case减弱T=getimage;prompt=输入参数:;defans=1;p=inputdlg(prompt,input,1,defans);p1=str2num(p1);f=imdivide(handles.img,p1); imshow(f);handles.img=f;guidata(hObject,handles);end该程序段主要通过 f=immultiply(h
16、andles.img,p1); p=inputdlg(prompt,input,1,defans);分别实现图像对比度的增强与减弱。44 用鼠标选取图像感兴趣区域,显示和保存该选择区域。通过imcrop(x)函数来实现对图片某一区域的截取,截取的图片在右框中显示。结合“保存为”,可把截图处理后的图片保存在指定路径。实现程序段如下:14 / 52% - Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushb
17、utton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global Taxes(handles.axes2);T=getimage;x=imcrop(handles.img); %截图imshow(x);handles.img=x;guidata(hObject,handles);4.5 图像转化为灰度图像。由于在matlab中较多的图像处理函数支持对灰度图像进行处
18、理,故对图像进行灰度转化十分必要。可利用rgb2gray(X)函数对其他图像进行灰度图像的转化。转化实例如下:实现程序段如下:% - Executes on button press in radiobutton16.function radiobutton16_Callback(hObject, eventdata, handles)15 / 52% hObject handle to radiobutton16 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles stru
19、cture with handles and user data (see GUIDATA)% Hint: get(hObject,Value) returns toggle state of radiobutton16global Taxes(handles.axes2);T=getimage;x=rgb2gray(handles.img); %RGBimshow(x);handles.img=x;guidata(hObject,handles);4.6对图像进行放大和缩小整数倍的操作。通过imresize(X,n,mode)函数对图像X进行放大或者缩小。N放大缩小倍数,mode为采用的方式
20、。 通过处理后可发现保存的图片的比原图放大了(缩小了)。实现的程序段如下:function uipanel9_SelectionChangeFcn(hObject, eventdata, handles)% hObject handle to uipanel9 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global Tstr=get(hObject,string);a
21、xes(handles.axes2);switch strcase最近邻插值T=getimage;prompt=输入参数:;16 / 52defans=2;p=inputdlg(prompt,input,1,defans);p1=str2num(p1);f=imresize(handles.img,p1,nearest); imshow(f);handles.img=f;guidata(hObject,handles);case双线性插值T=getimage;prompt=输入参数:;defans=1;p=inputdlg(prompt,input,1,defans);p1=str2num(p
22、1);f=imresize(handles.img,p1,bilinear); imshow(f);handles.img=f;guidata(hObject,handles);end4.7图像直方图统计和直方图均衡。(1)通过histeq(X)函数实现直方图均衡。因为此函数只能对灰度图像进行直方图均衡。故应先将彩图转为灰度图像。17 / 52在上一步的基础上对第二幅图进行直方图均衡:直方图均衡实现程序段如下:% - Executes on button press in pushbutton7.function pushbutton7_Callback(hObject, eventdata,
23、 handles)% hObject handle to pushbutton7 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global Taxes(handles.axes2);18 / 52T=getimage;h=histeq(handles.img); imshow(h);handles.img=h;guidata(hObject,handles); 关键部分
24、:通过 h=histeq(handles.img)进行直方图均衡 (2)直方图统计。通过利用imhist(X)函数来实现直方图统计。% - Executes on button press in pushbutton8.function pushbutton8_Callback(hObject, eventdata, handles)% hObject handle to pushbutton8 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with
25、 handles and user data (see GUIDATA)axes(handles.axes2);x=imhist(handles.img); %直方图统计x1=x(1:10:256);horz=1:10:256;bar(horz,x1);19 / 52axis(0 255 0 15000);set(handles.axes2,xtick,0:50:255);set(handles.axes2,ytick,0:2000:15000);注意:横纵坐标的范围应选取适当,否则,统计图表有可能超出范围。4.8 加入各种噪声,并通过几种滤波算法实现去噪。(1)加入噪声。通过imnoise(
26、I,type,parameters)来加入各种噪声。加入椒盐噪声加入高斯噪声:20 / 52加入乘性噪声:21 / 52实现程序段如下:function uipanel4_SelectionChangeFcn(hObject, eventdata, handles)% hObject handle to uipanel4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)gl
27、obal Tstr=get(hObject,string);axes(handles.axes2);switch strcase 椒盐噪声T=getimage; prompt=数日椒盐噪声参数1:;defans=0.02;p=inputdlg(prompt,input,1,defans);p1=str2num(p1);f=imnoise(handles.img,salt imshow(f);handles.img=f;guidata(hObject,handles);case 高斯噪声T=getimage;prompt=输入高斯噪声1:,输入高斯噪声2;defans=0,0.02;22 / 5
28、2p=inputdlg(prompt,input,1,defans);p1=str2num(p1);p2=str2num(p2);f=imnoise(handles.img,gaussian,p1,p2);imshow(f);handles.img=f;guidata(hObject,handles); case 乘性噪声T=getimage;prompt=输入乘性噪声1:;defans=0.02;p=inputdlg(prompt,input,1,defans);p1=str2num(p1);f=imnoise(handles.img,speckle,p1);imshow(f);handle
29、s.img=f;guidata(hObject,handles); end(2)滤除噪声(椒盐噪声) 。滤波前中值滤波后23 / 52线性滤波后自适应滤波后实现程序段如下:function uipanel5_SelectionChangeFcn(hObject, eventdata, handles) %图像滤波% hObject handle to uipanel5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and u
30、ser data (see GUIDATA)global Tstr=get(hObject,string);axes(handles.axes2);24 / 52switch strcase 中值滤波T=getimage;k=medfilt2(handles.img);imshow(k);handles.img=k;guidata(hObject,handles);case 线性滤波T=getimage;h=1 1 1;1 1 1;1 1 1;H=h/9;i=double(handles.img);k=convn(i,h);imshow(k,);handles.img=k;guidata(hO
31、bject,handles);case 自适应滤波T=getimage;k=wiener2(handles.img,5,5);imshow(k);handles.img=k;guidata(hObject,handles);end 低通滤波器滤波后25 / 52高通滤波器滤波后实现程序如下:% - Executes on button press in pushbutton14.function pushbutton14_Callback(hObject, eventdata, handles)% hObject handle to pushbutton14 (see GCBO)% event
32、data reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)axes(handles.axes2);y1=handles.img; f=double(y1); % 数据类型转换,matlab不支持图像的无符号整型的计算g=fft2(f); % 傅里叶变换g=fftshift(g); % 转换数据矩阵M,N=size(g);nn=2; %二阶巴特沃斯低通滤波器d0=50; %截止频率50m=fix(M/2); n=fix
33、(N/2);for i=1:Mfor j=1:Nd=sqrt(i-m)2+(j-n)2);h=1/(1+0.414*(d/d0)(2*nn); % 计算低通滤波器传递函数result(i,j)=h*g(i,j);end26 / 52endresult=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2);imshow(y3); % 显示处理后的图像% - Executes on button press in pushbutton15.function pushbutton15_Callback(hObject, eventdata, han
34、dles)% hObject handle to pushbutton15 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)axes(handles.axes2);x=(handles.img);f=double(x); % 数据类型转换k=fft2(f); % 傅里叶变换g=fftshift(k); % 转换数据矩阵M,N=size(g);nn=2;d0=25; %截止频
35、率25m=fix(M/2); n=fix(N/2);for i=1:Mfor j=1:Nd=sqrt(i-m)2+(j-n)2); % 计算高通滤波器传递函数if d=d027 / 52h=0;else h=1;endresult(i,j)=h*g(i,j);endendresult=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2);imshow(y3); % 显示滤波处理后的图像4.9 还原通过一个全局变量保存原始图像路径,在需要还原至原始图像时,重新读取该全局变量即可。实现程序段如下:% - Executes on button pr
36、ess in pushbutton9.function pushbutton9_Callback(hObject, eventdata, handles)% hObject handle to pushbutton9 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global S %还原axes(handles.axes2);y=imread(S);f=imshow(y)
37、;handles.img=y;guidata(hObject,handles);4.10 撤销。撤销上一步的操作。通过另设一个全局变量 T 保存是上一次操作后的图像。28 / 52实现程序段如下:- Executes on button press in pushbutton11.function pushbutton11_Callback(hObject, eventdata, handles)% hObject handle to pushbutton11 (see GCBO)% eventdata reserved - to be defined in a future version
38、of MATLAB% handles structure with handles and user data (see GUIDATA)axes(handles.axes2); %撤销global Timshow(T);handles.img=T;guidata(hObject,handles);该程序段只是简单的显示图像的功能,其中全局变量T中储存的是上一步操作处理后的图像信息。在以上的各段功能程序段中可见均有 “T=getimage;”,此句把当前操作前的图像,即上一次操作后的图像信息赋予全局变量T。4.11 图像变形。(1)图像翻转。实现图像的镜像翻转。左右翻转:上下翻转29 / 52
39、实现程序如下:function uipanel7_SelectionChangeFcn(hObject, eventdata, handles) %图像翻转% hObject handle to uipanel7 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)str=get(hObject,string);axes(handles.axes2);global Tswitc
40、h strcase 左右翻转T=handles.img;f=fliplr(handles.img);imshow(f);handles.img=f;guidata(hObject,handles); case 上下翻转T=handles.img;f=flipud(handles.img);imshow(f);handles.img=f;guidata(hObject,handles); 30 / 52end程序关键部分:通过f=fliplr(handles.img); f=flipud(handles.img);分别实现左右镜像翻转与上下镜像翻转。(2)图像旋转。实现图像的逆时针旋转任意角度。实现程序段如下:function pushbutton3_Callback(hObject, eventdata, handles) %图像爱那个旋转% hObject handle to pushbutton3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global Taxes(handles.axes2);T=getimage;prompt=旋转角度:;