ITK/Examples/Images/NormalizedCorrelationImageFilter: Difference between revisions
Daviddoria (talk | contribs) |
Daviddoria (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
Output is | Output neither the minimum nor maximum of the correlation image is the "correct" result (the pixel that we extracted the patch to correlate). | ||
==NormalizedCorrelationImageFilter.cxx== | ==NormalizedCorrelationImageFilter.cxx== | ||
<source lang="cpp"> | <source lang="cpp"> | ||
#include | #include "itkImage.h" | ||
#include | #include "itkImageFileReader.h" | ||
#include | #include "itkNormalizedCorrelationImageFilter.h" | ||
#include | #include "itkRegionOfInterestImageFilter.h" | ||
#include "itkImageKernelOperator.h" | |||
#include "itkRescaleIntensityImageFilter.h" | |||
#include "itkImageFileWriter.h" | |||
#include "itkMinimumMaximumImageCalculator.h" | |||
#include "QuickView.h" | |||
#include " | |||
#include " | |||
#include " | |||
#include " | |||
#include " | |||
#include <iostream> | #include <iostream> | ||
#include <string> | #include <string> | ||
typedef itk::Image<float, 2> FloatImageType; | |||
typedef itk::Image<unsigned char, 2> UnsignedCharImageType; | |||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||
Line 30: | Line 26: | ||
return EXIT_FAILURE; | return EXIT_FAILURE; | ||
} | } | ||
std::string filename = argv[1]; | std::string filename = argv[1]; | ||
typedef itk::ImageFileReader<FloatImageType> ReaderType; | typedef itk::ImageFileReader<FloatImageType> ReaderType; | ||
// Read the image | // Read the image | ||
ReaderType::Pointer reader = ReaderType::New(); | ReaderType::Pointer reader = ReaderType::New(); | ||
reader->SetFileName(filename.c_str()); | reader->SetFileName(filename.c_str()); | ||
reader->Update(); | |||
// Extract a small region | // Extract a small region | ||
typedef itk::RegionOfInterestImageFilter< FloatImageType, | typedef itk::RegionOfInterestImageFilter< FloatImageType, | ||
Line 61: | Line 42: | ||
ExtractFilterType::Pointer extractFilter = ExtractFilterType::New(); | ExtractFilterType::Pointer extractFilter = ExtractFilterType::New(); | ||
FloatImageType::IndexType start; | |||
start | start.Fill(50); | ||
FloatImageType::SizeType size; | |||
size | size.Fill(100); | ||
FloatImageType::RegionType desiredRegion(start,size); | |||
extractFilter->SetRegionOfInterest(desiredRegion); | extractFilter->SetRegionOfInterest(desiredRegion); | ||
extractFilter->SetInput(reader->GetOutput()); | extractFilter->SetInput(reader->GetOutput()); | ||
extractFilter->Update(); | |||
// Perform normalized correlation | // Perform normalized correlation | ||
// <input type, mask type (not used), output type> | // <input type, mask type (not used), output type> | ||
Line 93: | Line 60: | ||
itk::ImageKernelOperator<float> kernelOperator; | itk::ImageKernelOperator<float> kernelOperator; | ||
kernelOperator.SetImageKernel(extractFilter->GetOutput()); | kernelOperator.SetImageKernel(extractFilter->GetOutput()); | ||
kernelOperator.CreateToRadius(extractFilter->GetOutput()->GetLargestPossibleRegion().GetSize()); | |||
CorrelationFilterType::Pointer correlationFilter = CorrelationFilterType::New(); | CorrelationFilterType::Pointer correlationFilter = CorrelationFilterType::New(); | ||
correlationFilter->SetInput(reader->GetOutput()); | correlationFilter->SetInput(reader->GetOutput()); | ||
correlationFilter->SetTemplate(kernelOperator); | correlationFilter->SetTemplate(kernelOperator); | ||
correlationFilter->Update(); | |||
typedef itk::MinimumMaximumImageCalculator <FloatImageType> | |||
MinimumMaximumImageCalculatorType; | |||
MinimumMaximumImageCalculatorType::Pointer minimumMaximumImageCalculatorFilter | |||
= MinimumMaximumImageCalculatorType::New (); | |||
minimumMaximumImageCalculatorFilter->SetImage(correlationFilter->GetOutput()); | |||
minimumMaximumImageCalculatorFilter->Compute(); | |||
std::cout << "Maximum: " << minimumMaximumImageCalculatorFilter->GetIndexOfMaximum() << std::endl; | |||
std::cout << "Minimum: " << minimumMaximumImageCalculatorFilter->GetIndexOfMinimum() << std::endl; | |||
typedef itk::RescaleIntensityImageFilter< FloatImageType, UnsignedCharImageType > RescaleFilterType; | typedef itk::RescaleIntensityImageFilter< FloatImageType, UnsignedCharImageType > RescaleFilterType; | ||
typedef itk::ImageFileWriter<UnsignedCharImageType> WriterType; | |||
{ | |||
RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New(); | RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New(); | ||
rescaleFilter->SetInput(correlationFilter->GetOutput()); | rescaleFilter->SetInput(correlationFilter->GetOutput()); | ||
rescaleFilter->SetOutputMinimum(0); | rescaleFilter->SetOutputMinimum(0); | ||
rescaleFilter->SetOutputMaximum(255); | rescaleFilter->SetOutputMaximum(255); | ||
rescaleFilter->Update(); | |||
WriterType::Pointer writer = WriterType::New(); | |||
writer->SetInput(rescaleFilter->GetOutput()); | |||
writer->SetFileName("correlation.png"); | |||
writer->Update(); | |||
} | |||
{ | |||
RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New(); | |||
rescaleFilter->SetInput(extractFilter->GetOutput()); | |||
rescaleFilter->SetOutputMinimum(0); | |||
rescaleFilter->SetOutputMaximum(255); | |||
rescaleFilter->Update(); | |||
WriterType::Pointer writer = WriterType::New(); | |||
writer->SetInput(rescaleFilter->GetOutput()); | |||
writer->SetFileName("patch.png"); | |||
writer->Update(); | |||
} | |||
QuickView viewer; | |||
viewer.AddImage(reader->GetOutput()); | |||
viewer.AddImage(extractFilter->GetOutput()); | |||
viewer.AddImage(correlationFilter->GetOutput()); | |||
viewer.Visualize(); | |||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</source> | </source> | ||
Line 168: | Line 123: | ||
PROJECT(NormalizedCorrelationImageFilter) | PROJECT(NormalizedCorrelationImageFilter) | ||
include_directories(/home/doriad/ | include_directories(/home/doriad/ITKWikiExamples/ItkVtkGlue) | ||
FIND_PACKAGE(VTK REQUIRED) | FIND_PACKAGE(VTK REQUIRED) | ||
Line 176: | Line 131: | ||
INCLUDE(${ITK_USE_FILE}) | INCLUDE(${ITK_USE_FILE}) | ||
ADD_EXECUTABLE(NormalizedCorrelationImageFilter NormalizedCorrelationImageFilter.cpp) | ADD_EXECUTABLE(NormalizedCorrelationImageFilter NormalizedCorrelationImageFilter.cpp /home/doriad/ITKWikiExamples/ItkVtkGlue/QuickView.cxx) | ||
TARGET_LINK_LIBRARIES(NormalizedCorrelationImageFilter | TARGET_LINK_LIBRARIES(NormalizedCorrelationImageFilter | ||
vtkHybrid | vtkHybrid |
Revision as of 16:09, 3 February 2011
Output neither the minimum nor maximum of the correlation image is the "correct" result (the pixel that we extracted the patch to correlate).
NormalizedCorrelationImageFilter.cxx
<source lang="cpp">
- include "itkImage.h"
- include "itkImageFileReader.h"
- include "itkNormalizedCorrelationImageFilter.h"
- include "itkRegionOfInterestImageFilter.h"
- include "itkImageKernelOperator.h"
- include "itkRescaleIntensityImageFilter.h"
- include "itkImageFileWriter.h"
- include "itkMinimumMaximumImageCalculator.h"
- include "QuickView.h"
- include <iostream>
- include <string>
typedef itk::Image<float, 2> FloatImageType; typedef itk::Image<unsigned char, 2> UnsignedCharImageType;
int main(int argc, char *argv[]) {
if(argc < 2) { std::cerr << "Required: filename" << std::endl; return EXIT_FAILURE; } std::string filename = argv[1]; typedef itk::ImageFileReader<FloatImageType> ReaderType;
// Read the image ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(filename.c_str()); reader->Update(); // Extract a small region typedef itk::RegionOfInterestImageFilter< FloatImageType, FloatImageType > ExtractFilterType;
ExtractFilterType::Pointer extractFilter = ExtractFilterType::New();
FloatImageType::IndexType start; start.Fill(50);
FloatImageType::SizeType size; size.Fill(100);
FloatImageType::RegionType desiredRegion(start,size);
extractFilter->SetRegionOfInterest(desiredRegion); extractFilter->SetInput(reader->GetOutput()); extractFilter->Update(); // Perform normalized correlation // <input type, mask type (not used), output type> typedef itk::NormalizedCorrelationImageFilter<FloatImageType, FloatImageType, FloatImageType> CorrelationFilterType;
itk::ImageKernelOperator<float> kernelOperator; kernelOperator.SetImageKernel(extractFilter->GetOutput()); kernelOperator.CreateToRadius(extractFilter->GetOutput()->GetLargestPossibleRegion().GetSize()); CorrelationFilterType::Pointer correlationFilter = CorrelationFilterType::New(); correlationFilter->SetInput(reader->GetOutput()); correlationFilter->SetTemplate(kernelOperator); correlationFilter->Update();
typedef itk::MinimumMaximumImageCalculator <FloatImageType> MinimumMaximumImageCalculatorType;
MinimumMaximumImageCalculatorType::Pointer minimumMaximumImageCalculatorFilter = MinimumMaximumImageCalculatorType::New (); minimumMaximumImageCalculatorFilter->SetImage(correlationFilter->GetOutput()); minimumMaximumImageCalculatorFilter->Compute(); std::cout << "Maximum: " << minimumMaximumImageCalculatorFilter->GetIndexOfMaximum() << std::endl; std::cout << "Minimum: " << minimumMaximumImageCalculatorFilter->GetIndexOfMinimum() << std::endl;
typedef itk::RescaleIntensityImageFilter< FloatImageType, UnsignedCharImageType > RescaleFilterType; typedef itk::ImageFileWriter<UnsignedCharImageType> WriterType; { RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New(); rescaleFilter->SetInput(correlationFilter->GetOutput()); rescaleFilter->SetOutputMinimum(0); rescaleFilter->SetOutputMaximum(255); rescaleFilter->Update(); WriterType::Pointer writer = WriterType::New(); writer->SetInput(rescaleFilter->GetOutput()); writer->SetFileName("correlation.png"); writer->Update(); }
{ RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New(); rescaleFilter->SetInput(extractFilter->GetOutput()); rescaleFilter->SetOutputMinimum(0); rescaleFilter->SetOutputMaximum(255); rescaleFilter->Update(); WriterType::Pointer writer = WriterType::New(); writer->SetInput(rescaleFilter->GetOutput()); writer->SetFileName("patch.png"); writer->Update(); } QuickView viewer; viewer.AddImage(reader->GetOutput()); viewer.AddImage(extractFilter->GetOutput()); viewer.AddImage(correlationFilter->GetOutput()); viewer.Visualize();
return EXIT_SUCCESS;
}
</source>
CMakeLists.txt
<source lang="cmake"> cmake_minimum_required(VERSION 2.6)
PROJECT(NormalizedCorrelationImageFilter)
include_directories(/home/doriad/ITKWikiExamples/ItkVtkGlue)
FIND_PACKAGE(VTK REQUIRED) INCLUDE(${VTK_USE_FILE})
FIND_PACKAGE(ITK REQUIRED) INCLUDE(${ITK_USE_FILE})
ADD_EXECUTABLE(NormalizedCorrelationImageFilter NormalizedCorrelationImageFilter.cpp /home/doriad/ITKWikiExamples/ItkVtkGlue/QuickView.cxx) TARGET_LINK_LIBRARIES(NormalizedCorrelationImageFilter vtkHybrid ITKBasicFilters ITKCommon ITKIO)
</source>