效果微信扫码查看
原图:
sobel X
sobel Y
sobel XY
canny边缘检测
边缘检测是一种图像处理技术,用于识别对象的边界(边缘)或图像内的区域。边缘是与图像相关的最重要的特征之一。我们通过图像的边缘了解图像的底层结构。因此,计算机视觉处理管道在应用中广泛使用边缘检测。
1,项目下载
https://download.csdn.net/download/qq_43033547/30007450
或:
import cv2
# Read the original image
img = cv2.imread('test.jpg')
# Display original image
cv2.imshow('Original', img)
# cv2.waitKey(0)
# Convert to graycsale
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Blur the image for better edge detection
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0)
# Sobel Edge Detection
sobelx = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5) # Sobel Edge Detection on the X axis
sobely = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=0, dy=1, ksize=5) # Sobel Edge Detection on the Y axis
sobelxy = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5) # Combined X and Y Sobel Edge Detection
# Display Sobel Edge Detection Images
cv2.imshow('Sobel X', sobelx)
# cv2.waitKey(0)
cv2.imshow('Sobel Y', sobely)
# cv2.waitKey(0)
cv2.imshow('Sobel X Y using Sobel() function', sobelxy)
#cv2.waitKey(0)
# Canny Edge Detection
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # Canny Edge Detection
# Display Canny Edge Detection Image
cv2.imshow('Canny Edge Detection', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
原始图像下载:
2,如何检测边缘
边缘的特点是像素强度的突然变化。为了检测边缘,我们需要去寻找相邻像素中的这种变化。来,让我们探索一下 OpenCV 中可用的两种重要边缘检测算法的使用:Sobel Edge Detection 和 Canny Edge Detection。我们将讨论理论并演示每个在 OpenCV 中的用法。
首先,看一下演示边缘检测的代码。每行代码都将详细讨论,以便您完全理解它。
import cv2
# Read the original image
img = cv2.imread('test.jpg')
# Display original image
cv2.imshow('Original', img)
# Convert to graycsale
#在这里,我们将彩色图像作为灰度图像读入,因为您不需要颜色信息来检测边缘
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Blur the image for better edge detection
'''
读取图像后,我们还使用该GaussianBlur()函数对其进行模糊处理。这样做是为了减少图像中的噪声。
在边缘检测中,必须计算像素强度的数值导数,这通常会导致“噪声”边缘。
换句话说,图像中相邻像素(尤其是靠近边缘)的强度可能会波动很大,
从而产生不代表我们正在寻找的主要边缘结构的边缘。
模糊可以平滑边缘附近的强度变化,从而更容易识别图像中的主要边缘结构
'''
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0)
# Sobel Edge Detection
sobelx = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5) # Sobel Edge Detection on the X axis
sobely = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=0, dy=1, ksize=5) # Sobel Edge Detection on the Y axis
sobelxy = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5) # Combined X and Y Sobel Edge Detection
# Display Sobel Edge Detection Images
cv2.imshow('Sobel X', sobelx)
cv2.imshow('Sobel Y', sobely)
cv2.imshow('Sobel X Y using Sobel() function', sobelxy)
# Canny Edge Detection
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # Canny Edge Detection
# Display Canny Edge Detection Image
cv2.imshow('Canny Edge Detection', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
sobel 边缘检测
1,Sobel 算子检测以像素强度突然变化为标志的边缘
当我们绘制强度函数的一阶导数时,强度的上升更加明显。
上图表明可以在梯度高于特定阈值的区域中检测到边缘。
此外,导数的突然变化也会揭示像素强度的变化。考虑到这一点,我们可以使用 3×3 内核来近似导数。我们使用一个内核来检测 X 方向和Y方向上像素强度的突然变化。
2,在下面的代码示例中,我们使用Sobel()函数来计算:
单独的 Sobel 边缘图像,在两个方向(x 和 y),
两个方向的复合梯度 (xy)
以下是使用 OpenCV 应用 Sobel 边缘检测的语法:
Sobel(src, ddepth, dx, dy)
参数ddepth指定输出图像的精度,而dx和dy指定每个方向的导数顺序。例如:
如果dx=1和dy=0,我们计算 x 方向上的一阶导数 Sobel 图像。
如果同时dx=1和dy=1,我们计算两个方向的一阶导数 Sobel 图像
Canny 边缘检测
该算法本身遵循从图像中提取边缘的三个阶段过程。添加图像模糊,这是减少噪声的必要预处理步骤。这使其成为一个四阶段过程,其中包括:
降噪
原始图像像素通常会导致噪声边缘,因此在计算边缘之前减少噪声很重要 在 Canny 边缘检测中,高斯模糊过滤器用于从本质上去除或最小化可能导致不良边缘的不必要细节。
以下是使用 OpenCV 应用 Canny 边缘检测的语法:
Canny(image, threshold1, threshold2)
在下面的代码示例中,该 Canny()函数实现了上述方法。我们只提供 Canny 边缘检测算法使用的两个阈值,OpenCV 处理所有实现细节。在调用Canny()函数之前不要忘记模糊图像。这是一个强烈推荐的预处理步骤。
结束语
我们讨论了是什么使边缘检测成为如此重要的图像处理技术,并专注于了解它的两个最重要的算法(Sobel 边缘检测和 Canny 边缘检测)。在演示它们在 OpenCV 中的使用时,我们强调了为什么模糊是一个如此重要的预处理步骤。
您还看到了 Canny Edge Detection 如何实际使用 Sobel 算子来计算数值导数。并且强大而灵活,甚至可以使用非最大抑制和滞后阈值来发挥最大优势。最后,您了解了为什么 Canny 边缘检测是执行边缘检测的首选和最广泛使用的方法。