一种基于空间矢量方程求解的三维定位线计算方法 技术领域 本发明涉及一种基于空间矢量方程求解的三维定位线计算方法, 尤其涉及针对医 学放射影像检查 CT, 核磁检查等断层扫描影像设备所产生的定位面与截面的定位线计算方 法。
背景技术 在 医 学 放 射 影 像 断 层 扫 描 检 查 过 程 中, 会针对患者检查部位产生定位面 (Localizer) 和一系列的切面 (Transect) 影像的 DICOM 格式医学影像。
在 DICOM 影像格式中会通过一系列的 TAG 来标识一组扫描影像的方向, 座标位置, 像素与实际尺寸映射比例, 像素宽, 高, 图像类型 ( 定位面或者截面等 ), 这些座标, 方向值 在影像定位面, 切面上的示例分别如图 1, 图 2 所示。
TAG 标签 (0020, 0032) Tag 名称 Image Position of Patient Image Orientation TAG 含义 指定图像的左上角 X, Y, Z 座标 指定图像第一行, 第一列 相对病人方向的方向 Cosine 值 像素与影像所对应的实际 尺寸 ( 毫米 ) 的比例尺映 射关系 (0028, 0010) (0028, 0011) (0008, 0008) Rows Columns Image Type 图像的像素行数 图像的像素列数 图像的类型 512 512 Localizer, AXIAL TAG 值示例 -125.0\-132.0\3.5(0020, 0037)1.0\0.0\0.0\0.0\1.0\0.0(0028, 0030)Pixel Spacing0.48828120.4882812面对 CT 计算机断层扫描得到的一个序列多幅图像, 在医生对 CT 扫描影像进行阅 片的过程中, 医生需要清楚了解当前观察图像切片在定位面上的检查部位对应的精确位 置, 需要求解切面图像定位, 则需要求解其空间矢量方程, 来计算得到定位面图像与切面图 像相互对应的位置, 画出定位线, 以辅助医生影像诊断。
发明内容 本发明的目的是建立一种基于空间矢量方程求解的三维定位线计算方法, 计算 DICOM 断层扫描影像三维定位线的方法。
一种基于空间矢量方程求解的三维定位线计算方法, 包括如下处理步骤 :
第一步 : 解析输入的 DICOM 文件, 读取如下 TAG 的数值 :Tag 名称 Image Position of Patient Image Orientation Pixel Spacing Rows Columns Image Type(0020, 0037) (0028, 0030) (0028, 0010) (0028, 0011) (0008, 0008)
并且通过解析 Image Position Of Patient 获得当前影像的左上角 X, Y, Z 座标 ; 通过解析 Image Orientation 获得当前影像第一行, 第一列相对病人方向的方向 Cosine 值。 第二步 : 通过判断 Image Type 判断当前计算定位面与截面的两个 DICOM 影像哪一 个是定位面, 哪一个是截面, 判断是否适合定位面的相互计算。
第三步 : 通过计算切面影像的平面法线向量方程参数得到切面的平面方程 :
第四步 : 分别计算切面影像所在的平面 Ax+By+Cz+D = 0 与定位面边线 x-x1/l = y-y1/m = z-z1/n( 其中 x1, y1, z1 分别为定位面左上角的 X, Y, Z 座标 ; l, m, n 分别为定位 面第一行的方向值 X, Y, Z 三轴的 Cos 方向值 ) 的交点。
第五步 : 判断如果切片图像所在的平面与定位片的四条边的交点为 2 个, 则计算 交点连线 x-point[i].x/l = y-point[i].y/m = z-point[i].z/n = t 与切片图像的四条 边 x-x2/A = y-y2/B = z-z2/C 的交点作为定位线起止点确定定位线段位置。
附图说明 本发明包括如下附图 :
图1: 定位面 x, y, z 轴座标方向与定位面左上角座标示例图
图2: 切面 x, y, z 轴座标方向与定位面左上角座标示例图
具体实施方法
下面结合附图对本发明做进一步详细说明。
本发明的目的是建立一种基于空间矢量方程求解的三维定位线计算方法, 计算 DICOM 断层扫描影像三维定位线的方法。
一种基于空间矢量方程求解的三维定位线计算方法, 包括如下处理步骤 :
第一步 : 解析输入的 DICOM 文件, 读取如下 TAG 的数值 :
Tag 名称 Image Position of Patient Image Orientation(0020, 0037)(0028, 0030) (0028, 0010) (0028, 0011) (0008, 0008)
Pixel Spacing Rows Columns Image Type并且通过解析 Image Position Of Patient 获得当前影像的左上角 X, Y, Z 座标 ; 通过解析 ImageOrientation 获得当前影像第一行, 第一列相对病人方向的方向 Cosine 值。 第二步 : 通过判断 Image Type 判断当前计算定位面与截面的两个 DICOM 影像哪一 个是定位面, 哪一个是截面, 判断是否适合定位面的相互计算。
第三步 : 通过如下方法计算切面影像的平面法线向量方程参数 :
A = Transect.RowDirection.Cos(Y)*Transect.ColumnDirection.Cos(Z)
-Transect.RowDirection.Cos(Z)*Transect.ColumnDirection.Cos(Y)
B = Transect.RowDirection.Cos(Z)*Transect.ColumnDirection.Cos(X)
-Transect.RowDirection.Cos(X)*Transect.ColumnDirection.Cos(Z)
B = Transect.RowDirection.Cos(X)*Transect.ColumnDirection.Cos(Y)
-Transect.RowDirection.Cos(Y)*Transect.ColumnDirection.Cos(Y)
D = -1*(A*Transect.Leftup.X+B*Transect.Leftup.Y+C*Transect.Leftup.Z)
第四步 : 分别计算切面影像所在的平面 Ax+By+Cz+D = 0 与定位面边线 x-x1/l = y-y1/m = z-z1/n( 其中 x1, y1, z1 分别为定位面左上角的 X, Y, Z 座标 ; l, m, n 分别为定位 面第一行的方向值 X, Y, Z 三轴的 Cos 方向值 ) 的交点。
平面空间交点逐步计算方法如下 :
计算第 1 条边 :
a = (A*l+B*m+C*n)*Localizer.PixelSpace.Y
b = A*x1+B*y1+C*z1+D
判断如果 a = 0, b != 0 则说明直线与平面平行, 没有交点,
进入下一条边的计算判断 ;
或者如果 a = 0, b = 0 则说明直线在平面上, 也没有交点,
进入下一条边的计算判断 ;
所以只有在 a > 0 的条件下再执行下一步计算。
计算 : t1 = b/a
判断 t1 的值, 应该大于 0 小于定位面的像素列数 Localizer.Columns,
否则返回定位线计算失败 ;
计算如下值 ( 其中 i 表示当前是切面的第几条边的相交计算 ) :
point[i][0] = x1+l*k*t1 ;
point[i][1] = y1+m*k*t1 ;
point[i][2] = z1+n*k*t1 ;
point[i][0] = 0 ;
point[i][1] = t1 ;
然后依次按照如上相似方法计算第 2, 3, 4 条切面边的相交 ;
在第 2, 3, 4 条切面边的相交计算中, 计算方法除 a, b 值的计算方法与如上第一条 边稍有不同如下之外, 其余计算方法都相同 :
第 2 条边 :
x1 = Localizer.Leftup.X+
Localizer.Row*Localizer.PixelSpace.X*Localizer.RowDirection.Cos(X) ;
y1 = Localizer.Leftup.Y+
Localizer.Columns*Localizer.PixelSpace.Y*Localizer.RowDirection. Cos(Y) ; z1 = Localizer.Leftup.Z+
Localizer.Columns*Localizer.PixelSpace.Y*Localizer.RowDirection. Cos(Z) ;
b = A*x1+B*y1+C*z1+D ;
第 3 条边 :
x1 = Localizer.Leftup.X ;
y1 = Localizer.Leftup.Y ;
z1 = Localizer.Leftup.Z ;
k = Localizer.Leftup.PixelSpace.X ;
l = Localizer.ColumnDirection.Cos(X) ;
m = Localizer.ColumnDirection.Cos(Y) ;
n = Localizer.ColumnDirection.Cos(Z) ;
a = (A*l+B*m+C*n)*k ;
b = A*x1+B*y1+C*z1+D ;
第 4 条边 :
x1 = Localizer.Leftup.X+
Localizer.Columns*Localizer.PixelSpace.Y*Localizer.RowDirection. Cos(X)
y1 = Localizer.Leftup.Y+
Localizer.Columns*Localizer.PixelSpace.Y*Localizer.RowDirection. Cos(Y)
z1 = Localizer.Leftup.Z+
Localizer.Columns*Localizer.PixelSpace.Y*Localizer.RowDirection.
Cos(Z) b = A*x1+B*y1+C*z1+D
第五步 : 判断如果切片图像所在的平面与定位片的四条边的交点为 2 个, 则计算 交点连线 x-point[i].x/l = y-point[i].y/m = z-point[i].z/n = t 与切片图像的四条 边 x-x2/A = y-y2/B = z-z2/C 的交点作为定位线起止点确定定位线段位置。
计算方法如下 :
l = point[1][0]-point[0][0] ;
m = point[1][1]-point[0][1] ;
n = point[1][2]-point[0][2] ;
a = l*Transect.RowDirection.Cos[X]
+m*Transect.RowDirection.Cos[Y]
+n*Transect.RowDirection.Cos[Z]
b = l*Transect.ColumnDirection.Cos[X]
+m*Transect.ColumnDirection.Cos[Y]
+n*Transect.ColumnDirection.Cos[Z]
然后通过 (a*a < b*b) 比较判断切面图像的哪两条平行边与 point[1], point[2] 相交 ;
如果 (a*a < b*b) 则说明是切面水平方向边与定位面相交则计算 :
k = Transect.Rows*Transect.PixelSpace.Y
x2 = Transect.Leftup.X+k*Transect.ColumnDirection[X]
y2 = Transect.Leftup.Y+k*Transect.ColumnDirection[Y]
z2 = Transect.Leftup.Z+k*Transect.ColumnDirection[Z]
如果 (a*a > b*b) 则说明是切面水平方向边与定位面相交则计算 :
x2 = Transect.Leftup.X+k*Transect.RowDirection.Cos(X)
y2 = Transect.Leftup.Y+k*Transect.RowDirection.Cos(Y)
z2 = Transect.Leftup.Z+k*Transect.RowDirection.Cos(Z)
然后计算 :
t1 = ((x1-point[0][0])*B+(point[0][1]-y1)*A)/a ;
t2 = ((x2-point[0][0])*B+(point[0][1]-y2)*A)/a ;
然后判断 t1, t2 二值均在 0 ~ 1 之间, 则计算 :
pointLine[0][0] = point[0][0]*(1-t1)+point[1][0]*t1
pointLine[0][1] = point[0][1]*(1-t1)+point[1][1]*t1
pointLine[1][0] = point[0][0]*(1-t2)+point[1][0]*t2
pointLine[1][1] = point[0][1]*(1-t2)+point[1][1]*t2
其中 pointLine[0][], pointLine[1][] 分别为定位面与切面两个面相交的定位 线两个端点在各自平面上的两个座标。