как порог изображения с vtk для рендеринга - PullRequest
0 голосов
/ 07 августа 2020

Почему-то мне не удается сделать то, что, как мне казалось, было бы очень простым: я хочу применить порог к объему перед рендерингом.

Ниже приведен код того, что я делаю. Он отлично работает, если я не включаю пороговое значение, но если я это сделаю (т.е. установлю 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 +.

...