我在实现 LoG 内核时遇到了麻烦。我正在尝试使用 theta = 1.4 实现 9x9 内核,如此链接http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm所示。
但是,我对公式本身有困难。如果有人能告诉我如何计算中心,即使用什么 x 和 y 值来在 9x9 内核中获得 -40,将不胜感激。
我在实现 LoG 内核时遇到了麻烦。我正在尝试使用 theta = 1.4 实现 9x9 内核,如此链接http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm所示。
但是,我对公式本身有困难。如果有人能告诉我如何计算中心,即使用什么 x 和 y 值来在 9x9 内核中获得 -40,将不胜感激。
最近我实现了 LoG 过滤器,您唯一需要的就是将公式和 sigma 作为参数。如果需要固定大小的掩码,可以将过滤掩码值存储在矩阵中并使用它,或者每次重新计算并创建所需的矩阵。过滤器的大小取决于 sigma 值,如果使用超过该大小 - 它没有意义,因为超出某个最大大小的其余部分使用该公式计算为零。因此,例如,您有一个过滤器大小 = 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 sigma = 1.4 x 和 y 从 -4 变为 4。使用点 (0, 0) 处的公式(它是过滤器的中心),您会得到接近 -12 的值
但是,如果您将 sigma 设为 0.2986,您将获得接近 -40 的所需答案。我也不明白为什么写 sigma 值等于 1.4 May ba 我遗漏了一些东西。如果我犯了错误,请纠正我
您无需担心公式 - 仅用于生成系数。您只需要将这些 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;
}
}