假设Canny边缘检测器成功检测到图像中的边缘。然后将边缘旋转θ,其中原始边缘(x,y)(x,y)
上的点与旋转边缘上的点(x′,y′)(x′,y′)
之间的关系定义为x′ = xcosθ; y′ = xsinθ;
使用相同的Canny边缘检测器检测旋转边缘吗?
(我认为我们应该找到答案,考虑到Canny边缘检测器对边缘的检测仅取决于其导数的大小。)
答案 0 :(得分:2)
答案是肯定和否定,你选择哪一个取决于你提出问题的字面意思。
首先,我们处理矩形网格,因此给定整数位置(x,y),旋转图像中的对应点(x',y')很可能不是整数位置。考虑到Canny的输出是一组点,而不是可以插值的平滑函数,很难在旋转产生的集合与原始图像产生的集合之间建立对应关系。
例如,考虑给定长度在0度和45度的离散线上的像素数量。 (提示:45度的线的像素数减少sqrt(2)
倍。)
但是如果你更普遍地提出问题并将其解释为“在将图像旋转θ度后,是否还能检测到原始图像中检测到的边缘?”理论上答案是肯定的。
当然,实践总是与理论有点不同。这里的实施细节很重要。并且总是存在数值上的不精确性。
让我们首先假设正确计算旋转,使用精确的插值方案(立方体,Lanczos),而不是在uint8
之后舍入(即我们使用浮点值进行计算)。
如果您阅读original paper by Canny,您会看到他建议使用Gaussian derivatives作为紧凑支持和计算精度之间的最佳折衷方案。我见过很少的实现。通常我会看到使用高斯和索贝尔衍生物的卷积。特别是对于较小的sigmas(较少平滑),差异可能非常大。高斯导数是旋转不变的,Sobel衍生物不是。
算法的下一步是非最大抑制。这是连续渐变转换为一组点的位置。对于每个像素,它会检查它是否是渐变方向上的局部最大值。因为这是按像素完成的,所以与原始图像相比,在旋转图像中测试不同的位置集。尽管如此,它应该在两种情况下检测沿着相同脊的点。
接下来,应用滞后阈值。这是双阈值操作,只要在同一连通分量中存在高于第二阈值的至少一个像素,就将像素保持在一个阈值以上。这是旋转图像和原始图像之间可能出现差异的地方。请记住,我们正在处理一组像素。我们在离散点处对连续梯度函数进行采样。在一个版本的图像中可能存在一个像素高于第二阈值的边缘,但在另一个版本中没有。当然,这仅适用于非常接近所选阈值的边缘。
接下来是瘦身。因为非最大抑制可以沿着较粗的线产生点,所以应用细化操作以从组中移除不需要维持线的连通性的像素。这里选择的像素在旋转图像和原始图像之间也会有所不同,但这不会改变解决方案的几何形状,因此我们仍然拥有相同的点集。
所以,答案是肯定的,不是。 :)
请注意,相同的逻辑适用于翻译。