19

x-导数 Sobel 看起来是这样的:

-1 0 +1
-2 0 +2
-1 0 +1

假设我的图像有两个样本看起来像这样(0=黑色,1=白色):

0 0 1            1 0 0
0 0 1      &     1 0 0
0 0 1            1 0 0

如果我执行卷积,我将分别得到 4 和 -4。

所以我的自然反应是将结果归一化 8 并将其翻译 0.5 - 对吗?(我想知道找不到维基百科等提到任何规范化)

编辑: 我使用 Sobel 滤波器创建一个 2D 结构张量(带有导数 dX 和 dY):

                   A B 
Structure Tensor = C D

with  A = dx^2 
      B = dx*dy
      C = dx*dy 
      D = dy^2

最终我想将结果存储在 [0,1] 中,但现在我只是想知道是否必须标准化 Sobel 结果(默认情况下,不仅仅是为了存储它),即:

A = dx*dx 
//OR
A = (dx/8.0)*(dx/8.0)
//OR
A = (dx/8.0+0.5)*(dx/8.0+0.5)
4

3 回答 3

3

Sobel 滤波器是一维有限差分滤波器的组合:

[ 1  0  -1 ] / 2

和另一个维度的平滑滤波器:

[ 1  2  1 ] / 4

因此,通常定义的对内核的适当归一化是 1/8。

当需要对导数进行正确估计时,需要进行这种归一化。在计算用于检测边缘的梯度幅度时,缩放是无关紧要的。

平滑滤波器中的 1/4 是将其归一化为 1。有限差分滤波器中的 1/2 来自比较的两个像素之间的距离。导数定义为[ f ( x + h )- f ( x )]/ h的h到零的极限。对于有限差分近似,我们可以选择h =1,导致滤波器,或h =2,导致上述滤波器。h = 2的优点是滤波器是对称的,在h = 1 时,您最终会计算两个像素之间中间的导数,因此结果会移动半个像素。[1,-1]

于 2019-04-19T01:20:27.700 回答
1

Sobel 滤波器在数学上正确的归一化是 1/8,因为它将结果带入每个像素一个灰度级的自然单位。但在实际编程中,这不一定是正确的做法。

于 2014-03-19T12:09:25.613 回答
-1

Sobel 滤波器是一种沿水平或垂直方向进行微分的启发式方法。因此,标准化可以是任意的。我发现遵循标准化比其他标准化更有意义,后者占绝对值总和的一半。

http://www.imagemagick.org/discourse-server/viewtopic.php?t=14434&start=30

事实上,scikit-image 使用了这种方法。例如,

>>>from skimage import filters
>>>import numpy as np
>>>one[:,0] = 2
>>>one
array([[ 2.,  1.,  1.],
       [ 2.,  1.,  1.],
       [ 2.,  1.,  1.]])
>>>filters.sobel_v(one)
array([[ 0.,  0.,  0.],
       [ 0., -1.,  0.],
       [ 0.,  0.,  0.]])
于 2015-08-25T04:41:46.647 回答