opencv 使用内核大小计算高斯滤波器的sigma

3htmauhk  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(93)

我在cvSmooth的OpenCV文档中发现,sigma可以从内核大小计算如下:σ = 0.3(n/2 - 1)+0.8
我想知道这个方程的理论背景。

  • 谢谢你-谢谢
cig3rfwq

cig3rfwq1#

使用这样的sigma值,对于y=0x=n/2-1,在核的中心处的值与在核的边缘上的值之间的比率为:

g_edge / g_center = exp(-(x²+y²)/(2σ²))
                  = exp(-(n/2-1)²/(2*(0.3(n/2-1)+0.8)²))

字符串
n增加时,该值的极限为:

exp(-1/(2*0.3²)) = 0.00386592


注意1/2560.00390625。图像通常以256个值的范围编码。选择0.3可确保内核考虑可能显著影响结果值的所有像素。
恐怕我没有对0.8部分的解释,但我想它在这里是为了确保当n很小时的合理值。

qoefvg9y

qoefvg9y2#

我们可以看到半径是否足够大,它实际上是0.3r,符合sigma假设:我们需要滤波器半径为3sigma
半径是(ksize-1)/2,因此换句话说,我们需要sigma =(ksize-1)/6。其大约为0.15*(ksize-1)。
为什么需要+0.5
事情很简单。如果我们对于小内核使边缘为0,则只有中心具有相对大的值。它变成了每像素缩放而不是过滤。对于半径为2,它看起来像三角形滤波器而不是高斯滤波器
因此,我们需要一个偏移量来确保小滤波器具有低通效应。
x1c 0d1x的数据

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])

字符串

相关问题