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