使用Python VTK 完成图像切割
目录
1、读取二维图片序列完成面绘制2、vtk.vtkOutlineFilter()介绍3、隐函数平面模块vtk.vtkImplicitPlaneWidget()4、vtk.vtkClipPolyData()切割效果展示1、读取二维图片序列完成面绘制
详情见Python-VTK批量读取二维切片并显示三维模型
2、vtk.vtkOutlineFilter()介绍
这个空间就相当于生成渲染模型的轮廓线,比如三维图像大小为(256x256x200),那么这个控件就会生成一个长宽高分别为256x256x200的一个长方体框架
详细介绍:VTK官方文档
3、隐函数平面模块vtk.vtkImplicitPlaneWidget()
使用该模块可以灵活的调整需要选取的平面vtkImplicitPlaneWidget官方文档
4、vtk.vtkClipPolyData()
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()
到此这篇关于使用PythonVTK完成图像切割的文章就介绍到这了,更多相关PythonVTK图像切割内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?