如本文标题所言,本文确实很中二。
翻译迟迟没有下篇的原因很简单,因为是原作者的源代码现在跑始终有问题,毕竟4,5年前的源代码,vtk和python都升级了很多版本了,别说接口了,就连语法都变了不少。这一直是一块心病。
同时深感vtk资料之匮乏,google也上不了,百度搜索的结果都是翻来覆去那几句车轱辘话,对解决问题近乎毫无帮助。路线错了,研究越多越反动,所以走了不少弯路,差点跳到itk里面去了。
所以再次验证了那句话,程序员可以数学不好,但是不可以英语不好。
故参考国外资料,修改原文的源代码,并且保留了我的修改痕迹。
做得不好的地方,欢迎大家指出,非常感谢!
环境:centos7+pytho3.4+vtk8.0.0,此段代码需配合原文中下载的mha和colour两个文件使用。
效果如下图:
这显然不是一个漂亮的体绘制图,但是,如原文作者所言,重点不在于此。
#######################################
import os
import numpy
import vtk
#######################################
# Path to the .mha file
filenameSegmentation = "./brain_segmentation.mha"
# Path to colorfile.txt
filenameColorfile = "./colorfile.txt"
# Opacity of the different volumes (between 0.0 and 1.0)
volOpacityDef = 0.25
#######################################
vtk_reader = vtk.vtkMetaImageReader()
vtk_reader.SetFileName(filenameSegmentation)
castFilter = vtk.vtkImageCast()
castFilter.SetInputConnection(vtk_reader.GetOutputPort())
castFilter.SetOutputScalarTypeToUnsignedShort()
castFilter.Update()
imdataBrainSeg = castFilter.GetOutput()
#######################################
import csv
fid = open(filenameColorfile, "r")
csv_reader = csv.reader(fid)
dictRGB = {}
for line in csv_reader:
dictRGB[int(line[0])] = [float(line[2])/255.0,
float(line[3])/255.0,
float(line[4])/255.0]
fid.close()
#######################################
funcColor = vtk.vtkColorTransferFunction()
for idx in dictRGB.keys():
funcColor.AddRGBPoint(idx,
dictRGB[idx][0],
dictRGB[idx][1],
dictRGB[idx][2])
#######################################
funcOpacityScalar = vtk.vtkPiecewiseFunction()
for idx in dictRGB.keys():
##funcOpacityScalar.AddPoint(idx, volOpacityDef if idx0 else 0.0)
funcOpacityScalar.AddPoint(idx, volOpacityDef if idx!=0 else 0.0)
#######################################
funcOpacityGradient = vtk.vtkPiecewiseFunction()
funcOpacityGradient.AddPoint(1, 0.0)
funcOpacityGradient.AddPoint(5, 0.1)
funcOpacityGradient.AddPoint(100, 1.0)
#######################################
propVolume = vtk.vtkVolumeProperty()
propVolume.ShadeOff()
propVolume.SetColor(funcColor)
propVolume.SetScalarOpacity(funcOpacityScalar)
propVolume.SetGradientOpacity(funcOpacityGradient)
propVolume.SetInterpolationTypeToLinear()
#######################################
##funcRayCast = vtk.vtkVolumeRayCastCompositeFunction()
##funcRayCast.SetCompositeMethodToClassifyFirst()
mapperVolume = vtk.vtkFixedPointVolumeRayCastMapper()
mapperVolume.SetInputConnection(vtk_reader.GetOutputPort())
##mapperVolume.SetVolumeRayCastFunction(funcRayCast)
actorVolume = vtk.vtkVolume()
actorVolume.SetMapper(mapperVolume)
actorVolume.SetProperty(propVolume)
##renderer = vtk.vtkRenderer()
##renderer.AddActor(actorVolume)
##vtk_show(renderer, 600, 600)
#######################################
ren = vtk.vtkRenderer()
ren.AddViewProp(actorVolume)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
renWin.SetSize(600, 600)
iren.Start()
#######################################
#######################################
#######################################
#######################################
#######################################
领取专属 10元无门槛券
私享最新 技术干货