码迷,mamicode.com
首页 > 编程语言 > 详细

算法解剖系列(1)-Canny边缘检测原理

时间:2016-05-12 23:48:43      阅读:504      评论:0      收藏:0      [点我收藏+]

标签:

Canny边缘检测算子

基本原理

  • 须满足条件:抑制噪声;精确定位边缘。
  • 从数学上表达了三个准则[信噪比准则(低错误率)、定位精度准则、单边缘响应准则],并寻找表达式的最佳解。
  • 属于先平滑后求导的方法。

算法实现步骤

1使用高斯滤波平滑图像

f(x,y)G(x,y)fs(x,y)为卷积平滑后的图像。

G(x,y)=12πσ2e?(x2+y2)2σ2

fs(x,y)=f(x,y)?G(x,y)

Guess

  • 用坐标点(x,y)3×3(0,0),相邻的点以此类推。

    技术分享
  • 计算权重矩阵。设定方差σ=0.8的值,将对应各个坐标点(x,y)带入二维高斯公式G(x,y)中,得到一个权重矩阵,归一化权重矩阵(矩阵中各个点除以权重之和),得到标准的权重矩阵,即高斯模板。

    技术分享 技术分享
  • 计算高斯模糊。设在一幅图像中的3×3区域内,用各像素点的灰度值乘以对应点的权重。

    技术分享
    技术分享
  • 将得到的9个值求和,就是中心点的高斯模糊值。

    技术分享

    具体过程http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

卷积过程

  • 简单来说就是使用Guess模板在原始图像中进行移位、相乘、相加的过程。

2计算梯度的幅值图像,角度图像

补充:求变化率时,对于一元函数,即求导;对于二元函数,求偏导。

数字图像处理中,用一阶有限差分近似求取灰度值的梯度值(变化率)
(即:使差商(Δf/Δx)(?f/?x)xyxy方向一阶偏导)

例:计算一点xy方向的梯度幅值和方向


技术分享

上图中显示一段直的边缘线段放大后一部分,每个方块代表一个像素点,用一个方框强调点处边缘的幅值和方向。令灰色像素值为01.
如图关于一点为中心的3×3邻域,使用Prewitt卷积模板进行计算:
px=????101?101?101???,py=????1?1?1000111???

根据xy方向的卷积模板,可知,在3×3邻域中从底部一行像素值减去顶部一行的像素,得到x方向的偏导数(梯度);同样,从右边一列像素值减去左边一列的像素,得到y方向的偏导数。
x方向的梯度:
gx=?f/?x=(0?0)+(0?1)+(0?1)=?2

y方向的梯度:
gy=?f/?x=(1?0)+(1?0)+(0?0)=2

由此,可以得到该点梯度的幅值和方向:
M(x,y)=g2x+g2y??????=22

α(x,y)=arctan[gy/gx]=135°

如下图表示了中心点的梯度向量、方位角以及边缘方向。(任一点的边缘与梯度向量正交)

技术分享

注意

  • gx,gy,M(x,y)α(x,y)
  • α(x,y)M(x,y)

Canny算子卷积模板:

px=[?1?111],py=[1111]

p[i,j]=(f[i,j+1]?f[i,j]+f[i+1,j+1]?f[i+1,j])/2

Q[i,j]=(f[i,j]?f[i+1,j]+f[i,j+1]?f[i+1,j+1])/2

M[i,j]=p[i,j]2+Q[i,j]2?????????????

θ=arctan(Q[i,j]/p[i,j])

3对幅值图像进行应用非极大值抑制

  • 首先将角度划分成四个方向范围:水平(0°)?45°(90°)+45°。如下图:

    技术分享
  • 接着讨论对3×3区域的四个基本边缘方向进行非极大值抑制。

    技术分享

    做法:若中心点(即:访问点)在沿其方向上邻域的梯度幅值最大,则保留;否则,抑制。

4双阈值检测和连接边缘

  • 选取高阈值THTL2:13:1TH=0.3/0.2,TL=0.1
  • 取出非极大值抑制后的图像中的最大梯度幅值,重新定义高低阈值。即:TH×Max,TL×Max。(当然可以自己给定)
  • TL0TH1
  • TLTH使8TH1

注意:双阈值做法是将候选像素点拼接成轮廓,轮廓的形成时对这些像素运用滞后性阈值。

算法实现

Matlab代码

