[vtkusers] Emulating Matlab imagesc() function in VTK

Nicholas Kinar n.kinar at usask.ca
Thu Aug 12 13:30:07 EDT 2010


> I am wondering if there is a way in VTK to render the elements of a 2D 
> array in a similar fashion to the Matlab imagesc() function.  Suppose 
> that I have a 1000-by-1000 array M of values.  In Matlab, calling 
> imagesc(M) will display a color-mapped image with the colors scaled to 
> the maximum and minimum numbers in the image.  Using the following 
> Matlab syntax will plot the 2D array with a colorbar:
>
> imagesc(M);
> colorbar;
>
> Is there a similar way to do this in VTK?  (I am currently working 
> with C++.)  In the past, I tried using vtkImageViewer2, but I remember 
> that I was not successful.  What would be an example pipeline (from 
> start to finish) that would allow me to plot a similar image in VTK?
>
> Since I am writing a Finite-Difference Time-Domain (FDTD) simulation, 
> I would like to progressively update the plot at each timestep so that 
> the user of the program can view an animation of how the simulation 
> progresses.  How would I dynamically update the plot at each timestep?
Well, I've been working on displaying the 2D data as an image.

I've written a function in C++ to try and and test the notion of 
displaying the values in a 2D matrix as an image.  This test function 
uses the Template Numerical Toolkit (TNT) to store the data in a 2D 
array.  The function load_matrix() is responsible for loading the data 
from file into the matrix object M.  The data is a 2D matrix object M 
which is then converted to a pointer **pm by the assignment pm = M.  
This is done due to the TNT Array2D object overloading the equality (=) 
operator.

The example compiles without errors and VTK opens a display window.  
However, I see nothing but "garbage data" in the display window.

Is there a way to assign data in a 2D array to a vtkImage?  Ultimately I 
would like to display this 2D array in a similar fashion to the Matlab 
imagesc() function.

Here is the code of the test function:

//BEGIN CODE
void test_VTK()
{
     std::string fileName = "M.txt";
     int Nx = 1000;
     int Ny = 1000;
     int PML_num = 20;

     int Nxp = Nx + 2 * PML_num;
     int Nyp = Ny + 2 * PML_num;

     TNT::Array2D<double> M(Nxp, Nyp);
     double **pm;
     load_matrix( fileName, &M );
     pm = M;  // convert object to pointer

    // Here variable pm contains the data from the 2D Array object
    // so it is similar to a 2D array in C

     vtkSmartPointer<vtkImageImport> import =
             vtkSmartPointer<vtkImageImport>::New();

     import->SetImportVoidPointer((void*)pm);
     import->SetWholeExtent(0,Nxp,0,Nyp,0,0);
     import->SetDataExtent(0,Nxp,0,Nyp,0,0);

     vtkSmartPointer<vtkLookupTable> lookupTable =
             vtkSmartPointer<vtkLookupTable>::New();

     vtkSmartPointer<vtkScalarBarActor> colorbar =
                 vtkSmartPointer<vtkScalarBarActor>::New();

     lookupTable->SetNumberOfColors(9344);
     lookupTable->SetTableRange(0,10);
     lookupTable->ForceBuild();

     colorbar->SetLookupTable(lookupTable);
     colorbar->SetWidth(0.05);
     colorbar->SetPosition(0.95, 0.1);
     colorbar->SetLabelFormat("%.3g");
     colorbar->PickableOff();
     colorbar->VisibilityOn();

     vtkSmartPointer<vtkImageViewer2> viewer =
              vtkSmartPointer<vtkImageViewer2>::New();
     viewer->SetInput(import->GetOutput());
     viewer->SetInput( import->GetOutput() );

     vtkSmartPointer<vtkRenderer> renderer =
           vtkSmartPointer<vtkRenderer>::New();
     renderer->AddActor ( viewer->GetImageActor() );
     renderer->AddActor(colorbar);
     renderer->ResetCamera();

     vtkSmartPointer<vtkRenderWindow> renderWindow =
           vtkSmartPointer<vtkRenderWindow>::New();
     renderWindow->AddRenderer ( renderer );

     vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
           vtkSmartPointer<vtkRenderWindowInteractor>::New();
     vtkSmartPointer<vtkInteractorStyleImage> style =
           vtkSmartPointer<vtkInteractorStyleImage>::New();
     renderWindowInteractor->SetInteractorStyle( style );

     renderWindowInteractor->SetRenderWindow ( renderWindow );
     renderWindowInteractor->Initialize();
     renderWindowInteractor->Start();

} // end function

// END CODE




















More information about the vtkusers mailing list