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