Using VTK Volume Rendering Presets in DicomObjects

Purpose: Demonstrate how to import VTK-style volume rendering presets (JSON or .vp format) into a DicomImage3D rendering pipeline, generating color/opacity lookup tables (LUTs) and applying them for interactive 3D visualization in .NET/C#.


1. Key Features

  • Preset Parsing: JSON-defined presets parsed into VolumeRenderingPreset structures containing ScalarOpacityPoint and ColorTransferPoint.
  • LUT Generation: Builds a 4096-element Color[] table via linear interpolation across preset value ranges.
  • Runtime Application: Applies LUT to DicomImage3D via SetTransferFunction(min, max, lut), enabling instant visual updates.
  • Visual Comparison: Side-by-side rendering results from DicomObjects.NET and VTK.js WebViewer using identical presets.

2. Code Walk-Through

// Load and populate presets
string json = System.IO.File.ReadAllText("presets.json");
var vtkPresets = JsonConvert.DeserializeObject(json)
 .Select(PresetConversion.Parse).ToList();
presetSelector.Items.AddRange(vtkPresets.Select(p => p.Name).ToArray());

// Apply selected preset at runtime
var sel = vtkPresets[presetSelector.SelectedIndex];
var lut = PresetConversion.GenerateLUT(sel);

var vr = new DicomImage3D(mprAxial.Volume, RenderMode3D.VR);
vr.SetTransferFunction(sel.MinValue, sel.MaxValue, lut);

viewer.Images.Clear();
viewer.Images.Add(vr);
viewer.SafeUpdate();

3. How It Works

The PresetConversion class:

  • Uses Parse() to build a VolumeRenderingPreset from JSON data.
  • GenerateLUT() interpolates color and opacity points into a full LUT array.
  • SetTransferFunction() applies the LUT to the DicomImage3D instance, aligning voxel intensities to visual output.

Above: first image shows DicomObjects.NET rendering, second image shows the same data in VTK.js WebViewer with identical preset applied.

4. Troubleshooting & Tuning

Issue Solution
Colors dont match expected output Ensure your MinValue and MaxValue align with the DICOM intensity range (e.g., Hounsfield units).
Rendering performance is slow Use vtkGPUVolumeRayCastMapper and reduce LUT size or sampling distances.
Opacity clipping occurs Verify interpolation clamps at endpoint presets, not extrapolates–linear piecewise should suffice.
Incorrect MRI appearance MRI needs custom presets – CT presets assume HU scale, not MR intensity values.

Conclusion

This KB page demonstrates a streamlined workflow for using VTK-style volume rendering presets within DicomObjects.NET. By parsing presets, generating LUTs, and applying them via DicomImage3D, you gain full-featured, interactive volume rendering that can match or rival web-based VTK.js implementations. With this foundation, it is easy to extend preset support, add UI controls, and leverage advanced cinematic techniques.

Download Demo

A c# sample project can be downloaded here