<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">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><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><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?<br><br></div><div>Elvis<br> <br></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><br></div></div>