在实际处理图像应用中,我们通常需要提取图像的边缘信息,便于我们进行观测、实验。
Laplacian边缘检测
拉普拉斯是用二阶差分计算边缘的,连续函数的情况下,在一阶微分图中极大值或极小值处,认为是边缘。在二阶微分图中极大值和极小值之间的过零点,被认为是边缘。
# 拉普拉斯边缘检测
# 深度设置为-1,与输入图像深度相同,均为np.uint8类型
img_laplacian = cv2.Laplacian(img_gray, cv2.CV_8U)
Canny边缘检测
Canny边缘检测的算法更复杂,它包含下列5个步骤:
(1)使用高斯滤波去除图像噪声。
(2)使用Sobel核进行滤波,计算梯度。
(3)在边缘使用非最大值抑制。
(4)对检测出的边缘使用双阈值以去除假阳性。
(5)分析边缘之间的连接性,保留真正的边缘,消除不明显的边缘。
# Canny边缘检测
# 100位第一个阈值;200为第二个阈值
img_canny = cv2.Canny(img_gray, 100, 200)
Sobel边缘检测
Sobel边缘检测算法比较简单,虽然准确度较低,但在很多实际应用中,尤其是对效率要求较高,对纹理不太关心的时候,Sobel算法却是首选。
Sobel算子是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。
Sobel算法,就是将得到像素点乘以一个3*3矩阵(Sobel算子)得到一个该点的灰度矢量值或者其法矢量值。Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。
# Sobel边缘检测
'''
深度设置为-1,与输入图像深度相同,均为np.uint8类型;
dx为导数x的阶数;
dy为导数y的阶数
'''
# 垂直方向sobel梯度
img_sobelx = cv2.Sobel(img_gray, cv2.CV_8U, dx=1, dy=0)
# 水平方向sobel梯度
img_sobely = cv2.Sobel(img_gray, cv2.CV_8U, dx=0, dy=1)
# Sobel边缘检测
'''
深度设置为-1,与输入图像深度相同,均为np.uint8类型;
dx为导数x的阶数;
dy为导数y的阶数
'''
# 垂直方向sobel梯度
img_sobelx = cv2.Sobel(img_bin, cv2.CV_8U, dx=1, dy=0,ksize=3)
sobelx=cv2.convertScaleAbs(img_sobelx)
# 水平方向sobel梯度
img_sobely = cv2.Sobel(img_bin, cv2.CV_8U, dx=0, dy=1,ksize=3)
sobely=cv2.convertScaleAbs(img_sobely)
# 求和
img_sobelxy = cv2.addWeighted(sobelx,2,sobely,2,0)