sobel算子
用来计算图像灰度的近似梯度,梯度越大越有可能是边缘。
Soble算子的功能集合了高斯平滑和微分求导,又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到的是图像在X方法与Y方向梯度图像。
sobelx = cv2.Sobel(img,cv2.CCV_64F,1,0,ksize = 3) #img:图像,cv2.ccv_64F图像深度,dx,dy:方向,ksize:核大小
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CCV_64F,0,1,ksize = 3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobelx,0.5,0)sobelxy = cv2.Sobel(img,cv2.CCV_64F,1,1,ksize = 3)#错误
sobelxy = cv2.convertScaleAbs(sobelxy)
Scharr算子和laplacian算子
当内核大小为3时, 以上Sobel内核可能产生比较明显的误差(毕竟,Sobel算子只是求取了导数的近似值)。 为解决这一问题,OpenCV提供了 Scharr 函数,但该函数仅作用于大小为3的内核。该函数的运算与Sobel函数一样快,但结果却更加精确,不怕干扰,其内核为:
#scharr算子代码
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharry = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
#laplacion算子代码
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
三个算子效果图: