ITK/Examples/ImageProcessing/MaskImageFilter: Difference between revisions

From KitwarePublic
< ITK‎ | Examples
Jump to navigationJump to search
mNo edit summary
(Use QuickView.)
Line 8: Line 8:
#include "itkImageFileReader.h"
#include "itkImageFileReader.h"
#include "itkMaskImageFilter.h"
#include "itkMaskImageFilter.h"
#include "itkRescaleIntensityImageFilter.h"


#include <itkImageToVTKImageFilter.h>
#include "QuickView.h"
 
#include "vtkImageViewer.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkSmartPointer.h"
#include "vtkImageActor.h"
#include "vtkInteractorStyleImage.h"
#include "vtkRenderer.h"


typedef itk::Image<unsigned char, 2>  ImageType;
typedef itk::Image<unsigned char, 2>  ImageType;


void CreateHalfMask(ImageType::Pointer image, ImageType::Pointer mask);
void CreateHalfMask(ImageType::Pointer image, ImageType::Pointer &mask);


int main(int argc, char *argv[])
int main(int argc, char *argv[])
Line 27: Line 19:
   if(argc < 2)
   if(argc < 2)
     {
     {
     std::cerr << "Required: filename" << std::endl;
     std::cerr << "Usage: " << argv[0] << " filename" << std::endl;
     return EXIT_FAILURE;
     return EXIT_FAILURE;
     }
     }
Line 43: Line 35:
   maskFilter->SetInput1(reader->GetOutput());
   maskFilter->SetInput1(reader->GetOutput());
   maskFilter->SetInput2(mask);
   maskFilter->SetInput2(mask);
   maskFilter->Update();;
   mask->Print(std::cout);
 
   QuickView viewer;
  // Visualize original image
   viewer.AddImage(
  typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
     reader->GetOutput(),true,
 
     itksys::SystemTools::GetFilenameName(argv[1]));
  ConnectorType::Pointer originalConnector = ConnectorType::New();
  originalConnector->SetInput(reader->GetOutput());
  vtkSmartPointer<vtkImageActor> originalActor =
    vtkSmartPointer<vtkImageActor>::New();
  originalActor->SetInput(originalConnector->GetOutput());
 
  // Visualize mask image
  typedef itk::RescaleIntensityImageFilter< ImageType, ImageType > RescaleFilterType;
  RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New();
  rescaleFilter->SetInput(mask);
  rescaleFilter->SetOutputMinimum(0);
  rescaleFilter->SetOutputMaximum(255);
 
  ConnectorType::Pointer maskConnector = ConnectorType::New();
   maskConnector->SetInput(rescaleFilter->GetOutput());
 
   vtkSmartPointer<vtkImageActor> maskActor =
    vtkSmartPointer<vtkImageActor>::New();
  maskActor->SetInput(maskConnector->GetOutput());
 
  // Visualize masked image
  ConnectorType::Pointer maskedConnector = ConnectorType::New();
  maskedConnector->SetInput(maskFilter->GetOutput());
 
  vtkSmartPointer<vtkImageActor> maskedActor =
     vtkSmartPointer<vtkImageActor>::New();
  maskedActor->SetInput(maskedConnector->GetOutput());
 
 
  // There will be one render window
  vtkSmartPointer<vtkRenderWindow> renderWindow =
     vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->SetSize(900, 300);
 
  vtkSmartPointer<vtkRenderWindowInteractor> interactor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  interactor->SetRenderWindow(renderWindow);
 
  // Define viewport ranges
  // (xmin, ymin, xmax, ymax)
  double leftViewport[4] = {0.0, 0.0, 0.33, 1.0};
  double centerViewport[4] = {0.33, 0.0, 0.66, 1.0};
  double rightViewport[4] = {0.66, 0.0, 1.0, 1.0};
 
  // Setup both renderers
  vtkSmartPointer<vtkRenderer> leftRenderer =
    vtkSmartPointer<vtkRenderer>::New();
  renderWindow->AddRenderer(leftRenderer);
  leftRenderer->SetViewport(leftViewport);
  leftRenderer->SetBackground(.6, .5, .4);
 
  // Setup both renderers
  vtkSmartPointer<vtkRenderer> centerRenderer =
    vtkSmartPointer<vtkRenderer>::New();
  renderWindow->AddRenderer(centerRenderer);
  centerRenderer->SetViewport(centerViewport);
  centerRenderer->SetBackground(.6, .5, .4);
 
  vtkSmartPointer<vtkRenderer> rightRenderer =
    vtkSmartPointer<vtkRenderer>::New();
  renderWindow->AddRenderer(rightRenderer);
  rightRenderer->SetViewport(rightViewport);
  rightRenderer->SetBackground(.4, .5, .6);
 
  // Add the sphere to the left and the cube to the right
  leftRenderer->AddActor(originalActor);
  centerRenderer->AddActor(maskActor);
  rightRenderer->AddActor(maskedActor);
 
  leftRenderer->ResetCamera();
  centerRenderer->ResetCamera();
  rightRenderer->ResetCamera();
 
  renderWindow->Render();


   vtkSmartPointer<vtkInteractorStyleImage> style =
   std::stringstream desc;
     vtkSmartPointer<vtkInteractorStyleImage>::New();
  desc << "Mask";
  viewer.AddImage(
    mask.GetPointer(),
     true,
    desc.str());


   interactor->SetInteractorStyle(style);
   std::stringstream desc2;
  desc2 << "MaskFilter";
  viewer.AddImage(
    maskFilter->GetOutput(),
    true,
    desc2.str());


   interactor->Start();
   viewer.Visualize();


   return EXIT_SUCCESS;
   return EXIT_SUCCESS;
