9.3 scharr算子函数及其使用

                                                                                                                    点击此处返回总目录

 

 

我们这节讲一下scharr(杀尔)算子。scharr算子是sobel算子的改进。

 

一、scharr算子介绍

首先我们看一下,为什么要提出使用scharr算子。

               9.3 scharr算子函数及其使用

 

原理跟sobel算子一样,使用右边一列减去左边一列,但是系数不太一样。

可以对比一下:

             9.3 scharr算子函数及其使用

 

可以说,scharr算子是sobel算子的改进。scharr算子运算准确度更高,效果更好。

我们经常用到的是scharr算子,sobel算子不怎么用。

 

 

二、scharr函数使用

 

          9.3 scharr算子函数及其使用

 

2.1 ddepth

与sobel算子一样,如果写-1,表示处理结果图像dst的深度与src一样,比如说都是8位的位图,那就是0~255。在使用scharr算子求边界的时候,可能求出来是负值。这时候就会被处理成0。

因此要把范围扩大,使用cv2.CV_64F,允许出现负数。最后取绝对值。

 

9.3 scharr算子函数及其使用

 

2.2 dx、dy

 

dx = 1, dy = 0, 表示计算x轴方向上的梯度;

dx = 0, dy = 1, 表示计算y轴方向上的梯度;

 

9.3 scharr算子函数及其使用

 

要注意,dx和dy满足:dx >=0 && dy >=0 && dx+dy = 1。

如果写dx = 1, dy = 1,会报错。(而不像sobel算子一样,返回一个错误的结果)

 

9.3 scharr算子函数及其使用

 

 

同sobel算子一样,需要自己加起来求scharr算子。

 

9.3 scharr算子函数及其使用

 

 

 

三、scharr函数与sobel函数的关系

scharr算子是sobel算子的改进。在sobel算子里面,可以将第5个参数的值设置成-1。当sobel的第5个参数为-1时,表示使用改进的sobel算子,也就是scharr算子。

 

9.3 scharr算子函数及其使用

 

 

 

四、scharr函数的使用举例

 

 

例1:求水平方向的梯度

9.3 scharr算子函数及其使用

 

结果:

9.3 scharr算子函数及其使用

 

 

例2:求垂直方向上的梯度

 

同样的道理,可以求垂直方向上的梯度

9.3 scharr算子函数及其使用

 

结果:

9.3 scharr算子函数及其使用

 

 

例3:计算scharr算子

9.3 scharr算子函数及其使用

 

 

结果:

9.3 scharr算子函数及其使用

 

 

例4:如果写dx = 1, dy = 1,则会直接报错

9.3 scharr算子函数及其使用

 

结果:

9.3 scharr算子函数及其使用

 

 

例5:使用sobel函数计算scharr算子

 

9.3 scharr算子函数及其使用

 

结果:

9.3 scharr算子函数及其使用

 

可以看到水平和垂直方向的梯度都计算出来了。