数字图像处理MATLAB大作业:基础版

您所在的位置:网站首页 大数据基础大作业怎么写好 数字图像处理MATLAB大作业:基础版

数字图像处理MATLAB大作业:基础版

2024-07-02 12:51| 来源: 网络整理| 查看: 265

图像处理基础版 一、主程序介绍二、功能模块1 图像的灰度化与二值化1.1 算法原理1.2算法实现1.2结果分析 2.图像的代数运算与逻辑运算2.1 算法原理2.2 算法实现2.3 实验结果及分析 3.直方图均衡化3.1 算法原理3.2算法实现3.3结果分析 4.基于空间域的图像平滑与边缘提取4.1 算法原理4.2算法实现4.3结果分析 5.基于频域的图像平滑与边缘提取5.1算法原理5.2算法实现5.3结果分析 6.图像复原6.1算法原理6.2算法实现6.3结果分析 7.图像的形态变换7.1算法原理7.2算法实现7.3结果分析 8.图像分割-提取红苹果8.1算法原理8.2算法实现8.3结果分析 9.图像分割-检测硬币数量9.1算法原理9.2算法实现9.3结果分析 10.检测特定形状-矩形与圆形10.1算法原理10.2算法实现10.3结果分析 三、创新点(使用GUI界面)

一、主程序介绍

本次程序共分为10个功能点: 第一个功能点是实现彩色图像的灰度化、灰度图像的二值化及图像的灰度变化。 第二个功能点是实现图像的代数运算及逻辑运算。 第三个功能点是基于直方图修正的图像增强。 第四个功能点是基于空间域去实现图像平滑和提取图像边缘。 第五个功能点是基于频域去实现图像平滑及提取图像边缘。 第六个功能点是图像复原。 第七个功能点是图像的膨胀运算、腐蚀运算、开运算及闭运算。 第八个功能点是提取图像中的红苹果。 第九个功能点是检测图像中硬币的数量。 第十个功能点是检测图像中的矩形与圆形。

请添加图片描述

二、功能模块 1 图像的灰度化与二值化 1.1 算法原理

彩色图像的灰度化:让彩色图像中的R,G,B三分量值相等。 1、最大值法:取R,G,B三个分量中数值最大的分量,并让每个分量都等于最大值。 2、平均值法:取R,G,B三个分量中的平均值,并让每个分量都等于平均值。 3、加权值法:赋予R,G,B不同的权值并使R,G,B的值加权平均。

灰度图像的二值化:确定一个阈值,当灰度值大于阈值时将其灰度值设定为255,当灰度值小于阈值时将其灰度值设定为0。这样就可以得到一个只有黑白像素的二值化图像。

图像的灰度变换:借助变换函数将图像的像素值映射成一个新的像素值,通过改变像素的亮度值实现图像增强。 1、对数变换:通过改变对数函数来改变图像的像素值,以达到图像的灰度变换。 2、指数变换:通过改变指数函数来改变图像的像素值,以达到图像的灰度变换。 3、幂次变换:通过改变幂次函数来改变图像的像素值,以达到图像的灰度变换。

1.2算法实现

彩色图像的灰度化:

在这里插入代码片a=imread("a.jpg") [x,y,z]=size(a) s=ones(x,y) R=im2double(a(:,:,1)) G=im2double(a(:,:,2)) B=im2double(a(:,:,3)) %提取图像的RGB三色分量 for i=1:x for j=1:y s(i,j)=max(a(i,j,:)); end end %通过遍历找到最大的像素值 var=get(handles.popupmenu1,'value') %获取弹出式菜单的value值 switch var case 1 axes(handles.axes2) %将图片显示在坐标区axes2中 a(:,:,1)=s a(:,:,2)=s a(:,:,3)=s %使分个分量值等于最大值 imshow(a),title("最大值法") case 2 i1=round((R*0.30+B*0.59+G*0.11)/3*255) axes(handles.axes2) a(:,:,1)=i1 a(:,:,2)=i1 a(:,:,3)=i1 %使分个分量值等于加权平均后的值 imshow(a),title("加权值法") case 3 axes(handles.axes2) i=round((R+B+G)/3*255) a(:,:,1)=i a(:,:,2)=i a(:,:,3)=i %使分个分量值等于平均值 imshow(a) imwrite(a,"1.jpg") ,title("平均值法") end

