python中opencv Canny边缘检测

目录
  • Canny边缘检测
  • Canny边缘检测基础
  • 高斯滤波去除图像噪声
  • 计算梯度
  • 非极大值抑制
  • 应用双阈值确定边缘
  • Canny函数及使用

Canny边缘检测

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

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

Canny边缘检测基础

Canny边缘检测分为如下几个步骤:

  • 去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。
  • 计算梯度的幅度与方向
  • 非极大值抑制,即适当地让边缘“变瘦”
  • 确定边缘。使用双阈值算法确定最终的边缘信息

高斯滤波去除图像噪声

图像边缘非常容易受到噪声的干扰,因此为了避免检测到错误的边缘信息,通常需要对图像进行滤波以去除噪声。

滤波的目的是平滑一些纹理较弱的非边缘区域,以便得到更准确的边缘。在实际处理过程中,通常采用高斯滤波去除图像中的噪声。在滤波过程中,通过滤波器对像素点周围的像素计算加权平均值,获取最终滤波结果。对于高斯滤波器,越临近中心的点,权值越大。

滤波器的大小也是可变的,高斯核的大小对于边缘检测的效果具有很重要的作用。滤波器的核越大,边缘信息对于噪声的敏感度就越低。不过,核越大,边缘检测的定位错误也会随之增加。通常来说,一个5×5的核能够满足大多数的情况

计算梯度

关注梯度的方向,梯度的方向与边缘的方向是垂直的。

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

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

atan2(·)表示具有两个参数的arctan函数。

梯度的方向总是与边缘垂直的,通常就近取值为水平(左、右)、垂直(上、下)、对角线(右上、左上、左下、右下)等8个不同的方向。

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

梯度的表示法: 其中,每一个梯度包含幅度和角度两个不同的值。为了方便观察,这里使用了可视化表示方法。

左上角顶点的值“2↑”实际上表示的是一个二元数对“(2, 90)”,表示梯度的幅度为2,角度为90°。

非极大值抑制

在获得了梯度的幅度和方向后,遍历图像中的像素点,去除所有非边缘的点。

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

通过以上描述可知,该步骤是边缘细化的过程。针对每一个像素点:

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

(梯度方向垂直于边缘)

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

对于同一个方向的若干个边缘点,基本上仅保留了一个,因此实现了边缘细化的目的。

应用双阈值确定边缘

完成上述步骤后,图像内的强边缘已经在当前获取的边缘图像内。但是,一些虚边缘可能也在边缘图像内。

这些虚边缘可能是真实图像产生的,也可能是由于噪声所产生的。对于后者,必须将其剔除。设置两个阈值,其中一个为高阈值maxVal,另一个为低阈值minVal。根据当前边缘像素的梯度值(指的是梯度幅度)与这两个阈值之间的关系,判断边缘的属性。

具体步骤为:

  • 如果当前边缘像素的梯度值大于或等于maxVal,则将当前边缘像素标记为强边缘。
  • 如果当前边缘像素的梯度值介于maxVal与minVal之间,则将当前边缘像素标记为虚边缘(需要保留)。
  • 如果当前边缘像素的梯度值小于或等于minVal,则抑制当前边缘像素。

在上述过程中,我们得到了虚边缘,需要对其做进一步处理。一般通过判断虚边缘与强边缘是否连接,来确定虚边缘到底属于哪种情况。

通常情况下,如果一个虚边缘:

  • 与强边缘连接,则将该边缘处理为边缘。
  • 与强边缘无连接,则该边缘为弱边缘,将其抑制。

高阈值maxVal和低阈值minVal不是固定的,需要针对不同的图像进行定义。

Canny函数及使用

OpenCV提供了函数cv2.Canny()来实现Canny边缘检测,其语法形式如下:

