Finding Circles, Revisited
Earth Engine by Example
在地球引擎代码编辑器示例中,有一个通过内核卷积进行圆查找的示例。本文将演示另一种圆检测方法,它具有更大的灵活性,称为圆霍夫变换(CHT)。
Circle Hough 变换应用于科罗拉多州南部中心枢轴灌溉农场的边缘检测图像的示例。彩色圆点代表检测到的圆心。冷色(紫色、浅绿色、绿色)表示更合身,而暖色(红色、橙色、黄色)表示合身较弱。
CHT 通常的配方是:
- 使用高斯卷积平滑输入
- 使用 Canny 边缘检测器执行边缘检测
- 迭代图像中的像素,为每个输入像素绘制一个给定半径的圆到一个累加器图像中。
- 找出累加器中的最高值;这些将对应于输入中任何圆的中心。
要了解 CHT 的工作原理,请考虑下图,其中输入圆(左)中的 4 个像素被描绘为半径为
0.6*r
(中心)和半径为
1.0*r
(右)的圆。
CHT 示例,追踪圆并求和原始圆(左)的 4 个点,半径为 0.6*r(中心)和 1.0*r(右)。
如果圆完全不重叠,则累加器的值为 1。当它们与另一个圆重叠时,累加器的值为 2,而它们都在中心重叠时,其值为 4。即高点对应于原始圆或半径的中心
r
。
实际上,这是针对 0 到 360 度之间的每个角度(或某个阶梯子集)和每个可能的感兴趣半径进行的。那么这只是在 N 维累加器空间中找到最大值的问题。
CHT 配方中的前两个步骤在 Earth Engine 中很简单,但是在那里迭代图像中的每个像素是不切实际的,因此我们无法以传统方式跟踪和累积圆圈。相反,我们可以用图像位移来近似这个,本质上是将整个图像旋转成不同大小的圆圈并将它们相加。看起来像这样对于我们的例子圆,半径
0.6*r
和
1.0*r
。
使用图像位移而不是跟踪来近似 CHT。输入图像(左)位移 4 次,并以 0.6*r(中心)和 1.0*r(右)的位移半径求和。
对于 的“太小”半径
0.6*r
,交点出现在稍微不同的位置(我们不关心),但是对于完全正确的半径,
1.0*r
我们在完整的 CHT 上得到相同的结果。
实现这只是映射所有半径和角度并对中间结果求和的问题。然后我们可以在所有半径累加器图像中取最大值以找到最佳拟合。
不幸的是,根据所使用的投影和与投影原点的距离,圆形对象(或其位移)实际上可能不是圆形;它们通常可以是椭圆。下面的图像显示了科罗拉多州南部的一个中心轴农场(左)、它的边缘检测结果(中),以及该边缘在 X 和 Y 方向通过 12 个角度位移相同的距离(右)。由于该位置的北纬,该投影中的结果肯定是椭圆体,并且中心“热点”已在 Y 方向上展开,使得中心查找更加困难。
中心轴场的图像(左)、其边缘(中)和 CHT 累加器的可视化(右)。墨卡托投影导致该农场纬度的 Y 轴伸长。
这就是 Hough 优于其他方法的地方:它允许在 X 和 Y 方向上独立使用不同的半径。实现只需要一个额外的
map()
来适应额外的半径。
注意事项
- 如前所述,位移方法只是 CHT 的近似值,在小半径(接近 1 个像素的任何地方)时,两种方法之间的差异可能很大。
- 该
函数在当前位置使用米,因此图像内的位移量(和最佳拟合半径)实际上可能更多或更少像素,具体取决于像素与投影原点的接近程度。displace()
- 虽然二值化阈值是动态找到的,但我随意将 Canny 边缘检测结果设置为 0.5 的附加阈值。
- 实际上,构成良好拟合的阈值取决于已设置的其他参数(例如:角度数),并确定需要包括的圆的完整程度。刚接触的圆之间没有边缘,导致拟合值较低。