灰度图像的二值化:

val=get(handles.slider1,'Value') %获取滑动条的值 set(handles.text10,'String',num2str(val)) %将此值在静态文本中显示 I=imread("1.jpg") [a,b]=size(I) for x=1:a for y=1:b if I(x,y)>val %将滑动条的值设置为阈值 I(x,y)=255; else I(x,y)=0; end end end axes(handles.axes3) %将图片显示在坐标区axes3中 imshow(I),title("二值化图像")

图像的灰度变换:

I=imread("1.jpg") I=I(:,:,1) %将三位矩阵变换为二维矩阵 a1=double(I) var=get(handles.popupmenu3,'value') %获取弹出式菜单的value值 switch var case 1 axes(handles.axes5) %将图片显示在坐标区axes5中 a2=10*log(a1+1) %以10为底的对数变换 imshow(a2,[]),title("对数变换") case 2 axes(handles.axes5) a3=100*exp(0.325*(a1-220)/30)-1 %以e为底的指数函数 imshow(a3,[]),title("指数变换") case 3 axes(handles.axes5) a3=a1.^3 %以像素值为底,3为指数的幂次函数 imshow(a3,[]),title("幂数变换") case 4 axes(handles.axes5) a4=a1.^0.3 %以像素值为底,3为指数的幂次函数 imshow(a4,[]),title("幂数变换") end 1.2结果分析

请添加图片描述

通过上图的对比我们可以看出最大值法会形成一个亮度较高的灰度图像。平均值法会形成一个相对柔和的灰度图像。而加权值法形成了一个相对较暗的灰度图像。我们可以根据自己的需求去选择不同的方法来实现彩色图像的灰度变换。

请添加图片描述 通过上图我们可以看出不同的阈值会使二值化后的图像达到不同的效果,我们可以通过设定不同的阈值来达到最终想要的二值化图像也可以用此方法来实现图像分割。

请添加图片描述 通过上图我们可以看出对数变换可以对图像起到提亮的效果,所以我们可以用对数变换来处理较暗的图像。指数变换将图像整体变暗,所以我们可以用指数变换来处理较亮的图像。而幂次函数的指数小于1时能使图像变亮,指数大于1能使图像变暗。我们可以根据自己的需求来选择不同的方法对图像进行灰度变化。

2.图像的代数运算与逻辑运算 2.1 算法原理

加法运算:将两张大小相等的图片对应的像数值相加,若像素值超出灰度值范围则采用以下两种方法处理。 1、截断处理:让大于255的像素值等于255。Imadd函数采用此方法 2、加权求和:让图像A的像素值乘以a(a的范围在0到1之间),让图像B的像素值乘以(1-a),最后将他们想加这样就保证了像数值不会超过255。

减法运算:将两张大小相等的图片对应的像数值相减,若像数值小于0则采用以下两种方法处理。 1、截断处理:让小于0的像素值等于0。Imsubtract函数采用此方法 2、取绝对值:将两张大小相等的图片对于的像数值相减,将结果取绝对值这样就可以保证像素值不会小于0。Imabsdiff函数采用此方法

乘法运算:将两张大小相等的图片对应的像数值相乘,若像数值超过255则采用截断处理,让大于255的像数值等于255。

除法运算:将两张大小相等的图片对应的像数值相除,若像数值小于0则采用截断处理,让小于0的像素值等于0。

非运算:用255减去图像的每个像素值得到的新像素值就构成了新的图像,此图像就是原图像的补图像。

