Difference between revisions of "VTK/Examples/Cxx/Images/ImageLuminance"

From KitwarePublic
< VTK‎ | Examples‎ | Cxx
Jump to navigationJump to search
(add description, mostly from http://www.vtk.org/pipermail/vtkusers/2010-July/061595.html)
Line 1: Line 1:
 
<div class="floatright">[[File:VTK_Examples_Baseline_Images_TestImageLuminance.png|400px]]</div>
 
<div class="floatright">[[File:VTK_Examples_Baseline_Images_TestImageLuminance.png|400px]]</div>
 +
 +
There are two ways to convert images to greyscale:
 +
* {{class|vtkImageLuminance}} uses the [[wikipedia:Luma (video)|luminance equation]] for properly weighting the R, G, and B components
 +
* {{class|vtkImageMagnitude}} does a simple sum-of-squares computation of the components (i.e. the [[wikipedia:Magnitude (mathematics)#Euclidean vector space|Euclidean norm]] -- not the [[wikipedia:Root mean square|quadratic mean]]!)
 +
 +
These filters are meant for different things.  For RGB, you usually want to use luminance because in the RGB colorspace, G has slightly higher luminance than R, and both have much higher luminance than B.
 +
The vtkImageMagnitude filter is meant for use on vector images, not so much for RGB images.
 +
 +
For an example of usage of the vtkImageMagnitude filter, see [[../ImageMagnitude]].
 
==ImageLuminance.cxx==
 
==ImageLuminance.cxx==
 
<source lang="cpp">
 
<source lang="cpp">

Revision as of 11:33, 8 January 2016

VTK Examples Baseline Images TestImageLuminance.png

There are two ways to convert images to greyscale:

These filters are meant for different things. For RGB, you usually want to use luminance because in the RGB colorspace, G has slightly higher luminance than R, and both have much higher luminance than B. The vtkImageMagnitude filter is meant for use on vector images, not so much for RGB images.

For an example of usage of the vtkImageMagnitude filter, see VTK/Examples/Cxx/Images/ImageMagnitude.

ImageLuminance.cxx

#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkImageMapper3D.h>
#include <vtkJPEGWriter.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkImageLuminance.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkJPEGReader.h>
#include <vtkImageActor.h>
#include <vtkImageEllipsoidSource.h>
#include <vtkImageCast.h>

int main(int, char *[])
{
  // Create an image of a rectangle
  vtkSmartPointer<vtkImageCanvasSource2D> source =
    vtkSmartPointer<vtkImageCanvasSource2D>::New();
  source->SetScalarTypeToUnsignedChar();
  source->SetNumberOfScalarComponents(3);
  source->SetExtent(0, 200, 0, 200, 0, 0);

  // Clear the image
  source->SetDrawColor(0,0,0);
  source->FillBox(0,200,0,200);

  // Draw a red box
  source->SetDrawColor(255,0,0);
  source->FillBox(100,120,100,120);
  source->Update();

  vtkSmartPointer<vtkImageLuminance> luminanceFilter = 
      vtkSmartPointer<vtkImageLuminance>::New();
  luminanceFilter->SetInputConnection(source->GetOutputPort());
  luminanceFilter->Update();

  // Create actors
  vtkSmartPointer<vtkImageActor> originalActor =
    vtkSmartPointer<vtkImageActor>::New();
  originalActor->GetMapper()->SetInputConnection(
    source->GetOutputPort());

  vtkSmartPointer<vtkImageActor> luminanceActor =
    vtkSmartPointer<vtkImageActor>::New();
  luminanceActor->GetMapper()->SetInputConnection(
    luminanceFilter->GetOutputPort());

  // Define viewport ranges
  // (xmin, ymin, xmax, ymax)
  double originalViewport[4] = {0.0, 0.0, 0.5, 1.0};
  double luminanceViewport[4] = {0.5, 0.0, 1.0, 1.0};

  // Setup renderers
  vtkSmartPointer<vtkRenderer> originalRenderer =
    vtkSmartPointer<vtkRenderer>::New();
  originalRenderer->SetViewport(originalViewport);
  originalRenderer->AddActor(originalActor);
  originalRenderer->ResetCamera();
  originalRenderer->SetBackground(.4, .5, .6);

  vtkSmartPointer<vtkRenderer> luminanceRenderer =
    vtkSmartPointer<vtkRenderer>::New();
  luminanceRenderer->SetViewport(luminanceViewport);
  luminanceRenderer->AddActor(luminanceActor);
  luminanceRenderer->ResetCamera();
  luminanceRenderer->SetBackground(.4, .5, .7);

  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->SetSize(600, 300);
  renderWindow->AddRenderer(originalRenderer);
  renderWindow->AddRenderer(luminanceRenderer);

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

  renderWindowInteractor->SetInteractorStyle(style);

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

  renderWindowInteractor->Start();
  return EXIT_SUCCESS;
}

Please try the new VTKExamples website.

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

PROJECT(ImageLuminance)

find_package(VTK REQUIRED)
include(${VTK_USE_FILE})

add_executable(ImageLuminance MACOSX_BUNDLE ImageLuminance.cxx)

if(VTK_LIBRARIES)
  target_link_libraries(ImageLuminance ${VTK_LIBRARIES})
else()
  target_link_libraries(ImageLuminance vtkHybrid vtkWidgets)
endif()

Download and Build ImageLuminance

Click here to download ImageLuminance. and its CMakeLists.txt file.

Once the tarball ImageLuminance.tar has been downloaded and extracted,

cd ImageLuminance/build 
  • If VTK is installed:
cmake ..
  • If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:
cmake -DVTK_DIR:PATH=/home/me/vtk_build ..

Build the project:

make

and run it:

./ImageLuminance

WINDOWS USERS PLEASE NOTE: Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.