Sobel滤波器是否需要标准化?

Tom*_*Tom 15 image-processing discrete-mathematics

x衍生Sobel就是这样的:

-1 0 +1
-2 0 +2
-1 0 +1
Run Code Online (Sandbox Code Playgroud)

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

0 0 1            1 0 0
0 0 1      &     1 0 0
0 0 1            1 0 0
Run Code Online (Sandbox Code Playgroud)

如果我执行卷积,我将分别以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
Run Code Online (Sandbox Code Playgroud)

最后我想将结果存储在[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)
Run Code Online (Sandbox Code Playgroud)

Cri*_*ngo 7

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

[ 1  0  -1 ] / 2
Run Code Online (Sandbox Code Playgroud)

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

[ 1  2  1 ] / 4
Run Code Online (Sandbox Code Playgroud)

因此,通常定义的内核的正确标准化为 1/8。

当需要正确估计导数时,需要进行这种归一化。当计算用于检测边缘的梯度幅度时,缩放是无关的。这就是为什么通常在不进行 1/8 归一化的情况下实现 Sobel 滤波器的原因。

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


小智 1

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