包含全部的罗伯特算子、普鲁伊特算子、索贝尔算子、拉普拉斯算子、传统CANNY算法、改进的CANNY算法边缘提取代码,实用性高,效果显著,画出每种方法的对比结果图,下载源文件直接跑就行。文件里包含三张医学X光图片用于检验程序有效性。
全部资料51hei下载地址:
边缘提取MATLAB源码.zip
(687.51 KB, 下载次数: 23)
- clear all;
- close all;
- clc;
- tic
- img=imread('timg1.png');
- imshow(img);
- title('原图');
- [m n]=size(img);
- img=double(img);
- %产生一个高斯(低通)滤波器,产生一个5*5的校验矩阵
- w=fspecial('gaussian',[5 5]);
- figure;
- imshow(uint8(img))
- title('高斯滤波后的图像');
- %产生一个sobel类型滤波器
- w=fspecial('sobel');
- img_w=imfilter(img,w,'replicate'); %求横边缘
- w=w';
- img_h=imfilter(img,w,'replicate'); %求竖边缘
- img=sqrt(img_w.^2+img_h.^2); %求距离
- figure;
- imshow(uint8(img));
- title('sobel边缘检测后的图像')
- %下面是非极大抑制
- new_edge=zeros(m,n);
- for i=2:m-1
- for j=2:n-1
- Mx=img_w(i,j);
- My=img_h(i,j);
-
- if My~=0
- o=atan(Mx/My); %边缘的法线弧度
- elseif My==0 && Mx>0
- o=pi/2;
- else
- o=-pi/2;
- end
-
- %Mx处用My和img进行插值
- adds=get_coords(o);
- M1=My*img(i+adds(2),j+adds(1))+(Mx-My)*img(i+adds(4),j+adds(3));
- adds=get_coords(o+pi);
- M2=My*img(i+adds(2),j+adds(1))+(Mx-My)*img(i+adds(4),j+adds(3));
- isbigger=(Mx*img(i,j)>M1)*(Mx*img(i,j)>=M2)+(Mx*img(i,j)<M1)*(Mx*img(i,j)<=M2);
- if isbigger
- new_edge(i,j)=img(i,j);
- end
- end
- end
- figure;
- imshow(uint8(new_edge));
- title('非极大抑值后的图像');
- %下面是滞后阈值处理
- up=120; %上阈值
- low=100; %下阈值
- set(0,'RecursionLimit',10000); %设置最大递归深度
- for i=1:m
- for j=1:n
- if new_edge(i,j)>up &&new_edge(i,j)~=255 %判断上阈值
- new_edge(i,j)=255;
- new_edge=connect(new_edge,i,j,low);
- end
- end
- end
- figure;
- imshow(new_edge==255);
- title('滞后阈值处理后的图像');
- toc
复制代码
|