diff --git a/Examples/DisparityMap/SIFTDisparityMapEstimation.cxx b/Examples/DisparityMap/SIFTDisparityMapEstimation.cxx index 012a7584928fa4f5e55dd80fe7fcfe39d5400cc3..7a96128519c783cd7ecf56e197e7a8d82256e921 100644 --- a/Examples/DisparityMap/SIFTDisparityMapEstimation.cxx +++ b/Examples/DisparityMap/SIFTDisparityMapEstimation.cxx @@ -25,7 +25,7 @@ // Software Guide : BeginCommandLineArgs // INPUTS: {ROI_IKO_PAN_LesHalles_pos_spacing.tif}, {ROI_IKO_PAN_LesHalles_warped_pos_spacing.tif} -// OUTPUTS: {SIFTdeformationFieldOutput.png},{SIFTresampledMovingOutput.png} +// OUTPUTS: {SIFTdeformationFieldOutput.png} // Software Guide : EndCommandLineArgs // Software Guide : BeginLatex @@ -61,14 +61,14 @@ #include "otbImageFileWriter.h" #include "itkRescaleIntensityImageFilter.h" #include "itkPointSet.h" - +#include "otbMultiToMonoChannelExtractROI.h" int main (int argc, char* argv[]) { - if(argc!= 5) + if(argc!= 4) { std::cerr <<"Usage: "<<argv[0]; - std::cerr<<"fixedFileName movingFileName fieldOutName imageOutName " << std::endl; + std::cerr<<"fixedFileName movingFileName fieldOutName" << std::endl; return EXIT_FAILURE; } @@ -207,19 +207,31 @@ int main (int argc, char* argv[]) double secondOrderThreshold = 0.5; bool useBackMatching = 0; - filter1->SetInput( fixedReader->GetOutput() ); - filter2->SetInput( movingReader->GetOutput() ); + filter1->SetInput(0, fixedReader->GetOutput() ); + filter1->SetNumberOfScales(3); + filter2->SetInput(0, movingReader->GetOutput() ); + filter2->SetNumberOfScales(3); + euclideanMatcher->SetInput1(filter1->GetOutput()); euclideanMatcher->SetInput2(filter2->GetOutput()); euclideanMatcher->SetDistanceThreshold(secondOrderThreshold); euclideanMatcher->SetUseBackMatching(useBackMatching); + euclideanMatcher->Update(); + // Software Guide : EndCodeSnippet + // Software Guide : BeginLatex + // + // The matched points will be stored into a landmark list. + // + // Software Guide : EndLatex - LandmarkListType::Pointer landmarkList; + // Software Guide : BeginCodeSnippet - euclideanMatcher->Update(); + LandmarkListType::Pointer landmarkList; + landmarkList = euclideanMatcher->GetOutput(); - MatchVectorType trueSecondOrder; + // Software Guide : EndCodeSnippet + MatchVectorType trueSecondOrder; for(LandmarkListType::Iterator it = landmarkList->Begin(); it != landmarkList->End();++it) { @@ -286,9 +298,17 @@ int main (int argc, char* argv[]) } + // Software Guide : BeginLatex + // + // The landmarks are used for building a deformation field. The + // deformation field is an image of vectors created by the + // \doxygen{itk}{DeformationFieldSource} class. + // + // Software Guide : EndLatex - typedef float VectorComponentType; - typedef itk::Vector< VectorComponentType, Dimension > VectorType; + // Software Guide : BeginCodeSnippet + + typedef itk::Vector< RealType, Dimension > VectorType; typedef otb::Image< VectorType, Dimension > DeformationFieldType; typedef itk::DeformationFieldSource< @@ -297,6 +317,14 @@ int main (int argc, char* argv[]) DeformationSourceType::Pointer deformer = DeformationSourceType::New(); + // Software Guide : EndCodeSnippet +// Software Guide : BeginLatex + // + // The deformation field needs information about the extent and + // spacing of the images on which it is defined. + // + // Software Guide : EndLatex + ImageType::ConstPointer fixedImage = fixedReader->GetOutput(); @@ -304,6 +332,15 @@ int main (int argc, char* argv[]) deformer->SetOutputOrigin( fixedImage->GetOrigin() ); deformer->SetOutputRegion( fixedImage->GetLargestPossibleRegion() ); + + // Software Guide : EndCodeSnippet +// Software Guide : BeginLatex + // + // We will need some intermediate variables in order to pass the + // matched SIFTs to the deformation field source. + // + // Software Guide : EndLatex + typedef DeformationSourceType::LandmarkContainerPointer LandmarkContainerPointer; typedef DeformationSourceType::LandmarkContainer @@ -316,6 +353,14 @@ int main (int argc, char* argv[]) LandmarkPointType sourcePoint; LandmarkPointType targetPoint; +// Software Guide : EndCodeSnippet +// Software Guide : BeginLatex + // + // We can now iterate through the list of matched points and store + // them in the intermediate landmark sets. + // + // Software Guide : EndLatex + unsigned int pointId = 0; @@ -336,79 +381,84 @@ int main (int argc, char* argv[]) sourceLandmarks->InsertElement( pointId, sourcePoint ); targetLandmarks->InsertElement( pointId, targetPoint ); + std::cout << sourcePoint << " " << targetPoint << std::endl; + ++pointId; } +// Software Guide : EndCodeSnippet +// Software Guide : BeginLatex + // + // We pass the landmarks to the deformer and we run it. + // + // Software Guide : EndLatex deformer->SetSourceLandmarks( sourceLandmarks.GetPointer() ); deformer->SetTargetLandmarks( targetLandmarks.GetPointer() ); - try - { - deformer->UpdateLargestPossibleRegion(); - } - catch( itk::ExceptionObject & excp ) - { - std::cerr << "Exception thrown " << std::endl; - std::cerr << excp << std::endl; - return EXIT_FAILURE; - } - + deformer->UpdateLargestPossibleRegion(); + DeformationFieldType::ConstPointer deformationField = deformer->GetOutput(); deformer->Update(); - std::cout << "Image Resampling" << std::endl; - typedef itk::WarpImageFilter< ImageType, - ImageType, - DeformationFieldType > FilterType; - - FilterType::Pointer warper = FilterType::New(); - - typedef itk::LinearInterpolateImageFunction< - ImageType, double > InterpolatorType; - - InterpolatorType::Pointer interpolator = InterpolatorType::New(); - - warper->SetInterpolator( interpolator ); - - - warper->SetOutputSpacing( deformationField->GetSpacing() ); - warper->SetOutputOrigin( deformationField->GetOrigin() ); - - warper->SetDeformationField( deformationField ); - - warper->SetInput( movingReader->GetOutput() ); + // Software Guide : EndCodeSnippet + + ImageType::Pointer outdf = ImageType::New(); + outdf->SetRegions(fixedReader->GetOutput()->GetLargestPossibleRegion()); + outdf->Allocate(); + + itk::ImageRegionIterator<ImageType> outIt(outdf,outdf->GetLargestPossibleRegion()); - typedef otb::ImageFileWriter< ImageType > WriterType; - WriterType::Pointer movingWriter = WriterType::New(); + itk::ImageRegionIterator<DeformationFieldType> inIt(deformer->GetOutput(),deformer->GetOutput()->GetLargestPossibleRegion()); + outIt.GoToBegin(); + inIt.GoToBegin(); - movingWriter->SetFileName( argv[6] ); - movingWriter->SetInput( warper->GetOutput() ); + while(!inIt.IsAtEnd() && !outIt.IsAtEnd()) + { + std::cout << inIt.Get() << std::endl; + + outIt.Set(inIt.Get()[1]); - - try - { - movingWriter->Update(); - } - catch( itk::ExceptionObject & excp ) - { - std::cerr << "Exception thrown " << std::endl; - std::cerr << excp << std::endl; - return EXIT_FAILURE; + ++inIt; + ++outIt; } - typedef otb::ImageFileWriter< DeformationFieldType > DeformationWriterType; + typedef itk::RescaleIntensityImageFilter< ImageType, + OutputImageType> RescaleType; - DeformationWriterType::Pointer defWriter = DeformationWriterType::New(); + RescaleType::Pointer rescaler = RescaleType::New(); + rescaler->SetInput( outdf ); + rescaler->SetOutputMinimum(0); + rescaler->SetOutputMaximum(255); - defWriter->SetFileName( "deformation.mhd" ); - defWriter->SetInput( deformationField ); - defWriter->Update(); - + typedef otb::ImageFileWriter< OutputImageType > WriterType; + WriterType::Pointer writer = WriterType::New(); + + writer->SetInput( rescaler->GetOutput() ); + writer->SetFileName( argv[3] ); + writer->Update(); + // Software Guide : BeginLatex + // + // Figure~\ref{fig:SIFTDME} shows the result of applying the SIFT + // disparity map estimation. Only the horizontal component of the + // deformation is shown. + // + // \begin{figure} + // \center + // \includegraphics[width=0.40\textwidth]{ROI_IKO_PAN_LesHalles_pos_spacing.eps} + // \includegraphics[width=0.40\textwidth]{ROI_IKO_PAN_LesHalles_warped_pos_spacing.eps} + // \includegraphics[width=0.40\textwidth]{SIFTdeformationFieldOutput.eps} + // \itkcaption[Deformation field from SIFT disparity map estimation]{From left + // to right and top to bottom: fixed input image, moving image with a sinusoid deformation, + // estimated deformation field in the horizontal direction.} + // \label{fig:SIFTDME} + // \end{figure} + // + // Software Guide : EndLatex return EXIT_SUCCESS;