[vtkusers] Extracting largest region works with vtkPolyDataConnectivityFilter, but not with vtkConnectivityFilter
David Gobbi
david.gobbi at gmail.com
Wed Jun 8 11:06:14 EDT 2016
Hi Daniel,
Within VTK proper, there's the vtkImageThresholdConnectivity filter, but it
requires you to seed the regions you want, it can't just give you the
largest:
http://www.vtk.org/doc/nightly/html/classvtkImageThresholdConnectivity.html
I have a better filter called simply "vtkImageConnectivityFilter", but it
hasn't
made its way into VTK yet:
https://github.com/dgobbi/AIRS/blob/master/ImageSegmentation/vtkImageConnectivityFilter.h
- David
On Wed, Jun 8, 2016 at 8:52 AM, D L <lackodan at outlook.com> wrote:
> Hello again!
>
> Today, I'm having some trouble understanding how to use
> vtkConnectivityFilter in python 2.7 and VTK6.3. I've consulted a number of
> resources and examples, including:
>
> http://www.vtk.org/doc/nightly/html/classvtkConnectivityFilter.html
>
> http://www.vtk.org/Wiki/VTK/Examples/CSharp/PolyData/ColorDisconnectedRegions
> http://public.kitware.com/pipermail/vtkusers/2014-October/085430.html
>
> http://www.vtk.org/Wiki/VTK/Examples/CSharp/PolyData/PolyDataConnectivityFilter_LargestRegion
>
> http://www.vtk.org/gitweb?p=VTK.git;a=blob;f=Common/DataModel/Testing/Python/scalarConn.py
>
> http://www.vtk.org/Wiki/VTK/Examples/CSharp/PolyData/PolyDataConnectivityFilter_LargestRegion
>
> http://www.vtk.org/Wiki/VTK/Examples/CSharp/PolyData/PolyDataConnectivityFilter_LargestRegion
>
> http://www.vtk.org/gitweb?p=VTK.git;a=blob;f=Filters/Extraction/Testing/Python/extractUGrid.py
>
> However, I still can't figure out how to use the filter. I have a number
> of operations in mind, but let's start with extracting the largest region.
> From the available documentation, I assumed that this could be done by
> using vtkConnectivityFilter.SetExtractionModeToLargestRegion(). However,
> when I apply this to a (segmented and thresholded) MRI image to remove some
> noise, it just extracts the entire image. On the other hand, if I convert
> it to a surface first, using vtkMarchingCubes, and then apply a
> vtkPolyDataConnectivityFilter, that does give me the expected result...
>
> Here's a minimal example I'm using to test and compare:
>
> import vtk
>
> niftiReader = vtk.vtkNIFTIImageReader()
> niftiReader.SetFileName("test/MNI_0103-thresholded.nii")
> niftiReader.Update()
> thresholdedImage = niftiReader.GetOutput()
>
> # vtkConnectivityFilter - doesn't work
> connectivity = vtk.vtkConnectivityFilter()
> connectivity.SetInputData(thresholdedImage)
> connectivity.SetExtractionModeToLargestRegion()
> connectivity.Update()
>
> print("\nvtkConnectivityFilter number of extracted regions: " +
> str(connectivity.GetNumberOfExtractedRegions()))
> # outputs 1
>
> # Connectivity filter produces an unstructured grid; convert back
> # to image data for further use.
> probeFilter = vtk.vtkProbeFilter()
> probeFilter.SetSourceConnection(connectivity.GetOutputPort())
> probeFilter.SetInputData(thresholdedImage)
> probeFilter.Update()
>
> marchingCubes = vtk.vtkMarchingCubes()
> marchingCubes.SetInputConnection(probeFilter.GetOutputPort())
> marchingCubes.GenerateValues(1,1,1) # input was thresholded with 1 as
> output value
> marchingCubes.Update()
>
> stlWriter = vtk.vtkSTLWriter()
> stlWriter.SetInputConnection(marchingCubes.GetOutputPort())
>
> stlWriter.SetFileName("test/MNI_0103-vtkConnectivityFilter-largestRegion.stl")
> stlWriter.Write()
>
>
> # vtkPolyDataConnectivityFilter - works as expected
> marchingCubes2 = vtk.vtkMarchingCubes()
> marchingCubes2.SetInputData(thresholdedImage)
> marchingCubes2.GenerateValues(1,1,1)
> marchingCubes2.Update()
>
> connectivity2 = vtk.vtkPolyDataConnectivityFilter()
> connectivity2.SetInputConnection(marchingCubes2.GetOutputPort())
> connectivity2.SetExtractionModeToLargestRegion()
> connectivity2.Update()
>
> print("\nvtkPolyDataConnectivityFilter number of extracted regions: " +
> str(connectivity2.GetNumberOfExtractedRegions()))
> # outputs 1673
>
> stlWriter2 = vtk.vtkSTLWriter()
> stlWriter2.SetInputConnection(connectivity2.GetOutputPort())
>
> stlWriter2.SetFileName("test/MNI_0103-vtkPolyDataConnectivityFilter-largestRegion.stl")
> stlWriter2.Write()
>
> The input volume can downloaded here:
> https://onedrive.live.com/redir?resid=C74503A42DE708!3267&authkey=!AMjKnLDNfJzYxGo&ithint=file%2cnii
> The end result when using vtkConnectivityFilter:
> https://onedrive.live.com/redir?resid=C74503A42DE708!3269&authkey=!ACgeZNYmu0yYYTQ&ithint=file%2cstl
> The end result when using vtkPolyDataConnectivityFilter:
> https://onedrive.live.com/redir?resid=C74503A42DE708!3268&authkey=!ADAeoPw8O09APE8&ithint=file%2cstl
>
> The reason I want to apply the connectivity filter before surface
> extraction is that I would like to so some other morphological operations
> on the image first (e.g. closing and flood fill). At first, I assumed it
> might have something to do with scalar connectivity, but using
> vtkConnectivityFilter.SetScalarConnectivityOff() didn't change anything.
>
> Could someone with a better understanding of VTK please explain?
>
> Kind regards,
>
> Daniel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160608/56e578f4/attachment.html>
More information about the vtkusers
mailing list