确定时空图像的图案方向

时间:2017-08-07 12:34:26

标签: python opencv image-processing

如何获得下图所示图案的平均方向。它是红色箭头相对于黄色(水平)线的方向。对方法的任何想法?我无法想办法接近。这是从视频创建的时空图像。谢谢。

Figure A

这是我的原始图片:enter image description here

3 个答案:

答案 0 :(得分:2)

尝试傅立叶变换可能很有用。 在您的情况下,您应该在变换图像的中间获得两条垂直线,这些垂直线对应于在图像中垂直移动时的信息。 另一方面,不应该有水平线,因为在图像中水平移动时信息很少(变化不大)

例如,您可以使用此在线网站进行傅里叶变换: https://www.ejectamenta.com/Fourifier-fullscreen/

听起来问题可能仍然相同,但实际上现在要容易得多。 2D图案被转换为主线,在变换图像中很容易找到。 例如,您可以搜索图像中最强的像素,并简单地确定它们是更可能是水平线还是垂直线,或者确定主线的角度。然后旋转90度。

例如,请参阅此木纹图像以及生成的转换图像: Horizontal Wood grain

Transformed image

不要担心这两行。图像是对称的,所以只需忽略图像的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变换将线条映射到角度,在您的情况下可能很有用。

相关问题