计算图像中的角度 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])
我正在从事图像处理工作,我需要知道图像中心 (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])