《数字图像处理》课程设计文档目录一、课程设计目的 (2)二、课程设计要求 (2)三、课程设计的容 (2)四、课题分析 (3)五、总体设计 (3)六、具体设计 (4)6.1、文件 (4)6.1.1、打开 (4)6.1.2、保存 (4)6.1.3、打印 (4)6.1.4、退出 (4)6.2、直方图统计 (4)6.2.1、R直方图 (4)6.2.2、G直方图 (4)6.2.3、B直方图 (4)6.3、图像增强处里 (5)6.3.1、直方图均衡化 (5)6.3.2、对比度展宽 (6)6.3.3、动态围调整 (6)6.3.4、空间域平滑算法 (6)6.3.4.1、均值滤波 (7)6.3.4.2、中值滤波 (7)6.3.4.3、边界保持滤波 (8)6.4、图像分割 (8)6.4.1、均匀性度量法 (8)6.4.2、类间最大距离法 (9)6.4.3、局部阈值法 (9)6.5、颜色空间转化 (9)6..5.1、RGB转HSV (10)6.5.2、RGB转HIS (10)6.6、其他图像处理功能 (10)6.6.1、锐化 (10)6.6.2、傅里叶………………………………………………………….10\\七、程序调试及结果分析 (11)八、心得体会 (11)九、参考文献 (11)十、附录 (12)基于MATLAB的图像处理的课程设计一、课程设计目的1、提高分析问题、解决问题的能力,进一步巩固数字图像处理系统中的基本原理与方法。
2、熟悉掌握一门计算机语言,可以进行数字图像的应用处理的开发设计。
二、课程设计要求1、要求独立完成设计项目,开发工具为MATLAB,也可为C、C++、java等,具体自选。
各组长有责任督促组员完成任务并提交报告;2、时间为4月28日~6月28日为其两个月的业余时间。
三、课程设计的容学习MATLAB GUI程序设计,利用MATLAB图像处理工具箱,设计和实现自己的Photoshop 。
要求:按照软件工程方法,根据需求进行程序的功能分析和界面设计,给出设计详细说明。
然后按照自己拟定的功能要求进行程序设计和调试。
整个系统要完成的基本功能大致如下:1、能对图像文件(bmp、 jpg、 tiff、 gif等)进行打开、保存、另存、打印、退出等功能操作;2、数字图像的统计信息功能:直方图的统计及绘制;3、数字图像的增强处理功能:(1)直方图的均衡化(2)对比度展宽(3)动态围调整(4)空间域平滑算法的各种算法(如均值滤波、中值滤波、边界保持的滤波方法等)4、数字图像由RGB转换成HIS空间并分别显示其分量图。
5、数字图像分割功能:可采用两种以上方法进行图像分割。
总体设计由于要实现的功能并不是很多,所以在排版的过程中,把各个功能都安排在目录栏上,整体安排如下图所示:四、具体设计6.1、文件6.1.1、打开为了让使用者更方便的使用,所以在设计的时候,通过对话框的形式来选择文件,选择uigetfile函数来实现,uigetfile函数显示一个打开文件对话框,该对话框自动列出当前路径下的目录和文件,由于这个GUI程序的操作对象是图像文件。
Uigetfile函数的调用格式为[name,path]=yigetfile(…), 在按下对话框中的执行按钮“打开”后,返回选择的文件名和路径,分别保存到“name”和“path”中。
如果按下取消按钮或是发生错误,则返回值是0。
根据返回值的情况,如果是0,则弹出提示错误的对话框,否则,通过imread函数读出图像数据,把图像数据赋值给全局变量handles.image。
6.1.2、保存同样也通过对话框的形式来保存图像数据,通过uigetfile函数选择文件名和路径,用getimage(gca)取出坐标2变换后的图像数据保存到变量i,最后用imwrite 函数,把数据i存到指定的文件。
6.1.4、退出退出比较简单,程序如下所示:clc;close all;close(gcf);6.1.3、打印打印功能没能实现,将它设置为不可使用,可用如下代码实现set(handles.print, 'Enable','off' ); %放在open_callback函数末尾set(handles.print, 'Enable','off' );%放在two_OpeningFcn中6.2、直方图统计6.2.1、R直方图由于RGB图像是三维图像,所以图像数据是一个三维数组,为了显示R直方图像,把三维图像降为二维,且是当最后一个参数为1时是R直方图:x=imhist(handles.image(:,:,1)); %当然也可以选择(:,:,2) 或(:,:,3)••••imshow(y);处理前后图片效果如下:6.2.2、G直方图G直方图与R直方图的程序差不多只需将数值为1的R直方图变成2即可成为G直方图x=imhist(handles.image(:,:,2));6.2.3、B直方图同理可得B直方图x=imhist(handles.image(:,:,3));RGB三种直方图统计图如下:原图R直方图G直方图B直方图6.3、图像增强处理6.3.1、直方图均衡化在balance_Callback回退函数中实现直方图均衡化每个回退函数中都要获取图片,上面的RGB直方图也一样需获取打开的图片。
打开图片的为以下程序代码:set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);直方图均衡化是判断是否为灰度图。
用函数isrgb了来判断,不是灰度则将其转化,否则就直接用函数:histeq(handles.image)%handles.image是获取的图片来直方图均衡化处理图片图片前后效果如下:6.3.2、对比度展宽对图像的对比度展宽刻可自己编写算法来处理,同样的,,处理结果如图:6.3.3、动态围调整共图像处理功能未能实现,程序中已给出处理其图像的代码,但有错误,不能找出其错位,将其正确的处理,原因是:nw=1./(b-a).*(h-a.*ones(sx,sy));Error:Matrix dimensions must agree也查过资料修改该语句,有的资料说是乘除和幂方要改成点乘点除,点幂方,这个是合理,但是改正后仍然有错,是在无能为力,代码在后面将给出,可供参考。
6.3.4、空间域平滑算法6.3.4.1、均值滤波经常用到的噪声有两种,高斯噪声,椒盐噪声,可以通过以下两个函数来实现:y=imnoise(handles.img,'gaussian',p1,p2);%高斯噪声y=imnoise(x,'salt & pepper',p1); %椒盐噪声均值滤波中可对高斯滤波,也可以对椒盐滤波,设计过程中采用其一种图片进行处理。
但两种处理的效果就不同,对高斯噪声处理的效果更加明显均值滤波是一种采取平均灰度值的方法进行滤波,用imnoise获得噪声的图片。
这个函数可获得高斯噪声,亦可获得椒盐噪声。
在采用函数conv2进行均值处理,处理前后的图片比较如下:6.3.4.2、中值滤波中值滤波同均值滤波的程序差不多,只是进行滤波的原理不同,则采用不同的函数进行代替,用以下函数可进行中值滤波处理:I = imnoise(handles.image,'salt & pepper', 0.02); imshow(I);j=medfilt2(I);前后图片效果如下:6.3.4.3、边界保持滤波原理不同,采用knn 函数是处理边界保持滤波的,程序代码的形式跟前两种滤波差不多:I = imnoise(handles.image,'salt & pepper', 0.02);imshow(I);j=knn2(I);前后图片效果如下:6.4、 图像分割:图象分割是按照某些特性(如灰度级,频谱,颜色,纹理等)将图象划分成一些区域,在这些区域其特性是相同的或者说是均匀的,两个相邻区域彼此特性则是不同的,其间存在着边缘或边界6.4.1、均匀性度量法当图像被分为目标物和背景两个类时,属于同一类别的像素值分布方差最小,也即具有均匀性。
给定一初始阈值Th=Th0,将图像分为C1和C2两类 分别计算两类中的方差 分别计算两类在图像中的分布概率选择最佳阈值 Th=Th*, 将图像分为C1和C2两类,满足均匀性度量方法的处理结果:2221σσ和6.4.2、类间最大距离法.采用最佳阈值分割后,两类之间的差异最大,且差异采用两类中心与阈值间的距离差度量给定一初始阈值Th=Th0,将图像分为C1和C2两类分别计算两类的灰度均值 计算相对距离度量值 s选择最佳阈值 Th=Th*, 将图像分为C1和C2两类图片效果:6.4.3、局部阈值法不均匀照射,物体背景对比明显, 不能只使用一门限灰度级校正。
图象分成小块,选择局部门限局部阈值法的处理前后结果:6.5、 颜色空间转化6..5.1、RGB 转HSV21μμ和}m ax {|*S S Th Th ==色彩空间相互转化:其中有很多种色彩空间,这里只介绍两种转换关系:RGB转HSV,图像处理中有专门的函数将其进行转化,即rgb2hvs函数转化图像前后对比如下:6.5.2、RGB转HIS首先获取图像的RGB 3个通道R=w(:,:,1);G=w(:,:,2);B=w(:,:,3);观察HSI通道图像因系统没有rgb2hsi函数,只有rgb2hsv函数,可自己编写程序实现算法,用一个循环处理,分别得到HIS的色度,饱和度以及强度图,代码在后面实现图形处理效果如下:6.6、其他图像处理功能6.6.1、锐化6.6.2、傅里叶这两个是附加的图像处理功能,在次不做过多的说明,可向大家看看处理图像结果进行对比一下,看看效果,可在后面附上代码锐化.四种傅里叶变参考文献【1】 阿奇,戈,阳.MATLAB 实用教程[M].:电子工业 【2】 精通matlab6[1].5_(北航_志涌).pdf 【3】MATLAB 编程 (第二版)MATLAB Programming for Engineers Second Edition ) Stephen J. Chapman 著 邢树军 碧波 译 【4】相关的MATLAB 图像处理函数五、 附录function varargout = two(varargin)% Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State =struct('gui_Name',mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', two_OpeningFcn, ...'gui_OutputFcn', two_OutputFcn, ...'gui_LayoutFcn',[] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback =str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before erzhi is made visible.function two_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see OutputFcn.---------------------------------------------------------%接下来是菜单的程序---------------------------------------------------------function file_Callback(hObject, eventdata, handles)--------------------------------------------------------%文件打开程序function open_Callback(hObject, eventdata, handles)[name,path]=uigetfile({'*.bmp'},'载入图像');if isequal(name,0)|isequal(path,0)errordlg('没有选中文件','出错');return;elsex=imread([path,name]);axes(handles.axes1);imshow(x);handles.img=x;handles.noise_img=x;guidata(hObject,handles)end---------------------------------------------------function save_Callback(hObject, eventdata, handles)%文件保存[filename,pathname] = uiputfile('*.bmp','图片保存为');if isequal([filename,pathname],[0,0])errordlg('没有保存','出错');return;elsefile=strcat(pathname,filename);(handles.axes2);i=getimage(gca);imwrite(i,file);end-----------------------------------------------------function exit_Callback(hObject, eventdata, handles)clc;close all;close(gcf);---------------------------------------------------------% 直方图------------------------------------------------------function zhf_Callback(hObject, eventdata, handles)-------------------------------------------------function red_Callback(hObject, eventdata, handles)% R直方图data (see GUIDA TA)set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);x=imhist(handles.image(:,:,1));x1=x(1:10:256);horz=1:10:256;bar(horz,x1);set(handles.axes2,'xtick',0:50:255);------------------------------------------------------function green_Callback(hObject, eventdata, handles)% G直方图set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);x=imhist(handles.image(:,:,2));x1=x(1:10:256);horz=1:10:256;bar(horz,x1);set(handles.axes2,'xtick',0:50:255);------------------------------------------------------function blue_Callback(hObject, eventdata, handles)% B直方图set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);%if isrgb(handles.img)x=imhist(handles.image(:,:,3));x1=x(1:10:256);horz=1:10:256;bar(horz,x1);set(handles.axes2,'xtick',0:50:255);-----------------------------------------------------%图像增强处理--------------------------------------------------------- function zhf_Callback(hObject, eventdata, handles) -------------------------------------------------function balance_Callback(hObject, eventdata, handles)%直方图均衡化set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);if isrgb(handles.image)a=histeq(handles.image(:,:,1));b=histeq(handles.image(:,:,2));c=histeq(handles.image(:,:,3));k(:,:,1)=a;k(:,:,2)=b;k(:,:,3)=c;imshow(k);elseh=histeq(handles.image);imshow(h);endfunction zq_Callback(hObject, eventdata, handles)----------------------------------------------------------------- function duibidu_Callback(hObject, eventdata, handles)%对比度展宽set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);h=im2double(handles.image);[sx,sy]=size(h);nw=h.^0.3;subplot(2,2,1);imshow(h);title('original');subplot(2,2,2);imshow(nw);title('r=0.4');subplot(2,2,3);imshow(h.^0.5);title('r=0.7');subplot(2,2,4);imshow(h.^2);title('r=3');--------------------------------------------------------------------function dongtai_Callback(hObject, eventdata, handles)%动态调整围set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);h=im2double(handles.image);a=0.01;b=0.35;[sx,sy]=size(h);[w,n]=find(h(:)<=a);h(n)=0;[w1,n1]=find(h(:)>b);h(n1)=1;nw=1./(b-a).*(h-a.*ones(sx,sy));subplot(1,2,1);imshow(h);subplot(1,2,2);imshow(nw);----------------------------------------------------------------- %空间域平滑算法function pinghua_Callback(hObject, eventdata, handles)-----------------------------------------------------------------function junzhi_Callback(hObject, eventdata, handles)%均值滤波h=[1 1 1;1 1 1;1 1 1];h=h/9;set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);x=imnoise(handles.image,'gaussian',0,0.02);imshow(x);j=conv2(x,h);figure,imshow(j,[]);--------------------------------------------------------------------function zhongzhi_Callback(hObject, eventdata, handles)%中值滤波set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);% I=imnoise(I,'gaussian',0,0.02);I = imnoise(handles.image,'salt & pepper',0.02);%j=medfilt2(I);figure,imshow(j,[]);--------------------------------------------------------------------function bianjie_Callback(hObject, eventdata, handles)% 边界保持滤波set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);% I=imnoise(I,'gaussian',0,0.02);I = imnoise(handles.image,'salt & pepper',0.02);imshow(I);j=knn2(I);figure,imshow(j,[]);-------------------------------------------------------------------------------------------------------------------------------------function junyunxing_Callback(hObject, eventdata, handles)%均与性度量法set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);v=double(handles.image);[sx,sy]=size(v);num=sx*sy;t=[];for th=6:254[r1,c1]=find(v(:)>=th);[r2,c2]=find(v(:)<th);if(length(r1)~=0 & length(c1)~=0 )L1=v(r1);elseL1=[];endif(length(r2)~=0 & length(c2)~=0 )L2=v(r2);elseL2=[];endm1=mean(L1(:)); m2=mean(L2(:));Var1=sum((L1(:)-m1).^2);Var2=sum((L2(:)-m2 ).^2);Var1=var(L1(:));Var2=var(L2(:));P1=length(L1(:))/num;P2=length(L2(:))/num;t=[t,P1*Var1+P2*Var2];end[c,l]=min(t);B=v;[r1,c1]=find(v(:)>=l+5);[r2,c2]=find(v(:)<l+5);B(r1)=255; B(r2)=0;imshow(uint8(B));%--------------------------------------------------------------------function jubuyuzhi_Callback(hObject, eventdata, handles)%局部阈值法set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);v=rgb2gray(handles.image);imshow(v); R=zeros(size(v));H = FSPECIAL('gaussian',9,2.4);v = imfilter(v,H);t=graythresh(v); t=t*255;[c,l]=find( v(:)>t);R(c)=1;[x,y]=size(R); q=R;for i=10:x-10for j=10:y-10if R(i,j)==0t=[R(i-1,j-1),R(i-1,j),R(i-1,j+1),R(i,j-1),R(i,j+1),R(i+1 ,j-1),R(i+1,j),R(i+1,j+1)];if sum(t)==0q(i,j)=1;endendendendfigure, imshow(q,[]);--------------------------------------------------------------------function leijianzuidajuli_Callback(hObject, eventdata, handles)%类间最大法set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);X=rgb2gray(handles.image);[r,c]=size(X);figure (1)subplot(1,2,1)imshow(X)R=zeros(1,256);for i=50:150Xi0=X0<=i;N0=sum(sum(Xi0));Xm0=X0(Xi0);u0=sum(Xm0)/N0;Xi1=X0>i;N1=sum(sum(Xi1));Xm1=X0(Xi1);u1=sum(Xm1)/N1;R(i+1)=(u1-i)*(i-u0)/((u1-u0)^2);endTh=find(R==max(R(51:151)))-1X2=zeros(r,c);for i=1:rfor j=1:cX2(i,j)=X0(i,j)>Th;endendsubplot(2,2,2)imshow(X2)----------------------------------------------------------------- %颜色空间转化--------------------------------------------------------------------function hsv_Callback(hObject, eventdata, handles)%RGB转HSVset(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);hv=rgb2hsv(handles.image);subplot(2,2,1);imshow(hv);title('RGB•• HSV');%RGB=reshape(ones(64,1)*reshape(jet(64),1,1 92),[64,64,3]); ••H=hv(:,:,1); •S=hv(:,:,2);V=hv(:,:,3);subplot(2,2,2);imshow(H) ;title('• •§•§');subplot(2,2,3);imshow(S);title('• •§•§');subplot(2,2,4);imshow(V);title('• •§•§');--------------------------------------------------------------------function HIS_Callback(hObject, eventdata, handles)%RGB转HSIset(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);W=im2double(handles.image);%获得double 型的图形矩阵[m,n,q]=size(W);R=W(:,:,1);G=W(:,:,2);B=W(:,:,3);% 改变通道来观察图像H=zeros(m,n);S=H;for i1=1:mfor i2=1:nnumerator=0.5*(R(i1,i2)-G(i1,i2)+R(i1,i2)-B(i1,i2));denominator=sqrt((R(i1,i2)-G(i1,i2))^2+(R(i1,i2)-B(i 1,i2))*(G(i1,i2)-B(i1,i2)));theta=acos(numerator/denominator)*180/pi;if(B(i1,i2)<=G(i1,i2))H(i1,i2)=theta;elseH(i1,i2)=360-theta;endmin1=min(R(i1,i2),G(i1,i2));min1=min(B(i1,i2),min1);S(i1,i2)=1-3/(R(i1,i2)+G(i1,i2)+B(i1,i2))*min1;endendI=(R+G+B)/3;figure,subplot(1,3,1),imshow(H,[]),title('色度图H');set(gcf,'outerposition',get(0,'screensize'));set(gcf,'NumberTitle','off','Name','HSI通道图像');subplot(1,2,2),imshow(S),title('饱和度图S');subplot(1,2,3),imshow(I),title('强度图•I');%----------------------------------------------------------------- %其他图像处理---------------------------------------------------------------------------function fly_Callback(hObject, eventdata, handles)%傅里叶变化set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);[m,n]=size(handles.image);d=zeros(m,n);d(60:100,60:100)=1;w=fft2(d);w1=fftshift(w);[sx,sy]=size(d);subplot(2,2,1); imshow(d);subplot(2,2,2); imshow(abs(w1));for i=1:sxt= fft(d(i,:));len=length(t)/2;F1(i,:)=[(t(len+1:end)),t(1:len)];endfor i=1:syF2=fft(F1(:,i));len=length(F2)/2;F(:,i)=[(F2(len+1:end));F2(1:len)];endsubplot(2,2,3);imshow(abs(F1));subplot(2,2,4);imshow((abs(F)));function ruihua_Callback(hObject, eventdata, handles)%锐化k=2;h1=[-1 0 1;-k 0 k;-1 0 1];h2=[1 k 1;0 0 0;-1 -k -1];set(handles.axes2,'HandleVisibility','ON');axes(handles.axes2);I=rgb2gray(handles.image);subplot(121);imshow(I);J1(:,:)=conv2(I(:,:),h1);J2(:,:)=conv2(I(:,:),h2);J=abs(J1)+abs(J2);subplot(122);imshow((J),[0 255]);。