本文是OpenCV图像视觉入门之路的第13篇文章,本文详细的介绍了Canny边缘检测算子的各种操作,例如:Canny算子进行边缘检测等操作。
Canny函数是OpenCV中用于执行边缘检测的函数之一,其参数包括:
- threshold1:第一个阈值,用于在检测到的边缘上消除弱的像素点。通常设置为较小的值,例如50或100。
- threshold2:第二个阈值,用于确定哪些像素点是强边缘,哪些是弱边缘。通常设置为较大的值,例如150或200。
- apertureSize:Sobel算子的核大小。通常设置为3,表示使用一个3x3的核,但也可以设置为5、7或其他值。
- L2gradient:一个布尔值,指示是否使用L2范数来计算梯度幅值。如果设置为False,则使用L1范数。
Canny算法的基本原理如下:
-
去噪:由于图像可能存在噪声,需要对图像进行高斯平滑来去除噪声。
-
计算梯度幅值和方向:使用Sobel算子对平滑后的图像进行梯度计算,并计算每个像素点的梯度幅值和方向。
-
非极大值抑制:对每个像素点的梯度幅值进行非极大值抑制,以保留边缘的细节。
-
双阈值检测:使用两个阈值来确定哪些边缘是强边缘,哪些是弱边缘。通常,梯度幅值大于第二个阈值的像素点被认为是强边缘,梯度幅值小于第一个阈值的像素点被认为不是边缘,而位于两个阈值之间的像素点被认为是弱边缘。
-
滞后阈值处理:对于位于两个阈值之间的像素点,如果其与某个强边缘相连,则将其视为强边缘,否则将其视为非边缘。这个过程叫做滞后阈值处理,可以进一步增强边缘的连通性。
Canny算法的目标是从图像中提取出尽可能准确的边缘信息,并尽量避免将噪声或者其他不重要的信息误判为边缘。
import cv2
import numpy as np
from numpy import unicode
if __name__ == '__main__':
img = cv2.imread('D:/Jupyter_Notebooks/0.jpg', cv2.IMREAD_GRAYSCALE)
# v1 = cv2.Canny(img, 80, 150)
# v2 = cv2.Canny(img, 50, 100)
v1 = cv2.Canny(img, 120, 250)
v2 = cv2.Canny(img, 50, 100)
#res = np.hstack((v1, v2))
cv2.imshow("v1", v1)
cv2.imshow("v2", v2)
cv2.waitKey(0)
cv2.destroyAllWindows()