Hawkeye中骨密度测定程序的开发

山西医科大学第二医院核医学科 张宝牛

骨密度测定可早期观察骨骼组织骨量的变化,对骨质疏松的早期诊断、明确治疗方案、观察治疗效果、判断预后和随访具有重要价值。GE公司的Hawkeye CT不仅在临床上起着同机图像融合、衰减校正和对高密度组织的诊断作用,而且具有测定骨矿物质的价值。笔者利用eNTEGRA工作站Aladdin工具,开发了处理骨密度的程序,具体流程如下:

一、骨密度计算方法[1]:

骨密度(BMD)=CK(HB-HW)/(HK-HW)
HB:测量对象的CT值;
HK:体模内K2HPO4的CT值;
HW: 体模内水的CT值;
CK:K2HPO4的浓度,mg/mL。

二、数据采集:

CT图像采集可单独采集或核素骨扫描加骨密度测量,具体方法见文献1。

二、数据采集

Click on the image to enlarge

三、程序处理流程:

四、程序处理界面



四、程序处理界面

五、输出结果:

1.腰椎皮质骨及小梁骨的骨矿含量;
2.股骨颈皮质骨及小梁骨的骨矿含量。

六、输出界面

六、输出界面

七、处理程序
Rem ****************************************************
Rem This is a protocol for Bone minerel density(BMD). *
Rem October 30 2003 *
Rem ****************************************************
Dim mainScreen As Screen 'The main screen
Dim mainVP() As Viewport 'The viewports on the main screen
Dim number_of_vports As Integer 'The number of viewports
Dim MaxImages As Integer
Dim ImageItems() As Image
Dim MaxCurves As Integer
Dim CurveItems() As Curve
Dim img1 As Image
Dim img2 As Image
Dim CurFrame1 As Integer
Dim CurFrame2 As Integer
Dim rval As Integer
Dim Water_roi As Roi
Dim K2HPO4_roi As Roi
Dim Lum_comp_Roi As Roi 'ROI of Lumbar Substntia Compacta
Dim Lum_spon_roi As Roi 'ROI of Lumbar Substntia spongiosa
Dim coll_fem_comp_Roi As Roi 'ROI of collum femoris Substntia Compacta
Dim coll_fem_spon_Roi As Roi 'ROI of collum femoris Substntia spongiosa
Dim Water_evreage As Double
Dim K2HPO4_evreage As Double
Dim Lum_comp_evreage As Double
Dim Lum_spon_evreage As Double
Dim coll_fem_comp_evreage As Double
Dim coll_fem_spon_evreage As Double
Dim Lum_comp_BMD As Double
Dim Lum_spon_BMD As Double
Dim coll_fem_comp_BMD As Double
Dim coll_fem_spon_BMD As Double
Dim Vp1 As Viewport
Dim Vp2 As Viewport
Dim Vp3 As Viewport
Dim Vp4 As Viewport
Dim ImageStats As iStatsInfo
Dim BMDAnnot As Annot
Dim AnStr As String
Const CK=300 'consistency of K2HPO4

Sub Main
Set mainScreen=CreateScreen("basic1.rt")
number_of_vports = ListViewPorts(mainScreen,mainVP)
Display mainScreen

retb = SelectTools(True,SCROLL_TOOL,CINE_TOOL,ANNOT_TOOL,COLOURMAP_TOOL,ROI_TOOL)
Load ImageItems(0)
Set img1 = ImageItems(0)
Set Vp1 = GetViewport("cell1")
Display img1, vp1
vp1.color=0

mainVP(0).DisplayFrame = 7
PostPrompt "Seclect Image"
CurFrame1 = mainVP(0).DisplayFrame

Rem calculat water HU
Set Water_Roi = ROICircle(img1,32,128,5,CurFrame1,"Water")
Water_Roi.OutlineColor=2
Water_Roi.InteractiveOn =TRUE
Water_Roi.Selected = TRUE
PostPrompt "Position Water ROI"
Water_Roi.InteractiveOn =false
Water_Roi.Selected = false

rval = Statistics(img1, CurFrame1, ImageStats, Water_Roi )
Water_evreage=ImageStats.mean

Rem calculat K2HPO4 HU
Set K2HPO4_Roi = ROICircle(img1,64,128,5,CurFrame1,"K2HPO4")
K2HPO4_Roi.outlinecolor=4
K2HPO4_Roi.InteractiveOn =TRUE
K2HPO4_Roi.Selected = TRUE
PostPrompt "Position K2HPO4 ROI"
K2HPO4_Roi.InteractiveOn =false
K2HPO4_Roi.Selected = false

rval = Statistics(img1, CurFrame1, ImageStats, K2HPO4_Roi )
K2HPO4_evreage=ImageStats.mean

Rem calculat Lumbar Substntia Compacta HU

Set Lum_comp_Roi = ROIbox(img1,100,100,4,2,CurFrame1,"compacta")
Lum_comp_Roi.outlinecolor=0
Lum_comp_Roi.InteractiveOn =TRUE
Lum_comp_Roi.Selected = TRUE
PostPrompt "Position Lumbar Substntia Compacta"
Lum_comp_Roi.InteractiveOn =false
Lum_comp_Roi.Selected = false
rval = Statistics(img1, CurFrame1, ImageStats, Lum_comp_Roi )
Lum_comp_evreage=ImageStats.mean

Rem calculat Lumbar Substntia spongiosa HU

