diff --git a/Examples/FeatureExtraction/SeamCarvingExample.cxx b/Examples/FeatureExtraction/SeamCarvingExample.cxx index 1900fe3f4f4f32edce9abe9f864d2d291f3ef92f..f36de07050e0bc5b921fcc222cd98bb304cff8c6 100644 --- a/Examples/FeatureExtraction/SeamCarvingExample.cxx +++ b/Examples/FeatureExtraction/SeamCarvingExample.cxx @@ -29,7 +29,10 @@ // This example illustrates the details of the seam carving operation. // References to this method can be found in \cite{Avidan07}. This example // details the use of \doxygen{otb}{ImageToCarvingPathFilter} and -// \doxygen{otb}{RemoveCarvingPathFilter}. +// \doxygen{otb}{RemoveCarvingPathFilter}. +// +// In this example, a loop is defined to remove a vertical or horizontal seam +// at each step of the algorithm. The seam with the minimum energy is chosen. // // Software Guide : EndLatex @@ -67,7 +70,8 @@ int main(int argc, char ** argv) typedef otb::ImageFileReader< ImageType > ReaderType; typedef otb::ImageFileWriter< OutputImageType > WriterType; - typedef itk::RescaleIntensityImageFilter<ImageType, OutputImageType> RescalerType; + typedef itk::RescaleIntensityImageFilter + <ImageType, OutputImageType> RescalerType; ReaderType::Pointer reader = ReaderType::New(); WriterType::Pointer writer = WriterType::New(); @@ -95,9 +99,9 @@ int main(int argc, char ** argv) // Software Guide : BeginLatex // - // The \doxygen{otb}{ImageToCarvingPathFilter} compute the path of minimum energy - // according to lines or columns of the image. Later, as we will choose the best option - // between the two, we need two of these filters. + // The \doxygen{otb}{ImageToCarvingPathFilter} compute the seam of minimum + // energy according to lines or columns of the image. Later, as we will + // choose the best option between the two, we need two of these filters. // // Software Guide : EndLatex @@ -109,20 +113,39 @@ int main(int argc, char ** argv) // Software Guide : BeginLatex // - // The \doxygen{otb}{RemoveCarvingPathFilter} will really resize the image deleting - // the path. + // The \doxygen{otb}{RemoveCarvingPathFilter} will really resize the image + // deleting the path. // // Software Guide : EndLatex // Software Guide : BeginCodeSnippet typedef otb::RemoveCarvingPathFilter <ImageType, PathType, ImageType> RemoveCarvingPathFilterType; - RemoveCarvingPathFilterType::Pointer removeCarvingPath = RemoveCarvingPathFilterType::New(); + RemoveCarvingPathFilterType::Pointer removeCarvingPath = + RemoveCarvingPathFilterType::New(); // Software Guide : EndCodeSnippet + // Software Guide : BeginLatex + // + // As we are going to iterate through the filters, we need to disconnect the + // pipeline at one point and store the image somewhere. For that purpose, we + // use an \doxygen{itk}{ImageDuplicator} + // + // Software Guide : EndLatex + // Software Guide : BeginCodeSnippet typedef itk::ImageDuplicator< ImageType > duplicatorType; duplicatorType::Pointer duplicator = duplicatorType::New(); + // Software Guide : EndCodeSnippet + + // Software Guide : BeginLatex + // + // Now that all elements have been instanciated, we start to plug the pipeline + // and to define the loop. + // + // Software Guide : EndLatex + + // Software Guide : BeginCodeSnippet reader->Update(); duplicator->SetInputImage(reader->GetOutput()); duplicator->Update(); @@ -135,7 +158,19 @@ int main(int argc, char ** argv) gradient->SetInput( duplicator->GetOutput() ); + // Software Guide : EndCodeSnippet + + // Software Guide : BeginLatex + // + // Two carving filters processed the gradient image to find the minimum + // vertical seam and the minimum horizontal seam. Note that the + // \code{UpdateLargestPossibleRegion()} need to be used as the size of the + // input image will be different in each loop. + // + // Software Guide : EndLatex + + // Software Guide : BeginCodeSnippet carvingFilterVert->SetInput( gradient->GetOutput() ); carvingFilterVert->SetDirection(0); carvingFilterVert->UpdateLargestPossibleRegion(); @@ -145,7 +180,16 @@ int main(int argc, char ** argv) carvingFilterHor->SetDirection(1); carvingFilterHor->UpdateLargestPossibleRegion(); energyHor = carvingFilterHor->GetEnergyPerPix(); + // Software Guide : EndCodeSnippet + + + // Software Guide : BeginLatex + // + // The vertical or the horizontal seam with the minimal energy is chosen. + // + // Software Guide : EndLatex + // Software Guide : BeginCodeSnippet if (energyVert < energyHor) { removeCarvingPath->SetInput( duplicator->GetOutput() ); @@ -160,17 +204,32 @@ int main(int argc, char ** argv) removeCarvingPath->SetDirection(1); removeCarvingPath->UpdateLargestPossibleRegion(); } + // Software Guide : EndCodeSnippet + + // Software Guide : BeginLatex + // + // The duplicator filter keep the results for the next loop + // + // Software Guide : EndLatex + // Software Guide : BeginCodeSnippet duplicator->SetInputImage(removeCarvingPath->GetOutput()); duplicator->Update(); } + // Software Guide : EndCodeSnippet + // Software Guide : BeginLatex + // + // Finally, the resulting image is saved on an image file as usual + // + // Software Guide : EndLatex + // Software Guide : BeginCodeSnippet rescaler->SetInput( duplicator->GetOutput() ); writer->SetInput( rescaler->GetOutput() ); writer->Update(); - + // Software Guide : EndCodeSnippet return EXIT_SUCCESS; }