Line 134: Line 61:




void CreateHalfMask(ImageType::Pointer image, ImageType::Pointer mask)
void CreateHalfMask(ImageType::Pointer image, ImageType::Pointer &mask)
{
{
   ImageType::RegionType region = image->GetLargestPossibleRegion();
   ImageType::RegionType region = image->GetLargestPossibleRegion();
Line 154: Line 81:
       else
       else
         {
         {
         imageIterator.Set(1);
         imageIterator.Set(255);
         }
         }



Revision as of 21:14, 21 December 2010

This example shows how to mask an image with a binary mask. Pixels in the original image where the mask is non zero will remain the same. Pixels in the original image where the mask is equal to zero will be set to the "outside" value.

The output shows the input image, the mask, and the masked output image.

MaskImageFilter.cxx

<source lang="cpp">

  1. include "itkImage.h"
  2. include "itkImageFileReader.h"
  3. include "itkMaskImageFilter.h"
  1. include "QuickView.h"

typedef itk::Image<unsigned char, 2> ImageType;

void CreateHalfMask(ImageType::Pointer image, ImageType::Pointer &mask);

int main(int argc, char *argv[]) {

 if(argc < 2)
   {
   std::cerr << "Usage: " << argv[0] << " filename" << std::endl;
   return EXIT_FAILURE;
   }
 typedef itk::ImageFileReader<ImageType> ReaderType;
 ReaderType::Pointer reader = ReaderType::New();
 reader->SetFileName(argv[1]);
 reader->Update();
 ImageType::Pointer mask = ImageType::New();
 CreateHalfMask(reader->GetOutput(), mask);
 
 typedef itk::MaskImageFilter< ImageType, ImageType > MaskFilterType;
 MaskFilterType::Pointer maskFilter = MaskFilterType::New();
 maskFilter->SetInput1(reader->GetOutput());
 maskFilter->SetInput2(mask);
 mask->Print(std::cout);
 QuickView viewer;
 viewer.AddImage(
   reader->GetOutput(),true,
   itksys::SystemTools::GetFilenameName(argv[1]));  
 std::stringstream desc;
 desc << "Mask";
 viewer.AddImage(
   mask.GetPointer(),
   true,
   desc.str());  
 std::stringstream desc2;
 desc2 << "MaskFilter";
 viewer.AddImage(
   maskFilter->GetOutput(),
   true,
   desc2.str());  
 viewer.Visualize();
 return EXIT_SUCCESS;

}


void CreateHalfMask(ImageType::Pointer image, ImageType::Pointer &mask) {

 ImageType::RegionType region = image->GetLargestPossibleRegion();
 
 mask->SetRegions(region);
 mask->Allocate();
 ImageType::SizeType regionSize = region.GetSize();
 itk::ImageRegionIterator<ImageType> imageIterator(mask,region);
 // Make the left half of the mask white and the right half black
 while(!imageIterator.IsAtEnd())
 {
   if(imageIterator.GetIndex()[0] > regionSize[0] / 2)
       {
       imageIterator.Set(0);
       }
     else
       {
       imageIterator.Set(255);
       }
   ++imageIterator;
 }

} </source>

CMakeLists.txt

<source lang="cmake"> cmake_minimum_required(VERSION 2.6)

PROJECT(MaskImageFilter)

include_directories(/home/doriad/src/ITK/Wrapping/WrapITK/ExternalProjects/ItkVtkGlue/src/)

FIND_PACKAGE(VTK REQUIRED) INCLUDE(${VTK_USE_FILE})

FIND_PACKAGE(ITK REQUIRED) INCLUDE(${ITK_USE_FILE})

ADD_EXECUTABLE(MaskImageFilter MaskImageFilter.cxx) TARGET_LINK_LIBRARIES(MaskImageFilter vtkHybrid ITKIO ITKBasicFilters ITKCommon )


</source>