与运算:两个图片对应的像素值同时为1时输出新像素值为1,否则输出新像素值为0。

或运算:两个图片对应的像素值有一个为1输出的新像素值就为1,否则输出新像素值为0。

异或运算:当两个图片对应的像素值相同时输出的新像素值为1,否则输出新像素值为0。

2.2 算法实现 a=imread("bird.jpg") a1=imread("bird1.bmp") var=get(handles.popupmenu4,'value') %获取弹出式菜单的value值 switch var case 1 i1=imread("a.jpg") i2=imopen(i1,strel('disk',15)) axes(handles.axes4) imshow(i1) axes(handles.axes5) imshow(i2) axes(handles.axes7) i5=imadd(i1,i2) %用imadd函数实现加法运算 imshow(i5) case 2 i3=imread("camema.jpg") i4=imopen(i3,strel('disk',15)) axes(handles.axes4) imshow(i3) axes(handles.axes5) imshow(i4) axes(handles.axes7) i6=imsubtract(i3,i4) %用imsubtract函数实现减法运算 imshow(i6) case 3 axes(handles.axes4) imshow(a) axes(handles.axes5) imshow(a1) axes(handles.axes7) c=immultiply(im2double(a1),im2double(a)) %用immultiply函数实现乘法运算 imshow(c) case 4 a2=imread("flower.tif.jpg") a3=a2*0.3+90 axes(handles.axes4) imshow(a2) axes(handles.axes5) imshow(a3) axes(handles.axes7) c1=imdivide(double(a2),double(a3)) %用imdivide函数实现除法运算 imshow(c1) case 5 axes(handles.axes4) imshow(a) axes(handles.axes5) c0=bitcmp(a) %用bitcmp函数实现非运算 imshow(c0) axes(handles.axes7) a=imread("pi.png") imshow(a) case 6 axes(handles.axes4) imshow(a) axes(handles.axes5) imshow(a1) axes(handles.axes7) c2=bitand(a1,a) %用bitand函数实现与运算 imshow(c2) case 7 axes(handles.axes4) imshow(a) axes(handles.axes5) imshow(a1) axes(handles.axes7) c3=bitor(a1,a) %用bitor函数实现或运算 imshow(c3) case 8 axes(handles.axes4) imshow(a) axes(handles.axes5) imshow(a1) axes(handles.axes7) c4=bitxor(a1,a) %用bitxor函数实现异或运算 imshow(c4) end 2.3 实验结果及分析

请添加图片描述 请添加图片描述 通过以上的图片对比我们可以知道: 加法运算可以将一幅图像的内容叠加到另一幅图像中,达到改善图像视觉效果的作用。也可用于图像的合成与图像拼接方向。 减法运算可以显示两幅图像之间的差异,检测同一场景两幅图像之间的变换。 乘法运算可以对图像的局部进行显示和提取。 除法运算可以用来检测相同图像不同像数值之间的像素值比率变换。 非运算可以用来求取图像的补图像。 与运算可以求两幅图像相交的部分,提取出他们的相同元素。 或运算可以将两幅图像进行合并。 异或运算可以得到两幅图像中不相交的部分。

3.直方图均衡化 3.1 算法原理

灰度直方图的绘制:通过遍历找到每一灰度级的像素总数,在将此灰度级的像素数除以总的像素数即可找到该灰度值的出现频数。最后用横坐标表示灰度级纵坐标表示灰度级出现的频数,再通过一个可以绘制二维条形图的函数即可绘制出灰度直方图。

直方图均衡化:先找到原图像每个灰度级所对应的p值(每个灰度级对应的像素总数除以总像素数),在将p值进行累加(每个灰度级等于前面灰度级的累加值),再将每一灰度级的累加值修正为合理的灰度级,若此灰度级只存在一个则此灰度级的r(与p值意义相同)值即为对应原图像灰度级的p值,若此灰度值存在多个相等的值则将这些灰度级所对应的原图像的p值相加得到最后的r值。最后根据每个新的灰度级与他们对应的r值即可得到均衡化的直方图和均衡化后的图像。