1.  clear all;
2.  clc;
3.  I = imread(‘rice.png‘);%读图
4.  % I = rgb2gray(I);%灰度转换
5.  I = double(I);%转化为双精度
6.  [H,W] = size(I);%获取图像大小
7.  
8.  %%  Step1:使用高斯滤波平滑图像
9.  
10. B = [1 2 1;2 4 2;1 2 1];%高斯滤波系数
11. B = 1/16.*B;%高斯滤波模板 方差=0.8
12. A = conv2(I,B,‘same‘);%使用高斯模板进行卷积.计算二维卷积,结果与原图像大小相同 
13. 
14. %%  Step2:计算梯度的幅值图像,角度图像.
15. 
16. %Prewitt梯度模板
17. dx = [-1 0 1;-1 0 1;-1 0 1];%x方向的梯度模板
18. dy = [1 1 1; 0 0 0;-1 -1 -1];%y方向的梯度模板
19. gx = conv2(A,dx,‘same‘);%获取x方向的梯度图像.使用梯度模板进行二维卷积,结果与原图像大小相同
20. gy = conv2(A,dy,‘same‘);%获取y方向的梯度图像.使用梯度模板进行二维卷积,结果与原图像大小相同
21. M = sqrt((gx.^2) + (gy.^2));%获取幅值图像.大小与原图像相等.(.^)表示数组乘方
22. a = atan2(gy,gx);%获取弧度,范围:-pi~pi
23. a = a*180/pi;%将弧度转换为角度,得到角度图像,与原图像大小相等.
24. 
25. %%  Step3:对幅值图像进行应用非极大值抑制
26. 
27. %首先将角度划分成四个方向范围:水平(0°)、-45°、垂直(90°)、+45°
28. for i = 1:H
29.     for j = 1:W
30.         if((a(i,j)>=-22.5) && (a(i,j)<0)||(a(i,j)>=0) && (a(i,j)<22.5) || (a(i,j)<=-157.5) && (a(i,j)>=-180)||(a(i,j)>=157.5)&&(a(i,j)<=180))
31.             a(i,j) = 0;
32.         elseif((a(i,j)>=22.5) && (a(i,j)<67.5) || (a(i,j)<=-112.5) && (a(i,j)>-157.5))
33.             a(i,j) = -45;
34.         elseif((a(i,j)>=67.5) && (a(i,j)<112.5) || (a(i,j)<=-67.5) && (a(i,j)>-112.5))
35.             a(i,j) = 90;
36.         elseif((a(i,j)>=112.5) && (a(i,j)<157.5) || (a(i,j)<=-22.5) && (a(i,j)>-67.5))
37.             a(i,j) = 45;  
38.         end
39.     end
40. end
41. %讨论对3x3区域的四个基本边缘方向进行非极大值抑制.获取非极大值抑制图像
42. Nms = zeros(H,W);%定义一个非极大值图像
43. for i=2:H-1
44.     for j=2:W-1
45.         if (a(i,j)==0 && M(i,j) == max([M(i,j), M(i,j+1), M(i,j-1)]))
46.             Nms(i,j) = M(i,j);
47.         elseif (a(i,j)==-45 && M(i,j) == max([M(i,j), M(i+1,j-1), M(i-1,j+1)]))
48.             Nms(i,j) = M(i,j);
49.         elseif (a(i,j)==90 && M(i,j) == max([M(i,j), M(i+1,j), M(i-1,j)]))
50.             Nms(i,j) = M(i,j);
51.         elseif (a(i,j)==45 && M(i,j) == max([M(i,j), M(i+1,j+1), M(i-1,j-1)]))
52.             Nms(i,j) = M(i,j);
53.         end;
54.     end;
55. end;
56. 
57. %%  Step4:双阈值检测和连接边缘
58. 
59. DT = zeros(H,W);%定义一个双阈值图像
60. TL = 0.1 * max(max(Nms));%低阈值
61. TH = 0.3 * max(max(Nms));%高阈值
62. for i = 1  : H
63.     for j = 1 : W
64.         if (Nms(i, j) < TL)
65.             DT(i,j) = 0;
66.         elseif (Nms(i, j) > TH)
67.             DT(i,j) = 1 ;
68.         %对TL<Nms(i, j)<TH 使用8连通区域确定
69.         elseif ( Nms(i+1,j)>TH || Nms(i-1,j)>TH || Nms(i,j+1)>TH || Nms(i,j-1)>TH || Nms(i-1, j-1)>TH || Nms(i-1, j+1)>TH || Nms(i+1, j+1)>TH || Nms(i+1, j-1)>TH)
70.             DT(i,j) = 1;
71.         end;
72.     end;
73. end;
74. figure, imshow(DT); %最终的边缘检测为二值图像


效果图


技术分享

算法解剖系列(1)-Canny边缘检测原理

标签:

原文地址:http://blog.csdn.net/liuzhuomei0911/article/details/51345591

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!