实现用三种边缘检测算子对一幅图像提取边缘

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实现用三种边缘检测算子对一幅图像提取边缘,给出结果并分析。用sobel,log,candy三种算子对图像进行边缘提取:f=imread('E:\木子的U盘\大三的木子\第一学期\数字图像处理\xback.jpg');f=rgb2gray(f);%将图像转化为灰度图像[gsobel_default,ts]=edge(f,'sobel');%利用sobel算子的默认语法得到边缘图像subplot(231);imshow(gsobel_default);title('gsobeldefault');[glog_default,tlog]=edge(f,'log');%利用log算子的默认语法得到边缘图像subplot(233);imshow(glog_default);title('glogdefault');[gcanny_default,tc]=edge(f,'canny');%利用candy算子的默认语法得到边缘图像subplot(235);imshow(gcanny_default);title('gcannydefault');gSobel_best=edge(f,'sobel',0.05);%减少不必要的细节subplot(232);imshow(gSobel_best);title('gsobelbest');gLog_best=edge(f,'log',0.003,2.25);%subplot(234);imshow(gLog_best);title('glogbest');gCanny_best=edge(f,'canny',[0.040.10],1.5);%subplot(236);imshow(gCanny_best);title('gcannybest');MATLAB图像显示如下:分析如下:sobel得出的结果与试图检测边缘的目标相差太远。log结果与sobel结果相比要好一些,与log默认值得出的结果相比要好很多。而candy结果也要远远好于前两种。除了检测期望的特征外,candy检测还产生了最清晰的图。2实现基本全局阈值处理、Otsu方法对一幅图像进行分割,给出结果并分析两种方法基本全局阈值处理和Otsu方法处理程序如下:f=imread('coins.png');subplot(221);imshow(f);title('原图');level=graythresh(f);%OTSU阈值BW=im2bw(f,level);subplot(222);imshow(BW);title('使用OTSU阈值分割图');count=0;%使用基本全局阈值分割T=mean2(f);done=false;while-donecount=count+1;g=fT;Tnext=0.5*(mean(f(g))+mean(f(-g)));done=abs(T-Tnext)0.5;T=Tnext;endcount;count=2;T;T=125.3860;g=im2bw(f,T/255);%分割图像subplot(223);imshow(f);title('原图');subplot(224);imshow(g);title('使用基本全局阈值分割图');MATLAB显示结果如下:分析:基本全局阈值处理算法在两次迭代后就收敛了,并且得到了一个靠近灰度中点的阈值。可以期待一个良好的分割,因为直方图中的模式间有较好的分离度。使用Otus阈值与基本全局阈值得到的阈值几乎相同,由分割效果图可知,两个的分离度相似。实现课件中区域生长的程序,采用鼠标点击选取种子点,选取两幅典型图像进行试验,并分析区域生长算法的特点。将课件中的程序在MATLAB中运行,读入两幅图像,分别是CT图像和超声图像:I=imread('E:\木子的U盘\大三的木子\第一学期\数字图像处理\ct.jpg');if(~(size(I,3)-3))I=rgb2gray(I);endI=im2double(I);gausFilter=fspecial('gaussian',[55],0.5);I=imfilter(I,gausFilter,'replicate');subplot(2,2,1),imshow(I,[]);[y,x]=getpts;%鼠标选点,回车确定x=round(x(1));%选择种子点y=round(y(1));J=zeros(size(I));%主函数的返回值,记录区域生长所得到的区域Isizes=size(I);reg_mean=I(x,y);%分割得到区域内的平均值,初始化为种子点的灰度值reg_size=1;%·分割得到区域初始化为一个种子点neg_free=10000;%动态分配内存时每次申请的连续空间大小neg_list=zeros(neg_free,3);%定义邻域列表,预先分配用于存储待分析的像素点的坐标值和灰度值的空间neg_pos=0;%用于记录neg_list中待分析像素点的个数pixdist=0;%记录最新像素点增加到分割区域后的距离侧度neigb=[-10;10;0-1;01];%四个邻域像素的位置%开始区域生长,当所有待分析的邻域像素点和已经分割好的区域像素点的灰度值距离大于reg_maxdis,区域生长结束while(pixdist0.06&®_sizenumel(I))%增加新的邻域像素到neg_list中forj=1:4xn=x+neigb(j,1);yn=y+neigb(j,2);%检查邻域像素是否超过图像的边界ins=(xn=1)&&(yn=1)&&(xn=Isizes(1))&&(yn=Isizes(1));%如果邻域像素在图像内部,并且尚未分割好,将它添加到邻域列表中if(ins&&J(xn,yn)==0)neg_pos=neg_pos+1;neg_list(neg_pos,:)=[xn,yn,I(xn,yn)];%存储对应点的灰度值J(xn,yn)=1;%标注该邻域点像素已经被访问过,并不意味着它在分割区域内endend%从所有待分析的像素点中选择一个像素点,该点的灰度值和已经分割好区域灰度均值的差的绝对值时所待分析像素中最小的dist=abs(neg_list(1:neg_pos,3)-reg_mean);[pixdist,index]=min(dist);%计算区域的新的均值reg_mean=(reg_mean*reg_size+neg_list(index,3))/(reg_size+1);reg_size=reg_size+1;%将旧的种子点标记为已经分割好的区域像素点J(x,y)=2;%标志该像素点已经是分割好的像素点x=neg_list(index,1);y=neg_list(index,2);neg_list(index,:)=neg_list(neg_pos,:);neg_pos=neg_pos-1;endJ=(J==2);%我们之前将分割好的像素点标记为2subplot(2,2,2),imshow(J);J=bwmorph(J,'dilate');%补充空洞[w,h]=size(J);J1=I+J;J2=zeros(w,h,3);fori=1:wforj=1:hif(J(i,j)==1)J2(i,j,1)=J1(i,j);J2(i,j,2)=0;J2(i,j,3)=0;elseJ2(i,j,1)=J1(i,j);J2(i,j,2)=I(i,j);J2(i,j,3)=I(i,j);endendendsubplot(2,2,3),imshow(J);subplot(2,2,4),imshow(J2);分别用鼠标选取种子点,按回车键后,两幅图片显示结果如下:讨论:区域生长算法对CT图像、MR图像以及所有的具有边界效应,或者是该区域与外界区域有明显差距的图像,分割效果很好。对感兴趣区域与外接区域存在边缘连通现象的图像,分割效果很差。如超声图像,肝脏对超声的反应就是“均匀性”散点回声。这造成“基于邻域像素相似性”分割很难应用。阈值设置的小,造成分割不完整;阈值设置得太大,造成过分割现象。区域生长算法的优点是计算简单,其缺点是需要人工交互以获得种子像素点,在每个需分割的区域中植入一个种子点;区域生长对噪声敏感,会导致分割出的区域存在空洞或将应该分开的区域连接起来。

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功