<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Hi Elvis,</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">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.</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Regards,</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Dženan</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 13, 2016 at 8:54 AM, Elvis Stansvik <span dir="ltr"><<a href="mailto:elvis.stansvik@orexplore.com" target="_blank">elvis.stansvik@orexplore.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="">2016-04-12 16:16 GMT+02:00 Elvis Stansvik <span dir="ltr"><<a href="mailto:elvis.stansvik@orexplore.com" target="_blank">elvis.stansvik@orexplore.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span>2016-04-12 15:56 GMT+02:00 Elvis Stansvik <span dir="ltr"><<a href="mailto:elvis.stansvik@orexplore.com" target="_blank">elvis.stansvik@orexplore.com</a>></span>:<br></span><span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div><div>Hi all,<br><br></div>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.<br><br></div>The only change I did to his reader was to modify RequestData to scale the loaded data and convert it to uint16, like this:<br><br>    data = (data * 1023).astype(uint16)<br><br></div><div>(should get me roughly in the range 0-65535).<br><br></div><div>I then generated a test HDF5 file containing a cylindrical volume like this:<br><br>def create_cylinder_file(filename, height, radius):<br>    """Create a cylindrical volume and save it in test.hdf5.<br><br>    The densities are saved as float32 and will vary sinusoidically<br>    from 0 to 64 along the cylinder height.<br><br>    The result is saved in the "test" dataset in the output file.<br>    """<br>    z_values = 32 + 32 * sin(linspace(0, 2*pi, height))<br>    diameter = radius * 2<br>    data = zeros(shape=(diameter, diameter, height), dtype=float32)<br><br>    for x in range(diameter):<br>        for y in range(diameter):<br>            if (x - radius)**2 + (y - radius)**2 <= radius**2:<br>                data[x, y, :] = z_values<br></div></div></blockquote><div><br></div></span><div>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).<br><br></div><div>Perhaps it's obvious to someone more experienced in visualisation than I am what is happening here?<span><font color="#888888"><br></font></span></div></div></div></div></blockquote><div><br></div></span><div>Noone has seen these sort of artifacts before?<br><br></div><div>I've tried blurring my synthetic data a little, as well as turning on shading again, but the artifacts are always there.<br><br></div><div>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.<span class="HOEnZb"><font color="#888888"><br><br></font></span></div><span class="HOEnZb"><font color="#888888"><div>Elvis<br></div></font></span><div><div class="h5"><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><span><font color="#888888"><br></font></span></div><span><font color="#888888"><div>Elvis<br> <br></div></font></span><div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br>    # Write array to HDF5 file.<br>    with h5py.File(filename, 'w') as file_:<br>        data_set = file_.create_dataset(<br>            name='test',<br>            shape=data.shape,<br>            dtype=data.dtype,<br>            data=data<br>        )<br><br></div><div>I then test it all out using a vtkVolumeRayCastMapper based pipeline like this:<br><br>    reader = HDF5Source()<br>    reader.SetFileName('test.hdf5')<br><br>    rayCastFunction = vtk.vtkVolumeRayCastCompositeFunction()<br><br>    mapper = vtk.vtkVolumeRayCastMapper()<br>    mapper.SetVolumeRayCastFunction(rayCastFunction)<br>    mapper.SetInputConnection(reader.GetOutputPort())<br><br>    colorTransferFunction = vtk.vtkColorTransferFunction()<br>    colorTransferFunction.AddRGBPoint(0, 0, 0, 0)     # Black<br>    colorTransferFunction.AddRGBPoint(20000, 1, 0, 0) # Red<br>    colorTransferFunction.AddRGBPoint(40000, 0, 1, 0) # Green<br>    colorTransferFunction.AddRGBPoint(65535, 0, 0, 1) # Blue<br><br>    opacityTransferFunction = vtk.vtkPiecewiseFunction()<br>    opacityTransferFunction.AddPoint(0, 0)     # Transparent<br>    opacityTransferFunction.AddPoint(65535, 1) # Opaque<br><br>    volumeProperty = vtk.vtkVolumeProperty()<br>    volumeProperty.SetColor(colorTransferFunction)<br>    volumeProperty.SetScalarOpacity(opacityTransferFunction)<br>    volumeProperty.ShadeOff()<br>    volumeProperty.SetInterpolationTypeToLinear()<br><br>    volume = vtk.vtkVolume()<br>    volume.SetMapper(mapper)<br>    volume.SetProperty(volumeProperty)<br><br>    renderer = vtk.vtkRenderer()<br>    renderer.AddVolume(volume)<br>    renderer.SetBackground(.85, .84, .83)<br><br>    renderWindow = vtk.vtkRenderWindow()<br>    renderWindow.AddRenderer(renderer)<br>    renderWindow.SetSize(600, 600)<br><br>    interactor = vtk.vtkRenderWindowInteractor()<br>    interactor.SetRenderWindow(renderWindow)<br>    interactor.Initialize()<br><br>    renderWindow.Render()<br>    interactor.Start()<br></div><div><br></div><div>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.<br><br></div><div>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..?<br></div><div><div><br>Very grateful for any ideas!<br><br>Cheers,<br>Elvis<br><br>[1] <a href="https://blog.kitware.com/developing-hdf5-readers-using-vtkpythonalgorithm/" target="_blank">https://blog.kitware.com/developing-hdf5-readers-using-vtkpythonalgorithm/</a><br></div></div></div>
</blockquote></div></div></div><br></div></div>
</blockquote></div></div></div><br></div></div>
<br>_______________________________________________<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>
<br>
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=vtkusers</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/vtkusers</a><br>
<br></blockquote></div><br></div>