拉普拉斯高斯算子

6
我在实现 LoG 卷积核时遇到了困难。我正在尝试按照此链接中所示的方式(http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm)实现一个 9x9 的卷积核,其中 theta = 1.4。
然而,我对公式本身感到困惑。如果有人能告诉我如何计算中心位置,也就是使用哪些 x 和 y 值才能得到 9x9 卷积核中的 -40,那将不胜感激。

你不能在一个双印章上再盖三次印。 - rook
1
... x 和 y 指的是像素的坐标。 - Noon Silk
2个回答

1

你不需要担心公式 - 它只是用来生成系数的。你只需要将这些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;
    }
}

3
啊啊。但是我很好奇,也很固执,那个公式如何生成带有sigma = 1.4 的9x9卷积核呢?我始终无法得到任何一个值来应用它。 - Don
2
最简单的方法是查看y = 0的情况,并查看x的值。似乎有一个约为483的缩放因子。因此,如果您评估y = 0,x = -4..+4时的483 * LoG(x, y),则应该发现您得到了正确的值。(我刚刚使用电子表格进行了检查,看起来没问题。)如果您想进一步了解,当然可以评估y = -4..+4,x = -4..+4的核,但我将其留给读者作为练习...;-) - Paul R
1
是的,你说得对。我刚刚5分钟前弄清楚了缩放因子的问题。这一点一直困扰着我。非常感谢你的帮助,Paul,非常感激。 - Don
1
那么为什么要使用缩放因子,它如何影响结果图像?(如果我正在使用浮点数据类型图像结构) - maximus
2
@maximus:大多数图像处理都使用整数(定点)算术进行。图像通常是整数值,我们选择整数系数和一个隐式缩放因子来使所有算术保持在整数域中。但是如果您的应用程序不需要关注性能,或者由于图像格式而已经使用了浮点数,那么您可以使用浮点系数并丢弃缩放因子。 - Paul R

1

最近我已经实现了 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);

大概就是这样。 这也意味着过滤器大小必须是奇数。 希望这可以帮到你。 在你的情况下, 大小=9 sigma=1.4 x和y变化范围为-4到4。 在点(0,0)处使用公式(它是过滤器的中心) 你会得到接近-12的结果

但是如果你把sigma设为0.2986 你将得到所需答案接近-40。 我也不明白为什么写着sigma值等于1.4 也许我漏掉了什么.. 如果我犯了错误,请纠正我


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接