精明的边缘检测边缘旋转不变吗?

Is canny edge detection edge rotationlly invariant?

假设Canny边缘检测器成功检测到图像中的边缘。然后将边缘旋转θ,其中原始边缘(x,y)(x,y)上的点与旋转边缘(x′,y′)(x′,y′)上的点之间的关系定义为x′ = xcosθ; y′ = xsinθ;

是否会使用相同的 Canny 边缘检测器来检测旋转边缘?

(考虑到 Canny 边缘检测器对边缘的检测仅取决于其导数的大小,我认为我们应该找到答案。)

答案既有肯定也有否定,你选择哪一个取决于你对问题的理解程度。

首先,我们处理的是矩形网格,因此给定一个整数位置 (x,y),旋转图像中的对应点 (x',y') 很可能不是整数位置.并且考虑到Canny的输出是一组点,而不是一个可以插值的平滑函数,很难在旋转后的结果集和原始图像得到的结果集之间建立对应关系。

例如,考虑在 0 度和 45 度时给定长度的离散线上的像素数。 (提示:45 度角的线的像素数减少 sqrt(2) 倍。)

但如果你更笼统地看待这个问题并将其解释为 "will an edge that is detected in the original image also be detected after rotating the image by θ degrees?" 那么理论上答案是肯定的。

当然,实践总是与理论有所不同。实施的细节在这里很重要。而且总是需要应对数值上的不精确性。

让我们首先假设旋转计算正确,使用精确的插值方案(立方,Lanczos)并且没有四舍五入到 uint8 或其他东西(即我们正在使用浮点值计算)。

如果您阅读 original paper by Canny, you'll see he proposes using Gaussian derivatives 作为紧凑支持和计算精度之间的最佳折衷。我看到很少有实际执行的实现。通常我会看到一个高斯卷积,然后是 Sobel 导数。特别是对于较小的西格玛(较少平滑),差异可能非常大。高斯导数是旋转不变的,Sobel导数不是。

算法的下一步是非极大值抑制。这是将连续梯度转换为一组点的地方。对于每个像素,它检查它是否是梯度方向上的局部最大值。因为这是按像素完成的,所以与原始图像相比,在旋转图像中测试了一组不同的位置。尽管如此,它应该在两种情况下都检测到沿相同山脊的点。

接下来,应用滞后阈值。这是一种双阈值操作,只要在同一连通分量中存在至少一个高于第二阈值的像素,就可以使像素保持在一个阈值以上。这是旋转图像和原始图像之间可能出现差异的地方。请记住,我们正在处理一组像素。我们在离散点对连续梯度函数进行了采样。在一个版本的图像中可能有一个边缘的像素高于第二个阈值,但在另一个版本中则没有。当然,这只会发生在非常接近所选阈值的边缘。

接下来是间伐。因为非最大抑制可以沿着较粗的线产生点,所以应用细化操作从集合中移除不需要保持线的连通性的像素。这里选择的像素在旋转图像和原始图像之间也会有所不同,但这不会改变解决方案的几何形状,所以我们仍然有相同的一组点。

所以,答案是肯定的,也不是。 :)

请注意,同样的逻辑也适用于翻译。