我在cvSmooth的OpenCV文档中发现,sigma可以从内核大小计算如下:σ = 0.3(n/2 - 1)+0.8我想知道这个方程的理论背景。
cig3rfwq1#
使用这样的sigma值,对于y=0和x=n/2-1,在核的中心处的值与在核的边缘上的值之间的比率为:
y=0
x=n/2-1
g_edge / g_center = exp(-(x²+y²)/(2σ²)) = exp(-(n/2-1)²/(2*(0.3(n/2-1)+0.8)²))
字符串当n增加时,该值的极限为:
n
exp(-1/(2*0.3²)) = 0.00386592
型注意1/256是0.00390625。图像通常以256个值的范围编码。选择0.3可确保内核考虑可能显著影响结果值的所有像素。恐怕我没有对0.8部分的解释,但我想它在这里是为了确保当n很小时的合理值。
1/256
0.00390625
0.3
0.8
qoefvg9y2#
我们可以看到半径是否足够大,它实际上是0.3r,符合sigma假设:我们需要滤波器半径为3sigma半径是(ksize-1)/2,因此换句话说,我们需要sigma =(ksize-1)/6。其大约为0.15*(ksize-1)。为什么需要+0.5?事情很简单。如果我们对于小内核使边缘为0,则只有中心具有相对大的值。它变成了每像素缩放而不是过滤。对于半径为2,它看起来像三角形滤波器而不是高斯滤波器因此,我们需要一个偏移量来确保小滤波器具有低通效应。x1c 0d1x的数据
+0.5
size=3 : tensor([0.0109, 0.9783, 0.0109]) size=3 with +0.5 offset: tensor([0.2466, 0.5067, 0.2466]) size=5 : tensor([0.0066, 0.1942, 0.5983, 0.1942, 0.0066]) size=5 with +0.5 offset: tensor([0.0809, 0.2434, 0.3515, 0.2434, 0.0809]) size=7 : tensor([0.0044, 0.0540, 0.2420, 0.3991, 0.2420, 0.0540, 0.0044]) size=7 with +0.5 offset: tensor([0.0366, 0.1113, 0.2167, 0.2707, 0.2167, 0.1113, 0.0366]) size=9 : tensor([0.0033, 0.0238, 0.0972, 0.2260, 0.2994, 0.2260, 0.0972, 0.0238, 0.0033]) size=9 with +0.5 offset: tensor([0.0204, 0.0578, 0.1216, 0.1900, 0.2205, 0.1900, 0.1216, 0.0578, 0.0204])
字符串
2条答案
按热度按时间cig3rfwq1#
使用这样的sigma值,对于
y=0
和x=n/2-1
,在核的中心处的值与在核的边缘上的值之间的比率为:字符串
当
n
增加时,该值的极限为:型
注意
1/256
是0.00390625
。图像通常以256个值的范围编码。选择0.3
可确保内核考虑可能显著影响结果值的所有像素。恐怕我没有对
0.8
部分的解释,但我想它在这里是为了确保当n
很小时的合理值。qoefvg9y2#
我们可以看到半径是否足够大,它实际上是0.3r,符合sigma假设:我们需要滤波器半径为3sigma
半径是(ksize-1)/2,因此换句话说,我们需要sigma =(ksize-1)/6。其大约为0.15*(ksize-1)。
为什么需要
+0.5
?事情很简单。如果我们对于小内核使边缘为0,则只有中心具有相对大的值。它变成了每像素缩放而不是过滤。对于半径为2,它看起来像三角形滤波器而不是高斯滤波器
因此,我们需要一个偏移量来确保小滤波器具有低通效应。
x1c 0d1x的数据
字符串