TextureExample.cxx 6.71 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
 *
 * This file is part of Orfeo Toolbox
 *
 *     https://www.orfeo-toolbox.org/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Jordi Inglada's avatar
Jordi Inglada committed
20

21

Jordi Inglada's avatar
Jordi Inglada committed
22

23
//  Software Guide : BeginCommandLineArgs
24 25
//    INPUTS: {ADS40RoiSmall.png}
//    OUTPUTS: {TextureOutput.tif}, {pretty_TextureOutput.png}
26 27 28
//    2 1 1
//  Software Guide : EndCommandLineArgs

29
#include "itkMacro.h"
30 31 32
#include "otbImage.h"
#include "otbImageFileReader.h"
#include "otbImageFileWriter.h"
Julien Michel's avatar
Julien Michel committed
33 34 35 36 37

// Pretty RGB output
#include "otbVectorImage.h"
#include "otbImageToVectorImageCastFilter.h"
#include "otbVectorRescaleIntensityImageFilter.h"
38

Jordi Inglada's avatar
Jordi Inglada committed
39 40
// Software Guide : BeginLatex
//
Julien Michel's avatar
Julien Michel committed
41
// The first step required to use the filter is to include the header file.
Jordi Inglada's avatar
Jordi Inglada committed
42 43 44 45
//
// Software Guide : EndLatex

// Software Guide : BeginCodeSnippet
Julien Michel's avatar
Julien Michel committed
46
#include "otbScalarImageToTexturesFilter.h"
Jordi Inglada's avatar
Jordi Inglada committed
47 48
// Software Guide : EndCodeSnippet

