Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
otb
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
David Youssefi
otb
Commits
02023c85
Commit
02023c85
authored
18 years ago
by
Jordi Inglada
Browse files
Options
Downloads
Patches
Plain Diff
Ajout exemple classif image
parent
3f838c55
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
Examples/Learning/SVMImageClassificationExample.cxx
+389
-0
389 additions, 0 deletions
Examples/Learning/SVMImageClassificationExample.cxx
with
389 additions
and
0 deletions
Examples/Learning/SVMImageClassificationExample.cxx
0 → 100644
+
389
−
0
View file @
02023c85
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include
<fstream>
#include
"otbImageFileReader.h"
#include
"otbImageFileWriter.h"
#include
"itkImageRegionIterator.h"
#include
"itkRescaleIntensityImageFilter.h"
#include
"otbImage.h"
// Software Guide : BeginCommandLineArgs
// INPUTS: {ROI_QB_MUL_1.png}
// OUTPUTS: {ROI_QB_MUL_1_SVN_CLASS.png}
// ${OTB_SOURCE_DIR}/Examples/Data/svm_image_model.svm
// Software Guide : EndCommandLineArgs
// Software Guide : BeginLatex
// This example illustrates the use of the
// \doxygen{otb::SVMClassifier} class for performing SVM
// classification on images.
// In this example, we will use an SVM model estimated in the example
// of section \ref{sec:LearningWithImages}
// to separate between water and non-water pixels by using the RGB
// values only. The images used for this example are shown in
// figure~\ref{fig:SVMROIS}.
// The first thing to do is include the header file for the
// class. Since the \doxygen{otb::SVMClassifier} takes
// \doxygen{itk::ListSample}s as input, the class
// \doxygen{itk::PointSetToListAdaptor} is needed.\\
//
//
// Software Guide : EndLatex
#include
"itkImageToListAdaptor.h"
#include
"itkListSample.h"
#include
"otbSVMClassifier.h"
int
main
(
int
argc
,
char
*
argv
[]
)
{
namespace
stat
=
itk
::
Statistics
;
if
(
argc
!=
4
)
{
std
::
cout
<<
"Usage : "
<<
argv
[
0
]
<<
" inputImage outputImage modelFile "
<<
std
::
endl
;
return
EXIT_FAILURE
;
}
const
char
*
imageFilename
=
argv
[
1
];
const
char
*
modelFilename
=
argv
[
3
];
const
char
*
outputFilename
=
argv
[
2
];
// Software Guide : BeginLatex
//
// In the framework of supervised learning and classification, we will
// always use feature vectors for the characterization of the
// classes. On the other hand, the class labels are scalar
// values. Here, we start by defining the type of the features as the
// \code{PixelType}, which will be used to define the feature
// \code{VectorType}. We also declare the type for the labels.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef
double
PixelType
;
typedef
std
::
vector
<
PixelType
>
VectorType
;
typedef
int
LabelPixelType
;
// Software Guide : EndCodeSnippet
const
unsigned
int
Dimension
=
2
;
// Software Guide : BeginLatex
//
// We can now proceed to define the image type used for storing the
// features. We also define the reader.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef
otb
::
Image
<
itk
::
FixedArray
<
PixelType
,
3
>
,
Dimension
>
InputImageType
;
typedef
otb
::
ImageFileReader
<
InputImageType
>
ReaderType
;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We can now read the image by calling he \code{Update} method of the reader.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
ReaderType
::
Pointer
reader
=
ReaderType
::
New
();
reader
->
SetFileName
(
imageFilename
);
reader
->
Update
();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// The image has now to be transformed to a sample which
// is compatible with the classification framework. We will use a
// \doxygen{itk::Statistics::ImageToListAdaptor} for this
// task. This class is templated over the image type used for
// storing the measures.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef
itk
::
Statistics
::
ImageToListAdaptor
<
InputImageType
>
SampleType
;
SampleType
::
Pointer
sample
=
SampleType
::
New
();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// After instatiantion, we can set the image as an imput of our
// sample adaptor.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
sample
->
SetImage
(
reader
->
GetOutput
());
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Now, we need to declare the SVM model which is to be used by the
// classifier. The SVM model is templated over the type of value used
// for the measures and the type of pixel used for the labels.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef
otb
::
SVMModel
<
PixelType
,
LabelPixelType
>
ModelType
;
ModelType
::
Pointer
model
=
ModelType
::
New
();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// After instantiation, we can load a model saved to a file (see
// section \ref{sec:LearningWithImages} for an example of model
// estimation and storage to a file.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
model
->
LoadModel
(
modelFilename
);
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We have now all the elements to create a classifier. The classifier
// is templated over the sample type (the type of the data to be
// classified) and the label type (the type of the ouput of the classifier).
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef
otb
::
SVMClassifier
<
SampleType
,
LabelPixelType
>
ClassifierType
;
ClassifierType
::
Pointer
classifier
=
ClassifierType
::
New
()
;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We set the classifier parameters : number of classes, SVM model,
// the sample data. And we trigger the classification process by
// calling the \code{Update} method.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
int
numberOfClasses
=
model
->
GetNumberOfClasses
();
classifier
->
SetNumberOfClasses
(
numberOfClasses
)
;
classifier
->
SetModel
(
model
);
classifier
->
SetSample
(
sample
.
GetPointer
())
;
classifier
->
Update
()
;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// After the classification step, we usually want to get the
// results. The classifier gives an output under the form of a sample
// list. This list supports the classical STL iterators. Therefore, we
// will create an output image and fill it up with the results of the
// classification. The pixel type of the output image is the same as
// the one used for the labels.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef
ClassifierType
::
ClassLabelType
OutputPixelType
;
typedef
otb
::
Image
<
OutputPixelType
,
Dimension
>
OutputImageType
;
OutputImageType
::
Pointer
outputImage
=
OutputImageType
::
New
();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We allocate the memory for the outpu image using the information
// from the input image.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef
itk
::
Index
<
Dimension
>
myIndexType
;
typedef
itk
::
Size
<
Dimension
>
mySizeType
;
typedef
itk
::
ImageRegion
<
Dimension
>
myRegionType
;
mySizeType
size
;
size
[
0
]
=
reader
->
GetOutput
()
->
GetRequestedRegion
().
GetSize
()[
0
];
size
[
1
]
=
reader
->
GetOutput
()
->
GetRequestedRegion
().
GetSize
()[
1
];
myIndexType
start
;
start
[
0
]
=
0
;
start
[
1
]
=
0
;
myRegionType
region
;
region
.
SetIndex
(
start
);
region
.
SetSize
(
size
);
outputImage
->
SetRegions
(
region
);
outputImage
->
Allocate
();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We can now declare the interators on the list that we get at the
// output of the classifier as well as the iterator to fill the output image.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
ClassifierType
::
OutputType
*
membershipSample
=
classifier
->
GetOutput
()
;
ClassifierType
::
OutputType
::
ConstIterator
m_iter
=
membershipSample
->
Begin
()
;
ClassifierType
::
OutputType
::
ConstIterator
m_last
=
membershipSample
->
End
()
;
typedef
itk
::
ImageRegionIterator
<
OutputImageType
>
OutputIteratorType
;
OutputIteratorType
outIt
(
outputImage
,
outputImage
->
GetBufferedRegion
()
);
outIt
.
GoToBegin
();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We will iterate through the list, get the labels and assign pixel
// values to the output image.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
while
(
m_iter
!=
m_last
&&
!
outIt
.
IsAtEnd
())
{
outIt
.
Set
(
m_iter
.
GetClassLabel
());
++
m_iter
;
++
outIt
;
}
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Only for visualization purposes, we choose to rescale the image of
// classes before sving it to a file. We will use the
// \doxygen{itk::RescaleIntensityImageFilter} for this purpose.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef
otb
::
Image
<
unsigned
char
,
Dimension
>
FileImageType
;
typedef
itk
::
RescaleIntensityImageFilter
<
OutputImageType
,
FileImageType
>
RescalerType
;
RescalerType
::
Pointer
rescaler
=
RescalerType
::
New
();
rescaler
->
SetOutputMinimum
(
itk
::
NumericTraits
<
unsigned
char
>::
min
());
rescaler
->
SetOutputMaximum
(
itk
::
NumericTraits
<
unsigned
char
>::
max
());
rescaler
->
SetInput
(
outputImage
);
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We can now create an image file writer and save the image.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef
otb
::
ImageFileWriter
<
FileImageType
>
WriterType
;
WriterType
::
Pointer
writer
=
WriterType
::
New
();
writer
->
SetFileName
(
outputFilename
);
writer
->
SetInput
(
rescaler
->
GetOutput
()
);
writer
->
Update
();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
// Figure \ref{fig:SVMCLASS} shows the result of the SVM classification.
// \begin{figure}
// \center
// \includegraphics[width=0.35\textwidth]{ROI_QB_MUL_1.eps}
// \includegraphics[width=0.35\textwidth]{ROI_QB_MUL_1_SVN_CLASS.eps}
// \itkcaption[SVM Image Classification]{Result of the SVM
// classification . Left: RGB image. Right: image of classes.}
// \label{fig:SVMCLASS}
// \end{figure}
// Software Guide : EndLatex
return
EXIT_SUCCESS
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment