我正在尝试使用SciPy堆栈来实现Borenstein,Koren,1991在Python 2.7中描述的矢量场直方图。

我已经能够计算出极坐标直方图,如本文所述,以及消除噪音的平滑功能。该变量存储在一个名为self.Hist的numpy数组中。在极坐标直方图中,其障碍物密度低于某个阈值)不包含完整圆圈的部分,即与computeTheta对应的扇区。


如果直方图在360º330º之间的角度中包含一个峰值,而其他直方图为谷值,则将正确计算转向方向。

但是,如果峰值位于30º30º之间,那么谷值将从60º开始,一直超过60º,直到360º结束,并且转向方向计算不正确,因为这单个山谷将被视为两个山谷leys,一个在30º之间,另一个在30º60º之间。 />我该如何解决这个问题?有没有办法将直方图视为圆形?

谢谢您的宝贵时间。

评论

请问每次极坐标直方图的执行时间有多快?

#1 楼

我很难遵循您的代码,部分是因为我不了解Python,但主要是因为我不确定我是否理解您的变量。就是说,我想我确实了解您的问题。

我要解决的方法是在评估之前先“扭曲”数据,然后做出决定,然后“扭曲”输出。例如,考虑下面的伪代码:希望我已经清楚了这一点;请参见下面的伪代码。基本上,调整数据的方向,使您始终从高峰开始。这样可以确保山谷始终以<= 360度结束。然后,一旦找到标题,就根据您将数据开始移动的距离进行移动。

评论


$ \ begingroup $
作为评论,我假设标题将是一个标志或类似的位/字节数组,与您的直方图变量对应1:1。如果只是角度,则需要根据步数乘以直方图字段中的点之间的角度步数进行转换。
$ \ endgroup $
–卡盘
16-2-17在14:51

$ \ begingroup $
因此,我使用numpy.roll()函数进行了尝试,围绕密度最高的索引旋转了直方图,并且成功了!非常感谢你! :D
$ \ endgroup $
–银行C.
16年2月19日在15:25

#2 楼

因为您使用的是Python的arctan2函数(返回值在$ [-\ pi,\ pi] $之间),所以我不明白为什么需要使用

if target_sector < 0:
    target_sector += 360


评论


$ \ begingroup $
你说的很好。这基本上是“调试糖”;我做了一些事情,以使我在运行时更容易读出外壳上的角度。我可能会在最终版本中将其删除。
$ \ endgroup $
–银行C.
16-2-17在15:17

$ \ begingroup $
这不是引起您算法错误的原因,当您从较大的山谷角开始搜索时,该算法会导致您向期望的方向旋转360度?
$ \ endgroup $
– SteveO
16年2月17日在16:54

$ \ begingroup $
我尝试删除此部分并进行了相关更改,但仍然基本相同。这些线基本上仅将负角度(例如-30度)转换为正角度(例如330度)。当我删除这行代码时,实际上发生的事情是我使用诸如self.Hist [-1]之类的结构访问了数组。圆度仍然是一个问题。
$ \ endgroup $
–银行C.
16-02-17 '17:47