Cross section of segmentation in oblique angle

Hello everyone!

I am interested in calculating cross section areas of my segmentations. I have a segmentation with 1 label (except for the background label) and I want to calculate the area of the cross section of my segment on certain slices. To do that, I installed the Segment Cross-Section Area module by installing the Sandbox extension in the Extension Manager. This works very well!!

Problem
However, I now would want to measure the area of the intersection of my segment with a plane that is not perpendicular to any of the axes. In other words, I would want to calculate the cross section area of my segmentation under a given oblique angle.
In the Segment Cross-Section Area module you can however only choose between slice, row and column.

What I have already tried
I have already tried a few things based on what I found online and what I already know you can do in Slicer from experience.

  • I have tried simply rotating my volume and segmentation with the help of a transform. However, after this rotation, the results of the Segment Cross-Section Area module stay the same, meaning that this module doesn’t change its concept of slices along with the transform.

  • Even after hardening this transformation, no change could be noticed in the way Segment Cross-Section Area handles the volume and the segmentation.

  • I also tried adjusting my views using the Reformat module, but again the Segment Cross-Section Area module doesn’t take these adjustments into account.

Question

Does anyone have an idea as to how to solve my problem?

Thanks in advance!

Hardening a linear transform only changes the mapping from pixels to physical space (ijkToRAS). Instead, you can resample the volume to apply the transform. See:
https://slicer.readthedocs.io/en/latest/user_guide/modules/resamplescalarvectordwivolume.html

Hi @pieper

This indeed does the trick!

Thanks a lot for the help!

Kind regards

Hi @pieper

The resampling module “Resample Scalar/Vector/DWI Volume” seems to work at first sight. The rotation works, but the result is cropped because it obviously cannot fit in the dimensions of the original volume anymore. When I just manually apply the rotation transformation to the volume, the whole volume is visible and no cropping is made.
Is there any way to make the resample module convert the volume without loss of any part of the image?
Below were the settings in the module that I used.

Thanks in advance!

If you don’t want to transform your volume, there are alternative ways you might investigate.

  1. You may use ‘Stenosis measurement: 2D’ module in SlicerVMTK extension that you can install vie the ‘Extensions manager’. Reorient a slice view to your required obliqueness, place a fiducial point in your segment, click on it and apply. You can repeat after changing obliquity and location as required.

  2. You may use ‘Cross-section analysis’ module in SlicerVMTK too in a hackish way. Place an open markups curve in your segment corresponding to your required obliqueness, with 2 control points only. Select this curve and your segment, then apply. It will calculate the cross-section area at each point between the 2 control points, by default 10 points. The ‘CE diameter’ output may not be of interest to you. You may also resample your curve to add more control points on the line (don’t move any control point, lock the curve quickly), so that the area can be measured 10x(number of control points -1).

1 Like

Hi @chir.set

Thank you for your response! The problem is that I eventually want to automate everything in my workflow using Python code. Placing markups is hence in my case not an easy thing to do.
I think the transformation of my volume is the way to go for me. However, I’m struggling with some aspects of it, namely having correct dimensions after applying the resampling, such as described here.

Thank you for taking your time to respond!

You can use the CropVolume module first to create a buffer area around the volume so the rotation won’t crop. You can eyeball this and set the ROI to fit, or in your code you could calculate the needed size based on the rotation. This example should help.

Hi @pieper

Thank you for your answer!

In the meantime I have found another way to do it: by creating an empty volume node with the right dimensions, origin etc. and then using this volume as a reference volume.

Thank you for helping me!