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)
答案 0 :(得分:1)
Sobel滤波器是一维有限差分滤波器的组成:
[ 1 0 -1 ] / 2
和另一个维度的平滑过滤器:
[ 1 2 1 ] / 4
因此,通常定义的对内核的适当归一化为1/8。
当需要正确估计导数时,需要进行此归一化。计算检测边缘的梯度幅度时,缩放比例无关紧要。
平滑滤波器中的1/4将其标准化为1。有限差分滤波器中的1/2来自比较的两个像素之间的距离。导数定义为 h 对[ f ( x + h )- f ( x )] / h 。对于有限差分近似,我们可以选择 h = 1,导致一个过滤器[1,-1]
,或者选择 h = 2,导致一个以上过滤器。 h = 2的优点是滤波器是对称的,而 h = 1则最终在两个像素之间的中间计算导数,因此结果发生偏移半像素。
答案 1 :(得分:0)
Sobel滤波器的数学上正确的归一化是1/8,因为它将结果带到每像素一个灰度级的自然单位。但在实际编程中,这不一定是正确的事情。