3.2算法实现 a=imread("1zhifangtu.png") [x,y]=size(a) h=zeros(1,256) for i=1:256 h(i)=length(find(a==(i-1)))/(x*y); %用find依次找到a数组中0到255灰度值的向量,在用length计算出0到255灰度值向量所对应的个数, %在除以像素总个数,最后将得到的数值p依次存入矩阵h end axes(handles.axes2) bar(0:255,h) %绘制原图像的直方图 s1=zeros(1,256) s2=zeros(1,256) t=0 for i=1:256 t=t+h(i); s1(i)=t; %对数值p进行累加计算出新的灰度级 end s2=round(s1*255) %将s1中的灰度级修正为合理的灰度级 s3=zeros(1,256) for i=1:256 s3(i)=sum(h(find(s2==(i-1)))); %在h矩阵中找到与修正后的灰度级对应的灰度级所对应的比重值,如原始灰度级对应同样修正后的灰度级则将他们相加。 end axes(handles.axes4) bar(0:255,s3) %绘制均衡化后图像的直方图 c=a for i=1:256 c(find(a==(i-1)))=s2(i); %将均衡化后的灰度值值一一对应给图像c,从而获得直方图均衡化后的图像 end axes(handles.axes3) imshow(c) 3.3结果分析

请添加图片描述 通过上图我们可以看出均衡化前的直方图只占有少部分的灰度级,而均衡化后的直方图占有大部分灰度级且分布均匀。所以直方图均衡化是把原图像的直方图变换为均匀分布的形式,通过增加像素灰度值的动态范围来达到增强图像整体对比度的效果,从而达到图像增强。

4.基于空间域的图像平滑与边缘提取 4.1 算法原理

基于空间域使图像平滑:基于图像空间的邻域模板运算去消除图像中的噪音从而使图像变得平滑。 均值滤波:以图像中某一像素为中心,在它的周围选择一邻域,将邻域中的所有灰度值相加求出其平均值,用此平均值去代替原来的像素值。 中值滤波:以图像中某一像素为中心,在它的周围选择一邻域,将邻域中的所有灰度值进行排序求出中值,用此中值去代替原来的像素值。 高斯滤波:以图像中的某一像素为中心,在它的周围选择一邻域,将邻域内的所有灰度值按高斯正态分布曲线进行统计,分配相应的权值系数,然后算出邻域内所有点的加权平均值,用此加权平均值代替原来的像素值。

基于空间域的边缘提取:基于图像空间的模板运算去提取图像中的边缘与轮廓。 Robert算子、Sobel算子、Prewitt算子、二阶微分算子原理一致只是模板并不相同。 原理:遍历图像中的每一个像素值用其对应的模板进行运算,用运算后的像素值代替原像素值。最后得到全新的像素值图像级是边缘提取后的图像。

4.2算法实现

添加噪音:

a=imread("1zao.png") [height,width,channel]=size(a); if channel==3 a=a(:,:,1); % 将三位矩阵变为二维矩阵 end J=imnoise(a,'gauss',0.02) % 添加高斯噪声 J1= imnoise(a,'salt & pepper') % 添加椒盐噪声 var=get(handles.popupmenu3,'value') %获取弹出式菜单的value值 switch var case 1 axes(handles.axes8) imshow(J),title("高斯噪声") imwrite(J,'1zao1.png') case 2 axes(handles.axes8) imshow(J1),title("椒盐噪声") imwrite(J1,'1zao1.png') imwrite(J1,'1zao1.jpg') end

图像平滑:

