OpenCV——边缘检测

Sobel算子原理

sobel算子是图像边缘检测的最重要的算子之一,在机器学习,数字媒体、计算机视觉等领域起着重要作用。本文主要介绍sobel算子的计算过程。python实现过程和python中相关函数的介绍。方便读者实际中使用。
原理:
边缘是指在图像上像素灰度变化最显著的地方,边缘检测算子则利用图像边缘灰度的突变来检测边缘。Sobel算子包含两组3X3的滤波器,分别对水平和垂直方向上的边缘敏感。
在这里插入图片描述
让两个方向模板分别沿着X轴、Y轴与图像做卷积,方向是从上到下和从左到右。将模板的中心和图像上的某个像素重合,并将该像素周围的点与模板上的系数相乘,如(3)和(4)所示,其中G(x)和G(y)分别表示横向及纵向边缘检测的图像梯度值。
G(X) = (X3 + 2X6 + X9)-(X1 + 2X4 + X7)
G(Y) = (X1 +2X2 +X3) - (X7 + 2X8 + X9)
图像上每个像素点的横向及纵向梯度值通过如下公式结合,来计算该点梯度值G的大小:
G = √Gx2+Gy2
为了减少运算时间,提高运算效率,可以使用绝对值求和近似的方法代替开平方:
G = |Gx| + |Gy |
最后选取合适的阈值,将像素点的灰度值与阈值进行比较,若大于阈值,则改点为图像的边缘点。由于Sobel算子对于像素的位置影响做了加权,可以降低边缘模糊程度,与Prewitt算子,Roberts相比效果更好。

Canny边缘检测算法

Canny边缘检测算法可以分为以下5个步骤:

  1. 使用高斯滤波器,以平滑图像,滤除噪声。
  2. 计算图像中每个像素点的梯度强度和方向。
  3. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
  4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
  5. 通过抑制孤立的弱边缘最终完成边缘检测。

高斯滤波

为了尽可能减少噪声对边缘检测结果的影响,所以必须滤除噪声以防止由噪声引起的错误检测。为了平滑图像,使用高斯滤波器与图像进行卷积,该步骤将平滑图像,以减少边缘检测器上明显的噪声影响。大小为(2k+1)x(2k+1)的高斯滤波器核的生成方程式:
在这里插入图片描述

计算梯度强度与方向

图像中的边缘可以指向各个方向,因此Canny算法使用四个算子来检测图像中的水平、垂直和对角边缘。边缘检测的算子(如Roberts,Prewitt,Sobel等)返回水平Gx和垂直Gy方向的一阶导数值,由此便可以确定像素点的梯度G和方向theta 。
在这里插入图片描述
其中G为梯度强度, theta表示梯度方向,arctan为反正切函数。

非极大值抑制

非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边。对图像进行梯度计算后,仅仅基于梯度值提取的边缘仍然很模糊。对于标准3,对边缘有且应当只有一个准确的响应。而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0,对梯度图像中每个像素进行非极大值抑制的算法是:

  1. 将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。
  2. 如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。

双阈值检测

在施加非极大值抑制之后,剩余的像素可以更准确地表示图像中的实际边缘。然而,仍然存在由于噪声和颜色变化引起的一些边缘像素。为了解决这些杂散响应,必须用弱梯度值过滤边缘像素,并保留具有高梯度值的边缘像素,可以通过选择高低阈值来实现。如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素;如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素;如果边缘像素的梯度值小于低阈值,则会被抑制。阈值的选择取决于给定输入图像的内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值