Artery-tumor intersection points

Hi everyone,
i’m working on segmentation of kidney tumor and artery that feeds the tumor. I used logical operator intersect to get the parts where artery and tumor touch each other. I’d like to know if it’s possible to get ras coordinates of the contact points (without adding markups manually).
Thank you very much for your time.

P.S.
it would be even better if i could get intersection point between tumor segment and centerline curve of the artery, obtained through “extract centerline” (vmtk).
thanks again

If there are multiple intersection regions, you can split each into it’s own segment using Islands → Split islands to segments. Then, you can find the centroid of each intersection segment using Segment Statistics module. If there are only small regions of intersection, these centroids might be quite close to the vessel centerline.

Thank you for your quick response, mike.
Though, is it possible to get the exact intersection point/points?

I’m sure this is possible at the VTK level and I would not be surprised if this is possible somehow in Slicer or a current Slicer extension, but I personally do not know how to find intersection points of a markups curve with a surface model. In this forum thread (Intersection two models (Plane and centerlines CT/MR) - #3 by shahrokh), I see someone has shared code for finding intersections of curves with a plane using vtkCutter, but I think this will not quite work for your purposes because it looks like vtkCutter uses an implicitly described surface (easy for a plane but maybe less so for your vessel segments). I also found this link: https://kitware.github.io/vtk-examples/site/Cxx/ImageData/IntersectLine/, which seems closer to what you are trying to do, but again may not be exactly it.

@mau_igna_06, do you have any suggestions?

Hi.

To find the intersection of centerline (only one branch) and the tumor surface (created from the segment) I would recommend to get the internal polydata representacion of the simply displayed centerline curve (that’s a 3d model) and use the module CombineModels to get the intesection with the tumor model. Then extract the centerline of the resulting model.

Hope it helps

1 Like

Both CombineModels and vtkCutter should give you the intersection point coordinates. vtkCutter needs a implicit function as input, which you can get from the tumor polydata using vtkImplicitPolyDataDistance filter.

Thank you very much for your replies, @mikebind, @mau_igna_06 and @lassoan .
Actually, I can’t find CombineModels module. where can i find it?
Sorry, i’m quite new with 3d slicer.

It is provided by the Sandbox extension.

is it available for 4.11.2 version?

You need to use the latest Slicer Preview Release. It will become the new Slicer Stable Release very soon anyway.

Hi, i tried with CombineModules method but if i use 3d model of centerline polydata representation and tumor, it does create the intersection model but it is not displayed and if i use it to extract centerline, an error tells me that “valid input surface is required”

in fact, if i check properties of the model created, surface area, volume, number of points and number of cells are all to zero

Artery is a polyline, tumor is a surface, therefore the intersection of the two is just a set of points.

What would you like to achieve?

Hi everyone,
i’ve already asked something like this, but i want to explain better what i’m trying to find out.
Basically i have artery and tumor segmentation and i extracted artery centerline curve (with hierachy).

  1. I would like to understand which of the branches of the centerline curve intersects with the tumor ;
  2. once i found the branch(es), i want to go back up in the hierarchy to the main branch (‘Centerline curve(0)’ );
  3. possibly doing all by code.

Do you have any ideas on how to do to something like this?

Thank you very much, guys.

This should not be a problem at all.

One option is to use vtkCutter on a polydata that contains all branches. This works if the cutter preserves cell data in the output, because then you can add cell IDs as a cell array (using vtkIdFilter) and in the output cell or point data you’ll have the IDs of all branches that had intersection point.

If vtkCutter does preserve cell data then you can use vtkCutter on one branch at a time. If the output is non-empty then you know that the branch intersects the surface. For this, you can use markup curves: iterate through the curves in the subject hierarchy and get the polydata of each curve using curveNode.GetCurveWorld().

Thank you very, it was very helpful!