Jordi Inglada's avatar
Jordi Inglada committed
49 50 51
int main(int argc, char * argv[])
{
  // Parse command line parameters
OTB Bot's avatar
STYLE  
OTB Bot committed
52 53
  if (argc != 7)
    {
54
    std::cerr << "Usage: " << argv[0] << " <inputImage> ";
55
    std::cerr << " <outputImage> <outputRescaled> ";
56 57 58
    std::cerr << " <radius> <xOffset> <yOffset> ";
    std::cerr << std::endl;
    return EXIT_FAILURE;
OTB Bot's avatar
STYLE  
OTB Bot committed
59
    }
60

Jordi Inglada's avatar
Jordi Inglada committed
61 62
  const char* infname   = argv[1];
  const char* outfname  = argv[2];
63
  const char* outprettyfname  = argv[3];
Jordi Inglada's avatar
Jordi Inglada committed
64

65 66 67
  const unsigned int radius  =  static_cast<unsigned int>(atoi(argv[4]));
  const unsigned int xOffset =  static_cast<unsigned int>(atoi(argv[5]));
  const unsigned int yOffset =  static_cast<unsigned int>(atoi(argv[6]));
Jordi Inglada's avatar
Jordi Inglada committed
68

Jordi Inglada's avatar
Jordi Inglada committed
69
  typedef double PixelType;
Jordi Inglada's avatar
Jordi Inglada committed
70
  const int Dimension = 2;
OTB Bot's avatar
STYLE  
OTB Bot committed
71
  typedef otb::Image<PixelType, Dimension> ImageType;
Jordi Inglada's avatar
Jordi Inglada committed
72

73
  // Software Guide : BeginLatex
Julien Michel's avatar
Julien Michel committed
74 75 76 77 78 79
  //
  // After defining the types for the pixels and the images used in the
  // example, we define the types for the textures filter. It is
  // templated by the input and output image types.
  //
  // Software Guide : EndLatex
80 81

  // Software Guide : BeginCodeSnippet
Julien Michel's avatar
Julien Michel committed
82
  typedef otb::ScalarImageToTexturesFilter
OTB Bot's avatar
STYLE  
OTB Bot committed
83
  <ImageType, ImageType> TexturesFilterType;
84
  // Software Guide : EndCodeSnippet
85

OTB Bot's avatar
STYLE  
OTB Bot committed
86
  typedef otb::ImageFileReader<ImageType> ReaderType;
87
  typedef otb::ImageFileWriter<ImageType> WriterType;
88

Jordi Inglada's avatar
Jordi Inglada committed
89 90
  ReaderType::Pointer reader  = ReaderType::New();
  WriterType::Pointer writer = WriterType::New();
91

Jordi Inglada's avatar
Jordi Inglada committed
92 93 94
  reader->SetFileName(infname);
  writer->SetFileName(outfname);

OTB Bot's avatar
STYLE  
OTB Bot committed
95
  // Software Guide : BeginLatex
Julien Michel's avatar
Julien Michel committed
96 97 98 99
  //
  // We can now instantiate the filters.
  //
  // Software Guide : EndLatex
100 101

  // Software Guide : BeginCodeSnippet
Julien Michel's avatar
Julien Michel committed
102 103
  TexturesFilterType::Pointer texturesFilter
    = TexturesFilterType::New();
104 105 106 107
  // Software Guide : EndCodeSnippet

  // Software Guide : BeginLatex
  //
Julien Michel's avatar
Julien Michel committed
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
  // The texture filters takes at least 2 parameters: the radius of the
  // neighborhood on which the texture will be computed and the offset
  // used. Texture features are bivariate statistics, that is, they are
  // computed using pair of pixels. Each texture feature is defined for
  // an offset defining the pixel pair.
  //
  // The radius parameter can be passed to the filter as a scalar
  // parameter if the neighborhood is square, or as \code{SizeType} in
  // any case.
  //
  // The offset is always an array of N values, where N is the number of
  // dimensions of the image.
  //
  // Software Guide : EndLatex
  // Software Guide : BeginCodeSnippet
  typedef ImageType::SizeType SizeType;
  SizeType sradius;
  sradius.Fill(radius);

  texturesFilter->SetRadius(sradius);

OTB Bot's avatar
STYLE  
OTB Bot committed
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
  typedef ImageType::OffsetType OffsetType;
  OffsetType offset;
  offset[0] =  xOffset;
  offset[1] =  yOffset;

  texturesFilter->SetOffset(offset);
  // Software Guide : EndCodeSnippet

  // Software Guide : BeginLatex
  //
  // The textures filter will automatically derive the optimal
  // bin size for co-occurences histogram, but they need to know
  // the input image minimum and maximum. These values can be set
  // like this :
  // Software Guide : EndLatex
  // Software Guide : BeginCodeSnippet
  texturesFilter->SetInputImageMinimum(0);
  texturesFilter->SetInputImageMaximum(255);
  // Software Guide : EndCodeSnippet

  // Software Guide : BeginLatex
  //
  // To tune co-occurence histogram resolution, you can use
  // the SetNumberOfBinsPerAxis() method.
  //
  // Software Guide : EndLatex

  // Software Guide : BeginLatex
  //
  // We can now plug the pipeline.
  //
  // Software Guide : EndLatex
  // Software Guide : BeginCodeSnippet
  texturesFilter->SetInput(reader->GetOutput());

  writer->SetInput(texturesFilter->GetInertiaOutput());
  writer->Update();
  // Software Guide : EndCodeSnippet

  //  Software Guide : BeginLatex
  // Figure~\ref{fig:TEXTUREFUNCTOR} shows the result of applying
  // the contrast texture computation.
  // \begin{figure}
  // \center
  // \includegraphics[width=0.40\textwidth]{ADS40RoiSmall.eps}
  // \includegraphics[width=0.40\textwidth]{pretty_TextureOutput.eps}
  // \itkcaption[Results of applying Haralick contrast]{Result of applying the
  // \doxygen{otb}{ScalarImageToTexturesFilter} to an image. From left to right :
  // original image, contrast.}
  // \label{fig:TEXTUREFUNCTOR}
  // \end{figure}
  //
  //  Software Guide : EndLatex

  // Pretty image creation for printing

  typedef otb::VectorImage<double, 2>        VectorImageType;
  typedef otb::VectorImage<unsigned char, 2> PrettyVectorImageType;
  typedef otb::ImageFileWriter<PrettyVectorImageType>
  WriterPrettyOutputType;

  typedef otb::ImageToVectorImageCastFilter<ImageType, VectorImageType> VectorCastFilterType;
  typedef otb::VectorRescaleIntensityImageFilter<VectorImageType, PrettyVectorImageType>
  RescalerOutputType;

  RescalerOutputType::Pointer     outputRescaler     = RescalerOutputType::New();
  WriterPrettyOutputType::Pointer prettyOutputWriter =
OTB Bot's avatar
STYLE  
OTB Bot committed
196
    WriterPrettyOutputType::New();
OTB Bot's avatar
STYLE  
OTB Bot committed
197 198 199
  VectorCastFilterType::Pointer vectorCastFilter = VectorCastFilterType::New();
  vectorCastFilter->SetInput(texturesFilter->GetInertiaOutput());
  outputRescaler->SetInput(vectorCastFilter->GetOutput());
Julien Michel's avatar
Julien Michel committed
200

OTB Bot's avatar
STYLE  
OTB Bot committed
201 202 203
  PrettyVectorImageType::PixelType min(1), max(1);
  min.Fill(0);
  max.Fill(255);
Julien Michel's avatar
Julien Michel committed
204

OTB Bot's avatar
STYLE  
OTB Bot committed
205 206
  outputRescaler->SetOutputMinimum(min);
  outputRescaler->SetOutputMaximum(max);
Julien Michel's avatar
Julien Michel committed
207

OTB Bot's avatar
STYLE  
OTB Bot committed
208 209
  prettyOutputWriter->SetFileName(outprettyfname);
  prettyOutputWriter->SetInput(outputRescaler->GetOutput());
Julien Michel's avatar
Julien Michel committed
210

OTB Bot's avatar
STYLE  
OTB Bot committed
211 212
  prettyOutputWriter->Update();
  return EXIT_SUCCESS;
Jordi Inglada's avatar
Jordi Inglada committed
213
}