i=imread("1zao1.png") var=get(handles.popupmenu2,'value') switch var case 1 axes(handles.axes7) a=fspecial('average',3) %生成3*3模板的均值滤波 a1=uint8(filter2(a,i)) %进行中值滤波运算 imshow(a1),title('均值滤波') b1=uint8(medfilt2(i,[3 3])) %对图像进行3*3模板的中值滤波计算 axes(handles.axes10) imshow(b1),title('中值滤波') c=fspecial('gaussian',3) %生成3*3模板的高斯滤波 c1=uint8(filter2(c,i)) %进行高斯滤波运算 axes(handles.axes11) imshow(c1),title('高斯滤波') case 2 axes(handles.axes7) a=fspecial('average',5) %生成5*5模板的均值滤波 a1=uint8(filter2(a,i)) %进行中值滤波运算 imshow(a1),title('均值滤波') b1=uint8(medfilt2(i,[5 5])) %对图像进行5*5模板的中值滤波计算 axes(handles.axes10) imshow(b1),title('中值滤波') c=fspecial('gaussian',5) %生成5*5模板的高斯滤波 c1=uint8(filter2(c,i)) %进行高斯滤波运算 axes(handles.axes11) imshow(c1),title('高斯滤波') end

边缘提取:

I=imread("1zao.png") var=get(handles.popupmenu1,'value') switch var case 1 h=[1 0;0 -1];h1=[0 1;-1 0] %Roberts算子模板 t=imfilter(I,h);t1=imfilter(I,h1) %对图像进行相应滤波运算 J=abs(t)+abs(t1) %将结果取绝对值后相加 axes(handles.axes6) imshow(J),title("Robert算子 ") c=imread("button.png") axes(handles.axes8) imshow(c) axes(handles.axes7) imshow(c) axes(handles.axes10) imshow(c) axes(handles.axes11) imshow(c) case 2 h2=[-1 -2 -1;0 0 0;1 2 1];h3=[-1 0 1;-2 0 2;-1 0 1] %Sobel算子模板 t2=imfilter(I,h2);t3=imfilter(I,h3) %对图像进行相应滤波运算 J1=abs(t2)+abs(t3) %将结果取绝对值后相加 axes(handles.axes8) imshow(J1),title("Sober算子") case 3 H1=[-1 -2 -1;0 0 0;1 2 1]; H2=[0 -1 -2;1 0 -1; 2 1 0]; H3=[1 0 -1;2 0 -2;1 0 -1]; H4=[2 1 0;1 0 -1;0 -1 -2]; H5=[1 2 1;0 0 0;-1 -2 -1]; H6=[0 1 2;-1 0 1;-2 -1 0]; H7=[-1 0 1;-2 0 2;-1 0 1]; H8=[-2 -1 0;-1 0 1;0 1 2]; %Sobel算子扩展 %对图像进行Sobel每个扩展模板的运算 R1=imfilter(I,H1); R2=imfilter(I,H2); R3=imfilter(I,H3); R4=imfilter(I,H4); R5=imfilter(I,H5); R6=imfilter(I,H6); R7=imfilter(I,H7); R8=imfilter(I,H8); f1=max(max(R1,R2),max(R3,R4)); f2=max(max(R5,R6),max(R7,R8)); %找到每行的最大值 a=max(f1,f2) axes(handles.axes7) imshow(a),title("8模板Sobel算子") case 4 h=[-1 -1 -1;0 0 0;1 1 1];h1=[-1 0 1;-1 0 1;-1 0 1] %Prewitt算子模板 t=imfilter(I,h);t1=imfilter(I,h1) %对图像进行相应滤波运算 J2=abs(t)+abs(t1) axes(handles.axes10) imshow(J2),title("Prewitt算子 ") case 5 h=[0 -1 0;-1 4 -1;0 -1 0] %Laplacian算子模板 b=imfilter(I,h) %对图像进行相应滤波运算 axes(handles.axes11) imshow(b),title("Laplacian算子") end 4.3结果分析