Set Lum_spon_Roi = ROICircle(img1,128,128,5,CurFrame1,"spongiosa")
Lum_spon_Roi.outlinecolor=1
Lum_spon_Roi.InteractiveOn =TRUE
Lum_spon_Roi.Selected = TRUE
PostPrompt "Position Lumbar Substntia Compacta"
Lum_spon_Roi.InteractiveOn =false
Lum_spon_Roi.Selected = false

rval = Statistics(img1, CurFrame1, ImageStats, Lum_spon_Roi )
Lum_spon_evreage=ImageStats.mean

mainVP(0).DisplayFrame = 7
PostPrompt "Seclect Image"
CurFrame2 = mainVP(0).DisplayFrame

Rem calculat collum femoris Substntia Compacta HU

Set coll_fem_comp_Roi = ROIbox(img1,100,100,4,2,CurFrame2,"compacta")
coll_fem_comp_Roi.outlinecolor=0
coll_fem_comp_Roi.InteractiveOn =TRUE
coll_fem_comp_Roi.Selected = TRUE
PostPrompt "Position collum femoris Substntia Compacta"
coll_fem_comp_Roi.InteractiveOn =false
coll_fem_comp_Roi.Selected = false

rval = Statistics(img1, CurFrame2, ImageStats, coll_fem_comp_Roi )
coll_fem_comp_evreage=ImageStats.mean

Rem calculat collum femoris Substntia spongiosa HU

Set coll_fem_spon_Roi = ROIELLIPSE(img1,64,128,4,3,CurFrame2,"spongiosa")
coll_fem_spon_Roi.outlinecolor=1
coll_fem_spon_Roi.InteractiveOn =TRUE
coll_fem_spon_Roi.Selected = TRUE
PostPrompt "Position collum femoris Substntia Compacta"
coll_fem_spon_Roi.InteractiveOn =false
coll_fem_spon_Roi.Selected = false

rval = Statistics(img1, CurFrame2, ImageStats, coll_fem_spon_Roi )
coll_fem_spon_evreage=ImageStats.mean

Rem calculat BMD

Lum_comp_BMD=(Lum_comp_evreage- Water_evreage)*CK/ (K2HPO4_evreage-Water_evreage) 'calculat BMD of Lumbar Substntia Compacta
Lum_spon_BMD=(Lum_spon_evreage- Water_evreage)*CK/ (K2HPO4_evreage-Water_evreage) 'calculat BMD of Lumbar Substntia spongiosa
coll_fem_comp_BMD=(coll_fem_comp_evreage- Water_evreage)*Ck/ (K2HPO4_evreage-Water_evreage) 'calculat BMD of collum femoris Substntia Compacta
coll_fem_spon_BMD=(coll_fem_spon_evreage- Water_evreage)*CK/ (K2HPO4_evreage-Water_evreage) 'calculat BMD of collum femoris Substntia spongiosa

Rem display the results

Set mainScreen=CreateScreen("basic2.rt")
number_of_vports = ListViewPorts(mainScreen,mainVP)
Display mainScreen
retb = SelectTools(True,SCROLL_TOOL,CINE_TOOL,ANNOT_TOOL,COLOURMAP_TOOL,ROI_TOOL)

Load ImageItems(0)
Set img1 = ImageItems(0)
Set Vp1 = GetViewport("cell1")
vp1.color=0
Display img1, vp1
MainVP(0).DisplayFrame = Curframe1

Set img2=Extract(img1,Curframe2,Curframe2)
Set Vp3 = GetViewport("cell3")
vp3.color=0
Display img2,vp3

Set Vp2 = GetViewport("cell2")
Anstr = "Bone minerel density(BMD) "
Set BMDAnnot = AnnotText(Vp2, 0, 0.4, AnStr)

Anstr ="Lumbar Substntia Compacta "
Anstr = Anstr & format(Lum_comp_BMD, "0.00") &"mg/mL"
Set BMDAnnot = AnnotText(Vp2, 0, 0.5, AnStr)
Anstr ="Lumbar Substntia spongiosa "
Anstr = Anstr & format(Lum_spon_BMD, "0.00") &"mg/mL"
Set BMDAnnot = AnnotText(Vp2, 0, 0.6, AnStr)

Set Vp4 = GetViewport("cell4")
Anstr = "Bone minerel density(BMD) "
Set BMDAnnot = AnnotText(Vp4, 0, 0.4, AnStr)

Anstr ="collum femoris Substntia Compacta "
Anstr = Anstr & format(coll_fem_comp_BMD, "0.00") &"mg/mL"
Set BMDAnnot = AnnotText(Vp4, 0, 0.5, AnStr)
Anstr ="collum femoris Substntia spongiosa "
Anstr = Anstr & format(coll_fem_spon_BMD, "0.00") &"mg/mL"
Set BMDAnnot = AnnotText(Vp4, 0, 0.6, AnStr)

End Sub

Function DataValidate(dv_Message As String,_
sel_image_list() As Image,_
numImages As Integer,_
sel_curve_list() As Curve,_
numCurves As Integer) As Integer

Dim item As Integer
Dim dbVal As Variant

maxImages = 0
maxCurves = 0

For item = 0 To numImages-1
MaxImages = MaxImages + 1
Redim Preserve ImageItems(MaxImages)
set ImageItems(item) = sel_image_list(item)
Next item

For item = 0 To numCurves-1
MaxCurves = MaxCurves + 1
Redim Preserve CurveItems(MaxCurves)
set CurveItems(item) = sel_curve_list(item)
Next item
dv_Message = "No Error message"
DataValidate = 1
End Function

参考文献:

1.徐家骅,杨雷,齐汝海. 使用GE Hawkeye CT定量测量骨矿物质的原理和方法. 功能分子影像杂志,2003,4,68-71.