[vtkusers] Artifacts in volume rendering
Dženan Zukić
dzenanz at gmail.com
Wed Apr 13 09:52:21 EDT 2016
Hi Elvis,
volume rendering is known to have some artifacts from certain angles. It is
data-dependent, and sometimes the artifacts are more pronounced. This is
due to many trade-offs between rendering speed and quality. I sometimes
encounter them too, with volume-rendered medical data.
Regards,
Dženan
On Wed, Apr 13, 2016 at 8:54 AM, Elvis Stansvik <
elvis.stansvik at orexplore.com> wrote:
> 2016-04-12 16:16 GMT+02:00 Elvis Stansvik <elvis.stansvik at orexplore.com>:
>
>> 2016-04-12 15:56 GMT+02:00 Elvis Stansvik <elvis.stansvik at orexplore.com>:
>>
>>> Hi all,
>>>
>>> Following Berk Geveci's great blog post from 2014 on writing a custom
>>> HDF5 reader in Python [1], I tried to take his code and modify it to load
>>> HDF5 files where the densities are float32 and vary between 0 and 64.
>>>
>>> The only change I did to his reader was to modify RequestData to scale
>>> the loaded data and convert it to uint16, like this:
>>>
>>> data = (data * 1023).astype(uint16)
>>>
>>> (should get me roughly in the range 0-65535).
>>>
>>> I then generated a test HDF5 file containing a cylindrical volume like
>>> this:
>>>
>>> def create_cylinder_file(filename, height, radius):
>>> """Create a cylindrical volume and save it in test.hdf5.
>>>
>>> The densities are saved as float32 and will vary sinusoidically
>>> from 0 to 64 along the cylinder height.
>>>
>>> The result is saved in the "test" dataset in the output file.
>>> """
>>> z_values = 32 + 32 * sin(linspace(0, 2*pi, height))
>>> diameter = radius * 2
>>> data = zeros(shape=(diameter, diameter, height), dtype=float32)
>>>
>>> for x in range(diameter):
>>> for y in range(diameter):
>>> if (x - radius)**2 + (y - radius)**2 <= radius**2:
>>> data[x, y, :] = z_values
>>>
>>
>> I made a quick test with densities uniformly random 0-64 instead (e.g.
>> data[x, y, :] = uniform(0, 64, height) above instead), with the attached
>> result. Notice how the artifacts are still present (they're particularly
>> visible from this angle).
>>
>> Perhaps it's obvious to someone more experienced in visualisation than I
>> am what is happening here?
>>
>
> Noone has seen these sort of artifacts before?
>
> I've tried blurring my synthetic data a little, as well as turning on
> shading again, but the artifacts are always there.
>
> I don't understand where these "stripes" are coming from, or why I'm
> seeing red voxels at all towards the denser parts of the cylinder. My color
> transfer function has no red at all in the range 40000-65535.
>
> Elvis
>
>
>>
>> Elvis
>>
>>
>>>
>>> # Write array to HDF5 file.
>>> with h5py.File(filename, 'w') as file_:
>>> data_set = file_.create_dataset(
>>> name='test',
>>> shape=data.shape,
>>> dtype=data.dtype,
>>> data=data
>>> )
>>>
>>> I then test it all out using a vtkVolumeRayCastMapper based pipeline
>>> like this:
>>>
>>> reader = HDF5Source()
>>> reader.SetFileName('test.hdf5')
>>>
>>> rayCastFunction = vtk.vtkVolumeRayCastCompositeFunction()
>>>
>>> mapper = vtk.vtkVolumeRayCastMapper()
>>> mapper.SetVolumeRayCastFunction(rayCastFunction)
>>> mapper.SetInputConnection(reader.GetOutputPort())
>>>
>>> colorTransferFunction = vtk.vtkColorTransferFunction()
>>> colorTransferFunction.AddRGBPoint(0, 0, 0, 0) # Black
>>> colorTransferFunction.AddRGBPoint(20000, 1, 0, 0) # Red
>>> colorTransferFunction.AddRGBPoint(40000, 0, 1, 0) # Green
>>> colorTransferFunction.AddRGBPoint(65535, 0, 0, 1) # Blue
>>>
>>> opacityTransferFunction = vtk.vtkPiecewiseFunction()
>>> opacityTransferFunction.AddPoint(0, 0) # Transparent
>>> opacityTransferFunction.AddPoint(65535, 1) # Opaque
>>>
>>> volumeProperty = vtk.vtkVolumeProperty()
>>> volumeProperty.SetColor(colorTransferFunction)
>>> volumeProperty.SetScalarOpacity(opacityTransferFunction)
>>> volumeProperty.ShadeOff()
>>> volumeProperty.SetInterpolationTypeToLinear()
>>>
>>> volume = vtk.vtkVolume()
>>> volume.SetMapper(mapper)
>>> volume.SetProperty(volumeProperty)
>>>
>>> renderer = vtk.vtkRenderer()
>>> renderer.AddVolume(volume)
>>> renderer.SetBackground(.85, .84, .83)
>>>
>>> renderWindow = vtk.vtkRenderWindow()
>>> renderWindow.AddRenderer(renderer)
>>> renderWindow.SetSize(600, 600)
>>>
>>> interactor = vtk.vtkRenderWindowInteractor()
>>> interactor.SetRenderWindow(renderWindow)
>>> interactor.Initialize()
>>>
>>> renderWindow.Render()
>>> interactor.Start()
>>>
>>> I'm attaching a main.py which contains the full code, including the
>>> HDFSource reader with my slight modification, and a screenshot showing the
>>> result.
>>>
>>> Noticy how there's some strange artifacts in the denser (greener, bluer)
>>> parts of the cylinder. Anyone know where these artifacts may come from?
>>> It's entirely possible that it has nothing to with the custom reader, but
>>> something with my pipeline..?
>>>
>>> Very grateful for any ideas!
>>>
>>> Cheers,
>>> Elvis
>>>
>>> [1]
>>> https://blog.kitware.com/developing-hdf5-readers-using-vtkpythonalgorithm/
>>>
>>
>>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/vtkusers
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160413/51f9b2d9/attachment.html>
More information about the vtkusers
mailing list