边缘检测

Posted fuzhuoxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了边缘检测相关的知识,希望对你有一定的参考价值。

  • Sobel算子

  应用于图像特征的提取,边缘检测,变化率最大的地方就是边缘过度的地方。边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。如何捕捉/提取边缘 – 对图像求它的一阶导数delta =  f(x) – f(x-1), delta越大,说明像素在X方向变化越大,边缘信号越强。

技术图片

 

   Soble算子是离散微分算子(discrete differentiation operator),用来计算图像灰度的近似梯度Soble算子功能集合高斯平滑和微分求导,又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到图像X方法与Y方向梯度图像。I为两个方向的不同权值。

技术图片

 

   图一为原图,图二为X方向的梯度,图二为Y方向的梯度,图三为X+Y的最终图像梯度。

技术图片

 

   Scharr算子原理和Soble算子原理相同:处理效果更加清晰,文理比较明显。

技术图片

 

  •  Laplance算子

[{ m{L}}left( f ight) = frac{{{partial ^2}f}}{{partial {x^2}}} + frac{{{partial ^2}f}}{{partial {y^2}}}]

技术图片

 

   在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。下图为Laplance算子提取的边缘特征。

技术图片

 

  •  Canny算法边缘检测

  边缘检测要转化为灰度图像,非最大信号抑制,即用于处理边缘的效果,在一个方向上,纵向切向或指定方向等,如果不是最大值就把它去掉,这样就使轮廓看起来比较细,更加的清晰,贴合边界。

技术图片

 

   抑制完成后,有的边界是连在一起的,通过高低阈值(即小于最低阈值的舍去,高于最高阈值的保留,在最低和最高之间的进行阈值连接)。例如T1低阈值, T2为高阈值,凡是高于T2的都保留,凡是小于T1都丢弃,从高于T2的像素出发,凡是大于T1而且相互连接的,都保留。最终得到一个输出二值图像。推荐的高低阈值比值为 T2: T1 = 3:1/2:1,下图为通过Canny算子得到的边界,非常清晰。

技术图片

 

 相关代码解释如下:

 1 边缘处理函数:copyMakeBorder(in1,out1,top,bottom,left,right,BORDER_CONSTANT, color);
 2 //上下左右分别用像素值预先填充边缘,赋一个初值像素,默认的处理方法是:
 3  //BORDER_DEFAULT,BORDER_CONSTANT 填充边缘用指定像素值,即最后一个color来指定,
 4 //BORDER_REPLICATE 填充边缘像素用已知的边缘像素值,即用给定的初值上下左右。
 5 //BORDER_WRAP 用另外一边的像素来补偿填充。
 6 
 7 convertScaleAbs(A, B), 计算图像A的像素绝对值,输出到图像B;
 8 
 9 Sobel 算子Sobel(huidu_image, Sobel_image, -1, 0, 1, 3);
10 //输入的图像要是灰度图像,-1为输出图像位图深度,0为X方向的求导阶数,1为Y方向的求导阶数
11 //Scharr算子原理和Soble算子原理相同:处理效果更加清晰,纹理比较明显。
12 
13 拉普拉斯算子Laplacian(huidu,out1,-1,3);
14 //参数意义同上。
15 
16 Canny边缘检测Canny(huidu, out1,50,100,3,false ); 
17 //50,100,为低阈值和高阈值,3为Soble算子的size,通常3x3,取值3,选择 true表示是L2来归一化,否则用L1归一化。

以上是关于边缘检测的主要内容,如果未能解决你的问题,请参考以下文章

图像边缘检测基于matlab Zernike矩亚像素边缘检测含Matlab源码 1536期

OpenCV——Sobel边缘检测

OpenCV——Canny边缘检测

Matlab边缘检测问题

转载传统车道线检测-canny边缘检测-霍夫变换-完整代码(python)

图像边缘检测