OpenCV边缘检测,opencv边缘检测方法

  OpenCV边缘检测,opencv边缘检测方法

  Canny边缘检测Canny边缘检测是一种利用多级边缘检测算法进行边缘检测的方法。

  OpenCV提供了函数cv2。Canny()实现Canny边缘检测。

  Canny边缘检测基础Canny边缘检测分为以下步骤:

  去噪。噪声会影响边缘检测的准确性,所以首先要滤除噪声。计算梯度的幅度和方向以抑制非极大值,即适当地使边缘“变薄”以确定边缘。利用双阈值算法确定最终的边缘信息高斯滤波去除图像噪声图像边缘非常容易受到噪声的干扰,因此为了避免检测出错误的边缘信息,通常需要对图像进行滤波去除噪声。

  滤波的目的是为了平滑一些纹理较弱的非边缘区域,以便得到更精确的边缘。在实际处理中,通常采用高斯滤波去除图像中的噪声。

  在滤波过程中,滤波器计算像素周围像素的加权平均值,得到最终的滤波结果。

  对于高斯滤波器,越靠近中心点,权重越大。

  滤波器的大小也是可变的,高斯核的大小在边缘检测中起着重要的作用。滤波器的核越大,边缘信息对噪声的敏感度越低。然而,核越大,边缘检测中的定位误差就越大。一般来说,55的内核可以满足大多数情况。

  梯度计算侧重于梯度的方向,即垂直于边缘的方向。

  边缘检测运算符返回水平方向的Gx和垂直方向的Gy。

  梯度的振幅g和方向(用角度值表示)为:

  Atan2(?)表示带有两个参数的反正切函数。

  渐变的方向总是垂直于边缘,最近的值通常是8个不同的方向,比如水平(左,右),垂直(上,下),对角线(右上,左上,左下,右下)。

  在计算梯度的时候,我们会得到梯度的幅度和角度(代表梯度的方向)。

  梯度表示:其中每个梯度包含两个不同的值:振幅和角度。为了便于观察,这里采用了视觉表示。

  左上角的值“2”实际上代表的是一个二进制数对“(2,90)”,表示梯度的幅度为2,角度为90。

  在获得梯度的幅度和方向之后,非最大值抑制遍历图像中的像素并移除所有非边缘点。

  具体实现时,逐个遍历像素,判断当前像素是否是周围像素中梯度方向相同的最大值,根据判断结果决定是否抑制该像素。

  从上面的描述可以看出,这个步骤是一个边缘细化的过程。对于每个像素:

  如果该点是正/负梯度方向上的局部最大值,则保留该点。否则,该点被抑制(归零)。

  (渐变方向垂直于边缘)

  “在正/负梯度方向”是指相反方向的梯度方向。

  对于同方向的几个边缘点,基本上只保留一个,这样就达到了边缘细化的目的。

  以上步骤完成后,图像中的强边缘已经在当前获取的边缘图像中。然而,一些虚拟边缘也可能在边缘图像中。

  这些虚拟边缘可能是由真实图像或噪声引起的。后者必须消除。

  设置两个阈值,一个是高阈值maxVal,一个是低阈值minVal。

  根据当前边缘像素的梯度值(梯度幅值)与这两个阈值的关系,判断边缘的属性。

  具体步骤如下:

  如果当前边缘像素的梯度值大于或等于maxVal,则当前边缘像素被标记为强边缘。如果当前边缘像素的梯度值在maxVal和minVal之间,则将当前边缘像素标记为虚拟边缘(需要保留)。如果当前边缘像素的梯度值小于或等于minVal,则抑制当前边缘像素。在上面的过程中,我们得到了虚拟边缘,这需要进一步的处理。

  一般通过判断虚边是否与强边相连,就可以确定虚边属于哪种情况。

  通常,如果虚拟边缘:

  用强边连接,边被当作边。如果和强边没有联系,那么这个边就是弱边,所以抑制它。高阈值maxVal和低阈值minVal不是固定的,需要为不同的图像定义。

  Canny函数和OpenCV提供了函数cv2。Canny()实现Canny边缘检测。其语法如下:

  边缘=cv。canny(图像,阈值1,阈值2 [,孔径大小[,L2梯度]]) Edges是计算出的边缘图像。图像是8位输入图像。Threshold1表示过程中的第一个阈值。Threshold2表示过程中的第二个阈值。ApertureSize表示Sobel算子的孔径大小。L2gradient是用于计算图像的梯度幅度的标识符。其默认值为False。如果为真,则使用更精确的L2范数进行计算(即两个方向导数的平方和重新平方),否则使用L1范数(两个方向导数的绝对值直接相加)。* *示例:* *使用函数cv2。Canny()来获取图像的边缘,并尝试使用不同大小的threshold1和threshold2来观察得到的边缘之间的差异。

  导入cv2

  o=cv2.imread(。/img/hand1.png ,cv2。IMREAD _灰度)

  r1=cv2。坎尼(o,128,200)

  r2=cv2。坎尼(o,32,128)

  cv2.imshow(original ,o)

  cv2.imshow(result1 ,r1)

  cv2.imshow(result2 ,r2)

  cv2.waitKey()

  2.函数cv2的参数threshold1和threshold2的值时,cv2.destroyAllWindows()可以捕捉到更多的边缘信息。Canny()很小。

  风暴中的白杨

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • opencv图像识别数字,opencv 识别
  • opencv图像识别数字,opencv 识别,如何基于opencv实现简单的数字识别
  • opencv图像的旋转角度计算,opencv图像仿射变换
  • opencv图像的旋转角度计算,opencv图像仿射变换,OpenCV图像几何变换之透视变换
  • opencv图像的旋转角度计算,opencv 旋转任意角度
  • opencv图像的旋转角度计算,opencv 旋转任意角度,opencv图片的任意角度旋转实现示例
  • opencv图像处理函数,opencv图像轮廓合并
  • opencv图像处理函数,opencv图像轮廓合并,OpenCV图像处理之七种常用图像几何变换
  • opencv双线性插值函数,opencv 图像插值
  • LBPH人脸识别,基于opencv的人脸识别技术
  • LBPH人脸识别,基于opencv的人脸识别技术,Opencv LBPH人脸识别算法详解
  • ,,OpenCV黑帽运算(BLACKHAT)的使用
  • opencv双线性插值函数,opencv 图像插值,C++ OpenCV实现图像双三次插值算法详解
  • ,,C语言 OpenCV实现柱面投影
  • ,,C++ Opencv imfill孔洞填充函数的实现思路与代码
  • 留言与评论(共有 条评论)
       
    验证码: