答案 0 :(得分:2)
尝试傅立叶变换可能很有用。 在您的情况下,您应该在变换图像的中间获得两条垂直线,这些垂直线对应于在图像中垂直移动时的信息。 另一方面,不应该有水平线,因为在图像中水平移动时信息很少(变化不大)
例如,您可以使用此在线网站进行傅里叶变换: https://www.ejectamenta.com/Fourifier-fullscreen/
听起来问题可能仍然相同,但实际上现在要容易得多。 2D图案被转换为主线,在变换图像中很容易找到。 例如,您可以搜索图像中最强的像素,并简单地确定它们是更可能是水平线还是垂直线,或者确定主线的角度。然后旋转90度。
不要担心这两行。图像是对称的,所以只需忽略图像的3/4,然后查看1个季度。
答案 1 :(得分:2)
最简单的方法是计算梯度向量(x导数和y导数)并在每个像素(atan2(y,x)
)找到它的方向。平均方向是你想要的,而不是平均方向(将取消)。因此,应用模数pi,然后在整个图像中取平均值。
计算图像渐变的最佳方法是Gaussian gradients。
structure tensor是实现这一目标的更有力的方法。简而言之,它计算梯度向量的局部平均值以减少噪声的影响。它通过计算梯度向量的外积来实现这一点,它产生对称矩阵。然后可以对该矩阵的各个分量进行局部平均(即应用平滑滤波器)。这类似于计算矢量的角度,将角度加倍以使相反方向的矢量相等,然后对它们求平均值。
请注意,您可以在3D中应用这些解决方案中的任何一种(您可以将视频数据视为2D +时间= 3D)。这样,您可以计算2D帧内的运动速度和运动方向,而不仅仅是沿着提取问题中显示的2D图像的方向的速度。图像梯度和结构张量的概念很容易扩展到3D。这种3D方法类似于Lucas-Kanade对光流的方法。如果您按照指向维基百科的链接,您会看到它在2D中使用结构张量,并在时间维度上添加渐变。
答案 2 :(得分:1)
我建议给Hough变换一个go,它在OpenCv中可用。 Hough变换将线条映射到角度,在您的情况下可能很有用。