canny边缘检测01
canny边缘检测,非极大抑制部分用的是传统方法,连接边缘部分感觉可以改改,滞后双阈值和连接分开进行,速度会不会变快?非极大抑制有改进的方法,如何改进再看看。
1 close all 2 clear all 3 clc 4 5 I=imread('lena.tif'); 6 imshow(I); 7 img=double(I); 8 %高斯平滑滤波 9 w=fspecial('gaussian',[5 5]); 10 img_gaussian=imfilter(img,w,'replicate'); 11 figure,imshow(uint8(img_gaussian));%注意图像类型 12 %索贝尔sobel边缘检测 13 w=fspecial('sobel'); 14 img_broadwise=imfilter(img_gaussian,w,'replicate'); 15 w=w'; 16 img_endwise=imfilter(img_gaussian,w,'replicate'); 17 img_grad=sqrt(img_broadwise.^2+img_endwise.^2); 18 figure,imshow(uint8(img_grad)); 19 %传统方法的非极大抑制(即:按规定的四个方向0、45、90、-45) 20 angle=atan(img_endwise./img_endwise);%“.+运算符”代表阵列运算 21 [m n]=size(img); 22 for i=2:m-1%0、1、2、3分别代表0、45、90、-45。 23 for j=2:n-1 24 if angle(i,j)>=3/8*pi; 25 direction(i,j)=2; 26 else if angle(i,j)>=1/8*pi; 27 direction(i,j)=1; 28 else if angle(i,j)>=-1/8*pi; 29 direction(i,j)=0; 30 else direction(i,j)=3; 31 end 32 end 33 end 34 end 35 end 36 img_nms=img_grad; 37 for i=2:m-1%0、1、2、3分别代表0、45、90、-45。 38 for j=2:n-1 39 switch direction(i,j) 40 case 0 41 if img_grad(i,j)>=img_grad(i-1,j)&&img_grad(i,j)>=img_grad(i+1,j); 42 img_nms(i,j)=img_grad(i,j); 43 else img_nms(i,j)=0; 44 end 45 case 1 46 if img_grad(i,j)>=img_grad(i-1,j+1)&&img_grad(i,j)>=img_grad(i+1,j-1); 47 img_nms(i,j)=img_grad(i,j); 48 else img_nms(i,j)=0; 49 end 50 case 2 51 if img_grad(i,j)>=img_grad(i,j-1)&&img_grad(i,j)>=img_grad(i,j+1); 52 img_nms(i,j)=img_grad(i,j); 53 else img_nms(i,j)=0; 54 end 55 case 3 56 if img_grad(i,j)>=img_grad(i-1,j-1)&&img_grad(i,j)>=img_grad(i+1,j+1); 57 img_nms(i,j)=img_grad(i,j); 58 else img_nms(i,j)=0; 59 end 60 end 61 end 62 end 63 figure,imshow(uint8(img_nms));%注意图像类型转换 64 %滞后双阈值处理 65 img_threshold=uint8(img_nms); 66 t1=120;%上阈值 67 t2=100;%下阈值 68 set(0,'RecursionLimit',1000); %设置最大递归深度 69 %递归深度越大,计算时间越长,但效果越好 70 71 for i=1:m; 72 for j=1:n; 73 if img_threshold(i,j)>=120&&img_threshold(i,j)~=255; 74 img_threshold(i,j)=255; 75 img_threshold=img_connect(t2,i,j,img_threshold); 76 end 77 end 78 end 79 figure, 80 imshow(img_threshold); 81 %subplot(321),imshow(I),title('原图'); 82 %subplot(322),imshow(uint8(img_gaussian)),title('高斯滤波后图像'); 83 %subplot(323),imshow(uint8(img_grad)),title('梯度图像'); 84 %subplot(324),imshow(uint8(img_nms)),title('非极大抑制后图像'); 85 %subplot(325),imshow(img_threshold),title('处理后输出图像');
连接函数
1 function img_c = img_connect( low,x,y,img_c) 2 %貌似是利用区域增长的方法进行边缘连接,参考 3 %http://www.cnblogs.com/tiandsp/archive/2012/12/13/2817240.html 4 %写的,等看完区域增长回来再看 5 neighbour=[-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1]; %八连通搜寻 6 [m,n]=size(img_c); 7 for k=1:8 8 xx=x+neighbour(k,1); 9 yy=y+neighbour(k,2); 10 if xx>=1&&xx<=m&&yy>=1&&yy<=n 11 if img_c(xx,yy)>=low&&img_c(xx,yy)~=255 12 img_c(xx,yy)=255; 13 img_c=img_connect(low,xx,yy,img_c); 14 end 15 end 16 end 17 18 end

浙公网安备 33010602011771号