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、4590、-4520 angle=atan(img_endwise./img_endwise);%“.+运算符”代表阵列运算
21 [m n]=size(img);
22 for i=2:m-1%0123分别代表0、4590、-4523     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%0123分别代表0、4590、-4538     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

 

posted @ 2014-11-04 18:48  火柴棍儿  阅读(212)  评论(0)    收藏  举报