请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 通过对比以上图片我们可以知道: 均值滤波更适合用来处理高斯噪声,因为高斯噪声的幅值是正态分布的且高斯噪声会让图片的每一点都成为污染点,用中值滤波去处理并不能选择合适的点去去代替污染点,而使用均值滤波时当噪声正态分布的均值为0时就可以消除(减弱)噪声。 中值滤波更适合用来处理椒盐噪声,因为椒盐噪声点出现的位置是随机的还会有一些未被污染的点存在,而中值滤波可以选择合适的点来代替污染点的值,从而消除(减弱)噪声。 选择不同的模板也会对图像的平滑起到不同的效果,当邻域模板越大时图像会变得更加模糊。所以当我们去消除噪声时不仅要考虑消除噪声效果也要考虑到图像的模糊程度,从而去选择合适的模板大小。 Sobel算子与Prewitt算子提取的边缘比Roberts算子更加粗和亮,这是因为Prewitt算子和Roberts算子的模板是相隔两行或两列求差分,而Soberts算子的模板是相隔一行或一列求差分。8模板的Sobel算子检测相比单模板Sobel算子检测到的边缘信息更加丰富。

5.基于频域的图像平滑与边缘提取 5.1算法原理

频率域滤波原理:通过滤波器函数以某种方式修改图像变换,然后通过取结果的反变换来获得处理后的图片。

基于频域的图像平滑:对图像进行正交变换,利用噪声对应高频信息的特点去消除噪声。 低通滤波器:让低频通过而使高频衰减的滤波器,因噪声是高频信息所以采用低通滤波器可实现基于频域的图像平滑。 理想低通滤波器:选定一个截止频率D0,找到图像中的每一点到频率域原点的距离b(定义为D(x,y)=(x2+y2)(1/2)),如果b值大于D0则设定该点的h值为0,如果该点的距离小于D0则设定该点的h值为1,最后用h值乘以该点像素值得到像素值即为该点的新像素。 巴特沃斯低通滤波器:选定一个截止频率D0、阶n,找到图像中的每一点到频率域原点的距离b,计算出1/(1+(b/D0)2n)的值,用此值去乘以没点对应的像素值,得到的即为新像素值。 高斯低通滤波器:选定一个截止频率D0,找到图像中的每一点到频率域原点的距离b,计算出exp(-(bb)/(2(D0^2)))的值,用此值去乘以每点对应的像素值,得到的值即为新像素值。

基于频域的边缘提取:对图像进行正交变换,利用边缘对应高频信息的特点去提取边缘。 高通滤波器:让高频通过而使低频衰减的滤波器,因边缘对应高频信息所以可以采用高通滤波器可实现基于频域的边缘提取。 理想高通滤波器:选定一个截止频率D0,找到图像中的每一点到频率域原点的距离b(定义为D(x,y)=(x2+y2)(1/2)),如果b值小于D0则设定该点的h值为0,如果该点的距离大于D0则设定该点的h值为1,最后用h值乘以该点像素值得到像素值即为该点的新像素。 巴特沃斯低通滤波器:选定一个截止频率D0、阶n,找到图像中的每一点到频率域原点的距离b,计算出1/(1+(D0/b)2n)的值,用此值去乘以没点对应的像素值,得到的即为新像素值。 高斯低通滤波器:选定一个截止频率D0,找到图像中的每一点到频率域原点的距离b,计算出1-exp(-(bb)/(2(D0^2)))的值,用此值去乘以每点对应的像素值,得到的值即为新像素值。

5.2算法实现 Is=imread('1pinyu.png'); I=double(Is); I=fftshift(fft2(I)); %傅里叶变换及频谱中心化 [a,b]=size(I); g=zeros(a,b); a0=round(a/2); b0=round(b/2); D0=val; var=get(handles.popupmenu1,'value') switch var case 1 for i=1:a for j=1:b H=sqrt((i-a0)^2+(j-b0)^2); %找到图像中每一点到频率域原点的距离 if H


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3