我是dicom开发组的初学者。我需要在dicom图像上创建定位器图像线。是否有好的想法?有没有技术专家能提供帮助。
我是dicom开发组的初学者。我需要在dicom图像上创建定位器图像线。是否有好的想法?有没有技术专家能提供帮助。
Group,Elem VR Value Name of the tag
---------------------------------------------------------------------
(0020,0032) DS [-249.51172\-417.51172\-821] # ImagePositionPatient
X0 Y0 Z0
(0020,0037) DS [1\0\0\0\1\0] # ImageOrientationPatient
A B C D E F
ImagePositionPatient包含全局坐标,以毫米为单位,表示传输的第一个像素(即左上角像素)的位置,用(x,y,z)表示。我将它们标记为X0、Y0、Z0。ImageOrientationPatient包含两个向量,每个向量都有三个分量,指定图像的第一行像素和第一列像素的方向余弦。理解方向余弦并不会有害(例如,请参见http://mathworld.wolfram.com/DirectionCosine.html),但dclunie建议的方法直接使用它们,因此现在让我们先说它们可以给您图像平面在空间中的方向。我将它们标记为A-F,以便公式更容易编写。
现在,在dclunie提供的代码中(我认为它是C语言,但它非常简单,应该也适用于Java、C#、awk、Vala、Octave等语言),约定如下:
scr_* = 源图像,即CT切片
dst_* = 目标图像,即侦察图
*_pos_x,*_pos_y,*_pos_z = 上述的X0,Y0,Z0
*_row_dircos_x,*_row_dircos_y,*_row_dircos_z = 上述的A,B,C
*_col_dircos_x,*_col_dircos_y,*_col_dircos_z = 上述的D,E,F
设置正确的值后,只需应用这些值:
dst_nrm_dircos_x = dst_row_dircos_y * dst_col_dircos_z
- dst_row_dircos_z * dst_col_dircos_y;
dst_nrm_dircos_y = dst_row_dircos_z * dst_col_dircos_x
- dst_row_dircos_x * dst_col_dircos_z;
dst_nrm_dircos_z = dst_row_dircos_x * dst_col_dircos_y
- dst_row_dircos_y * dst_col_dircos_x;
src_pos_x -= dst_pos_x;
src_pos_y -= dst_pos_y;
src_pos_z -= dst_pos_z;
dst_pos_x = dst_row_dircos_x * src_pos_x
+ dst_row_dircos_y * src_pos_y
+ dst_row_dircos_z * src_pos_z;
dst_pos_y = dst_col_dircos_x * src_pos_x
+ dst_col_dircos_y * src_pos_y
+ dst_col_dircos_z * src_pos_z;
dst_pos_z = dst_nrm_dircos_x * src_pos_x
+ dst_nrm_dircos_y * src_pos_y
+ dst_nrm_dircos_z * src_pos_z;
那就像这样:[ dst_row_dircos_x dst_row_dircos_y dst_row_dircos_z -dst_pos_x ] M = [ dst_col_dircos_x dst_col_dircos_y dst_col_dircos_z -dst_pos_y ] [ dst_nrm_dircos_x dst_nrm_dircos_y dst_nrm_dircos_z -dst_pos_z ] [ 0 0 0 1 ]
Scout_Point(x,y,z,1) = M * CT_Point(x,y,z,1)
在说了这些之后,我们应该将CT的哪些点转换为线条以创建侦察线?对于这个问题,dclunie已经提出了一个通用解决方案:DICOM中的像素距离值是指图像平面,因此您只需将x和y乘以这些值就可以得到它们在毫米中的位置,而z为0(既是像素也是毫米)。我说的是这些值:# Pixel location of the TRHC x_pixel = number_of_columns-1 # Counting from 0 y_pixel = 0 z_pixel = 0 # We're on a plane!
上面的矩阵M是从全局坐标到图像坐标的通用变换,具有方向余弦可用。现在需要的是执行反向作业(图像到全局)并在源图像(CT切片)上使用。我会让你去查一下几何书以确保,但我认为应该是这样的(旋转部分被转置,平移没有符号变化,当然我们使用src_*值):(0028,0011) US 512 # 2, 1 Columns (0028,0010) US 512 # 2, 1 Rows (0028,0030) DS [0.9765625\0.9765625] # 20, 2 PixelSpacing
[src_row_dircos_x src_col_dircos_x src_nrm_dircos_x src_pos_x ]
M2 = [src_row_dircos_y src_col_dircos_y src_nrm_dircos_y src_pos_y ]
[src_row_dircos_z src_col_dircos_z src_nrm_dircos_z src_pos_z ]
[0 0 0 1 ]
将CT切片上的点(例如四个角)转换为毫米,然后应用M2使它们处于全局坐标系中。然后您可以将它们提供给dclunie报告的过程。在使用它进行患者诊断之前,请交叉检查我的数学计算!;-)