ITK/Examples/EdgesAndGradients/BinaryContourImageFilter
This example demonstrates how to find the edges of binary blobs in an image. An example image with two solid white rectangles is programmatically created. This original image and the blob outlines are displayed.
BinaryContourImageFilter.cxx
<source lang="cpp">
- include "itkImage.h"
- include "itkImageFileWriter.h"
- include "itkBinaryContourImageFilter.h"
- include "itkRescaleIntensityImageFilter.h"
- include "itkImageToVTKImageFilter.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;
static void CreateImage(ImageType::Pointer image);
int main(int, char *[]) {
ImageType::Pointer image = ImageType::New(); CreateImage(image);
typedef itk::BinaryContourImageFilter <ImageType, ImageType > binaryContourImageFilterType;
binaryContourImageFilterType::Pointer binaryContourFilter = binaryContourImageFilterType::New (); binaryContourFilter->SetInput(image); binaryContourFilter->Update();
typedef itk::RescaleIntensityImageFilter< ImageType, ImageType > RescaleFilterType; RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New(); rescaleFilter->SetOutputMinimum(0); rescaleFilter->SetOutputMaximum(255); rescaleFilter->SetInput(binaryContourFilter->GetOutput());
typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType; ConnectorType::Pointer originalConnector = ConnectorType::New();
originalConnector->SetInput(image);
vtkSmartPointer<vtkImageActor> originalActor = vtkSmartPointer<vtkImageActor>::New(); originalActor->SetInput(originalConnector->GetOutput());
ConnectorType::Pointer boundaryConnector = ConnectorType::New(); boundaryConnector->SetInput(rescaleFilter->GetOutput());
vtkSmartPointer<vtkImageActor> boundaryActor = vtkSmartPointer<vtkImageActor>::New(); boundaryActor->SetInput(boundaryConnector->GetOutput());
// There will be one render window vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->SetSize(600, 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.5, 1.0}; double rightViewport[4] = {0.5, 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);
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); rightRenderer->AddActor(boundaryActor);
leftRenderer->ResetCamera(); rightRenderer->ResetCamera();
renderWindow->Render();
vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
interactor->SetInteractorStyle(style);
interactor->Start();
return EXIT_SUCCESS;
}
void CreateImage(ImageType::Pointer image) {
// Create an image with 2 connected components ImageType::RegionType region; ImageType::IndexType start; start[0] = 0; start[1] = 0;
ImageType::SizeType size; unsigned int NumRows = 200; unsigned int NumCols = 300; size[0] = NumRows; size[1] = NumCols;
region.SetSize(size); region.SetIndex(start);
image->SetRegions(region); image->Allocate();
// Make a square for(unsigned int r = 20; r < 80; r++) { for(unsigned int c = 30; c < 100; c++) { ImageType::IndexType pixelIndex; pixelIndex[0] = r; pixelIndex[1] = c;
image->SetPixel(pixelIndex, 255); } }
// Make another square for(unsigned int r = 100; r < 130; r++) { for(unsigned int c = 115; c < 160; c++) { ImageType::IndexType pixelIndex; pixelIndex[0] = r; pixelIndex[1] = c;
image->SetPixel(pixelIndex, 255); } }
} </source>
CMakeLists.txt
<source lang="cmake"> cmake_minimum_required(VERSION 2.6)
PROJECT(BinaryContourImageFilter)
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(BinaryContourImageFilter BinaryContourImageFilter.cxx) TARGET_LINK_LIBRARIES(BinaryContourImageFilter vtkHybrid ITKBasicFilters ITKCommon ITKIO) </source>