當我們將CT切片重建為三維體之後,通常會消除一些不必要的外部組織來觀察內部病灶,
一般思路是根據人體常見CT值範圍來使得部分組織透明來達到效果,
但這是非黑即白的,即,要麼顯示皮膚,要麼顯示神經,要麼顯示骨骼…
然而,當病灶介於兩個CT值範圍中間或重合時,要觀察病灶這將是一個非常困難的工作,需要手動旋轉、切割等一系列操作,
嚴重降低判斷準確性和工作效率,故此採用梯度透明思想來展現漸變過程。
準備一張人體CT值範圍表參考:
當我們對三維體使用滑鼠操作時,將CT值從最小值到最大值對映到三維體上面,並將透明度從0到100漸變,
如果能自己用程式碼實現效果最好,否則也可以用VTK進行梯度透明,部分C++程式碼如下:
vtkSmartPointer<vtkPiecewiseFunction> GradualOp = vtkSmartPointer<vtkPiecewiseFunction>::New();
GradualOp->AddPoint(10, 0.0);
GradualOp->AddPoint(20, 0.5);
GradualOp->AddPoint(30, 1.0);
volumeProperty->SetGradientOpacity(GradualOp);
梯度小於10點的不透明度乘子設為0,完全透明。
梯度大小為10時,不透明度為0;
梯度大小為20時,不透明度乘子為0.5;
梯度大小在10-20時,不透明度乘子通過線性對映至0-0.5之間的數值;
當梯度大小在20-30之間時,不透明度乘子通過線性對映至0.5-1.0之間;
梯度值大於30時,不透明度乘子為1
同樣最後還是用觀察者模式展現體重建
//設定相機 vtkCamera aCamera = new vtkCamera(); aCamera.SetViewUp(0, 0, -1); aCamera.SetPosition(0, 1, 0); aCamera.SetFocalPoint(0, 0, 0); aCamera.ComputeViewPlaneNormal(); //設定Actor vtkActor coneActor = new vtkActor(); coneActor.SetMapper(skinMapper); coneActor.GetProperty().SetAmbient(0.5); coneActor.GetProperty().SetDiffuse(1); coneActor.GetProperty().SetSpecular(0.6); //顯示類 vtkRenderer renderer = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer(); renderer.AddActor(coneActor);//新增coneActor物件 //renderer.AddActor2D(new vtkProp());//新增textActor物件 renderer.SetBackground(0, 0, 0); renderer.SetActiveCamera(aCamera);//新增相機 renderer.ResetCamera(); vtkRenderWindow renWin = renderWindowControl1.RenderWindow;//設定繪圖視窗renWin->AddRenderer(renderer);//裝載繪圖類 vtkWin32RenderWindowInteractor iren = new vtkWin32RenderWindowInteractor(); iren.SetRenderWindow(renWin);//裝載繪圖視窗
依照上述思想,實現最終效果,
案例①:從面部重建漸變到口腔牙齒,顯露出牙床鋼釘:
更為直觀、方便的觀察牙床鋼釘及口腔其他情況:
案例②:顱腦及上胸腔平掃,從皮膚漸變到肌肉、神經、骨骼
漸變過程中觀察骨骼、神經、血管等病灶: