对索贝尔面具的困惑

时间:2013-03-05 18:57:39

标签: matlab opencv

Sobel(Gx和Gy)的确切面罩是什么?我看到的是人们如何编写它有两种类型,如下面的,

样式1

Gx = [-1 -2 -1
        0 0 0
        1 2 1]

Gy = [-1 0 1
      -2 0 2
      -1 0 1]

样式2

Gx = [-1 0 1
      -2 0 2
      -1 0 1]

Gy = [-1 -2 -1
        0 0 0
        1 2 1]

被修改

@Aurelis

在Matlab中 - > (第x行)

在OpenCV中 - > (col x row)

但是,下图对于两者都是正确的

-->column
^
|row
|

如果使用样式1并且Gx ==水平边缘,则可能在Matlab中将输出Gx ==水平边缘,Gy ==垂直边缘,如果使用样式2,则Gy ==垂直边缘。两者都将产生相同的输出(由于col-row主要顺序,内部操作可能不同)。

@Abhishek您正在使用样式1来计算水平和垂直边缘?和Gx对应水平边缘,而Gy对应垂直边缘? 这是否意味着风格2是其中的补充?例如。计算Gx会给出垂直边缘而Gy会给出水平边缘吗?

2 个答案:

答案 0 :(得分:3)

样式2是正确的。但是,使用这两种样式我们将获得相同的结果,因为内核与图像进行卷积

Gx = [-1 -2 -1         0 0 0< ---将提取Y方向上的特征而不是X方向上的特征。         1 2 1]

Gy = [-1 0 1       -2 0 2< ---将在X方向上提取特征而不在Y方向上提取特征。       -1 0 1]

这可以通过使用简单的2-D卷积来验证。

原始图片:original image

使用Style1,Gx: enter image description here

使用style1,Gy: enter image description here

答案 1 :(得分:1)

如果您使用数学符号,正确的面具是样式2(见here)。

您的困惑可能源于MATLAB和OpenCV中矩阵之间的差异。 MATLAB矩阵以列主顺序指定,而OpenCV矩阵以行主顺序指定。

样式1以列为主的方式表示Sobel掩码,而样式2以行主顺序表示相同的掩码。