我正在使用高斯滤波器对视频进行处理ffmpeg 的 gblur 过滤器。过滤器接受 sigma 选项,但不允许选择内核大小。为了正确报告我的高斯模糊使用情况,我想知道 ffmpeg 中使用了哪种内核大小。(仅供参考,我使用了 sigma = 0.5 和 sigma = 0.8。)
现在,这个 StackExchange 问题理论上讨论了 sigma、半径和核大小之间的关系。如果我正确理解了答案,那么 radius = 2 * sigma。半径是高斯滤波器在每个方向上使用的像素数量。因此,kernel_size = ceil(radius*2 + 1)。例如,如果 sigma = 0.5,那么它是一个 3x3 核,而如果 sigma = 0.8,那么它是一个 5x5 核。
另一方面,维基百科说:“通常,图像处理程序只需要计算尺寸为 ceil(6*sigma) x ceil(6*sigma) 的矩阵,即可确保结果足够接近整个高斯分布获得的结果。” 因此,如果 sigma = 0.5,则它是一个 3x3 内核,而如果 sigma = 0.8,则它是一个 5x5 内核。
然而,我发现了一篇科学论文,题为“H.264 压缩域中的低复杂度视频水印“这与先前的陈述相矛盾。作者声称使用了 sigma = 0.3 和 sigma = 0.4 的 5x5 高斯滤波器(见表 III 和表 IV)。但对于那些 sigma,我期望内核大小为 3x3?
简而言之,我对如何推导 ffmpeg 中使用的内核大小感到困惑,而我只能更改 sigma。阅读ffmpeg gblur 源代码。有谁能帮我解释一下这个问题?提前谢谢了!
答案1
实质上,核大小是从连续正态分布中截断的离散核,是为了满足使用卷积的要求。
只需输入 sigma 是正确的。我猜你想知道这个:从正态分布中得出的约 68% 的值在距平均值一个标准差 σ 以内;约 95% 的值在两个标准差以内,约 99.7% 的值在三个标准差以内。这个事实被称为68-95-99.7(经验)规则或 3-sigma 规则。
因此,当 sigma 为 0.5 时,内核大小为 3x3。它只是 0.5 * 3 = 1.5,并且由于其对称性,在 1D 正态分布的情况下,最终内核大小为 3。对于 2D 情况,它是 3x3。