The 拉普拉斯算子定义为沿图像每个轴的二阶导数之和。 (即是Hessian矩阵的迹):
- Δ I = ( ∂2/∂x2 + ∂2/∂y2 ) I
有两种常用的离散化方法:
-
使用有限差分。导数算子是卷积[1,-1]
or [0.5,0,-0.5]
,二阶导数算子应用[1,-1]
卷积两次,导致卷积[1,-2,1]
.
-
与正则化核的导数进行卷积。最佳正则化核是高斯核,从而产生拉普拉斯高斯算子。结果是exact通过高斯核平滑图像的拉普拉斯。
另一种方法是用插值内核替换正则化内核。我的一位前同事发表了一篇关于这种方法的论文:
A. Hast,“通过双重滤波方法进行一阶和二阶导数的简单滤波器设计”,模式识别快报 42(1):65-71, 2014.
他使用了“双滤波器”,但线性滤波器总是可以简化为单个卷积。
这个想法很简单,采用插值内核,并计算其在整数位置的导数。插值核在原点处始终为 1,在其他整数位置处始终为 0,但它会通过这些“结点”波动,这意味着其导数在这些整数位置处不为零。
在极端情况下,采用理想插值器,正弦函数:
Its 二阶导数是:
- 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 ]
但请注意,这里的标准化是不正确的,因为我们正在切断无限长的内核。因此,最好选择较短的内核,例如三次样条核.
A second alternative is to compute the Laplace operator through the Fourier domain. This simply requires multiplying with -πu2-πv2, with u and v the frequencies.
这是一些 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。
最后,我想提一下,拉普拉斯算子是very对噪声敏感(高频显着增强)。这里讨论的方法仅对没有鼻子的数据有意义(大概是合成数据?)。对于任何真实世界的数据,我highly建议您使用高斯拉普拉斯。这将为您提供exact平滑图像的拉普拉斯。平滑对于防止噪声的影响是必要的。如果噪音很小,您可以使用较小的高斯西格玛(例如 σ=0.8)。这将为您提供比任何其他方法更有用的结果。