OPENCV FOR PYTHON 学习笔记 - 图像梯度 Scharr算子
Scharr算子:使用3*3的Sobel算子时,可能不太精准,scharr算子,效果更好。
在 Sobel算子算法函数中,如果设置 ksize=-1 就会使用 3x3 的 Scharr滤波器。
它的原理和sobel算子原理一样,只是卷积核不一样,所以精度会更高一点。
该函数的原型如下:
# Sobel 算子算法 dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) # Scharr 算子算法 dst = cv2.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])
sobel算子和scharr算子差异
- sobel算子系数:[1 2 1] ; scharr算子[3 10 3] ;
- scharr算子要比sobel算子拥有更高的精确度;
- scharr算子可以把比较细小的边界也检测出来;
测试代码如下:
import cv2 as cv
img = cv.imread("lena.jpg",cv.IMREAD_UNCHANGED)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
cv.namedWindow("binary",cv.WINDOW_AUTOSIZE)
cv.imshow("binary",binary)
#scharrx = cv.Sobel(binary,cv.CV_64F,1,0,-1)
scharrx = cv.Scharr(binary,cv.CV_64F,1,0);
scharrx = cv.convertScaleAbs(scharrx);
cv.namedWindow("scharrx",cv.WINDOW_AUTOSIZE)
cv.imshow("scharrx",scharrx)
#scharry = cv.Sobel(binary,cv.CV_64F,0,1,-1)
scharry = cv.Scharr(binary,cv.CV_64F,0,1);
scharry = cv.convertScaleAbs(scharry);
cv.namedWindow("scharry",cv.WINDOW_AUTOSIZE)
cv.imshow("scharry",scharry)
scharrxy = cv.addWeighted(scharrx,0.5,scharry,0.5,0);
cv.namedWindow("scharrxy",cv.WINDOW_AUTOSIZE)
cv.imshow("scharrxy",scharrxy)
cv.waitKey();
cv.destroyAllWindows();
本文来自博客园,作者:HappyChen2016,转载请注明原文链接:https://www.cnblogs.com/happychen2016/p/15162672.html

浙公网安备 33010602011771号