[vtkusers] select individual iso-lines

Jeremy Winston winston at cat.rpi.edu
Thu Feb 20 13:34:20 EST 2003


Dean Inglis wrote:
> Hi,
> 
> I am using vtkContourFilter to generate the 
> inner and outer perimeter contours from a
> binary thresholded image of a bone cross-section.
> The filter generates the closed outer bone 
> surface contour and the closed marrow-bone surface
> contour. Is there a way to extract each one
> separately from the vtkPolyData output?

Dean,
    Here are some snippets of Tcl/vtk code I wrote for a
similar purpose.  I pass the output of MarchingSquares to
vtkStripper, which pulls contiguous segments together into
polylines, one polyline for each contour.  The function
skipContours() "walks through" each polyline, and if it has
fewer than minPts points, changes its associated scalar value.
You would use your own criteria, but the data structures would
be similar.  If you're using C++, there are some convenience
functions to iterate through the list of contours more
conveniently.
    See
http://public.kitware.com/pipermail/vtkusers/2002-September/013435.html
in the list archives for more details on my code.

HTH,
-Jeremy

--- snippets: ---
vtkGESignaReader ctReader

vtkExtractVOI extract
   extract SetInput [ctReader GetOutput]

vtkMergePoints ctLocator
vtkMarchingSquares ctContour
   ctContour SetInput [extract GetOutput]
   ctContour SetLocator ctLocator

vtkStripper ctStrip
   ctStrip SetInput [ctContour GetOutput]

vtkPolyDataWriter ctWriter
   ctWriter SetInput [ctStrip GetOutput]

...

proc skipContours {} {
   global minpts thresh numSelected fs
   set intT [expr int($thresh)]                 ;# Scalar value of contour pts
   set c [ctStrip GetOutput]                    ;# Contours
   set sd [[$c GetPointData] GetScalars]        ;# Scalar data
   set ld [[$c GetLines] GetData]               ;# Line data
   set numLines [$c GetNumberOfLines]           ;# Number of contour lines
   set numSelected $numLines                    ;# Number of contours selected
   set flag 0                                   ;# Set if scalars are changed
   for {set idx 0; set i 0} {$i<$numLines} {incr i} { ;# For each line...
     set nPts [$ld GetComponent $idx 0]         ;# of points in this line
     set endPt [expr $idx + $nPts]              ;# Indx to last pt in this line
     if {$nPts < $minpts} {                     ;# If too few pts in line...
       for {set j [expr $idx+1]} {$j<=$endPt} {incr j} {;# For @ pt in the line
         set ptNo [$ld GetComponent $j 0]       ;# Point # (indx into scalars)
         set sv [$sd GetComponent $ptNo 0]      ;# Get pt's current scalar value
         if {$sv} {                             ;# If value is non-zero
           incr flag                            ;# Scalar data are changed
           $sd SetComponent $ptNo 0 0           ;# Set pt's scalar to 0
         }
       }
       incr numSelected -1                      ;# Decrement selected count
     } else {                                   ;# Don't skip this line
       for {set j [expr $idx+1]} {$j<=$endPt} {incr j} {;# For @ pt in the line
         set ptNo [$ld GetComponent $j 0]       ;# Point # (indx into scalars)
         set sv [$sd GetComponent $ptNo 0]      ;# Get pt's current scalar value
         if {!$sv} {                            ;# If value is zero
           incr flag                            ;# Scalar data are changed
           $sd SetComponent $ptNo 0 $intT       ;# Reset pt's scalar to orig val
         }
       }
     }
     incr idx [expr $nPts + 1]                  ;# Move to next line
   }
   if {$flag} {                                 ;# If scalars have changed
     $sd Modified
     renWin Render
   }
   $fs.m config -text [format "%s of %s contour(s) selected" \
     $numSelected $numLines]
}

--- end. ---





More information about the vtkusers mailing list