[vtkusers] Artifacts in volume rendering

Dženan Zukić dzenanz at gmail.com
Wed Apr 13 09:56:09 EDT 2016


Here it is.

On Wed, Apr 13, 2016 at 9:54 AM, Aashish Chaudhary <
aashish.chaudhary at kitware.com> wrote:

> Hi Elvis,
>
> Can you post your images somewhere (I couldn't find them in the email)?
>
> Thanks,
>
>
> On Wed, Apr 13, 2016 at 9:52 AM, Dženan Zukić <dzenanz at gmail.com> wrote:
>
>> 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
>>>
>>>
>>
>> _______________________________________________
>> 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
>>
>>
>
>
> --
>
>
>
> *| Aashish Chaudhary | Technical Leader         | Kitware Inc.            *
> *| http://www.kitware.com/company/team/chaudhary.html
> <http://www.kitware.com/company/team/chaudhary.html>*
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160413/b2f992d7/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: artifacts_uniform.png
Type: image/png
Size: 106541 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160413/b2f992d7/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: artifacts.png
Type: image/png
Size: 62129 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160413/b2f992d7/attachment-0003.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: main.py
Type: application/octet-stream
Size: 4269 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160413/b2f992d7/attachment-0001.obj>


More information about the vtkusers mailing list