茶楼网站模板,wordpress优化网站打开速度,wordpress主题模板收费会员系统,网站开发报价合同Scharr算子是用于计算图像梯度的一种常用算子#xff0c;特别是在边缘检测任务中。它是Sobel算子的改进版本#xff0c;旨在提供更加准确和敏感的边缘检测。 在离散的空间上#xff0c;有很多方法可以用来计算近似导数#xff0c;在使用 33 的 Sobel 算子时#xff0c;可能… Scharr算子是用于计算图像梯度的一种常用算子特别是在边缘检测任务中。它是Sobel算子的改进版本旨在提供更加准确和敏感的边缘检测。 在离散的空间上有很多方法可以用来计算近似导数在使用 3×3 的 Sobel 算子时可能计算结果并不太精准。OpenCV 提供了 Scharr 算子该算子具有和 Sobel 算子同样的速度且精度更高。可以将 Scharr 算子看作对 Sobel 算子的改进其核通常为 OpenCV 提供了函数 cv2.Scharr()来计算 Scharr 算子其语法格式如下
dst cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] )式中
dst 代表输出图像。src 代表原始图像。ddepth 代表输出图像深度。该值与函数 cv2.Sobel()中的参数 ddepth 的含义相同具体可 以参考上节表 9-1。dx 代表 x 方向上的导数阶数。dy 代表 y 方向上的导数阶数。scale 代表计算导数值时的缩放因子该项是可选项默认值是 1表示没有缩放。delta 代表加到目标图像上的亮度值该项是可选项默认值为 0。borderType 代表边界样式。具体可以参考上节表 9-2。
在函数 cv2.Sobel()中介绍过如果 ksize-1则会使用 Scharr 滤波器。
因此如下语句
dstcv2.Scharr(src, ddepth, dx, dy)和
dstcv2.Sobel(src, ddepth, dx, dy, -1)是等价的。
函数 cv2.Scharr()和函数 cv2.Sobel()的使用方式基本一致。 首先需要注意的是参数 ddepth 的值应该设置为“cv2.CV_64F”并对函数 cv2.Scharr()的计算结果取绝对值才能保证得到正确的处理结果。
具体语句为
dstScharr(src, cv2.CV_64F, dx, dy)
dst cv2.convertScaleAbs(dst)另外需要注意的是在函数 cv2.Scharr()中要求参数 dx 和 dy 满足条件
dx 0 dy 0 dxdy 1因此参数 dx 和参数 dy 的组合形式有
计算 x 方向边缘梯度dx1, dy0。计算 y 方向边缘梯度 dx0, dy1。计算 x 方向与 y 方向的边缘叠加通过组合方式实现。
下面分别对上述情况进行简要说明。
计算x方向边缘梯度dx1, dy0 此时使用的语句是
dstScharr(src, ddpeth, dx1, dy0)计算y方向边缘梯度dx0,dy1 此时使用的语句是
dstScharr(src, ddpeth, dx0, dy1)计算x方向与y方向的边缘叠加
将两个方向的边缘相加使用的语句是
dxScharr(src, ddpeth, dx1, dy0)
dyScharr(src, ddpeth, dx0, dy1)
Scharrxycv2.addWeighted(dx,0.5,dy,0.5,0)需要注意的是参数 dx 和 dy 的值不能都为 1。
例如如下语句是错误的
dstScharr(src, ddpeth, dx1, dy1)示例使用函数 cv2.Scharr()获取图像水平方向的边缘信息。
import cv2
o cv2.imread(scharr.bmp,cv2.IMREAD_GRAYSCALE)
Scharrx cv2.Scharr(o,cv2.CV_64F,1,0)
Scharrx cv2.convertScaleAbs(Scharrx)
cv2.imshow(original,o)
cv2.imshow(x,Scharrx)
cv2.waitKey()
cv2.destroyAllWindows()使用函数 cv2.Scharr()获取图像垂直方向的边缘信息。
import cv2
o cv2.imread(Scharr.bmp,cv2.IMREAD_GRAYSCALE)
Scharry cv2.Scharr(o,cv2.CV_64F,0,1)
Scharry cv2.convertScaleAbs(Scharry)
cv2.imshow(original,o)
cv2.imshow(y,Scharry)
cv2.waitKey()
cv2.destroyAllWindows()运行结果
使用函数 cv2.Scharr()实现水平方向和垂直方向边缘叠加的效果。
代码如下
import cv2
o cv2.imread(scharr.bmp,cv2.IMREAD_GRAYSCALE)
scharrx cv2.Scharr(o,cv2.CV_64F,1,0)
scharry cv2.Scharr(o,cv2.CV_64F,0,1)
scharrx cv2.convertScaleAbs(scharrx)
scharry cv2.convertScaleAbs(scharry)
scharrxy cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv2.imshow(original,o)
cv2.imshow(xy,scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()运行结果
Sobel 算子和 Scharr 算子的比较
Sobel 算子的缺点是当其核结构较小时精确度不高而 Scharr 算子具有更高的精度。 Sobel 算子和 Scharr 算子的核结构如图 9-22 所示。 代码示例
分别使用 Sobel 算子和 Scharr 算子计算一幅图像的水平边缘和垂直边缘的叠加信息。
import cv2
o cv2.imread(lena.png,cv2.IMREAD_GRAYSCALE)
Sobelx cv2.Sobel(o,cv2.CV_64F,1,0,ksize3)
Sobely cv2.Sobel(o,cv2.CV_64F,0,1,ksize3)
Sobelx cv2.convertScaleAbs(Sobelx)
Sobely cv2.convertScaleAbs(Sobely)
Sobelxy cv2.addWeighted(Sobelx,0.5,Sobely,0.5,0)
Scharrx cv2.Scharr(o,cv2.CV_64F,1,0)
Scharry cv2.Scharr(o,cv2.CV_64F,0,1)
Scharrx cv2.convertScaleAbs(Scharrx)
Scharry cv2.convertScaleAbs(Scharry)
Scharrxy cv2.addWeighted(Scharrx,0.5,Scharry,0.5,0)
cv2.imshow(original,o)
cv2.imshow(Sobelxy,Sobelxy)
cv2.imshow(Scharrxy,Scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()运行结果