ExtractLargestIsosurface

VTKExamples/CSharp/Modelling/ExtractLargestIsosurface

Description

  • Contributed by: Jinyoung Hwang

This example reads a structured points dataset stored in a .vtk file and constructs a 3D model using vtkMarchingCubes. vtkPolyDataConnectivityFilter is used to extract the largest isosurface.

Data is available at:

  1. test.vtk: http://web.kaist.ac.kr/~hjy/test.vtk

  2. brainweb.img: http://web.kaist.ac.kr/~hjy/brainweb.img

  3. brainweb.hdr: http://web.kaist.ac.kr/~hjy/brainweb.hdr

Second and third datasets can be downloaded from BrainWeb, which is free of charge in use for a research. "test.vtk" was converted from "brainweb.img" using a program by Erik Vidholm (http://www.cb.uu.se/~erik/vtk/rawToVTK.cpp).

The examples expects 2 or 3 argments:

 ExtractLargestIsosurface InputFilename Threshold ExtractLargest
  if ExtractLargest is omitted or 1, the largest isosurface is extracted
  if ExtractLargest is 0, all of the isosurfaces are extracted

Try

ExtractLargestIsosurface test.vtk 50 1

and compare the results to

 ExtractLargestIsosurface test.vtk 50 0

A tutorial on how to setup a Windows Forms Application utilizing ActiViz.NET can be found here: Setup a Windows Forms Application to use ActiViz.NET

Code

ExtractLargestIsosurface.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Diagnostics;

using Kitware.VTK;

namespace ActiViz.Examples {
   public partial class Form1 : Form {
      public Form1() {
         InitializeComponent();
      }


      private void renderWindowControl1_Load(object sender, EventArgs e) {
         try {
            // don't forget to adapt the file path
            ExtractLargestIsoSurface("test.vtk", 50, true);
         }
         catch(Exception ex) {
            MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK);
         }
      }


      private void ExtractLargestIsoSurface(string filePath, double threshold, bool extractLargest) { 
         // Load data
         vtkStructuredPointsReader reader = vtkStructuredPointsReader.New();
         reader.SetFileName(filePath);

         // Create a 3D model using marching cubes
         vtkMarchingCubes mc = vtkMarchingCubes.New();
         mc.SetInputConnection(reader.GetOutputPort());
         mc.ComputeNormalsOn();
         mc.ComputeGradientsOn();
         mc.SetValue(0, threshold);  // second value acts as threshold

         // To remain largest region
         vtkPolyDataConnectivityFilter confilter = vtkPolyDataConnectivityFilter.New();
         confilter.SetInputConnection(mc.GetOutputPort());
         confilter.SetExtractionModeToLargestRegion();

         // Create a mapper
         vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
         if(extractLargest) {
            mapper.SetInputConnection(confilter.GetOutputPort());
         }
         else {
            mapper.SetInputConnection(mc.GetOutputPort());
         }

         mapper.ScalarVisibilityOff();    // utilize actor's property I set

         // Visualize
         vtkActor actor = vtkActor.New();
         actor.GetProperty().SetColor(1, 1, 1);
         actor.SetMapper(mapper);

         // get a reference to the renderwindow of our renderWindowControl1
         vtkRenderWindow renderWindow = renderWindowControl1.RenderWindow;
         // renderer
         vtkRenderer renderer = renderWindow.GetRenderers().GetFirstRenderer();
         // add our actor to the renderer
         renderer.AddActor(actor);
      }
   }
}