asp网站会员注册不了,郑州网站建设最低价,免费网站开发软件有哪些,设计房子的平面图文章目录 概要图像梯度Canny边缘检测小结 概要
OpenCV中#xff0c;可以使用各种函数实现图像梯度和Canny边缘检测#xff0c;这些操作对于图像处理和分析非常重要。
图像梯度通常用于寻找图像中的边缘和轮廓。在OpenCV中#xff0c;可以使用cv2.Sobel()函数计算图像的梯度… 文章目录 概要图像梯度Canny边缘检测小结 概要
OpenCV中可以使用各种函数实现图像梯度和Canny边缘检测这些操作对于图像处理和分析非常重要。
图像梯度通常用于寻找图像中的边缘和轮廓。在OpenCV中可以使用cv2.Sobel()函数计算图像的梯度该函数可以计算图像在水平和垂直方向上的梯度。梯度的方向和大小可以帮助理解图像中的边缘信息。
Canny边缘检测是一种经典的边缘检测算法它通过多个步骤来检测图像中的边缘。首先Canny算法使用Sobel算子计算图像的梯度。然后它通过非极大值抑制Non-Maximum Suppression来细化边缘。接着Canny算法使用双阈值Double Thresholding来检测强边缘和弱边缘并通过连接强边缘来得到最终的边缘图像。Canny边缘检测在图像处理中被广泛应用因为它能够准确地检测出图像中的边缘。
在OpenCV中可以使用cv2.Sobel()函数计算图像的梯度而Canny边缘检测则可以通过cv2.Canny()函数实现。通过这些函数可以方便地在OpenCV中实现图像梯度和Canny边缘检测进而进行各种图像分析和处理任务。
图像梯度
寻找图像梯度边缘等等。 函数cv.Sobel(), cv.Scharr(), cvLaplacian() 等等。
Sobel和Scharr导数 Sobel算子是一种结合了高斯平滑和微分操作的滤波器因此它对图像中的噪声具有较好的抵抗能力。使用Sobel算子时可以指定所需导数的方向通过参数yorder和xorder来确定是垂直方向还是水平方向的导数。此外还可以通过参数ksize指定核kernel的大小。当ksize设为-1时OpenCV会使用3×3的Scharr滤波器其结果通常比3×3的Sobel滤波器更为精确。
拉普拉斯导数 它计算了由关系式给出的图像的拉普拉斯算子其中关系式为 其中每一个导数都是用 Sobel 导数找到的。如果 ksize -1滤波器会使用下面这个内核。 import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt# 读取图像
img cv.imread(dave.jpg, 0)# 计算拉普拉斯边缘
laplacian cv.Laplacian(img, cv.CV_64F)# 计算Sobel边缘x和y方向
sobelx cv.Sobel(img, cv.CV_64F, 1, 0, ksize5)
sobely cv.Sobel(img, cv.CV_64F, 0, 1, ksize5)# 绘制原始图像
plt.subplot(2, 2, 1), plt.imshow(img, cmapgray)
plt.title(Original), plt.xticks([]), plt.yticks([])# 绘制拉普拉斯边缘图像
plt.subplot(2, 2, 2), plt.imshow(laplacian, cmapgray)
plt.title(Laplacian), plt.xticks([]), plt.yticks([])# 绘制Sobel X边缘图像
plt.subplot(2, 2, 3), plt.imshow(sobelx, cmapgray)
plt.title(Sobel X), plt.xticks([]), plt.yticks([])# 绘制Sobel Y边缘图像
plt.subplot(2, 2, 4), plt.imshow(sobely, cmapgray)
plt.title(Sobel Y), plt.xticks([]), plt.yticks([])# 显示图像
plt.show() 在我们的最后一个例子中我们使用了Sobel滤波器来检测图像中的边缘。然而当我们将输出数据类型转换为cv.CV_8U或者np.uint8时存在一个小问题。在图像中从黑色到白色的过渡被视为正斜率它具有正值而从白色到黑色的过渡被视为负斜率它具有负值。因此当我们将数据类型转换为np.uint8时所有负斜率都被截断为0也就是说我们会错过所有负斜率对应的边缘。
如果我们希望找到所有的边缘更好的方法是将输出的数据类型保持在一个更高的精度范围内例如cv.CV_16S、cv.CV_64F等然后取其绝对值最后再转换回cv.CV_8U类型。下面的代码演示了这个过程特别是在处理水平Sobel滤波器时以及结果的差异。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt# 读取灰度图像
img cv.imread(img.png, 0)# 使用Sobel滤波器输出数据类型为cv.CV_8U
sobelx8u cv.Sobel(img, cv.CV_8U, 1, 0, ksize5)# 使用Sobel滤波器输出数据类型为cv.CV_64F然后取绝对值并转换为cv.CV_8U
sobelx64f cv.Sobel(img, cv.CV_64F, 1, 0, ksize5)
abs_sobel64f np.absolute(sobelx64f)
sobel_8u np.uint8(abs_sobel64f)# 显示原始图像、Sobel输出cv.CV_8U和Sobel绝对值cv.CV_64F
plt.subplot(1, 3, 1), plt.imshow(img, cmapgray)
plt.title(Original), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 2), plt.imshow(sobelx8u, cmapgray)
plt.title(Sobel CV_8U), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 3), plt.imshow(sobel_8u, cmapgray)
plt.title(Sobel abs(CV_64F)), plt.xticks([]), plt.yticks([])# 显示图像
plt.show() Canny边缘检测
Canny边缘检测的概念 OpenCV函数cv.Canny(
Canny边缘检测是一种广泛应用的边缘检测算法由John F. Canny开发而成。该算法包含多个阶段下面我们将详细介绍每个阶段的过程
噪声减少
由于边缘检测对图像中的噪声非常敏感第一步是通过一个5X5的高斯滤波器对图像进行平滑处理以去除噪声。寻找图像中的变化梯度强度
接下来使用Sobel核在水平和垂直方向上对平滑后的图像进行滤波得到水平方向$G_x$和垂直方向$G_y$的一阶导数。通过这两个导数我们可以计算每个像素点的边缘梯度幅值和方向。梯度方向始终与边缘垂直通常近似为水平、垂直和两个对角线方向中的一个。非极大值抑制
在得到梯度大小和方向之后在每个像素点上进行全图扫描。对于每个像素检查其梯度值是否在相邻像素中是最大的。如果是保留该值否则将其置为0。这一步骤产生了一个薄边的二值图像。滞后阈值 在此阶段我们需要确定哪些边缘是真实的哪些是噪声或者假的。为此我们使用两个阈值minVal最小值和maxVal最大值。所有强度大于maxVal的边缘被视为真正的边缘低于minVal的被丢弃。介于两者之间的边缘会基于连通性来判断是否为边缘。如果它们与确定的边缘相连则保留否则被抛弃。这一步骤也基于边缘是长线的假设来去除小的像素噪声。 边缘 A 因为在 maxVal 上面所以是肯定的边缘。尽管边缘 C 的位置在 maxVal 下面但是因为它和边缘 A 相连接所以我们认为它也是个有效边缘如此得到了一条完整的曲线。但是对于边缘 B 来说哪怕它在 minVal 上面和边缘 C 处在同一个区域上可是它并不和任何一条有效边缘连接所以会被丢弃。所以为了得到正确的结果我们需要确定好 minVal 和 maxVal 的值。
最终经过这些步骤我们就能得到一条完整的边缘在图像中。
OpenCV中的Canny边缘检测
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt# 读取灰度图像
img cv.imread(img.png, 0)# 使用Canny边缘检测算法阈值设置为100和200
edges cv.Canny(img, 100, 200)# 显示原始图像和Canny边缘检测结果
plt.subplot(121), plt.imshow(img, cmapgray)
plt.title(Original Image), plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(edges, cmapgray)
plt.title(Edge Image), plt.xticks([]), plt.yticks([])plt.show() 小结
图像梯度
OpenCV提供了多种方法来计算图像的梯度包括Sobel、Scharr和拉普拉斯滤波器。
Sobel算子是一种联合高斯平滑和微分操作的滤波器可以计算图像在水平和垂直方向上的梯度。
使用Sobel算子时你可以指定所需导数的方向水平或垂直以及核的大小。
拉普拉斯滤波器用于计算图像的拉普拉斯算子通过将图像的二阶导数与Sobel导数相关联来实现。Canny边缘检测
Canny边缘检测是一种多阶段算法用于检测图像中的边缘。
第一阶段是噪声减少通常通过应用高斯滤波器来实现以平滑图像并减少噪声。
第二阶段是计算图像的梯度通常使用Sobel滤波器以获得图像的水平和垂直梯度。
接下来进行非极大值抑制以去除可能不构成边缘的像素仅保留边缘像素。
最后一个阶段是滞后阈值需要设置两个阈值minVal和maxVal以确定哪些边缘是真实的。根据这些阈值边缘可能被分类为强边缘、弱边缘或非边缘并进行相应的处理。