logo资料库

MATLAB图像分割 [附MATLAB源码].doc

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
实验六 图像分割(一)实验报告 实验目的: 1. 了解图像分割的基本理论和方法; 2. 掌握对图像进行点、线和边缘检测的方法; 3. 掌握阈值分割的方法和阈值的选择; 实验内容: 1. 对图像 mask.tif 分别用水平、+45 度、垂直和-45 度 Kirsch 算子进行处理, 观察效果图,理解不同方向的模板对图像处理的作用。 下面是四个算子 function kirschTEST(p); f=imread(p); g=double(f); h1=[5 5 5;-3 0 -3;-3 -3 -3];%水平 h5=[-3 -3 -3;-3 0 -3;5 5 5]; g1=imfilter(g,h1); subplot(121),imshow(g1); title('水平(1)'); g11=imfilter(g,h5); subplot(122),imshow(g11); title('水平(2)') function kirschTEST1(p); f=imread(p); g=double(f); h2=[-3 5 5;-3 0 5;-3 -3 -3];%-45 度 h6=[-3 -3 -3;-3 0 -3;5 5 5]; g2=imfilter(g,h2); subplot(121),imshow(g2); title('-45 度(1)'); g22=imfilter(g,h6); subplot(122),imshow(g22); title('-45 度(2)'); function kirschTEST2(p); f=imread(p); g=double(f); h3=[-3 -3 5;-3 0 5;-3 -3 5];%垂直 h7=[5 -3 -3;5 0 -3;5 -3 -3]; g3=imfilter(g,h3); subplot(121),imshow(g3); title('垂直(1)'); g33=imfilter(g,h7); subplot(122),imshow(g33); title('垂直(2)'); function kirschTEST3(p); f=imread(p); g=double(f); h4=[-3 -3 -3;-3 0 5;-3 5 5];%+45 度 h8=[5 5 -3;5 0 -3;-3 3 -3]; g4=imfilter(g,h4); subplot(121),imshow(g4); title('+45 度(1)'); g44=imfilter(g,h8); subplot(122),imshow(g44); title('+45 度(2)');
>> kirschTEST('mask.tif'); >> kirschTEST1('mask.tif');
>> kirschTEST2('mask.tif'); >> kirschTEST3('mask.tif');
对于以上四个方向的掩膜,可以看到水平掩膜可最佳响应图片中水平的线;+45°掩膜可最佳响应图片中+45° 的线;垂直掩膜可最佳响应图片中垂直的线;-45°掩膜可最佳响应图片中-45°的线 而对于每一组的掩膜,虽然它们是同一个方向上的掩膜,但是对图片的影响是有点不一样的,每一组的第二幅图 片都可以有第一幅图片翻转 90°得到,这是因为每一组算子的权值刚好是旋转 90 度对称的,例如第一组(使用 了水平算子的)图片中的水平方向上的线明显比较清晰明显。 2. 掌握图像处理 Sobel、Prewitt 和 Roberts 模板,然后分别调用 edge 函数对 图片 building.tif 进行处理,分析处理效果图和模板之间的关系。 >> edgeTEST('building.tif'); >> edgeTESTp('building.tif'); function edgeTEST(p); g=imread(p); subplot(121),imshow(g); title('原图'); g1=edge(g,'sobel'); subplot(122),imshow(g1); title('sobel'); function edgeTESTp(p); g=imread(p); g2=edge(g,'Prewitt'); subplot(121),imshow(g2); title('Prewitt'); g3=edge(g,'Roberts'); subplot(122),imshow(g3); title('Roberts');
sobel 算子和 prewitt 算子对 building.Tif 这幅图片大体上是没有太大的影响的,但是当放大图片之后,我们发 现应用了 sobel 算子后图片的噪点会比用 prewitt 算子的要多一点。(原因是:Sobel 算子根据像素点上下、左右邻
点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边 缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。Prewitt 算子利用像素点上下、 左右邻点灰度差,在边缘处达到极值检测边缘。对噪声具有平滑作用,定位精度不够高。)所以使用 sobel 算子 和 prewitt 算子对图像进行处理后,sobel 算子处理后的图像的清晰度(定位精度)要比用 prewitt 算子高。 Roberts 模板是一个 2*2 的模板,由于它的非对称性,因而它不能检测诸如 45°倍数的边缘,于是,我们看到 的房子的屋顶的瓦片没有前面两个算子的清晰。 3. 利用 canny 算子对图片 building.tif 进行处理,深刻理解该算子的作用,并和题 2 比较。 P294 Canny 边缘检测算法 (1) 用高斯滤波器平滑图像。 (2) 用一阶偏导的有限差分来计算梯度的幅值和方向。 (3) 对梯度幅值进行非极大值抑制。 (4) 用双阈值算法检测和连接边缘。 Canny 算子检测边缘的方法是寻找图像梯度的局部极大值,梯度是用高斯滤波器的导数计算的。Canny 方法使用两个阈值来分别检测强边缘和弱边缘,而且仅当弱边缘与强边缘相连时,弱边缘才会包含在输出中。 因此,此方法不容易受噪声的干扰,能够检测到真正的弱边缘。 BW=edge(I, 'canny') BW=edge (I, 'canny',thresh) BW=edge (I, 'canny', thresh, sigma) [BW, thresh]=edge (I, 'canny'…) BW=edge(I, 'canny') 自动选择阈值用 Canny 算子进行边缘检测。 BW=edge(I, 'canny',thresh)根据所指定的敏感度阈值 thresh,用 Canny 算子进行边缘检测,thresh 是一个 含两个元素的矢量,第一个元素是低阈值,第二个元素是高阈值;如果只给 thresh 指定一个值,则此值作为高 阈值,而 0.4×thresh 作为低阈值;当 thresh 为空时,自动选择低阈值和高阈值。 BW=edge (I, 'canny', thresh, sigma)根据所指定的敏感度阈值 thresh 和标准偏差 sigma,用 Canny 算子 进行边缘检测,默认时 sigma 等于 1,滤波器的尺寸 sigma 自动选择。 [BW, thresh]=edge (I, 'canny'…) 返回含两个元素的阈值矢量。 >> [g_s,ts]=edge(i,'sobel'); >> ts ts = 0.0738 >> [g_c,tc]=edge(i,'canny'); >> tc
tc = 0.0188 0.0469 下面是 sobel 算子得出的图像 >> imshow(g_s); 下面是 canny 算子得出的图像 >> imshow(g_c);
这里挑了用 sobel 算子和 canny 算子处理过的进行对比,可以发现 canny 算子因其使用两个阈值来分别检测强边 缘和弱边缘,所以能精确地将房子的所有线条细节都显示出来(包括墙面上的砖块的线条),就如上图所示,但 是这样没有完全达到目的,因为使用算子目的是通过提取房屋的主要边缘特征并去掉不重要的细节,从而产生一 个干净的边缘“映射”,但是我们发现直接用 canny 算子的默认阈值显然得出来的图像并不是我们想要的结果, 除了 sobel 图像外,通过其他算子(默认阈值)得出的图像都与想象的相差甚远。所以要修改参数已达到较好的 效果。 >> g_sobel=edge(f,'sobel',0.05);
分享到:
收藏