【计算机视觉】OpenCV篇(8) - 边缘检测

基础篇-Canny边缘检测

Canny边缘检测方法常被誉为边缘检测的最优方法,先看下面的示例:

import cv2
import numpy as np

# 1.Canny边缘检测
img = cv2.imread('images/handwriting.jpg', 0)
edges = cv2.Canny(img, 30, 70) #参数2、3表示最低、高阈值

cv2.imshow('canny', np.hstack((img, edges)))
cv2.waitKey(0)

Canny边缘检测原理

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

  1. 使用高斯滤波消除噪声(边缘检测本身属于锐化操作,对噪点比较敏感,所以需要进行平滑处理)。
  2. 计算图像中每个像素点的梯度强度和方向。
  3. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应:非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边。对图像进行梯度计算后,仅仅基于梯度值提取的边缘仍然很模糊。对于标准3,对边缘有且应当只有一个准确的响应。而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0,对梯度图像中每个像素进行非极大值抑制的算法是:1) 将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。2) 如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。
  4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘:在施加非极大值抑制之后,剩余的像素可以更准确地表示图像中的实际边缘。然而,仍然存在由于噪声和颜色变化引起的一些边缘像素。为了解决这些杂散响应,必须用弱梯度值过滤边缘像素,并保留具有高梯度值的边缘像素,可以通过选择高低阈值来实现。如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素;如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素;如果边缘像素的梯度值小于低阈值,则会被抑制。阈值的选择取决于给定输入图像的内容。
  5. 通过抑制孤立的弱边缘最终完成边缘检测:到目前为止,被划分为强边缘的像素点已经被确定为边缘,因为它们是从图像中的真实边缘中提取出来的。然而,对于弱边缘像素,将会有一些争论,因为这些像素可以从真实边缘提取也可以是因噪声或颜色变化引起的。为了获得准确的结果,应该抑制由后者引起的弱边缘。通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素及其8个邻域像素,只要其中一个为强边缘像素,则该弱边缘点就可以保留为真实的边缘。

先阈值分割后检测

在很多情况下,阈值分割后再检测边缘,效果会更好:

# 2.先阈值,后边缘检测
# 阈值分割(使用到了Otsu自动阈值)
_, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) #_表示不会用到这个值
edges = cv2.Canny(thresh, 30, 70)

cv2.imshow('canny', np.hstack((img, thresh, edges)))
cv2.waitKey(0)

 

进阶篇-基于深度神经网络的边缘检测

canny 算法的检测效果,过度依赖于人工阈值的设定,无法再通用场景下工作,如何找到一个在自然场景下可以正确工作的边缘检测器呢?答案是使用CNN。

边缘检测︱基于 HED网络TensorFlow 和 OpenCV 实现图片边缘检测

转载于:https://www.cnblogs.com/carsonzhu/p/10862866.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值