VTK中基於vtkPolygon延伸成柱狀體的實現

2021-07-24 07:40:31 字數 2731 閱讀 8480

在之前已經完成的影象分割演算法中,已經為醫生提供了閾值分割、區域增長、盒切和模型切割這四種分割演算法,而且這些演算法可以組合進行使用。但是客戶(醫生)在進行實際的操作時,還是會遇到這些演算法難以方便解決的情況。比如,當患者在掃瞄ct或mri時,病床並不是平直的(盒切只能是平直的),而是呈弧線形的。因此,醫生提議能否由醫生自己在mpr的某一層面繪製乙個圖形,然後以這個圖形作為橫截面,擴充套件成乙個柱狀,然後再進行切割。

根據需求,結合之前自己做過的專案,後來選定了實現這個功能需要使用的vtk的類,基本實現了這個需求。

以下是基本的**:

//construct the pipeline.

vtksmartpointer< vtkkochanekspline > xspline = vtksmartpointer< vtkkochanekspline >::new();

vtksmartpointer< vtkkochanekspline > yspline = vtksmartpointer< vtkkochanekspline >::new();

vtksmartpointer< vtkkochanekspline > zspline = vtksmartpointer< vtkkochanekspline >::new();

vtksmartpointer spline =

vtksmartpointer< vtkparametricspline >::new();

spline->setxspline( xspline );

spline->setyspline( yspline );

spline->setzspline( zspline );

//manualellipsepathmodel裡面存著之前在軸狀位繪製的橢圓弧的點集合.

//這裡將dxpoint轉化為vtkpoints,塞給spline.

qvector vecellipsepathpoints = manualellipsepathmodel->getellipsepolygonpath();

vtksmartpointer< vtkpoints > sppoints = vtksmartpointer< vtkpoints >::new();

for ( int i = 0; i < vecellipsepathpoints.size(); i++ )

;sppoints->insertnextpoint( worldpathpoint );

}double originpathpoint[3] = ;

sppoints->insertnextpoint( originpathpoint );

spline->setpoints();

vtksmartpointer functionsource = vtksmartpointer::new();

functionsource ->setparametricfunction(spline);

vtksmartpointer linearpo***trusionfilter= vtksmartpointer< vtklinearextrusionfilter>::new();

linearpo***trusionfilter ->setinputconnection( functionsource->getoutputport());

linearpo***trusionfilter->setextrusiontypetovectorextrusion();

double linearpo***trusionvector[3] = ;

linearpo***trusionfilter->setvector(linearpo***trusionvector);

double posscalefactor = 300.0;

linearpo***trusionfilter->setscalefactor(posscalefactor );

linearpo***trusionfilter->update();

vtksmartpointer polydata =

vtksmartpointer::new();

polydata = linearpo***trusionfilter->getoutput();

以上部分的**是根據在軸狀位上繪製的一條橢圓弧,然後按照給定的方向,擴充套件一定的高度,形成乙個橢圓柱的**。

以上圖分別為在軸狀位上根據外接矩形的兩個對角端點而繪製的橢圓 ,以及由這個橢圓擴充套件而成的橢圓柱的圖形。

以下介紹如何在另外兩個矢狀位和冠狀位上顯示切割該柱狀體後的**。

最終的效果圖為:

由圖可知,乙個方向向量為(0.0,0.0,1.0)的橢圓柱,與軸狀位的截面是乙個橢圓,與矢狀位和冠狀位的截面則是乙個矩形。其中,矢狀位矩形的寬度對應橢圓的短軸的2倍,冠狀位矩形的寬度對應橢圓的長軸的2倍,而它們兩者的高度都是這個橢圓柱本身的高度。

未完待續……

基於VTK的任意平面切割

切割介紹 對於乙個模型的切割需要怎麼辦呢,想想切西瓜就知道,首先需要有乙個模型 然後有乙個切割平面 接著對於每個切割操作來更新模型,這樣就可以得到切割的效果了 影象本身是與原始影象成某軸對稱因此不能在原圖中找中心點 waitkey endif 做平滑處理 vtksmartpointersmooth ...

vtk中資料集

點或單元的屬性資料是以資料陣列 vtkdataarray 的形式進行儲存的,根據資料值型別的不同,具體儲存在vtkdataarray的子類中,如vtkfloatarray和vtkintarray等。陣列中每個元素為元組,對應著單個點或單元的屬性資料。元組個數不指定時,insert的方法插入資料 最終...

vtk中的剪裁

在vtk中,我們通常需要的並不是嚴格標準的幾何體,我們需要對這些幾何體進行加工,修改其內容,得到我們想要的效果,下面結合例子介紹如何在vtk中實現對幾何體的裁剪。要對幾何體進行裁剪,需要建立好幾何體模型,然後定義乙個隱函式,利用vtkclippolydata,通過隱函式vtkimplicitfunc...