如何在给定相机方向(theta、phi、距离)和 3d 对象坐标的情况下计算 2d X 射线图像投影

How to calculate 2d X-ray image projection given camera orientation (theta, phi, distance) and 3d object coordinates

我正在尝试重新创建 X 射线投影

我有形状为 (100,3) 的物体的 3D 坐标、相机的球面坐标(theta、phi、距离)、相机到图像的距离以及图像的大小 (512x512)

那里有很多教程,但我正在努力获得合理的结果

这是我到目前为止所做的

  1. 将球面转换为笛卡尔
def spherical_2_cartesian (phi, theta, p):

    x = p * np.sin(phi) * np.cos(theta)
    y = p * np.sin(phi) * np.sin(theta)
    z = p * np.cos(phi)
    
    return x,y,z

xa,ya,za = spherical_2_cartesian (23.1, 32.6, 730.0779523)
  1. 通过'look at'方法计算外部矩阵
L = [xa,ya,za]
L = L / np.linalg.norm(L)
s = np.cross(L, [0,1,0])
s = s / np.linalg.norm(s)
u_prime = s * L
R = np.array([s, u_prime, -L])
t = np.dot(-R,[xa,ya,za])
extrinsic = np.column_stack((R, t))
  1. 定义内在矩阵
f = 1066 ## distance from source to image plane
cx, cy = 512.0/2, 512.0/2 ## image size / 2
intrisic = np.array([[f, 0, cx], [0, f, cy], [0, 0, 1]])
  1. 将 3d 形状坐标转换为同质坐标,因此形状为 (100, 4)
mesh_homo = np.concatenate((mesh_coords,np.ones((len(mesh_coords),1))), axis=1)
  1. 计算相机坐标系中的 3d 形状坐标。
mesh_in_camera_coords = np.dot(extrinsic,np.swapaxes(mesh_homo, 0, 1))
  1. 最后计算投影并转换为 x,y 图像坐标
homogenous = np.dot(intrisic, mesh_in_camera_coords)
x = homogenous[0] / homogenous[2]
y = homogenous[1] / homogenous[2]

谁能看出我错在哪里?

已解决:对于那些感兴趣的人,本文描述了构建血管造影外部矩阵的正确方法x-ray:

https://ieeexplore.ieee.org/document/6820797