数学实验报告实验二图像轮廓线提取技术学院专业姓名学号成绩单序号提交日期一、实验目的1.了解对matlab的图像处理功能,掌握基本的图像处理方式;2.掌握imread,imshow,imwrite,subplot,title等的基本使用方法。
3.掌握图像轮廓线提取的简单方法并上机实现。
4.了解matlab自带的边界检测算子的使用,提高对复杂图像处理的能力。
二、实验要求1.任意选取一幅灰度图像和一幅彩色图像,对算法中若干关键语句中进行调整,得出不同的实验结果,对这些结果进行分析,并与MATLAB自带的边缘检测做对比。
2.提出其它的轮廓线提取方法,与简单阈值法进行比较分析。
三、实验过程1.任意选取一幅灰度图像和一幅彩色图像,对算法中若干关键语句中进行调整,得出不同的实验结果,对这些结果进行分析。
⑴灰度图的轮廓线提取,M文件代码:function gray(pix,n) %灰度图的轮廓线提取A=imread(pix); %读取指定的灰度图%生成与图像对应的矩阵[a,b]=size(A); %a,b分别等于矩阵A的行数和列数B=double(A); %将矩阵A变为双精度矩阵D=40*sin(1/255*B); %将矩阵B进行非线性变换T=A; %新建与A同等大小矩阵for p=2:a-1 %处理图片边框内的像素点for q=2:b-1if(D(p,q)-D(p,q+1))>n|(D(p,q)-D(p,q-1))>n|(D(p,q)-D(p+1,q))>n|(D(p,q)-D(p-1,q))>n|( D(p,q)-D(p-1,q+1))>n|(D(p,q)-D(p+1,q-1))>n|(D(p,q)-D(p-1,q-1))>n|(D(p,q)-D(p+1,q +1))>nT(p,q)=0; %置边界点为黑色%新建轮廓线矩阵elseT(p,q)=255; %置非边界点为白色end;end;end;subplot(2,1,1); %将窗口分割为两行一列,下图显示于第一行image(A); %显示原图像title('灰度图原图'); %图释axis image; %保持图片显示比例subplot(2,1,2); %下图显示于第二行image(T); %显示提取轮廓线后的图片title('提取轮廓线'); %图释axis image;①调整算法中的灰度值差值n,得到图像如下:图一n=1 图二n=5图三n=10 图四n=20②调整像素的灰度值T(p,q),实验图像如下:图五边界点T(p,q)=0,非边界T(p,q)=255 图六边界点T(p,q)=20,非边界T(p,q)=120 ③调整非线性变化D=40*sin(1/255*B)中的系数,设其系数为A,所得实验图像如下:图七系数A=100 图八系数A=400图九系数A=15 图十系数A=40实验结果分析:①图一,二,三,四表明,灰度值差值在提取轮廓线中起到了决定性的作用,调整灰度值差值可以修整轮廓线的提取效果,差值越大则满足条件的边界点越少,边界点与非边界点区分不明显,提取的轮廓线较为模糊;差值越小则满足条件的边界点越多,提取的轮廓线线条较粗,精度也较低且颜色较深。
因此,在实际提取轮廓线时,为了达到最佳的提取效果,应该多次调整差值n,提高轮廓线的精度同时减少断点。
②图五,图六表明,调整像素的灰度值可以改变图像轮廓线的灰度级以及图像本身的背景,即改变非边界点的灰度级。
③图七,八,九,十表明,提取轮廓线时改变算法中非线性变化的系数,其效果相当于改变灰度值差值n。
在灰度值差值n相同的情况下,非线性变换的系数越大,其效果相当于差值n越小;相反,非线性变换的系数越小,其效果相当于差值n越大⑵彩色图的轮廓线提取,M文件代码:function color(pix,n) %彩色图片轮廓线提取函数A=imread(pix); %读取指定彩色图片for i=1:3 %依次从三个矩阵中提取轮廓线if i==1 %从红色矩阵提取E=A(:,:,1); ;else if i==2 %从绿色矩阵提取E=A(:,:,2); ;else E=A(:,:,3); ; %从蓝色矩阵提取end;end;H=double(E); %将选择的矩阵变为双精度矩阵F=40*sin(1/255*H); %进行非线性变换[k,j]=size(E); % k,j分别为矩阵D的行数和列数T=A;for p=2:k-1for q=2:j-1if(F(p,q)-F(p,q+1))>n|(F(p,q)-F(p,q-1))>n|(F(p,q)-F(p+1,q))>n|(F(p,q)-F(p-1,q))> n|(F(p,q)-F(p-1,q+1))>n|(F(p,q)-F(p+1,q-1))>n|(F(p,q)-F(p-1,q-1))>n|(F(p,q)-F( p+1,q+1))>nT(p,q,1)=0;T(p,q,2)=0;T(p,q,3)=0; %置边界点黑色elseT(p,q,1)=255;T(p,q,2)=255;T(p,q,3)=255;%置非边界点白色end;end;end;subplot(2,2,i+1); %将窗口分割为两行两列,下图显示于第i+1位置image(T);%显示轮廓线if i==1 %从红色矩阵提取title('从红色矩阵提取');else if i==2 %从绿色矩阵提取title('从绿色矩阵提取');else title('从蓝色矩阵提取'); %从蓝色矩阵提取end; %图释axis image; %保持图片显示比例end;subplot(2,2,1); %下图显示于第1位置image(A); %显示原彩色图片title('彩色图原图'); %图释axis image; %保持图片显示比例end;改变灰度值差值n,所得图像如下:图十一n=1 图十二n=5图十三n=10 图十四n=20实验结果分析:从图十一,十二,十三,十四可以看到,对于彩色图而言,由于其像素点都是由红、绿、蓝三色的强度值一起定义其颜色,因此,即使对于相同灰度值差值n,对同一彩色图的不同单色矩阵提取轮廓线时,其效果是十分不同的。
例如在本实验中,蓝色矩阵提取效果最好,绿色次之,红色较差。
灰度图差值n 的影响则与其对灰度图的影响相同2.利用matlab自带的算子进行边缘检测利用matlab中log算子,roberts算子,sobel算子进行边缘检测,M文件代码:A=imread('C:\Users\wonder\Desktop\cc.JPG');B=rgb2gray(f);subplot(2,3,2);imshow(A);title(‘原始图像');C=edge(B,'log');subplot(2,3,4);imshow(C);title('log算子分割结果');D=edge(B,'sobel','both');subplot(2,3,5);imshow(D);title('sobel算子分割结果');E=edge(B,'roberts');subplot(2,3,6);imshow(E);title('roberts算子分割结果');实验图像如下:实验结果分析:从实验图像可知,对于同一图片,采用matlab中不同算子进行边缘检测时,其轮廓线提取结果也是不同的,例如在本实验中,采用roberts算子提取的轮廓线效果最好,sobel次之,log算子提取结果则较差。
在实际操作中,应该根据原始图像的具体情况采用合适的算子。
3.提出其它的轮廓线提取方法,与简单阈值法进行比较分析㈠算法思路:将指针在像素矩阵上依次移动,每到达一点时,取出其自身及其周围共9个像素点进行分析。
利用std函数计算这9个灰度值的标准差,当该值大于预设阈值n时,判断该点为边界点。
⑵M文件代码:clear;clf;a=imread('C:\Users\wonder\Desktop\cc.jpg');[s1,s2,s3]=size(a);n=30;b=a(:,:,1);b=b./2;for i=2:1:s1-1for j=2:1:s2-1c=[b(i-1,j-1:j+1,1),b(i,j-1:j+1,1),b(i+1,j-1:j+1,1)]; %将9个像素点排成一行s=std(double(c)); %计算九个像素点的标准差if s>n %将标准差与阈值n比较d(i,j,1)=0;else d(i,j,1)=255;endend;end;size(d);imshow(d);⑶实验图像如下:n=2 n=8n=12 n=18与简单阈值法进行比较分析:本算法采用指针对相素矩阵进行提取,由于指针的灵活性,算法相对于简单阈值法而言更为灵活,效率更高。
此外,算法采用像素点的标准差与阈值n 进行比较,而不是将其非线性变化后再与阈值n 比较,而标准差的误差较小,因此采用本算法提取轮廓线相对于简单阈值法而言,效果更好。