使用Python?VTK?完成圖像切割
1、讀取二維圖片序列完成面繪制
2、vtk.vtkOutlineFilter()介紹
這個(gè)空間就相當(dāng)于生成渲染模型的輪廓線,比如三維圖像大小為(256x256x200),那么這個(gè)控件就會(huì)生成一個(gè)長(zhǎng)寬高分別為256x256x200的一個(gè)長(zhǎng)方體框架
詳細(xì)介紹:VTK官方文檔
3、隱函數(shù)平面模塊vtk.vtkImplicitPlaneWidget()
使用該模塊可以靈活的調(diào)整需要選取的平面 vtkImplicitPlaneWidget官方文檔
4、vtk.vtkClipPolyData()
vtkclippolydata的剪切結(jié)果,根據(jù)切平面法線分為上下兩部分,接口中有相應(yīng)的輸出接口
切割效果展示
代碼如下:
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) #定義一個(gè)圖像邊界控件 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()) #定義平面隱函數(shù) 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) #關(guān)聯(lián)CallBack函數(shù) implicitPlaneWidget.AddObserver("EndInteractionEvent", my_call_back) implicitPlaneWidget.On() renWin.Render() iren.Initialize() iren.Start() #CallBack函數(shù) def my_call_back(pWidget,ev): #表示當(dāng)pWidget控件改變時(shí),觸發(fā)函數(shù) if (pWidget): print(pWidget.GetClassName(), "Event Id:", ev) planeNew = vtk.vtkPlane() #獲得pWidget中的平面,將平面值賦值planeNew pWidget.GetPlane(planeNew) #cliper將裁剪器cliper的平面設(shè)置為planeNew cliper.SetClipFunction(planeNew) planeNew.GetNormal() cliper.Update(); #將裁減后的模型傳遞給另一個(gè)窗口 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()
到此這篇關(guān)于使用Python VTK 完成圖像切割的文章就介紹到這了,更多相關(guān)Python VTK圖像切割內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
分解oracle存儲(chǔ)過(guò)程或函數(shù)調(diào)試過(guò)程步驟
這篇文章主要介紹了調(diào)試oracle存儲(chǔ)過(guò)程或函數(shù)過(guò)程步驟,文中附含詳細(xì)的圖文操作步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09Python+OpenCV實(shí)現(xiàn)車牌字符分割和識(shí)別
這篇文章主要為大家詳細(xì)介紹了Python+OpenCV實(shí)現(xiàn)車牌字符分割和識(shí)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Python利用capstone實(shí)現(xiàn)反匯編
Capstone是一個(gè)輕量級(jí)的多平臺(tái)、多架構(gòu)的反匯編框架,該模塊支持目前所有通用操作系統(tǒng),反匯編架構(gòu)幾乎全部支持。本文就將利用他實(shí)現(xiàn)反匯編,感興趣的可以了解下2022-04-04Python+OpenCV實(shí)現(xiàn)基于顏色的目標(biāo)識(shí)別
這篇文章主要介紹了利用OpenCV實(shí)現(xiàn)基于顏色的目標(biāo)識(shí)別,即讓攝像頭識(shí)別到視野范圍內(nèi)的有顏色的氣球并返回每個(gè)氣球的中心點(diǎn)坐標(biāo),感興趣的可以跟隨小編學(xué)習(xí)一下2022-01-01Python網(wǎng)絡(luò)編程之HTTP客戶端模塊urllib與urllib3
這篇文章介紹了Python網(wǎng)絡(luò)編程之HTTP客戶端模塊urllib與urllib3,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05分享Pytest fixture參數(shù)傳遞的幾種方式
這篇文章主要分享的是Pytest fixture參數(shù)傳遞的幾種方式,文章基于python的相關(guān)資料展開對(duì)主題的詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04