将Alpha通道添加到VTK中的音量

2024-06-28 11:29:24 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,有兴趣的朋友们

我在VTK中将alpha通道添加到卷(由rgb tiffstack制作)时遇到了一些问题。 在Slicer3d应用程序中,我只需在python shell中添加以下SKcript即可完成此操作:

colorVolume = slicer.mrmlScene.GetFirstNodeByClass("vtkMRMLVectorVolumeNode")

# Convert RGB image to RGBA
luminance = vtk.vtkImageLuminance()
luminance.SetInputConnection(colorVolume.GetImageDataConnection())
append=vtk.vtkImageAppendComponents()
append.AddInputConnection(colorVolume.GetImageDataConnection())
append.AddInputConnection(luminance.GetOutputPort())
append.Update()
colorVolume.SetAndObserveImageData(append.GetOutput())

# Enable volume rendering
volRenLogic = slicer.modules.volumerendering.logic()
displayNode = volRenLogic.CreateDefaultVolumeRenderingNodes(colorVolume)
displayNode.SetVisibility(True)
# Enable direct RGBA color mapping
displayNode.GetVolumePropertyNode().GetVolumeProperty().SetIndependentComponents(0)

现在,我正在使用vtk在自己的python脚本中尝试这一点。但我缺少从切片器到Python VTK的正确翻译

为了更好地理解,我的输入数据是RBG中的Tifftack/MultiImageTiff,我使用以下代码读取它:

filename = "D:/SomeFilePath/Some_Tiff_Stack.tif"

colors = vtk.vtkNamedColors()

# renderer, render window
# and interactor.
ren1 = vtk.vtkRenderer()

renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren1)

iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

# Create the reader for the Tiff-Data (Multi-Image-Tiff)
reader = vtk.vtkTIFFReader()
reader.SetFileName(filename)
reader.SetDataSpacing(1,1,1)

# Create transfer mapping scalar value to opacity (configured in Slicer app).
opacityTransferFunction = vtk.vtkPiecewiseFunction()
opacityTransferFunction.AddPoint(0, 0)
opacityTransferFunction.AddPoint(20, 0)
opacityTransferFunction.AddPoint(40, 0.45)
opacityTransferFunction.AddPoint(98.26, 0.78)
opacityTransferFunction.AddPoint(255, 0)

# Create transfer mapping scalar value to color.
colorTransferFunction = vtk.vtkColorTransferFunction()
colorTransferFunction.AddRGBPoint(0.0, 1, 1, 1)
colorTransferFunction.AddRGBPoint(64.0, 1.0, 1, 1)
colorTransferFunction.AddRGBPoint(128.0, 1.0, 1, 1.0)
colorTransferFunction.AddRGBPoint(192.0, 1.0, 1.0, 1.0)
colorTransferFunction.AddRGBPoint(255.0, 1, 1, 1)

# The property describes how the data will look.
volumeProperty = vtk.vtkVolumeProperty()
volumeProperty.SetColor(colorTransferFunction)
volumeProperty.SetScalarOpacity(opacityTransferFunction)
volumeProperty.SetInterpolationTypeToLinear()

'''
#This is what i need to translate to python/vtk
luminance = vtk.vtkImageLuminance()
luminance.SetInputConnection(colorVolume.GetImageDataConnection())
append=vtk.vtkImageAppendComponents()
append.AddInputConnection(colorVolume.GetImageDataConnection())
append.AddInputConnection(luminance.GetOutputPort())
append.Update()
colorVolume.SetAndObserveImageData(append.GetOutput())
volumeProperty.SetIndependentComponents(0)
'''
# The mapper / ray cast function know how to render the data.

#volumeMapper = vtk.vtkFixedPointVolumeRayCastMapper()
volumeMapper = vtk.vtkGPUVolumeRayCastMapper()
volumeMapper.SetInputConnection(reader.GetOutputPort())

volume = vtk.vtkVolume()
volume.SetMapper(volumeMapper)
volume.SetProperty(volumeProperty)
#volumeProperty.SetIndependentComponents(0)

ren1.AddVolume(volume)
ren1.ResetCameraClippingRange()
ren1.ResetCamera()

renWin.SetSize(600, 600)
renWin.Render()

iren.Start()

如果有人知道如何做到这一点,我真的非常感谢任何帮助。 直到现在,我“只”在我的图像/卷周围有一个黑匣子。在alpha chanel的帮助下,我将能够将黑盒设置为透明

致意 巴斯蒂安


Tags: toreadervtkvolumeappendrenwinaddpointluminance
1条回答
网友
1楼 · 发布于 2024-06-28 11:29:24

作为修复/翻译,我建议如下:

# create a default luminance map with the same size as the input image
luminance = vtk.vtkImageLuminance()
luminance.SetInputConnection(reader.GetOutputPort())

# merge the original image and the luminace map into one RGBA image
append = vtk.vtkImageAppendComponents()
append.AddInputConnection(reader.GetOutputPort())
append.AddInputConnection(luminance.GetOutputPort())

volumeProperty.SetIndependentComponents(False)

# use the created RGBA image from the append as input for the mapper
volumeMapper = vtk.vtkGPUVolumeRayCastMapper()
volumeMapper.SetInputConnection(append.GetOutputPort())

这将创建亮度贴图,并将其与图像合并为RGBA图像

colorVolume.SetAndObserveImageData(append.GetOutput())

这一行作为创建图像到切片器的反馈,在本例中,当您执行自己的渲染时,不需要切片器

相关问题 更多 >