您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么使用Python VTK完成圖像切割”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么使用Python VTK完成圖像切割”文章能幫助大家解決問題。
詳情見Python-VTK批量讀取二維切片并顯示三維模型
這個空間就相當于生成渲染模型的輪廓線,比如三維圖像大小為(256x256x200),那么這個控件就會生成一個長寬高分別為256x256x200的一個長方體框架
詳細介紹:VTK官方文檔
使用該模塊可以靈活的調整需要選取的平面 vtkImplicitPlaneWidget官方文檔
vtkclippolydata的剪切結果,根據切平面法線分為上下兩部分,接口中有相應的輸出接口
vtkClipPolyData官方文檔
代碼如下:
import vtk def main(): arender = vtk.vtkRenderer() arender.SetViewport(0, 0.0, 0.5, 1.0) renWin = vtk.vtkRenderWindow() renWin.AddRenderer(arender) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) # Reader = vtk.vtkMetaImageReader() # Reader.SetFileName("bbb.mhd") # Reader.Update() #讀取圖片、面繪制 Reader = vtk.vtkPNGReader() Reader.SetNumberOfScalarComponents(1) Reader.GetOutput().GetOrigin() Reader.SetDataByteOrderToLittleEndian() Reader.SetFileDimensionality(3) Reader.SetDataExtent(0, 512, 0, 512,0, 226) Reader.SetFilePrefix("E:/qct_data/in_out_data/in_data/inner/label/22/") #Reader.SetFilePrefix("C:/Users/deng5/Desktop/2/48/") Reader.SetFilePattern("%s%d.png") Reader.SetDataSpacing(1, 1, 1) # Volume Pixel Reader.Update() #面繪制代碼,詳情見使用python-vtk完成面繪制文章 skinExtractor = vtk.vtkContourFilter() skinExtractor.SetInputConnection(Reader.GetOutputPort()) skinExtractor.SetValue(0, 1) skinExtractor.ComputeGradientsOn(); skinExtractor.ComputeScalarsOn(); smooth = vtk.vtkSmoothPolyDataFilter() smooth.SetInputConnection(skinExtractor.GetOutputPort()) smooth.SetNumberOfIterations(100) skinNormals = vtk.vtkPolyDataNormals() skinNormals.SetInputConnection(smooth.GetOutputPort()) skinNormals.SetFeatureAngle(50) skinStripper = vtk.vtkStripper() skinStripper.SetInputConnection(skinNormals.GetOutputPort()) skinMapper = vtk.vtkPolyDataMapper() skinMapper.SetInputConnection(skinStripper.GetOutputPort()) skinMapper.ScalarVisibilityOff() skin = vtk.vtkActor() skin.SetMapper(skinMapper) #定義一個圖像邊界控件 outlineData = vtk.vtkOutlineFilter() outlineData.SetInputConnection(Reader.GetOutputPort()) mapOutline = vtk.vtkPolyDataMapper() mapOutline.SetInputConnection(outlineData.GetOutputPort()) outline = vtk.vtkActor() outline.SetMapper(mapOutline) outline.GetProperty().SetColor(0, 0, 0) aCamera = vtk.vtkCamera() aCamera.SetViewUp(0, 0, -1) aCamera.SetPosition(0, 1, 0) aCamera.ComputeViewPlaneNormal() aCamera.Azimuth(30.0) aCamera.Elevation(30.0) aCamera.Dolly(1.5) arender.AddActor(outline) arender.AddActor(skin) #splineActor.GetProperty().SetLineWidth(5) #arender.AddActor(splineActor) #arender.AddActor(pointActor) arender.SetActiveCamera(aCamera) arender.ResetCamera() arender.SetBackground(.2, .3, .4) arender.ResetCameraClippingRange() renWin.SetSize(1000, 1000) style = vtk.vtkInteractorStyleTrackballCamera() iren.SetInteractorStyle(style); #定義切割器 global cliper cliper = vtk.vtkClipPolyData() cliper.SetInputData(skinStripper.GetOutput()) #定義平面隱函數 implicitPlaneWidget = vtk.vtkImplicitPlaneWidget() implicitPlaneWidget.SetInteractor(iren) implicitPlaneWidget.SetPlaceFactor(1.25) implicitPlaneWidget.SetInputData(skinStripper.GetOutput()) implicitPlaneWidget.PlaceWidget() global coneSkinActor coneSkinActor = vtk.vtkActor() coneSkinActor.SetMapper(skinMapper) rRenderer = vtk.vtkRenderer() rRenderer.SetBackground(0.2, 0.3, 0.5) rRenderer.SetViewport(0.5, 0.0, 1.0, 1.0) coneSkinActor.RotateZ(90) rRenderer.AddActor(coneSkinActor) renWin.AddRenderer(rRenderer) #關聯CallBack函數 implicitPlaneWidget.AddObserver("EndInteractionEvent", my_call_back) implicitPlaneWidget.On() renWin.Render() iren.Initialize() iren.Start() #CallBack函數 def my_call_back(pWidget,ev): #表示當pWidget控件改變時,觸發函數 if (pWidget): print(pWidget.GetClassName(), "Event Id:", ev) planeNew = vtk.vtkPlane() #獲得pWidget中的平面,將平面值賦值planeNew pWidget.GetPlane(planeNew) #cliper將裁剪器cliper的平面設置為planeNew cliper.SetClipFunction(planeNew) planeNew.GetNormal() cliper.Update(); #將裁減后的模型傳遞給另一個窗口 clipedData = vtk.vtkPolyData() clipedData.DeepCopy(cliper.GetOutput()) coneMapper = vtk.vtkPolyDataMapper() coneMapper.SetInputData(clipedData) coneMapper.ScalarVisibilityOff() coneSkinActor.SetMapper(coneMapper) print("Plane Normal = "+str(planeNew.GetNormal())) print("Plane Origin = "+str(planeNew.GetOrigin())) main()
關于“怎么使用Python VTK完成圖像切割”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。