在有关数字图像处理的文献中,您可以找到相对低阶的拉普拉斯核的示例,通常为 3 或 5。我想知道,有没有一般的方法来构建拉普拉斯核或任意阶?链接或/和参考将不胜感激。
1 回答
拉普拉斯算子定义为沿图像每个轴的二阶导数之和。(即是Hessian矩阵的迹):
- Δ I = ( ∂<sup>2/∂<em>x 2 + ∂<sup>2/∂<em>y 2 ) I
有两种常用的离散化方法:
使用有限差分。导数算子是
[1,-1]
或的卷积[0.5,0,-0.5]
,二阶导数算子应用[1,-1]
卷积两次,导致与 的卷积[1,-2,1]
。与正则化核的导数卷积。最佳正则化核是高斯,导致高斯拉普拉斯算子。结果是由高斯核平滑的图像的精确拉普拉斯。
另一种方法是用插值内核替换正则化内核。我的一位前同事发表了一篇关于这种方法的论文:
A. Hast,“通过双重滤波方法对一阶和二阶导数进行简单滤波器设计”,模式识别快报 42(1):65-71,2014 年。
他使用了“双滤波器”,但线性滤波器总是可以简化为单个卷积。
这个想法很简单,采用一个插值内核,并在整数位置计算它的导数。插值内核在原点处始终为 1,在其他整数位置处始终为 0,但它通过这些“结点”波动,这意味着它的导数在这些整数位置处不为零。
在极端情况下,采用理想的插值器,即sinc 函数:
- sinc( x ) = sin(π x ) / π x
它的二阶导数是:
- d 2 /d x 2 (sinc(π x )) = [ (2 - π 2 x 2 ) sin(π x ) - 2π x cos(π x ) ] / (π x 3 )
在 11 个整数位置采样导致:
[ 0.08 -0.125 0.222 -0.5 2 -3 2 -0.5 0.222 -0.125 0.08 ]
但请注意,这里的归一化是不正确的,因为我们要切断无限长的内核。因此,最好选择较短的内核,例如三次样条内核。
第二种选择是通过傅立叶域计算拉普拉斯算子。这只需要乘以 -π u 2 -π v 2,同时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。这将为您提供平滑图像的精确拉普拉斯。为了防止噪声的影响,需要进行平滑处理。在噪声很小的情况下,您可以使用小的高斯西格玛(例如 σ=0.8)。这将为您提供比任何其他方法更有用的结果。