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();

  

posted @ 2021-08-19 16:58  HappyChen2016  阅读(218)  评论(0编辑  收藏  举报