在有关数字图像处理的文献中,您可以找到相对较低阶的拉普拉斯核的示例,通常为3或5.我想知道,有没有通用的方法来构建拉普拉斯内核或任意顺序?链接或/和参考将不胜感激。
答案 0 :(得分:1)
Laplace operator被定义为沿着图像的每个轴的二阶导数的总和。 (也就是说,它是Hessian矩阵的痕迹):
有两种常用方法可以将其去除:
使用有限差异。导数运算符是[1,-1]
或[0.5,0,-0.5]
的卷积,二阶导数运算符两次应用[1,-1]
卷积,导致与[1,-2,1]
进行卷积。
与正则化内核的导数一起讨论。最优正则化核是高斯核,导致拉普拉斯高斯算子。结果是高斯内核平滑的图像的精确拉普拉斯。
另一种方法是用插值内核替换正则化内核。我的一位前同事发表了一篇关于这种方法的论文:
一个。 Hast,“通过双重过滤方法对一阶和二阶导数进行简单滤波设计”,Pattern Recognition Letters 42(1):65-71, 2014。
他使用了“双重滤波器”,但线性滤波器总是可以简化为单个卷积。
这个想法很简单,就是采用插值内核,并在整数位置计算其导数。内插内核在原点始终为1,在其他整数位置为0,但它通过这些“结点”波动,这意味着它的导数在这些整数位置不为零。
在极端情况下,采用理想插值器sinc function:
在11个整数位置采样的结果为:
[ 0.08 -0.125 0.222 -0.5 2 -3 2 -0.5 0.222 -0.125 0.08 ]
但请注意,这里的规范化是不正确的,因为我们正在切断无限长的内核。因此,最好选择较短的内核,例如cubic spline kernel。
第二种选择是通过傅里叶域计算拉普拉斯算子。这只需要与-π 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.
最后,我想提一下拉普拉斯算子非常对噪声敏感(高频率显着增强)。这里讨论的方法仅对没有鼻子的数据有意义(可能是合成数据?)。对于任何真实世界的数据,我高度建议您使用高斯拉普拉斯。这将为您提供平滑图像的精确拉普拉斯。平滑是必要的,以防止噪音的影响。噪声很小,可以使用小高斯西格玛(例如σ= 0.8)。这将为您提供比任何其他方法更有用的结果。