edges = cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])

  • edges为计算得到的边缘图像。
  • image为8位输入图像。
  • threshold1表示处理过程中的第一个阈值。
  • threshold2表示处理过程中的第二个阈值。
  • apertureSize表示Sobel算子的孔径大小。
  • L2gradient为计算图像梯度幅度(gradient magnitude)的标识。其默认值为False。如果为True,则使用更精确的L2范数进行计算(即两个方向的导数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。

**例子:**使用函数cv2.Canny()获取图像的边缘,并尝试使用不同大小的threshold1和threshold2,观察获取到的边缘有何不同。

import cv2
o=cv2.imread("./img/hand1.png", cv2.IMREAD_GRAYSCALE)
r1=cv2.Canny(o,128,200)
r2=cv2.Canny(o,32,128)
cv2.imshow("original", o)
cv2.imshow("result1", r1)
cv2.imshow("result2", r2)
cv2.waitKey()
cv2.destroyAllWindows()

当函数cv2.Canny()的参数threshold1和threshold2的值较小时,能够捕获更多的边缘信息。

到此这篇关于python中opencv Canny边缘检测的文章就介绍到这了,更多相关opencv Canny内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python实现Opencv cv2.Canny()边缘检测

    目录 1. 效果图 2. 源码 补充:OpenCV-Python 中 Canny() 参数 这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测: Canny边缘检测是一种流行的边缘检测算法.它是由约翰F开发的,是一个多阶段的算法: Canny边缘检测大致包含4个步骤: 降噪(使用高斯滤波去除高频噪声): 计算边缘梯度和方向(SobelX.SobleY核在水平方向和垂直方向对平滑后的图像进行滤波,找到每个像素的边缘梯度和方向): 非最大抑制(在得到梯度大小和方向后,对

  • 使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能

    import cv2 from matplotlib import pyplot as plt import numpy as np img= cv2.imread('39.jpg')#加载图片 cv2.namedWindow('Canny edge detect')#设置窗口,cv2.WINDOW_NORMAL表示窗口大小可自动调节 cv2.namedWindow('Original Image',cv2.WINDOW_NORMAL) cv2.namedWindow('Canny edgeIm

  • python中opencv Canny边缘检测

    目录 Canny边缘检测 Canny边缘检测基础 高斯滤波去除图像噪声 计算梯度 非极大值抑制 应用双阈值确定边缘 Canny函数及使用 Canny边缘检测 Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法. OpenCV提供了函数cv2.Canny()实现Canny边缘检测. Canny边缘检测基础 Canny边缘检测分为如下几个步骤: 去噪.噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉. 计算梯度的幅度与方向 非极大值抑制,即适当地让边缘“变瘦” 确定边缘.使用双阈值算法确定

  • 使用Python中OpenCV和深度学习进行全面嵌套边缘检测

    这篇博客将介绍如何使用OpenCV和深度学习应用全面嵌套的边缘检测.并将对图像和视频流应用全面嵌套边缘检测,然后将结果与OpenCV的标准Canny边缘检测器进行比较. 1. 效果图 愤怒的小鸟--原始图 VS Canny边缘检测图 VS HED边缘检测图 花朵--原始图 VS Canny边缘检测图 VS HED边缘检测图 视频效果图GIF 如下 2. 全面嵌套边缘检测与Canny边缘检测 2.1 Hed与Canny边缘检测对比 Holistically-Nested Edge Detectio

  • Python OpenCV Canny边缘检测算法的原理实现详解

    目录 Gaussian smoothing Computing the gradient magnitude and orientation Non-maxima suppression Hysteresis thresholding OpenCV实现 Gaussian smoothing 总的来说,Canny边缘检测可以分为四个步骤: 由于边缘检测对噪声敏感,因此对图像应用高斯平滑以帮助减少噪声.具体做法是,采用一个5*5的高斯平滑滤波器对图像进行滤波处理. Computing the gra

  • Python使用Opencv实现边缘检测以及轮廓检测的实现

    边缘检测 Canny边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化. Canny边缘检测器算法基本步骤: 平滑图像:通过使用合适的模糊半径执行高斯模糊来减少图像内的噪声. 计算图像的梯度:这里计算图像的梯度,并将梯度分类为垂直.水平和斜对角.这一步的输出用于在下一步中计算真正的边缘. 非最大值抑制:利用上一步计算出来的梯度方向,检测某一像素在梯度的正方向和负方向上是否是局部最大值,如果是,则抑制该像素(像素不属于

  • opencv canny边缘检测算法详解

    目录 一.边缘检测原理 二.canny算法原理 三.opencv函数支持Canny() 四.代码示例: 一.边缘检测原理 图像的边缘由图像中两个相邻的区域之间的像素集合组成,是指图像中一个区域的结束和另外一个区域的开始.也可以这么理解,图像边缘就是图像中灰度值发生空间突变的像素的集合.梯度方向和幅度是图像边缘的两个性质,沿着跟边缘垂直的的方向,像素值的变化幅度比较平缓:而沿着与边缘平行的方向,则像素值变化幅度变化比较大.于是,根据该变化特性,通常会采用计算一阶或者二阶导数的方法来描述和检测图像边

  • python中opencv实现图片文本倾斜校正

    本项目为python项目需要安装python及python的opencv模块:opencv_python-4.0.1-cp37-cp37m-win32.whl 和 python的矩阵运算模块:numpy. 1.第一步,安装python3.7,具体安装步骤略. 2.第二步,使用pip安装python的矩阵运算模块:numpy. python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose

  • Python中OpenCV实现简单车牌字符切割

    在Jupyter Notebook上使用Python+opencv实现如下简单车牌字符切割.关于opencv库的安装可以参考:Python下opencv库的安装过程与一些问题汇总. 1.实现代码 import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image #读取原图片 image1=cv2.imread("123456.jpg") cv2.imshow("image1&

  • python中opencv图像叠加、图像融合、按位操作的具体实现

    目录 1图像叠加 2图像融合 3按位操作 1图像叠加 可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res = img1 + img2.两个图像应该具有相同的深度和类型,或者第二个图像可以是标量值. NOTE: OpenCV添加是饱和操作,也就是有上限值,而Numpy添加是模运算. 添加两个图像时, OpenCV功能将提供更好的结果.所以总是更好地坚持OpenCV功能. 代码: import cv2 import numpy as np x = np.uint8

  • python中opencv实现文字分割的实践

    图片文字分割的时候,常用的方法有两种.一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像:还有一种是用OpenCV的轮廓检测,适用于文字不规则排列的图像. 投影法 对文字图片作横向和纵向投影,即通过统计出每一行像素个数,和每一列像素个数,来分割文字. 分别在水平和垂直方向对预处理(二值化)的图像某一种像素进行统计,对于二值化图像非黑即白,我们通过对其中的白点或者黑点进行统计,根据统计结果就可以判断出每一行的上下边界以及每一列的左右边界,从而实现分割的目的. 算法步骤: 使用水平投影和垂直投

  • Python中OpenCV图像特征和harris角点检测

    目录 概念 第一步:计算一个梯度 Ix,Iy 第二步:整合矩阵,计算特征值 第三步:比较特征值的大小 第四步: 非极大值抑制,把真正的角点留下来,角点周围的过滤掉 代码实现 概念 第一步:计算一个梯度 Ix,Iy 第二步:整合矩阵,计算特征值 第三步:比较特征值的大小 第四步: 非极大值抑制,把真正的角点留下来,角点周围的过滤掉 代码实现 import cv2 import numpy as np img =cv2.imread('pie.png') print('img.shape',img.

随机推荐