计算图像中的角度 python

Calculate angles in an image python

我正在从事图像处理工作,我需要知道图像中心 (320, 320) 与多个对象之间的角度,例如([22.5, 114], [350, 500])。图片大小为640X640.

当我在图像 [0,320] 上计算北方时,使用以下方法的角度是 45º,应该是 0º。

center = [im.size[0]/2, im.size[1]/2]
vector_1= [center[0], center[1]]
vector_2 = [0, 320]
unit_vector_2 = vector_1 / np.linalg.norm(vector_1)
unit_vector_1 = vector_2 / np.linalg.norm(vector_2)
dot_product = np.dot(unit_vector_1, unit_vector_2)
angle = np.arccos(dot_product)
mydegrees = math.degrees(angle)

但是当我计算角度时:

myradians = math.atan2(vector_1[1]-vector_2[1], vector_1[0]-vector_2[0]) 
mydegrees = math.degrees(myradians) 

角度为0,但不适用于[5, 320]等其他坐标

我需要计算整个图像中从 0º 到 360º 的角度,同时考虑图像的尺寸和图像中物体的位置,始终假设图像的中心是原点坐标。

下图为示例:

蓝点代表中心[320,320],红点是我要找角度的像素坐标,假设北为0º [0, 320] 东为90º [320, 0], 南 180º [0, -320], 西 [-320, 0].

圆点坐标为:

(x=[22, 74, 88, 478.0, 635.0, 350], y=[114, 154, 540.0, 529.0, 217.0, 500])

如何解决这个问题? 谢谢!

您可以使用 np.arctan2 来计算矢量的角度和参考矢量的角度。

>>> x = np.array([ 22,  74,   88,  478.0, 635.0, 350])
>>> y = np.array([114, 154, 540.0, 529.0, 217.0, 500])

首先计算向量并归一化。您可以堆叠它们以便于使用:

>>> v = np.stack((x, y)) - 320
>>> v /= np.linalg.norm(v, axis=0, keepdims=True)
array([[-0.82258948, -0.82892679, -0.72562385,  0.60304904,  0.95047819, 0.16439899],
       [-0.56863568, -0.5593571 ,  0.68809158,  0.79770411, -0.31079128, 0.98639392]])

计算角度:

>>> v_rad = np.arctan2(*v)
array([-2.17564267, -2.16440635, -0.8119406 ,  0.64731788,  1.88682175, 0.16514868])

参考向量是 [0, -320],归一化后得到 [0, -1]np.arctan2(0, -1) 就是 np.pi.

以度为单位的所得角度由下式给出:

>>> angles = np.rad2deg((np.pi - v_rad) % (2*np.pi))
array([304.6551425, 304.011348, 226.5207696, 142.9114172, 71.8930768, 170.5376777])