One of my colleagues came across this article and we tried to do the same with 3D Slicer. I
It says two algorithms are used for generation of cephalograms from CBCT data.
maximum intensity projection
RayCast – 3D data are visualized by summing all values of the voxels from the viewpoint to the plane of projection and dividing this number by the number of voxels
I think we achived the MIP part, (Masking was not done nicely … was in a hurry to see it works )
And we use volume render to get this image, thinking this is the RayCasting as it says “VTK GPU raycasting” .
Is our MIP is correct ?
Is our RayCasting is correct ?
Is there any other way of generating cephalograms from CBCT data ? a better technique ?
The authors use quite strange terminology. Both methods are based on raycasting - in one case you use maximum value along the ray, in the other case you use the mean value. If you use the mean value then it is an X-ray-like image, which I’ll call mean Digitally Reconstructed Radiograph (DRR). I don’t see any reason why anyone would even consider using MIP for finding anatomical landmarks and planes on bony anatomy, but nevertheless, you can get DRR and MIP images in both slice and 3D views quite easily.
Slice views: Advantage is that you get a 2D planar image that you can directly measure things on. It uses parallel projection, so the distances that you measure are correct (do not depend on distance from source). Disadvantage that it is computed entirely in the CPU, so it is slow. You can generate it using this script. Use “SetSlabModeToMean” for getting DRR and “SetSlabModeToMax” for getting MIP.
3D views: Use Volume Rendering module with “CT-X-ray” rendering preset and set view background to black to get DRR. Switch to “CT-MIP” volume rendering preset and set Advanced / Techniques / Advanced rendering properties / Technique -> Maximum Intensity Projection.
Dear Prof Lasso, Thank you for your detailed explanation on this. I tried all recipes.
When it comes to MIP it works the same.
But when it comes to DRR, we do not see the outline of the orbits which is essential for lateral ceph analysis. So in the article it must be something else that they have used for this as the orbital out line is very nice.
However in the bottom photo i attached above which is from the 3D view we can get it to see the orbital outline as well. So that is why we were thinking this must be what they have done also under what is mentioned as “raycasting technique”. But as you said it would be very inaccurate to measure in the 3D view.
In 3D views, you need to adjust the scalar opacity transfer function to optimize visibility of the structures you are interested in - the same way as you would adjust X-ray exposure parameters depending on patient thickness and details that you want to visualize - bones, soft tissues, etc.
In slice views, you may need to adjust window/level. If that is not sufficient then you may apply some non-linear image intensity transformation to emphasize certain structures while suppress others. The simplest would be a ramp function (similar to the one used as scalar opacity transfer function). You can apply a function to the voxel array using numpy, as shown in examples in the script repository.