Почему-то мне не удается сделать то, что, как мне казалось, было бы очень простым: я хочу применить порог к объему перед рендерингом.
Ниже приведен код того, что я делаю. Он отлично работает, если я не включаю пороговое значение, но если я это сделаю (т.е. установлю volume_mapper.SetInputConnection(thr.GetOutputPort())
), я получаю сообщение об ошибке:
libpng warning: Image width is zero in IHDR
libpng warning: Image height is zero in IHDR
libpng error: Invalid IHDR data
Вот код:
ren = vtk.vtkRenderer()
ren_win = vtk.vtkRenderWindow()
ren_win.AddRenderer(ren)
# Create the reader for the data
# the .vtk files are Structured Points
reader = vtk.vtkStructuredPointsReader()
reader.SetFileName(vtk_file)
reader.Update()
thr = vtk.vtkImageThreshold()
thr.SetInputConnection(reader.GetOutputPort())
thr.ThresholdByLower(500)
thr.ReplaceOutOn()
thr.SetOutValue(500)
thr.Update()
# The property describes how the data will look
volume_property = vtk.vtkVolumeProperty()
# Create transfer mapping scalar value to color
self._rgb_function = vtk.vtkColorTransferFunction()
for p, point in enumerate(self._rgb_function_values):
self._rgb_function.AddRGBPoint(*point)
volume_property.SetColor(self._rgb_function)
# set opacity
for p in self._opacity_function_values:
self._opacity_function.AddPoint(*p)
volume_property.SetScalarOpacity(self._opacity_function)
volume_property.SetInterpolationTypeToLinear()
# The mapper / ray cast function know how to render the data
volume_mapper = vtk.vtkGPUVolumeRayCastMapper()
volume_mapper.SetBlendModeToComposite()
# volume_mapper.SetInputConnection(reader.GetOutputPort())
volume_mapper.SetInputConnection(thr.GetOutputPort())
# The volume holds the mapper and the property and
# can be used to position/orient the volume
volume = vtk.vtkVolume()
volume.SetMapper(volume_mapper)
volume.SetProperty(volume_property)
# Transform volume to global center
center_x, center_y, center_z = volume.GetCenter()
transform = vtk.vtkTransform()
transform.Translate(-center_x, -center_y, -center_z)
volume.SetUserMatrix(transform.GetMatrix())
volume.Update()
# Adding the volume to the render instance, setting the background,
# and defining the window size.
# Finally, calling it to be rendered
ren.SetBackground(0,0,0)
ren_win.SetSize(self._png_resolution, self._png_resolution)
ren_win.OffScreenRenderingOn()
ren_win.Render()
Есть идеи? Я поигрался с разными пороговыми уровнями, на всякий случай, я неправильно интерпретирую, что входит / выходит, но всегда получаю одну и ту же ошибку. Значения в диапазоне объемов от 0 ... 2500 +.