I was hoping I could get some help/ideas on how I can get a measure of the curvature of the model (curvature of insect cornea to be exact). In my project, I am interested in quantifying the curvature of the cornea (i.e. how curved or flat the cornea is) across different species which can affect several properties of the vision (please see the attached image). The image depicted here is the surface cut (after placing the closed curve) from the whole insect head. Is there any way I can do this in Slicer? I have >400 such models from which I would get a measure of the curvature of the eye.
Apologies if I missed any relevant posts.
Thank you very much for your help!
There’s probably more than one way to go about this.
Assuming that you have your data-set of cut surfaces already (i.e., a folder with the models), you could make a 3D Slicer scripted module that batch processes (loads, process, unload) all the models and get you the curvature statistics as a .csv file. Sometime ago I followed this approach to do bulk labelmap statistics on entire datasets (GitHub - RafaelPalomar/BulkLabelStatistics: Module to compute labelmap statistics in bulk) maybe you can use it as inspiration.
When it comes to curvature estimation, you can use the class
vtkCurvatures, which can give you Gaussian, Mean, Max and min curvature (https://vtk.org/doc/nightly/html/classvtkCurvatures.html). This should be exposed in Slicer as part of VTK.
vtkCurvatures can compute local curvature at each point, but probably in this case a description of the overall shape is needed. That could be achieved by fitting a sphere, ellipsoid, or some other shape model to the model points.
Hi Rafael and Andras,
Thank you very much for your quick replies. I am a complete newbie in Python and I was hoping you could demonstrate how these measures could be obtained, for example in Slicer, for just one model. But I am assuming (based on Andras’s reply) I do not necessarily need Slicer for measuring the curvature of the model.
First of all, you need to decide what kind of curvature you want to compute. Local surface curvature is good for quantifying surface roughness or other small localized variations in the surface. Global curvature can characterize the overall shape. If your assumption is that a sphere is a good enough approximation of the eye shape then you can fit a sphere or ellipsoid to the surface points and get the curvature value from the radii. However, most likely you would get a more accurate and informative characterization of the eye shape if you fit a more sophisticated shape model. Check out SlicerMorph and SlicerSalt shape analysis extensions for more details.
Thank you, Andras! I am interested in quantifying the global curvature of the eye (across multiple individuals and species). I thought, for starters, this could give me a rough idea about the extent of eye curvature across species (I do hope to analyze shape variation using landmarks in the future). I believe an ellipsoid would be a good approximation of the eye shape/curvature. I had a look at what is available in SlicerMorph. The PseudoLmGenerator module in SlicerMorph does allow fitting a spheroid or an ellipsoid but I do not get any measure of curvature (I hope I am not missing something obvious). I believe this is more for acquiring landmarks. @muratmaga do you have any suggestions?
Curvature is 1/radius, so if you know the radius then you know the curvature.
Thank you, I’ll explore some options!
It seems like the Segment Statistics module computes several metrics (Feret diameter, roundness, flatness, elongation) and these are exactly the measurements I am looking for. But I converted my model back to segmentation for the Segment Statistics module to work. I also noticed that the surface area of this segmentation is overestimated compared to the surface area of the model. Do you know why is this the case and if I can use this pipeline to get some basic estimates of the shape? Thank you!