9.3 scharr算子函数及其使用
我们这节讲一下scharr(杀尔)算子。scharr算子是sobel算子的改进。
一、scharr算子介绍 首先我们看一下,为什么要提出使用scharr算子。
原理跟sobel算子一样,使用右边一列减去左边一列,但是系数不太一样。 可以对比一下:
可以说,scharr算子是sobel算子的改进。scharr算子运算准确度更高,效果更好。 我们经常用到的是scharr算子,sobel算子不怎么用。
二、scharr函数使用
2.1 ddepth 与sobel算子一样,如果写-1,表示处理结果图像dst的深度与src一样,比如说都是8位的位图,那就是0~255。在使用scharr算子求边界的时候,可能求出来是负值。这时候就会被处理成0。 因此要把范围扩大,使用cv2.CV_64F,允许出现负数。最后取绝对值。
2.2 dx、dy
dx = 1, dy = 0, 表示计算x轴方向上的梯度; dx = 0, dy = 1, 表示计算y轴方向上的梯度;
要注意,dx和dy满足:dx >=0 && dy >=0 && dx+dy = 1。 如果写dx = 1, dy = 1,会报错。(而不像sobel算子一样,返回一个错误的结果)
同sobel算子一样,需要自己加起来求scharr算子。
三、scharr函数与sobel函数的关系 scharr算子是sobel算子的改进。在sobel算子里面,可以将第5个参数的值设置成-1。当sobel的第5个参数为-1时,表示使用改进的sobel算子,也就是scharr算子。
四、scharr函数的使用举例
例1:求水平方向的梯度
结果:
例2:求垂直方向上的梯度
同样的道理,可以求垂直方向上的梯度
结果:
例3:计算scharr算子
结果:
例4:如果写dx = 1, dy = 1,则会直接报错
结果:
例5:使用sobel函数计算scharr算子
结果:
可以看到水平和垂直方向的梯度都计算出来了。
|