1

我正在努力实现计算高斯核以返回模糊图像的能力。我当前计算内核的代码如下:

const int m = 5;
const int n = 5;
double sigma = std;
Mat Gauss;
double kernel[m][n];
for ( int x = 0; x < m; ++x )
    for ( int y = 0; y < n; ++y )
    {
        kernel[x][y] = (1 / (sigma * (sqrt(2 * M_PI))))
            * exp(-0.5 * (std::pow((x - avg) / sigma, 2.0)
                + pow((y - avg) / sigma, 2.0) ) / (2 * M_PI * sigma * sigma));
    }

但是,我不知道如何以返回模糊图像的方式将其应用于图像。如果有人能以我可以将其应用于图像的方式给我一些指示,我将不胜感激。

我正在考虑使用 for 循环来替换原始图像的像素,但我无法正确实现这个想法。感谢您的时间。

4

1 回答 1

1

听起来您想计算原始图像与高斯核的卷积,如下所示:

模糊[x][y] = 积分(内核[s][t] * 原始[xs][yt])ds dt

有许多技术可以做到这一点:

  1. 直接卷积:通过网格并计算每个点的上述积分。这对于支持非常小的内核非常有效,每个方向上大约 5 个网格点,但对于支持较大的内核,它变得太慢了。对于高斯核,截断支持的经验法则约为 3*sigma,因此在 2 个网格点下使用 sigma 进行直接卷积并非不合理。

  2. 快速傅里叶变换 (FFT)。对于任何内核,这都可以合理地快速运行。因此,FFT 成为计算几乎任何东西与几乎任何东西的卷积的标准方法。直接卷积仅在支持非常小的内核上优于 FFT。

  3. 解析:一些核的积分有解析表达式。特别是,高斯积分是 Erf 函数,至少在 Unix 系统上,它可以作为函数调用使用。此外,在某些硬件(例如 GPU)上,Erf 是在硬件中实现的。在一些罕见(但重要)的粗略双层图像的情况下,可以用循环 Erf 函数调用用高斯替换卷积。

对于大多数计算系统,您最好的选择是使用 FFT:它速度快且足够灵活,可以正确处理任何内核和图像。

于 2013-09-11T17:19:18.180 回答