我使用高斯拉普拉斯算子进行边缘检测,结合使用http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm和http://wwwmath.tau.ac.il/~turkel/notes/Maini.pdf
中描述的内容简单地说,我正在使用这个等式:
for(int i = -(kernelSize/2); i<=(kernelSize/2); i++)
{
for(int j = -(kernelSize/2); j<=(kernelSize/2); j++)
{
double L_xy = -1/(Math.PI * Math.pow(sigma,4))*(1 - ((Math.pow(i,2) + Math.pow(j,2))/(2*Math.pow(sigma,2))))*Math.exp(-((Math.pow(i,2) + Math.pow(j,2))/(2*Math.pow(sigma,2))));
L_xy*=426.3;
}
}
并使用L_xy变量来构建LoG内核。
问题是,当图像尺寸较大时,应用相同的内核会使滤波器对噪声更敏感。边缘清晰度也不一样。
让我举个例子......
假设我们有这张图片:
在此图像的480×264像素版本上使用sigma = 0.9的值和5 x 5矩阵的内核大小,我们得到以下输出:
但是,如果我们在此图像的1920×1080像素版本上使用相同的值(相同的sigma值和内核大小),我们会得到如下内容:
[两个图像都缩小了更大图像的版本。缩小是使用照片编辑器完成的,这意味着图像中包含的数据并不完全相似。但是,至少,他们应该非常接近。]
鉴于较大的图像大约是较小图像的4倍...我还尝试将sigma缩放4倍(sigma * = 4),输出是......你猜对了,黑色画布。
请您帮我理解如何实现一个LoG边缘检测器,它可以从输入信号中找到相同的特征,即使输入信号按比例放大或缩小(将给出比例因子)。
答案 0 :(得分:2)
查看您的图像,我想您正在使用24位RGB。当你增加sigma时,你的滤波器的响应会相应地减弱,因此你在较大的内核中得到的值是接近于零的值,这些值要么被截断,要么接近于零而你的显示器无法区分。
为了使不同尺度的差异具有可比性,你应该使用尺度空间微分算子(Lindeberg等人):
本质上,微分算子应用于高斯核函数(G_{\sigma}
),结果(或者卷积核;它只是一个标量乘数)通过\sigma^{\gamma}
缩放。这里L
是输入图像,LoG
是高斯图像的拉普拉斯算子。
当差异的顺序为2时,\gamma
通常设置为2。
然后你应该在两张图片中得到非常相似的幅度。
来源:
[1]林德伯格:“计算机视觉中的尺度空间理论”1993年
[2] Frangi等人。 “多尺度血管增强过滤”1998年