数字图像处理 阮秋琦 MATLAB源程序要点.docx
《数字图像处理 阮秋琦 MATLAB源程序要点.docx》由会员分享,可在线阅读,更多相关《数字图像处理 阮秋琦 MATLAB源程序要点.docx(26页珍藏版)》请在冰豆网上搜索。
![数字图像处理 阮秋琦 MATLAB源程序要点.docx](https://file1.bdocx.com/fileroot1/2022-12/16/b0a1b79c-5109-41a3-9a7c-21367428b95e/b0a1b79c-5109-41a3-9a7c-21367428b95e1.gif)
数字图像处理阮秋琦MATLAB源程序要点
%系统自动生成的创建对话框的代码
functionvarargout=myproject(varargin)
%MYPROJECTM-fileformyproject.fig
%MYPROJECT,byitself,createsanewMYPROJECTorraisestheexisting
%singleton*.
%
%H=MYPROJECTreturnsthehandletoanewMYPROJECTorthehandleto
%theexistingsingleton*.
%
%MYPROJECT('CALLBACK',hObject,eventData,handles,...)callsthelocal
%functionnamedCALLBACKinMYPROJECT.Mwiththegiveninputarguments.
%
%MYPROJECT('Property','Value',...)createsanewMYPROJECTorraisesthe
%existingsingleton*.Startingfromtheleft,propertyvaluepairsare
%appliedtotheGUIbeforemyproject_OpeningFcngetscalled.An
%unrecognizedpropertynameorinvalidvaluemakespropertyapplication
%stop.Allinputsarepassedtomyproject_OpeningFcnviavarargin.
%
%*SeeGUIOptionsonGUIDE'sToolsmenu.Choose"GUIallowsonlyone
%instancetorun(singleton)".
%
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%Edittheabovetexttomodifytheresponsetohelpmyproject
%LastModifiedbyGUIDEv2.507-Jun-200811:
33:
02
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@myproject_OpeningFcn,...
'gui_OutputFcn',@myproject_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
%Endinitializationcode-DONOTEDIT
%---Executesjustbeforemyprojectismadevisible.
functionmyproject_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstomyproject(seeVARARGIN)
%Choosedefaultcommandlineoutputformyproject
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakesmyprojectwaitforuserresponse(seeUIRESUME)
%uiwait(handles.figure1);
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=myproject_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
%以下为另存为按钮的回调函数,功能为存储图像处理后的图像到用户选择的磁盘空间中。
%---Executesonbuttonpressinlingcunwei.
functionlingcunwei_Callback(hObject,eventdata,handles)%另存为按钮的回调函数
globalImagenUmbral%定义全局变量
ifisempty(ImagenUmbral)==1,msgbox('Doesn''texistanimage');return,
end%如果ImagenUmbral不包含图像,则弹出对话框并显示'Doesn''texistanimage'
[filename,pathname]=uiputfile({'*.jpg';,'*.tif';,'*.gif';,'*.bmp';,'*.png';,...
'*.hdf';,'*.pcx';,'*.xwd';,'*.ico';,'*.cur';,'*.ras';,...
'*.pdm';,'*.pgm';,'*.ppm'},'Savefilename');%显示保存文件的对话框
ifisequal(filename,0)|isequal(pathname,0)
errordlg('Savingcanceled','ThresholdGUI');error('Savingcanceled')
else%如果不存在该文件,或者不存在保存路径,则显示错误信息
try
imwrite(ImagenUmbral,[pathname,filename]);%保存文件
end%try
end%if
%hObjecthandletolingcunwei(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%打印按钮的回调函数
%---Executesonbuttonpressindayinshuchu.
functiondayinshuchu_Callback(hObject,eventdata,handles)%打印按钮的回调函数
printdlg%显示打印对话框
%hObjecthandletodayinshuchu(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%复制到剪切板的回调函数,其功能为将处理后的图像存储到剪切板,以备处理图像处理后的图像之用。
%---Executesonbuttonpressinfuzhidaojianqieban.
functionfuzhidaojianqieban_Callback(hObject,eventdata,handles)%复制到剪切板按钮的回调函数
globalImagenUmbral%处理后的图像
globalJ%处理前的图像
J=ImagenUmbral%将处理后的图像赋予处理前的图像
%hObjecthandletofuzhidaojianqieban(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%几何变换的回调函数,它包含三个基本的几何变换,分别为水平变换,垂直变换,对角变换。
均使用了将像素灰度值进行对换的方式。
%---Executesonbuttonpressinjihebianhuan.
functionjihebianhuan_Callback(hObject,eventdata,handles)
globalImagenUmbral%定义一个全局变量ImagenUmbral
globalJ%使用全局变量J
selection=questdlg('请选择几何变换','选择几何变换','水平镜像','垂直镜像','对角镜像','default')
ifstrcmp(selection,'水平镜像')%如果选择“水平镜像”
[M,N]=size(J)%测量图像尺寸参数
I=J%将J赋给I
fori=1:
M%从第一行到最后一行
forj=1:
N/2%对每一行的第一个像素到中间的一个像素
t=I(i,j);I(i,j)=I(i,N-j+1);I(i,N-j+1)=t;%交换这一行第一个像素和最后一个像素的灰度值,交换第二个和倒数第二个灰度值,以此类推,直到中间的像素。
end%endfor
end%endfor
subplot(224);%分割绘图窗口为两行两列,将句柄移到第四个位置
imshow(I)%显示图像
ImagenUmbral=I;%将图像赋予全局变量ImagenUmbral
elseifstrcmp(selection,'垂直镜像')%如果选择“垂直镜像”
[M,N]=size(J)%测量图像尺寸参数
I=J%将J赋给I
forj=1:
N%从第一列到最后一列
fori=1:
M/2%对每一列的第一个像素到中间的一个像素
t=I(i,j);I(i,j)=I(M-i+1,j);I(M-i+1,j)=t;%交换这一列第一个像素和最后一个像素的灰度值,交换第二个和倒数第二个灰度值,以此类推,直到中间的像素。
end%endfor
end%endfor
subplot(224);%分割绘图窗口为两行两列,将句柄移到第四个位置
imshow(I)%显示图像
ImagenUmbral=I;%将图像赋予全局变量ImagenUmbral
elseifstrcmp(selection,'对角镜像')%如果选择“垂直镜像”
I=J%将J赋给I
[M,N]=size(I)%测量图像尺寸参数
fori=1:
M%从第一行到最后一行
forj=1:
N/2%对每一行的第一个像素到中间的一个像素
t=I(i,j);I(i,j)=I(M-i+1,N-j+1);I(M-i+1,N-j+1)=t;%交换第i行的第一个像素和M-i+1行的最后一个像素的灰度值,以此类推,直到中间的像素。
end%endfor
end%endfor
subplot(224);%分割绘图窗口为两行两列,将句柄移到第四个位置
imshow(I)%显示图像
ImagenUmbral=I;%将图像赋予全局变量ImagenUmbral
end%endofelseifstrcmp(selection,'对角镜像')
end%endofelseifstrcmp(selection,'垂直镜像')
end%endofifstrcmp(selection,'水平镜像')
%hObjecthandletojihebianhuan(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%灰度反转按钮的回调函数,灰度反转采用公式T=L-1-S,其中S为存储原始图像的灰度值的矩阵,T为存储反转后图像灰度值的矩阵。
%---Executesonbuttonpressinhuidufanzhuan.
functionhuidufanzhuan_Callback(hObject,eventdata,handles)%灰度反转按钮的回调函数
globalImagenUmbral%定义一个全局变量ImagenUmbral,将灰度反转后的图像存入ImagenUmbral中
globalJ%使用全局变量J
A=double(J)%将图像J的各点像素值存入矩阵A中
A=255-A%用255减去A的各点像素值,再重新存入A中
A=uint8(A)%将A的每个元素转换成整数
subplot(224)%分割绘图窗口为两行两列,将句柄移到第四个位置
imshow(A)%显示图像A
ImagenUmbral=A%将A赋给全局变量ImagenUmbral
%hObjecthandletohuidufanzhuan(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%直方图均衡化按钮的回调函数,直方图均衡化的处理目的是使图像变得清晰,明快。
%---Executesonbuttonpressinzhifangtujunhenghua.
functionzhifangtujunhenghua_Callback(hObject,eventdata,handles)%直方图均衡化按钮的回调函数
globalImagenUmbral%定义一个全局变量ImagenUmbral,将直方图均衡化后的图像存入ImagenUmbral中
globalJ%使用全局变量J
subplot(2,2,4);%分割绘图窗口为两行两列,将当前句柄移到第四个位置
%W=histeq(J);%Matlab自带直方图均衡化函数
PS=J%令PS为待处理的图像
[m,n]=size(PS);%测量图像尺寸参数
GP=zeros(1,256);%预创建存放灰度出现概率的向量
fork=0:
255%对每一个像素值
GP(k+1)=length(find(PS==k))/(m*n);%计算每级灰度出现的概率,将其存入GP中相应位置
end%endfor
S1=zeros(1,256);%分配一个256维数组
fori=1:
256%对每一个像素值
forj=1:
i%对从1到这个像素值的所有像素的
S1(i)=GP(j)+S1(i);%计算Sk,Sk为一个映射,将对从1到这个像素值的所有像素的概率相加
end%endfor
end%endfor
S2=round((S1*256)+0.5);%将Sk归到相近级的灰度
PA=PS;%定义一个与PS一样大小的矩阵
fori=0:
255%对每一个像素值
PA(find(PS==i))=S2(i+1);%将各个像素归一化后的灰度值赋给这个像素
end%endfor
imshow(PA)%显示均衡化后的图像
ImagenUmbral=PA;%将均衡化图像赋给ImagenUmbral
%hObjecthandletozhifangtujunhenghua(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%直方图统计按钮的回调函数,此按钮可以统计处理前后的图像的直方图。
%---Executesonbuttonpressinzhifangtutongji.
functionzhifangtutongji_Callback(hObject,eventdata,handles)%直方图统计按钮的回调函数
globalImagenUmbral%定义一个全局变量ImagenUmbral
globalJ%使用全局变量J
figure%弹出绘图窗口
subplot(211)%分割绘图窗口为两行一列,将当前句柄移到第一个区域
[m,n]=size(J);%测量图像尺寸参数
GP=zeros(1,256);%预创建存放灰度出现概率的向量
fork=0:
255%对每一个像素
GP(k+1)=length(find(J==k))/(m*n);%计算每级灰度出现的概率,将其存入GP中相应位置
end%endfor
bar(0:
255,GP,'b')%绘制直方图
title('原图像直方图')%标题为'原图像直方图'
subplot(212)%分割绘图窗口为两行一列,将当前句柄移到第二个区域
K=ImagenUmbral%将全局变量ImagenUmbral赋予K
[m,n]=size(K);%测量图像尺寸参数
GP=zeros(1,256);%预创建存放灰度出现概率的向量
fork=0:
255%对每一个像素
GP(k+1)=length(find(K==k))/(m*n);%计算每级灰度出现的概率,将其存入GP中相应位置
end%endfor
bar(0:
255,GP,'b')%绘制直方图
title('处理后图像直方图')%标题为'处理后图像直方图'
%hObjecthandletozhifangtutongji(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%图像复原按钮的回调函数,采用中值滤波和均值滤波两种方法,其中,中值滤波是将图像中一点的值用该点的一个邻域中各点值的中值代替,以达到滤波的效果。
均值滤波与之不同的是将图像中一点的值用该点的一个邻域中各点值的均值代替。
%---Executesonbuttonpressintuxiangfuyuan.
functiontuxiangfuyuan_Callback(hObject,eventdata,handles)%图像复原按钮的回调函数
globalImagenUmbral%定义一个全局变量ImagenUmbral
globalJ%使用全局变量J
selection=questdlg('请选择图像复原方法','图像复原方法','中值滤波','均值滤波','default')
ifstrcmp(selection,'中值滤波')%如果选择'中值滤波'
A=J%将J赋给A
[m,n]=size(A);%测量图像尺寸参数
B=A;%将A赋给B
pixel_block=zeros(1,9);%开辟一个一行九列的数组,均赋于初值0
fori=2:
m-1%对A中的各个像素点(不包括边界)
forj=2:
n-2
pixel_block=reshape(A(i-1:
i+1,j-1:
j+1),9,1);%采用3*3的窗口,将一个像素点及其周围的8各点,依次存入新开辟的数组pixel_block中
sorted_block=sort(pixel_block);%将数组pixel_block排序
block_median=sorted_block(5);%将数组的中值赋予block_median
B(i,j)=block_median;%将block_median赋予B的相应位置的像素值
end;%endofforj=2:
n-2
end;%endoffori=2:
m-1
B=uint8(B);%将B中所有元素转换成0~255之间的整数
subplot(224)%分割绘图窗口为两行两列,将句柄移到第四个位置
imshow(B)%显示图像B
ImagenUmbral=B%将B赋给全局变量ImagenUmbral
elseifstrcmp(selection,'均值滤波')%如果选择'均值滤波'
A=J%将J赋给A
[m,n]=size(A);%m为A的行数,n为A的列数
B=A;%将A赋给B
pixel_block=zeros(1,9);%开辟一个一行九列的数组,均赋于初值0
fori=2:
m-1%对A中的各个像素点(不包括