Laplace operator 定义为沿图像每个轴的二阶导数之和。 (即是Hessian矩阵的迹):
- Δ I = ( ∂2/∂x2 + ∂2/∂y2 ) 我
有两种常用的离散化方法:
-
使用有限差分。导数算子是[1,-1]或[0.5,0,-0.5]的卷积,二阶导数算子应用[1,-1]卷积两次,导致与[1,-2,1]的卷积。
-
与正则化内核的导数卷积。最佳正则化核是高斯,导致高斯拉普拉斯算子。结果是经过高斯核平滑的图像的精确拉普拉斯。
另一种方法是用插值内核替换正则化内核。我的一位前同事发表了一篇关于这种方法的论文:
A. Hast,“通过双滤波方法对一阶和二阶导数进行简单滤波器设计”,Pattern Recognition Letters 42(1):65-71, 2014。
他使用了“双滤波器”,但线性滤波器总是可以简化为单卷积。
这个想法很简单,采用一个插值内核,并在整数位置计算它的导数。插值核在原点处始终为 1,在其他整数位置处始终为 0,但它通过这些“结点”波动,这意味着它的导数在这些整数位置处不为零。
在极端情况下,采用理想的插值器,sinc function:
它的second derivative is:
- d2/dx2(sinc(πx)) = [ (2 - π 2x2) sin(πx) - 2πx cos(π x) ] / (πx3)
在 11 个整数位置采样导致:
[ 0.08 -0.125 0.222 -0.5 2 -3 2 -0.5 0.222 -0.125 0.08 ]
但请注意,这里的归一化是不正确的,因为我们要切断无限长的内核。因此,最好选择较短的内核,例如cubic spline kernel。
第二种选择是通过傅立叶域计算拉普拉斯算子。这只需要乘以 -πu2-πv2 和 u 和 v 频率。
这是一些 MATLAB 代码,将这个过滤器应用于单位脉冲图像,从而生成大小为 256x256 的内核图像:
[u,v] = meshgrid((-128:127)/256,(-128:127)/256);
Dxx = -4*(pi*u).^2;
Dyy = -4*(pi*v).^2;
L = Dxx + Dyy;
l = fftshift(ifft2(ifftshift(L)));
l = real(l); % discard insignificant imaginary component (probably not necessary in MATLAB, but Octave leaves these values there)
l(abs(l)<1e-6) = 0; % set near-zero values to zero
l 这里与上述理想插值器的结果相同,将垂直和水平插值相加,标准化长度为 256。
最后,我想提一下,拉普拉斯算子对噪声非常敏感(高频显着增强)。这里讨论的方法只对没有鼻子的数据有意义(大概是合成数据?)。对于任何真实世界的数据,我强烈建议您使用 Laplace of Gaussian。这将为您提供平滑图像的精确拉普拉斯。为了防止噪声的影响,需要进行平滑处理。在噪声很小的情况下,您可以使用小的高斯 sigma(例如 σ=0.8)。与任何其他方法相比,这将为您提供更有用的结果。