高斯拉普拉斯算子

时间:2010-03-31 22:36:11

标签: image-processing filtering

我在实现LoG内核时遇到了麻烦。我正在尝试使用theta = 1.4实现9x9内核,如此链接http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm所示。

然而,我对配方本身有困难。如果有人能告诉我如何计算中心,即为了在9x9内核中获得-40而使用的x和y值,我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

您无需担心公式 - 仅用于生成系数。您只需将这些9x9系数应用于图像。

示例(未经测试的代码!):

const int K = 9;
const int K2 = K / 2;
const int NORM = 500; // constant for normalising filter gain
const int coeffs[K][K] = { ... };
int in_image[M][N];
int out_image[M][N];

for (i = K2; i < M - K2; ++i)
{
    for (j = K2; j < N - K2; ++j)
    {
        int term = 0;
        for (di = -K2; di <= K2; ++di)
        {
            for (dj = -K2; dj <= K2; ++dj)
            {
                term += in_image[i + di][j + dj] * coeff[K2 + ii][K2 + jj];
            }
        }
        out_image = term / NORM;
    }
}

答案 1 :(得分:1)

最近我实施了LoG过滤器, 你唯一需要的是公式和西格玛作为参数。 如果需要固定大小的蒙版,可以将过滤器蒙版值存储在矩阵中并使用它, 或每次重新计算并创建所需的矩阵。 过滤器的大小取决于西格玛值,如果使用的大小超过该大小 - 它不会产生任何意义,因为超出某个最大大小的其余部分将使用该公式计算为零。 因此,例如,您的过滤器大小= 9X9 然后为了将滤波器本身计算为矩阵, 您需要通过以下值运行公式:

int halfsize = size / 2;    
for (int x = -halfsize; x < halfsize; ++x)
   for (int y = -halfsize; y < halfsize; ++y)
       mask[x][y] = LoGFunction(x, y);

这样的事情。 这也意味着过滤器大小必须是奇数值。 希望这可以帮助。 在你的情况下, size = 9 西格玛= 1.4 x和y从-4变为4。 在点(0,0)处使用公式(它是过滤器的中心) 你得到的东西接近-12

但是如果你把sigma设为0.2986 您将获得接近-40所需的答案。 我也不明白为什么写sigma值等于1.4 我可能会错过一些东西.. 如果我犯了错误,请纠正我