我了解了许多边缘检测算法,包括 Sobel、Laplacian 和 Canny 方法等算法。在我看来,最受欢迎的边缘检测器是 Canny 边缘检测器,但在某些情况下这不是最佳算法吗?我如何决定使用哪种算法?谢谢!
在选择边缘检测算法时应该考虑哪些因素?
有很多边缘检测的可能性,但你提到的 3 个例子恰好属于 3 个不同的类别。
索贝尔
这近似于一阶导数。在梯度位置给出极值,0 表示不存在梯度。在一维中,它是 =
- 平滑边缘 => 局部最小值或最大值,取决于信号上升或下降。
- 1 像素线 => 0 线本身,其旁边有局部极值(不同符号)。在一维中,它是 =
Sobel 还有其他替代品,它们具有 +/- 相同的特性。在维基百科的Roberts Cross页面上,您可以找到其中一些的比较。
拉普拉斯
这近似于二阶导数。在渐变位置给出 0,在不存在渐变的地方也给出 0。它给出了(更长的)梯度开始或停止的极值。
- 沿边缘平滑边缘 => 0,边缘开始/停止处的局部极值。
- 1 像素线 => 线上有一个“双”极值,旁边有一个带有不同符号的“正常”极值
这 2 种对不同类型边缘的影响可以从视觉上得到最好的观察:
精明的
这不是一个简单的算子,而是一个多步骤的方法,它使用 Sobel 作为步骤之一。在 Sobel 和 Laplace 为您提供灰度/浮点结果的地方,您需要自己设置阈值,而 Canny 算法将智能阈值作为其步骤之一,因此您只需获得二进制是/否结果。此外,在平滑的边缘上,您可能会在渐变中间的某处发现只有 1 条线。
虽然 Sobel 和 Laplacian 只是过滤器,但 Canny 在两个方面比这更进一步。
首先,它进行非最大抑制,消除图像中各种对象和颜色梯度产生的噪声。其次,它实际上包括一个步骤,可让您辨别不同的边缘方向并填充线条的缺失点。
换句话说,Canny 边缘检测器与 Sobel 和 Laplacian 属于完全不同的类别。它更聪明,因为它包括一大堆后处理,而 Sobel 和 Laplacian 只是高通滤波器输出,然后是线性二进制阈值。
对我来说,尝试检测边缘时最重要的两个决定通常是:
我可以分割对象,然后使用形态学算子来找到二进制(分割)图像的边缘吗?对于嘈杂的数据,这往往更加稳健。
我应该使用什么边缘保持平滑滤波器来减少图像噪声?边缘过滤器基于差分,这将受到噪声数据的影响。最简单的选择是中值滤波器,但各向异性扩散或非局部意味着滤波器将提供更好的性能,但代价是需要调整更多参数。
对于边缘检测本身,我想不出不使用 Canny 的充分理由。