diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 78abd2944953322db73aae08520a65dd18d39af1..f0de6bfcd81f02792a9521b220cd7a30a5695ac2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,11 +5,12 @@
 # But Git fails to manage efficiently numerous LFS data.
 # We have to use directly git-lfs wrapping commands to have an
 # efficient cloning step.
-# Furthermore, Git-LFS and Gitlab sufer a bug preventing usage of 
+# Furthermore, Git-LFS and Gitlab sufer a bug preventing usage of
 # GIT_STRATEGY=fetch (https://gitlab.com/gitlab-org/gitlab-runner/issues/3318)
 
 variables:
-  BUILD_IMAGE_REGISTRY: $CI_REGISTRY/gbonnefille/otb-build-env
+  BUILD_IMAGE_REGISTRY: $CI_REGISTRY/orfeotoolbox/otb-build-env
+  GIT_CLONE_PATH: $CI_BUILDS_DIR/otb
   DOCKER_DRIVER: overlay2
   GIT_DEPTH: "3"
   # Disable automatic checkout to let us fetch LFS before
@@ -29,6 +30,8 @@ after_script:
   - python3 CI/cdash_handler.py $CI_COMMIT_SHA $CI_PROJECT_ID $CI_PROJECT_DIR $K8S_SECRET_CDASH
 
 stages:
+  - precheck
+  - prepare
   - build
 
 .general:
@@ -38,36 +41,92 @@ stages:
       - runner_system_failure
       - stuck_or_timeout_failure
 
-native-build:
+fast-build:
   extends: .general
-  only: [merge_requests]
-  stage: build
-  image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-native:18.04
+  only: [merge_requests, branches]
+  stage: precheck
+  image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-native-develop:latest
+  before_script:
+    - export GIT_LFS_SKIP_SMUDGE=1
+    - git checkout $CI_COMMIT_REF_NAME
+    - python3 CI/check_twin_pipelines.py
   script:
-    - ctest -VV -S CI/main_ci.cmake -DIMAGE_NAME:string=ubuntu-18.04-gcc
+    - ctest -V -S CI/main_ci.cmake -DIMAGE_NAME:string=ubuntu-18.04-fast
+    - ccache -s
 
-debian-build:
+.common-build:
   extends: .general
   only: [merge_requests]
   stage: build
+  dependencies: []
+
+debian-build:
+  extends: .common-build
   image: $BUILD_IMAGE_REGISTRY/otb-debian-native:unstable
   script:
-    - ctest -VV -S CI/main_ci.cmake -DIMAGE_NAME:string=debian-unstable-gcc
+    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_ci.cmake -DIMAGE_NAME:string=debian-unstable-gcc
 
-.common-build:
+ubuntu-llvm:
+  extends: .common-build
+  image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-native:18.04
+  script:
+    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_ci.cmake -DIMAGE_NAME:string=ubuntu-18.04-llvm
+  artifacts:
+    paths:
+      - build/CookBook-*-html.tar.gz
+      - build/Documentation/Cookbook/latex/CookBook-*.pdf
+      - build/Documentation/Doxygen/OTB-Doxygen-*.tar.bz2
+
+.common-prepare:
   extends: .general
-  stage: build
-  image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-shark:18.04
+  only: [merge_requests]
+  stage: prepare
+  before_script:
+# This override the previous before_script
+    - git checkout $CI_COMMIT_REF_NAME
+# We are now doing the git-lfs install
+# This is done after the checkout so we avoid downloading Data
+# But we need it to upload the archive
+    - git-lfs install
+    - git config --global user.email "otbbot@orfeo-toolbox.org"
+    - git config --global user.name "otbbot"
+    - eval $(ssh-agent -s)
+    - ssh-add <(echo "$K8S_SECRET_SSH")
+# This is for debug, we are checking the owner of the ssh key
+    - ssh -o StrictHostKeyChecking=no -T git@gitlab.orfeo-toolbox.org
+  after_script:
+    - echo "Nothing to do for after_script"
+  artifacts:
+    expire_in: 24 hrs
+    paths:
+      # This recovers logs from superbuild build
+      - build/*/*/*/*.log
+      - sb_branch.txt
+
+ubuntu-superbuild-prepare:
+  extends: .common-prepare
+  image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-superbuild-base:18.04
   script:
-    - ctest -VV -S CI/main_ci.cmake -DIMAGE_NAME:string=ubuntu-18.04-llvm-shark
+    - ctest -V -S CI/prepare_superbuild.cmake -DIMAGE_NAME:string=otb-ubuntu-superbuild-base
 
+centos-superbuild-prepare:
+  extends: .common-prepare
+  image: $BUILD_IMAGE_REGISTRY/otb-centos-superbuild-base:6.6
+  script:
+    - ctest -V -S CI/prepare_superbuild.cmake -DIMAGE_NAME:string=otb-centos-superbuild-base
 
-# This is needed to have only one pipeline in a merge request context
-ubuntu-llvm:
-  only: [merge_requests]
+ubuntu-superbuild-build:
   extends: .common-build
+  image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-superbuild-base:18.04
+  script:
+    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_superbuild.cmake -DIMAGE_NAME:string=otb-ubuntu-superbuild-base
+  dependencies:
+    - ubuntu-superbuild-prepare
 
-ubuntu-llvm-wip:
-  except: [merge_requests]
+centos-superbuild-build:
   extends: .common-build
-
+  image: $BUILD_IMAGE_REGISTRY/otb-centos-superbuild-base:6.6
+  script:
+    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_superbuild.cmake -DIMAGE_NAME:string=otb-centos-superbuild-base
+  dependencies:
+    - centos-superbuild-prepare
diff --git a/.gitlab/merge_request_templates/request_for_changes.md b/.gitlab/merge_request_templates/request_for_changes.md
index 31bf9cb52c20e5b67e82be1158a46b7bbd7ca268..79acdadae838587114d6aa593ddcf0a78a8ef3bd 100644
--- a/.gitlab/merge_request_templates/request_for_changes.md
+++ b/.gitlab/merge_request_templates/request_for_changes.md
@@ -45,3 +45,4 @@ The copyright owner is *COPYRIGHT OWNER (OR OWNER'S AGENT)* and has signed the O
 - The feature branch is (reasonably) up-to-date with the base branch
 - Dashboard is green
 - Copyright owner has signed the ORFEO ToolBox Contributor License Agreement
+- Optionally, run `git diff develop... -U0 --no-color | clang-format-diff.py -p1 -i` on latest changes and commit
diff --git a/CI/cdash_handler.py b/CI/cdash_handler.py
index 72a4f46c64e57b4a7c5835f99cee8a836d244a66..7a19d5a87f870f785565319d0dcd24dc47de6df4 100644
--- a/CI/cdash_handler.py
+++ b/CI/cdash_handler.py
@@ -26,6 +26,7 @@ import re
 import unittest
 import sys
 import json
+import time
 
 
 trace = False
@@ -168,7 +169,7 @@ class Handler:
       if key == "project":
         project = value
     if ( site == "" or stamp == "" or name == "" or project == ""):
-      print( "Not enougth argument given for buildid request \
+      print( "Missing argument for buildid request \
 site:"+site+", stamp:"+stamp+", name:"+name+", project:"+project+".")
       return
     buildid_api = "/api/v1/getbuildid.php?"
@@ -176,11 +177,18 @@ site:"+site+", stamp:"+stamp+", name:"+name+", project:"+project+".")
     full_url = self.url + buildid_api + buildid_params
     if trace:
       print("full_url: "+full_url)
-    response = urllib.request.urlopen(full_url).read().decode()
-    if trace:
-      print ( "response: " + response )
+    nb_try = 6
     build_id_regex = re.compile( "<buildid>([0-9]+)</buildid>" )
-    buildid = build_id_regex.search( response )
+    while nb_try:
+      response = urllib.request.urlopen(full_url).read().decode()
+      if trace:
+        print ( "response: " + response )
+      buildid = build_id_regex.search( response )
+      nb_try -= 1
+      if buildid or (nb_try == 0):
+        break
+      print("No build id, retry ...")
+      time.sleep(60)
     if buildid:
       self.buildid = buildid.group(1)
       if trace:
@@ -198,7 +206,7 @@ site:"+site+", stamp:"+stamp+", name:"+name+", project:"+project+".")
     if ( buildid == "" ):
       buildid = self.buildid
     if ( buildid == "" ):
-      print( "Not enougth argument given to build url")
+      print( "Missing argument to build url")
       return
     build_url = self.url
     build_url +="/buildSummary.php?"
@@ -212,7 +220,7 @@ site:"+site+", stamp:"+stamp+", name:"+name+", project:"+project+".")
     if ( buildid == "" ):
       buildid = self.buildid
     if ( buildid == "" ):
-      print( "Not enougth argument given to build Status")
+      print( "Missing argument to build Status")
       return
     full_url = self.url + "/api/v1/buildSummary.php?buildid=" + buildid
     response = urllib.request.urlopen(full_url).read().decode()
@@ -251,10 +259,13 @@ if __name__ == "__main__":
   handler.GetSite()
   handler.GetName()
   handler.GetStamp()
-  handler.GetBuildId()
-  # handler.buildid="1"
-  cdash_url = handler.GetBuildUrl()
-  ( state , error ) = handler.GetBuildStatus()
+  if handler.GetBuildId() is None:
+    cdash_url = "https://cdash.orfeo-toolbox.org"
+    state = 'failed'
+    error = "Failed to get build id"
+  else:
+    cdash_url = handler.GetBuildUrl()
+    ( state , error ) = handler.GetBuildStatus()
   if trace:
     print ( "cdash_url is: " + cdash_url )
   gitlab_url = "https://gitlab.orfeo-toolbox.org/api/v4/projects/"
diff --git a/CI/check_twin_pipelines.py b/CI/check_twin_pipelines.py
new file mode 100644
index 0000000000000000000000000000000000000000..d2a6113924677266de8cf30f8d35debc8ee2c3ea
--- /dev/null
+++ b/CI/check_twin_pipelines.py
@@ -0,0 +1,88 @@
+#
+# Copyright (C) 2005-2019 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.
+#
+
+import os
+import urllib.request
+import urllib.parse
+import json
+import re
+import time
+
+"""
+Send a request to Gitlab and return the answer
+The request parameter is added after `project/:id/`
+WARNING: when data is given, the request will be a POST
+Otherwise, it is a GET
+"""
+def GitlabRequest(request, project=53, data=None, token=''):
+  gitlab_url = "https://gitlab.orfeo-toolbox.org/api/v4/projects/"
+  gitlab_url+= str(project) + '/' + request
+  params = None
+  myHeader = {}
+  if not data is None:
+    params = urllib.parse.urlencode(data).encode('ascii')
+  if token:
+    myHeader = {'PRIVATE-TOKEN':token}
+  gitlab_request = urllib.request.Request(gitlab_url, data=params, headers=myHeader)
+  res = urllib.request.urlopen(gitlab_request)
+  return json.loads(res.read().decode())
+
+"""
+Check needed environment parameters
+"""
+def CheckEnvParameters(params):
+  for p in params:
+    if not p in os.environ.keys():
+      print("Missing environment variable '"+p+"'")
+      return False
+  return True
+
+"""
+Check for any duplicated twin pipeline and cancel it
+"""
+if __name__ == "__main__":
+  if not CheckEnvParameters(['CI_COMMIT_SHA']):
+    sys.exit(1)
+  env = os.environ
+  sha1 = env['CI_COMMIT_SHA']
+  # are we in a merge_request pipeline ?
+  if 'CI_MERGE_REQUEST_IID' in env.keys():
+    if not CheckEnvParameters(['K8S_SECRET_TWIN_PIPELINE','CI_PROJECT_ID','CI_PIPELINE_ID']):
+      sys.exit(1)
+    mrInfo = GitlabRequest('merge_requests/'+env['CI_MERGE_REQUEST_IID'],token=env['K8S_SECRET_TWIN_PIPELINE'])
+    wip_regex = re.compile("^[Ww][Ii][Pp]:")
+    # is it a "WIP" merge request ?
+    if wip_regex.search(mrInfo["title"]):
+      # Yes: cancel the current pipeline
+      print("Cancel current pipeline "+env['CI_PIPELINE_ID'])
+      GitlabRequest('pipelines/'+env['CI_PIPELINE_ID']+'/cancel', data={}, \
+        project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_TWIN_PIPELINE'])
+      time.sleep(180)
+      print("Error: this pipeline should have been canceled")
+      sys.exit(1)
+    else:
+      # No: cancel any previous "normal" pipeline on the same SHA1
+      jres = GitlabRequest('pipelines?sha='+sha1, project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_TWIN_PIPELINE'])
+      for item in jres:
+        if item["id"] < int(env['CI_PIPELINE_ID']) and item["status"] == "running":
+          print("Cancel pipeline "+str(item["id"]))
+          jres2 = GitlabRequest('pipelines/'+str(item["id"])+'/cancel', data={}, \
+            project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_TWIN_PIPELINE'])
+
diff --git a/CI/configure_option.cmake b/CI/configure_options.cmake
similarity index 92%
rename from CI/configure_option.cmake
rename to CI/configure_options.cmake
index 7cc9b319fa96eec436a3454d916c7e7c2eb35d21..d0b41c6adc0fe7546fecfbb698a5710cf849755d 100644
--- a/CI/configure_option.cmake
+++ b/CI/configure_options.cmake
@@ -19,13 +19,13 @@
 #
 
 # This script is a prototype for the future CI, it may evolve rapidly in a near future
-#This file set the following variable : 
+#This file set the following variable :
 # * otb_build_project_option
 # * otb_use_option
 # * otb_wrap_option
 # * CONFIGURE_OPTIONS
 
-set (otb_build_project_option 
+set (otb_build_project_option
 "BUILD_COOKBOOK:BOOL=OFF
 BUILD_EXAMPLES:BOOL=ON
 BUILD_SHARED_LIBS:BOOL=ON
@@ -40,7 +40,7 @@ OTB_USE_GLUT:BOOL=ON
 OTB_USE_GSL:BOOL=ON
 OTB_USE_LIBKML:BOOL=ON
 OTB_USE_LIBSVM:BOOL=ON
-OTB_USE_MPI:BOOL=ON
+OTB_USE_MPI:BOOL=OFF
 OTB_USE_MUPARSER:BOOL=ON
 OTB_USE_MUPARSERX:BOOL=ON
 OTB_USE_OPENCV:BOOL=ON
@@ -51,12 +51,12 @@ OTB_USE_QWT:BOOL=ON
 OTB_USE_SHARK:BOOL=ON
 OTB_USE_SIFTFAST:BOOL=ON
 OTB_USE_SPTW:BOOL=ON
-OTB_USE_SSE_FLAGS:BOOL=ON")
+OTB_USE_SSE_FLAGS:BOOL=ON
+OTB_MPIEXEC_OPT:STRING=--allow-run-as-root")
 
 set (otb_wrap_option
 "OTB_WRAP_JAVA:BOOL=ON
-OTB_WRAP_PYTHON:BOOL=ON
-OTB_WRAP_PYTHON3:BOOL=ON")
+OTB_WRAP_PYTHON:BOOL=ON")
 
 set (otb_data_option
 "OTB_DATA_USE_LARGEINPUT:BOOL=OFF
diff --git a/CI/macros.cmake b/CI/macros.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..544daca845fd1b0d8fe36d746cd698fa09ce3a76
--- /dev/null
+++ b/CI/macros.cmake
@@ -0,0 +1,53 @@
+#
+# Copyright (C) 2005-2019 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.
+#
+# This script is for the superbuild build on the CI platform
+
+# Find the build name and CI profile
+macro( set_dash_build_name )
+  set(ci_profile wip)
+
+  set(ci_mr_source "$ENV{CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}")
+  set(ci_mr_target "$ENV{CI_MERGE_REQUEST_TARGET_BRANCH_NAME}")
+  set(ci_mr_iid "$ENV{CI_MERGE_REQUEST_IID}")
+
+  set(ci_pipeline_id "$ENV{CI_PIPELINE_ID}")
+  set(ci_job_id "$ENV{CI_JOB_ID}")
+
+  set(ci_ref_name "$ENV{CI_COMMIT_REF_NAME}")
+
+  set (CTEST_BUILD_NAME ${ci_short_sha})
+
+  if(ci_mr_source AND ci_mr_target AND ci_mr_iid)
+    set (CTEST_BUILD_NAME "${ci_mr_source} (MR ${ci_mr_iid}) P-${ci_pipeline_id}")
+    set(ci_profile mr)
+
+  elseif(ci_ref_name)
+    set (CTEST_BUILD_NAME "${ci_ref_name} P-${ci_pipeline_id}")
+
+    if("${ci_ref_name}" STREQUAL "develop")
+      set(ci_profile develop)
+
+    elseif("${ci_ref_name}" MATCHES "^release-[0-9]+\\.[0-9]+\$")
+      set(ci_profile release)
+    endif()
+
+  endif()
+
+endmacro()
diff --git a/CI/main_ci.cmake b/CI/main_ci.cmake
index dc6c7ea1a344e35db661493435bb47c4ae207950..052fae88822b9b6d4d20b435f55bfb1090990b33 100644
--- a/CI/main_ci.cmake
+++ b/CI/main_ci.cmake
@@ -18,6 +18,8 @@
 # limitations under the License.
 #
 
+include( "${CMAKE_CURRENT_LIST_DIR}/macros.cmake" )
+
 # This script is a prototype for the future CI, it may evolve rapidly in a near future
 get_filename_component(OTB_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR} DIRECTORY)
 set (ENV{LANG} "C") # Only ascii output
@@ -26,33 +28,49 @@ set (ENV{LANG} "C") # Only ascii output
 set (CTEST_BUILD_CONFIGURATION "Release")
 set (CTEST_CMAKE_GENERATOR "Ninja")
 
+# detect short sha
+if(NOT DEFINED ENV{CI_COMMIT_SHORT_SHA})
+  execute_process(COMMAND git log -1 --pretty=format:%h
+                  WORKING_DIRECTORY ${OTB_SOURCE_DIR}
+                  OUTPUT_VARIABLE ci_short_sha)
+else()
+  set(ci_short_sha "$ENV{CI_COMMIT_SHORT_SHA}")
+endif()
+
 # Find the build name and CI profile
-set(ci_profile wip)
-set(ci_mr_source "$ENV{CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}")
-set(ci_mr_target "$ENV{CI_MERGE_REQUEST_TARGET_BRANCH_NAME}")
-set(ci_mr_iid "$ENV{CI_MERGE_REQUEST_IID}")
-set(ci_ref_name "$ENV{CI_COMMIT_REF_NAME}")
-set (CTEST_BUILD_NAME "$ENV{CI_COMMIT_SHORT_SHA}")
-if(ci_mr_source AND ci_mr_target AND ci_mr_iid)
-  set (CTEST_BUILD_NAME "${ci_mr_source} (MR ${ci_mr_iid})")
-  set(ci_profile mr)
-elseif(ci_ref_name)
-  set (CTEST_BUILD_NAME "${ci_ref_name}")
-  if("${ci_ref_name}" STREQUAL "develop")
-    set(ci_profile develop)
-  elseif("${ci_ref_name}" MATCHES "^release-[0-9]+\\.[0-9]+\$")
-    set(ci_profile release)
+set_dash_build_name()
+
+# set pipelines to enable documentation
+set(ci_cookbook_profiles mr develop release)
+set(ci_doxygen_profiles mr develop release)
+list(FIND ci_cookbook_profiles ${ci_profile} ci_do_cookbook)
+list(FIND ci_doxygen_profiles ${ci_profile} ci_do_doxygen)
+
+# Detect site
+if(NOT DEFINED IMAGE_NAME)
+  if(DEFINED ENV{IMAGE_NAME})
+    set(IMAGE_NAME $ENV{IMAGE_NAME})
   endif()
 endif()
-
-#Warning, this variable is used in cdash_status.py. If change from 
-# ${IMAGE_NAME} to something else do not forget to change it.
 set (CTEST_SITE "${IMAGE_NAME}")
 
+# Detect "skip testing"
+if(DEFINED ENV{CI_SKIP_TESTING})
+  set(ci_skip_testing 1)
+endif()
+
 # Directory variable
 set (CTEST_SOURCE_DIRECTORY "${OTB_SOURCE_DIR}")
-set (CTEST_BINARY_DIRECTORY "${OTB_SOURCE_DIR}/build/")
-set (CTEST_INSTALL_DIRECTORY "${OTB_SOURCE_DIR}/install/")
+if(BUILD_DIR)
+  set (CTEST_BINARY_DIRECTORY "${BUILD_DIR}")
+else()
+  set (CTEST_BINARY_DIRECTORY "${OTB_SOURCE_DIR}/build/")
+endif()
+if(INSTALL_DIR)
+  set (CTEST_INSTALL_DIRECTORY "${INSTALL_DIR}")
+else()
+  set (CTEST_INSTALL_DIRECTORY "${OTB_SOURCE_DIR}/install/")
+endif()
 set (PROJECT_SOURCE_DIR "${OTB_SOURCE_DIR}")
 
 # Ctest command value
@@ -64,8 +82,9 @@ set (OTB_LARGEINPUT_ROOT "") # todo
 message(STATUS "CI profile : ${ci_profile}")
 
 #The following file set the CONFIGURE_OPTIONS variable
+set (ENABLE_DOXYGEN OFF)
 set (CONFIGURE_OPTIONS  "")
-include ( "${CMAKE_CURRENT_LIST_DIR}/configure_option.cmake" )
+include ( "${CMAKE_CURRENT_LIST_DIR}/configure_options.cmake" )
 
 # Sources are already checked out : do nothing for update
 set(CTEST_GIT_UPDATE_CUSTOM echo No update)
@@ -76,7 +95,7 @@ find_program(CTEST_GIT_COMMAND NAMES git git.cmd)
 # End of configuration
 
 
-ctest_start (Experimental TRACK Experimental)
+ctest_start (Experimental TRACK CI_Build)
 
 ctest_update()
 
@@ -88,6 +107,7 @@ ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}"
     )
 
 if ( NOT _configure_rv EQUAL 0 )
+  # stop processing here
   ctest_submit()
   message( FATAL_ERROR "An error occurs during ctest_configure.")
 endif()
@@ -98,19 +118,30 @@ ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}"
             )
 
 if ( NOT _build_rv EQUAL 0 )
-  ctest_submit()
   message( SEND_ERROR "An error occurs during ctest_build.")
 endif()
 
-# Uncomment when ready for test
-# ctest_test(PARALLEL_LEVEL 8
-#            RETURN_VALUE _test_rv
-#            CAPTURE_CMAKE_ERROR _test_error
-#            )
+if(ci_skip_testing)
+  message(STATUS "Skip testing")
+  set(_test_rv 0)
+else()
+  ctest_test(PARALLEL_LEVEL 8
+             RETURN_VALUE _test_rv
+             CAPTURE_CMAKE_ERROR _test_error
+             )
+endif()
 
-# if ( NOT _test_rv EQUAL 0 )
-#   ctest_submit()
-#   message( SEND_ERROR "An error occurs during ctest_test.")
-# endif()
+if ( NOT _test_rv EQUAL 0 )
+  message( SEND_ERROR "An error occurs during ctest_test.")
+endif()
 
 ctest_submit()
+
+if(ENABLE_DOXYGEN)
+  # compile doxygen
+  ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}"
+              TARGET Documentation
+              RETURN_VALUE _doxy_rv
+              CAPTURE_CMAKE_ERROR _doxy_error
+              )
+endif()
diff --git a/CI/main_superbuild.cmake b/CI/main_superbuild.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..a7ba0f96d7049eb6b10d4227acd33ff6d886f594
--- /dev/null
+++ b/CI/main_superbuild.cmake
@@ -0,0 +1,172 @@
+#
+# Copyright (C) 2005-2019 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.
+#
+# This script is a prototype for the future CI, it may evolve rapidly in a near future
+
+include( "${CMAKE_CURRENT_LIST_DIR}/macros.cmake" )
+
+set (ENV{LANG} "C") # Only ascii output
+get_filename_component(OTB_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR} DIRECTORY)
+
+###########################################################################
+###########################################################################
+# Download xkd
+###########################################################################
+###########################################################################
+
+# How to get md5sum:
+# * concatenate all source files in one
+# * add configure result from previous job ${OTB_SOURCE_DIR}/build/CMakeCache.txt
+###########################
+
+file(READ "${OTB_SOURCE_DIR}/sb_branch.txt" BRANCH_NAME)
+
+####################################
+
+
+# git clone $REPOSITORY_URL --branch $BRANCH_NAME --depth 1 superbuild-artifact
+###############################################################################
+set ( REMOTE "https://gitlab.orfeo-toolbox.org/gbonnefille/superbuild-artifact.git")
+# set ( BRANCH_NAME "${IMAGE_NAME}/${SB_MD5}")
+
+# Look for a GIT command-line client.
+find_program(CTEST_GIT_COMMAND NAMES git git.cmd)
+
+# FIXME: Replace ${GIT} variable with $[CTEST_GIT_COMMAND}"
+set( GIT "${CTEST_GIT_COMMAND}" )
+
+execute_process(
+  COMMAND ${GIT} "clone" "${REMOTE}" "--branch" "${BRANCH_NAME}"
+  "--depth" "1" "superbuild-artifact"
+  WORKING_DIRECTORY ${OTB_SOURCE_DIR}
+  RESULT_VARIABLE clone_res
+  OUTPUT_VARIABLE clone_out
+  ERROR_VARIABLE clone_err
+  )
+
+if ( DEBUG )
+  message( "Clone")
+  message( "clone_res = ${clone_res}" )
+  message( "clone_out = ${clone_out}" )
+  message( "clone_err = ${clone_err}" )
+endif()
+
+if (clone_res)
+  message( SEND_ERROR "Problem in retreiving the archive")
+  return()
+endif()
+
+set (CMAKE_COMMAND "cmake")
+execute_process(
+  COMMAND ${CMAKE_COMMAND} "-E" "tar" "xf"
+  "${OTB_SOURCE_DIR}/superbuild-artifact/SuperBuild_Install.tar"
+  WORKING_DIRECTORY ${OTB_SOURCE_DIR}
+  )
+
+set( XDK_PATH "${OTB_SOURCE_DIR}/xdk")
+
+if ( DEBUG )
+  if ( EXISTS "${XDK_PATH}")
+    message("Xdk folder exists at ${XDK_PATH}")
+  else()
+    message("Something went wrong no folder in ${XDK_PATH}")
+  endif()
+endif()
+
+###########################################################################
+###########################################################################
+# Building OTB
+###########################################################################
+###########################################################################
+
+set ( CTEST_BUILD_CONFIGURATION "Release" )
+set ( CTEST_CMAKE_GENERATOR "Unix Makefiles" )
+set ( CTEST_BUILD_FLAGS "-j8" )
+set ( CTEST_SITE "${IMAGE_NAME}" )
+
+# Find the build name and CI profile
+set_dash_build_name()
+
+# Directory variable
+set ( CTEST_SOURCE_DIRECTORY "${OTB_SOURCE_DIR}" )
+set ( CTEST_BINARY_DIRECTORY "${OTB_SOURCE_DIR}/build/" )
+set ( CTEST_INSTALL_DIRECTORY "${OTB_SOURCE_DIR}/install/" )
+set ( PROJECT_SOURCE_DIR "${OTB_SOURCE_DIR}" )
+
+set (CONFIGURE_OPTIONS  "")
+include ( "${CMAKE_CURRENT_LIST_DIR}/configure_options.cmake" )
+# SuperBuild case : one more configure option
+set ( CONFIGURE_OPTIONS
+  "${CONFIGURE_OPTIONS}-DCMAKE_PREFIX_PATH=${XDK_PATH};")
+
+# Hack because there is no more superbuild available (LIBKML)
+set ( CONFIGURE_OPTIONS
+  "${CONFIGURE_OPTIONS}-DOTB_USE_LIBKML:BOOL=OFF;" )
+
+# FIX ME this part might platform dependent
+set( GDAL_DATA "${XDK_PATH}/share/gdal" )
+set( GEOTIFF_CSV "${XDK_PATH}/share/epsg_csv" )
+set( PROJ_LIB "${XDK_PATH}/share" )
+set( CTEST_ENVIRONMENT
+"PATH=${XDK_PATH}/lib:${XDK_PATH}/bin:$ENV{PATH}
+")
+# It seems that we do not need that
+# GDAL_DATA= GDAL_DATA
+# GEOTIFF_CSV= GEOTIFF_CSV
+# PROJ_LIB= PROJ_LIB
+
+# Sources are already checked out : do nothing for update
+set(CTEST_GIT_UPDATE_CUSTOM echo No update)
+
+ctest_start (Experimental TRACK CI_Build)
+
+ctest_update()
+
+ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}"
+    SOURCE "${OTB_SOURCE_DIR}"
+    OPTIONS "${CONFIGURE_OPTIONS}"
+    RETURN_VALUE _configure_rv
+    CAPTURE_CMAKE_ERROR _configure_error
+    )
+
+if ( NOT _configure_rv EQUAL 0 )
+  ctest_submit()
+  message( FATAL_ERROR "An error occurs during ctest_configure.")
+endif()
+
+ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}"
+            RETURN_VALUE _build_rv
+            CAPTURE_CMAKE_ERROR _build_error
+            )
+
+if ( NOT _build_rv EQUAL 0 )
+  message( SEND_ERROR "An error occurs during ctest_build.")
+endif()
+
+# Uncomment when ready for test
+ctest_test(PARALLEL_LEVEL 8
+           RETURN_VALUE _test_rv
+           CAPTURE_CMAKE_ERROR _test_error
+           )
+
+if ( NOT _test_rv EQUAL 0 )
+  message( WARNING "Some tests have failed.")
+endif()
+
+ctest_submit()
diff --git a/CI/prepare_superbuild.cmake b/CI/prepare_superbuild.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..47eec850c1c19af099f0e61ae02b01216a57195e
--- /dev/null
+++ b/CI/prepare_superbuild.cmake
@@ -0,0 +1,344 @@
+#
+# Copyright (C) 2005-2019 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.
+#
+# This script is for the superbuild build on the CI platform
+
+include( "${CMAKE_CURRENT_LIST_DIR}/macros.cmake" )
+
+set (ENV{LANG} "C") # Only ascii output
+get_filename_component(OTB_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR} DIRECTORY)
+
+set ( DEBUG "1" )
+
+set ( SUPERBUILD_SOURCE_DIR "${OTB_SOURCE_DIR}/SuperBuild" )
+
+set ( CTEST_BUILD_CONFIGURATION "Release" )
+set ( CTEST_CMAKE_GENERATOR "Unix Makefiles" )
+set ( PROJECT_SOURCE_DIR "${SUPERBUILD_SOURCE_DIR}" )
+set ( CTEST_SOURCE_DIRECTORY "${SUPERBUILD_SOURCE_DIR}" )
+set ( CTEST_BINARY_DIRECTORY "${OTB_SOURCE_DIR}/build/" )
+set ( CTEST_SITE "${IMAGE_NAME}" )
+
+
+# Find the build name and CI profile
+set_dash_build_name()
+
+# We need a directory independent from user
+# in CI the architecture is /builds/user/otb
+# So we will go in /builds/
+# This is platform dependent, and the next step (build) also
+# depends on that, as some paths are hardcoded
+# This can be fixed with a packaging of OTB_DEPENDS
+set (CTEST_INSTALL_DIRECTORY "${OTB_SOURCE_DIR}/xdk/")
+
+# HACK
+# This is needed because when using return() function ctest is trying
+# to run the CTEST_COMMAND. And we need it to not produce an error
+set (CTEST_COMMAND "echo \"Exit\"") # HACK FIX ME
+set (CMAKE_COMMAND "cmake")
+
+########################################################################
+########################################################################
+# Build process
+########################################################################
+########################################################################
+
+# Look for a GIT command-line client.
+find_program(CTEST_GIT_COMMAND NAMES git git.cmd)
+
+# FIXME: Replace ${GIT} variable with $[CTEST_GIT_COMMAND}"
+set( GIT "${CTEST_GIT_COMMAND}" )
+
+# Sources are already checked out : do nothing for update
+set(CTEST_GIT_UPDATE_CUSTOM echo No update)
+
+ctest_start (Experimental TRACK CI_Prepare)
+
+ctest_update( SOURCE "${OTB_SOURCE_DIR}" )
+
+set(CTEST_BUILD_FLAGS "-j16")
+
+set ( SB_CONFIGURE_OPTIONS "")
+include( "${CMAKE_CURRENT_LIST_DIR}/sb_configure_options.cmake" )
+
+ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}"
+    SOURCE "${SUPERBUILD_SOURCE_DIR}"
+    OPTIONS "${SB_CONFIGURE_OPTIONS}"
+    RETURN_VALUE _configure_rv
+    CAPTURE_CMAKE_ERROR _configure_error
+    )
+
+if ( NOT _configure_rv EQUAL 0 )
+  ctest_submit()
+  message( SEND_ERROR "An error occurs during ctest_configure. Dependencies might be buggy.")
+  return()
+endif()
+
+########################################################################
+########################################################################
+# Check process
+########################################################################
+########################################################################
+# Once that we have configure our build we can check if it exists a
+# corresponding SB on superbuild-artifact
+
+# How to get md5sum:
+# * concatenate all source files in one
+# * add configure result : CMakeCache.txt
+####################################
+file( GLOB_RECURSE sb_file_list "${OTB_SOURCE_DIR}/SuperBuild/*")
+set( SB_TXT "${OTB_SOURCE_DIR}/full_sb.txt")
+foreach(sb_file  ${sb_file_list})
+  file(READ ${sb_file} CONTENTS)
+  file(APPEND ${SB_TXT} "${sb_file}${CONTENTS}")
+endforeach(sb_file)
+file(READ "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt" CMAKE_ORIG)
+file(APPEND ${SB_TXT} "CMakeCache.txt${CMAKE_ORIG}")
+file ( MD5 "${SB_TXT}" SB_MD5)
+message ( "SB_MD5 = ${SB_MD5}" )
+file (REMOVE ${SB_TXT})
+
+####################################
+
+# checkout part
+# we look for the right branch
+# Branch name cannot have a ":"
+# git ls-remote $REMOTE $BRANCH_NAME
+####################################
+file ( WRITE "${OTB_SOURCE_DIR}/sb_branch.txt" "${IMAGE_NAME}/${SB_MD5}")
+message( "Checking out git for existence of archive")
+set ( REMOTE "https://gitlab.orfeo-toolbox.org/gbonnefille/superbuild-artifact/")
+set ( BRANCH_NAME "${IMAGE_NAME}/${SB_MD5}")
+
+execute_process(
+  COMMAND ${GIT} "ls-remote" "${REMOTE}" "${BRANCH_NAME}"
+  OUTPUT_VARIABLE IS_SB_BUILD
+  )
+if ( IS_SB_BUILD )
+  message( "Superbuild is already build for ${IMAGE_NAME} with sources as ${SB_MD5}")
+  return()
+else()
+  message( "No build available, this job will build and push OTB_DEPENDS")
+endif()
+####################################
+# Back to build
+
+ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}"
+            TARGET "OTB_DEPENDS"
+            RETURN_VALUE _build_rv
+            NUMBER_ERRORS _build_nb_err
+            CAPTURE_CMAKE_ERROR _build_error
+            )
+
+if ( DEBUG )
+  message( "Status for build:" )
+  message("_build_rv=${_build_rv}")
+  message("_build_nb_err=${_build_nb_err}")
+  message("_build_error=${_build_error}")
+endif()
+
+if ( ( NOT ${_build_nb_err} EQUAL 0 ) OR ( ${_build_error} EQUAL -1 ))
+  ctest_submit()
+  message( FATAL_ERROR "An error occurs during ctest_build.")
+endif()
+
+ctest_submit()
+
+########################################################################
+########################################################################
+# Git process
+########################################################################
+########################################################################
+
+# WE PUSH ONLY IF BUILD SUCCEED
+# The image used will be passed to this script.
+# TODO verify that images does not have forbidden char in there name
+# TODO right now we rely on ctest_build to know whether there has been an error
+# in build, whereas SuperBuild does not necessarily return an error if something
+# goes wrong
+
+# REPOSITORY_GIT_URL and REMOTE whould be the same. Right now there are
+# different because one is https and one is ssh. Both should be ssh.
+set( REPOSITORY_GIT_URL "git@gitlab.orfeo-toolbox.org:gbonnefille/superbuild-artifact.git")
+# We clone master to have a basic configuration, mainly a correct .gitattribute
+# git clone $REMOTE --branch master --depth 1 superbuild-artifact
+execute_process(
+  COMMAND ${GIT} "clone" "${REPOSITORY_GIT_URL}"
+  "--branch" "master" "--depth" "1" "superbuild-artifact"
+  WORKING_DIRECTORY "${OTB_SOURCE_DIR}"
+  )
+set ( SB_ARTIFACT_GIT "${OTB_SOURCE_DIR}/superbuild-artifact" )
+
+# setting up the repo
+# StrictHostKeyChecking so we don't have to add the host as a known key
+# -F /dev/null so the agent is not taking a default file ~/.ssh/..
+execute_process(
+  COMMAND ${GIT} "config" "core.sshCommand"
+  "ssh -o StrictHostKeyChecking=no"
+  WORKING_DIRECTORY ${SB_ARTIFACT_GIT}
+  RESULT_VARIABLE ssh_res
+  OUTPUT_VARIABLE ssh_out
+  ERROR_VARIABLE ssh_err
+  )
+
+if ( DEBUG )
+  message( "Step 1: ssh")
+  message( "ssh_res = ${ssh_res}" )
+  message( "ssh_out = ${ssh_out}" )
+  message( "ssh_err = ${ssh_err}" )
+endif()
+
+execute_process(
+  COMMAND ${GIT} "config" "user.mail" "otbbot@orfeo-toolbox.org"
+  WORKING_DIRECTORY ${SB_ARTIFACT_GIT}
+  RESULT_VARIABLE mail_res
+  OUTPUT_VARIABLE mail_out
+  ERROR_VARIABLE mail_err
+  )
+
+if ( DEBUG )
+  message( "Step 2: mail")
+  message( "mail_res = ${mail_res}" )
+  message( "mail_out = ${mail_out}" )
+  message( "mail_err = ${mail_err}" )
+endif()
+
+execute_process(
+  COMMAND ${GIT} "config" "user.name" "otbbot"
+  WORKING_DIRECTORY ${SB_ARTIFACT_GIT}
+  RESULT_VARIABLE name_res
+  OUTPUT_VARIABLE name_out
+  ERROR_VARIABLE name_err
+  )
+
+if ( DEBUG )
+  message( "Step 3: name")
+  message( "name_res = ${name_res}" )
+  message( "name_out = ${name_out}" )
+  message( "name_err = ${name_err}" )
+endif()
+
+# create a branche
+execute_process(
+  COMMAND ${GIT} "checkout" "-b" "${BRANCH_NAME}"
+  WORKING_DIRECTORY ${SB_ARTIFACT_GIT}
+  RESULT_VARIABLE co_res
+  OUTPUT_VARIABLE co_out
+  ERROR_VARIABLE co_err
+  )
+
+if ( DEBUG )
+  message( "Step 4: check-o")
+  message( "co_res = ${co_res}" )
+  message( "co_out = ${co_out}" )
+  message( "co_err = ${co_err}" )
+endif()
+
+set ( SB_TAR_NAME "SuperBuild_Install.tar" )
+
+# Creating the tar
+# May be for easier maintainability the tar name should be the same as the
+# file inside.
+execute_process(
+  COMMAND ${CMAKE_COMMAND} "-E" "tar" "cf" "${SB_ARTIFACT_GIT}/${SB_TAR_NAME}"
+  -- "${CTEST_INSTALL_DIRECTORY}"
+  WORKING_DIRECTORY ${OTB_SOURCE_DIR}
+  )
+
+
+# In a near futur it might be nice to clean up the mess we made...
+
+if ( DEBUG )
+  if (EXISTS "${SB_ARTIFACT_GIT}/${SB_TAR_NAME}")
+    message("Tar file exists in superbuild_artefact at: ${SB_ARTIFACT_GIT}/${SB_TAR_NAME}")
+  else()
+    message("Tar file does not exist")
+  endif()
+endif()
+
+# add the file
+execute_process(
+  COMMAND ${GIT} "add" "${SB_TAR_NAME}"
+  WORKING_DIRECTORY ${SB_ARTIFACT_GIT}
+  RESULT_VARIABLE add_res
+  OUTPUT_VARIABLE add_out
+  ERROR_VARIABLE add_err
+  )
+
+if ( DEBUG )
+  message( "Step 5: add")
+  message( "add_res = ${add_res}" )
+  message( "add_out = ${add_out}" )
+  message( "add_err = ${add_err}" )
+endif()
+
+
+# commit
+# We need the author because otherwise the mail is wrong
+# In our case if toto is deploying a key in superbuild-artifact repo
+# the the mail will be toto's
+execute_process(
+  COMMAND ${GIT} "commit" "--author=\"otbbot <otbbot@orfeo-toolbox.org>\""
+  "-m" "\"New Superbuild for ${SB_MD5} on ${IMAGE_NAME}\""
+  WORKING_DIRECTORY ${SB_ARTIFACT_GIT}
+  RESULT_VARIABLE com_res
+  OUTPUT_VARIABLE com_out
+  ERROR_VARIABLE com_err
+  )
+
+if ( DEBUG )
+  message( "Step 6: com")
+  message( "com_res = ${com_res}" )
+  message( "com_out = ${com_out}" )
+  message( "com_err = ${com_err}" )
+endif()
+
+
+# This part is just for debug
+if ( DEBUG )
+  execute_process(
+    COMMAND ${GIT} "log" "-1"
+    WORKING_DIRECTORY ${SB_ARTIFACT_GIT}
+    RESULT_VARIABLE log_res
+    OUTPUT_VARIABLE log_out
+    ERROR_VARIABLE log_err
+    )
+
+  message( "Step 6bis: log")
+  message( "log_res = ${log_res}" )
+  message( "log_out = ${log_out}" )
+  message( "log_err = ${log_err}" )
+endif()
+
+# push
+# we should be able to do a simple : git push origin $BRANCH_NAME
+execute_process(
+  COMMAND ${GIT} "push" "${REPOSITORY_GIT_URL}" "${BRANCH_NAME}"
+  WORKING_DIRECTORY ${SB_ARTIFACT_GIT}
+  RESULT_VARIABLE push_res
+  OUTPUT_VARIABLE push_out
+  ERROR_VARIABLE push_err
+  )
+
+if ( DEBUG )
+  message( "Step 7: push")
+  message( "push_res = ${push_res}" )
+  message( "push_out = ${push_out}" )
+  message( "push_err = ${push_err}" )
+endif()
diff --git a/Modules/Feature/SeamCarving/test/CMakeLists.txt b/CI/sb_configure_options.cmake
similarity index 57%
rename from Modules/Feature/SeamCarving/test/CMakeLists.txt
rename to CI/sb_configure_options.cmake
index f8775d775c5a1ca807d63b5504e0a58401cae263..7b1b1e2e9deb0e7d7780b43edd31425f8c1be895 100644
--- a/Modules/Feature/SeamCarving/test/CMakeLists.txt
+++ b/CI/sb_configure_options.cmake
@@ -17,16 +17,24 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
+# For know OTB_DEPENDS is build with default value
 
-otb_module_test()
+set ( cmake_configure_option
+"CMAKE_BUILD_TYPE=${CTEST_BUILD_CONFIGURATION}
+CMAKE_INSTALL_PREFIX:PATH=${CTEST_INSTALL_DIRECTORY}")
 
-set(OTBSeamCarvingTests
-otbSeamCarvingTestDriver.cxx
-)
+set ( temporary_option
+"OTB_USE_LIBKML=OFF
+OTB_USE_MPI=OFF")
 
-add_executable(otbSeamCarvingTestDriver ${OTBSeamCarvingTests})
-target_link_libraries(otbSeamCarvingTestDriver ${OTBSeamCarving-Test_LIBRARIES})
-otb_module_target_label(otbSeamCarvingTestDriver)
+set(concat_options
+"${cmake_configure_option}
+${temporary_option}
+")
 
-# Tests Declaration
+#Transform the previous string in list
+string (REPLACE "\n" ";" sb_options ${concat_options})
 
+foreach(item ${sb_options})
+  set( SB_CONFIGURE_OPTIONS "${SB_CONFIGURE_OPTIONS}-D${item};")
+endforeach(item)
diff --git a/CI/ubuntu-18.04-gcc-shark.cmake b/CI/ubuntu-18.04-fast.cmake
similarity index 61%
rename from CI/ubuntu-18.04-gcc-shark.cmake
rename to CI/ubuntu-18.04-fast.cmake
index b9ef2642b4890d8be17aabb164727bb70add5120..5ba38ec80c18fcf420f77160b528c6555ee1d84e 100644
--- a/CI/ubuntu-18.04-gcc-shark.cmake
+++ b/CI/ubuntu-18.04-fast.cmake
@@ -18,7 +18,18 @@
 # limitations under the License.
 #
 
-# Configuration options for ubuntu-18.04-gcc-shark-3.1.4
+# Configuration options for ubuntu-18.04-fast
 
 set(site_option
-"opencv_INCLUDE_DIR:PATH=/usr/include")
+"opencv_INCLUDE_DIR:PATH=/usr/include
+CMAKE_C_COMPILER:STRING=clang
+CMAKE_CXX_COMPILER:STRING=clang++
+CMAKE_EXE_LINKER_FLAGS:STRING=-fuse-ld=lld
+CMAKE_MODULE_LINKER_FLAGS:STRING=-fuse-ld=lld
+CMAKE_SHARED_LINKER_FLAGS:STRING=-fuse-ld=lld
+CMAKE_C_COMPILER_LAUNCHER:STRING=ccache
+CMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache
+OTB_USE_SHARK:BOOL=OFF
+BUILD_EXAMPLES:BOOL=OFF")
+
+set(ci_skip_testing ON)
diff --git a/CI/ubuntu-18.04-llvm-shark.cmake b/CI/ubuntu-18.04-llvm-nodoc.cmake
similarity index 89%
rename from CI/ubuntu-18.04-llvm-shark.cmake
rename to CI/ubuntu-18.04-llvm-nodoc.cmake
index af3b0283f2b122c7796d6eca61f4892fac11117f..27ab15d0cd7e0e9c9a7802f2831baf5ef5e5f180 100644
--- a/CI/ubuntu-18.04-llvm-shark.cmake
+++ b/CI/ubuntu-18.04-llvm-nodoc.cmake
@@ -18,7 +18,7 @@
 # limitations under the License.
 #
 
-# Configuration options for ubuntu-18.04-llvm-shark-3.1.4
+# Configuration options for ubuntu-18.04-llvm-nodoc
 
 set(site_option
 "opencv_INCLUDE_DIR:PATH=/usr/include
@@ -28,4 +28,5 @@ CMAKE_EXE_LINKER_FLAGS:STRING=-fuse-ld=lld
 CMAKE_MODULE_LINKER_FLAGS:STRING=-fuse-ld=lld
 CMAKE_SHARED_LINKER_FLAGS:STRING=-fuse-ld=lld
 CMAKE_C_COMPILER_LAUNCHER:STRING=ccache
-CMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache")
+CMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache
+OTB_USE_SHARK:BOOL=OFF")
diff --git a/CI/ubuntu-18.04-llvm.cmake b/CI/ubuntu-18.04-llvm.cmake
index a92364f2b45d82176aa65d3d112753055421aef1..9b838da433a06cff9f26281578ad56c0b20c52ec 100644
--- a/CI/ubuntu-18.04-llvm.cmake
+++ b/CI/ubuntu-18.04-llvm.cmake
@@ -22,9 +22,34 @@
 
 set(site_option
 "opencv_INCLUDE_DIR:PATH=/usr/include
-OTB_USE_SHARK:BOOL=OFF
 CMAKE_C_COMPILER:STRING=clang
 CMAKE_CXX_COMPILER:STRING=clang++
 CMAKE_EXE_LINKER_FLAGS:STRING=-fuse-ld=lld
 CMAKE_MODULE_LINKER_FLAGS:STRING=-fuse-ld=lld
-CMAKE_SHARED_LINKER_FLAGS:STRING=-fuse-ld=lld")
+CMAKE_SHARED_LINKER_FLAGS:STRING=-fuse-ld=lld
+CMAKE_C_COMPILER_LAUNCHER:STRING=ccache
+CMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache
+OTB_USE_SHARK:BOOL=OFF")
+
+if(NOT ${ci_do_cookbook} EQUAL -1)
+  set(site_option
+"${site_option}
+BUILD_COOKBOOK:BOOL=ON")
+endif()
+
+if(NOT ${ci_do_doxygen} EQUAL -1)
+  set(site_option
+"${site_option}
+BUILD_DOCUMENTATION:BOOL=ON
+OTB_DOXYGEN_ITK_TAGFILE:FILEPATH=${CTEST_BINARY_DIRECTORY}/InsightDoxygenDocTag-4.13.0
+OTB_DOXYGEN_ITK_DOXYGEN_URL:STRING=\"https://itk.org/Doxygen413/html\"
+")
+  set (ENABLE_DOXYGEN ON)
+  # The ITK doxygen tag file needs to be patched before being used for OTB
+  # See otb-devutils/Scripts/tagfile_fix.py
+  message(STATUS "Get resources for Doxygen build ...")
+  execute_process(COMMAND wget https://www.orfeo-toolbox.org/packages/archives/Doxygen/InsightDoxygenDocTag-4.13.0.gz
+                  WORKING_DIRECTORY ${CTEST_BINARY_DIRECTORY})
+  execute_process(COMMAND gzip -d InsightDoxygenDocTag-4.13.0.gz
+                  WORKING_DIRECTORY ${CTEST_BINARY_DIRECTORY})
+endif()
diff --git a/CMake/OTBModuleTest.cmake b/CMake/OTBModuleTest.cmake
index 97e21fbf0d80cb69fb10e02072a650e66b9e936c..c1402718ece7ecb92c2aabc0b581f16e7c679aa3 100644
--- a/CMake/OTBModuleTest.cmake
+++ b/CMake/OTBModuleTest.cmake
@@ -224,7 +224,7 @@ endfunction()
 function(otb_add_test_mpi)
    set( _OPTIONS_ARGS )
    set( _ONE_VALUE_ARGS NAME NBPROCS COMMAND)
-   set( _MULTI_VALUE_ARGS )
+   set( _MULTI_VALUE_ARGS EXTRA_OPT)
    cmake_parse_arguments( TEST_MPI "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} )
 
    # Test nb procs
@@ -235,6 +235,6 @@ function(otb_add_test_mpi)
    foreach(arg IN LISTS TEST_MPI_UNPARSED_ARGUMENTS)
      list(APPEND ARGS ${arg})
    endforeach()
-   set (test_parameters -np ${TEST_MPI_NBPROCS} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_MPI_COMMAND} ${ARGS})
+   set (test_parameters -n ${TEST_MPI_NBPROCS} ${OTB_MPIEXEC_OPT} ${TEST_MPI_EXTRA_OPT} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_MPI_COMMAND} ${ARGS})
    otb_add_test(NAME ${TEST_MPI_NAME} COMMAND ${MPIEXEC} ${test_parameters})
 endfunction()
diff --git a/CMake/OTBStandaloneModuleMacros.cmake b/CMake/OTBStandaloneModuleMacros.cmake
index 54e3ada505601f2a0d17559aa80daf61eec71352..e877a15ceb405951e27bddf2e55f914b5ad2d980 100644
--- a/CMake/OTBStandaloneModuleMacros.cmake
+++ b/CMake/OTBStandaloneModuleMacros.cmake
@@ -101,7 +101,7 @@ endmacro()
 function(otb_add_test_mpi)
    set( _OPTIONS_ARGS )
    set( _ONE_VALUE_ARGS NAME NBPROCS COMMAND)
-   set( _MULTI_VALUE_ARGS )
+   set( _MULTI_VALUE_ARGS EXTRA_OPT)
    cmake_parse_arguments( TEST_MPI "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} )
 
    # Test nb procs
@@ -112,7 +112,7 @@ function(otb_add_test_mpi)
    foreach(arg IN LISTS TEST_MPI_UNPARSED_ARGUMENTS)
      list(APPEND ARGS ${arg})
    endforeach()
-   set (test_parameters -np ${TEST_MPI_NBPROCS} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_MPI_COMMAND} ${ARGS})
+   set (test_parameters -n ${TEST_MPI_NBPROCS} ${OTB_MPIEXEC_OPT} ${TEST_MPI_EXTRA_OPT} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_MPI_COMMAND} ${ARGS})
    otb_add_test(NAME ${TEST_MPI_NAME} COMMAND ${MPIEXEC} ${test_parameters})
 endfunction()
 
diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.1.png b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.1.png
deleted file mode 100644
index 21b0d0b017d140ad17456c384e583e7cf308297a..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.1.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:34a5f9e6daad51f0e614fe07e4755422c8420fda029e7ad7302de31a92535982
-size 1340160
diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png
deleted file mode 100644
index c2d86e289fa134625e4e008e8b5765201acd9478..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:870c0d619c315c9843cd9a5aedc44a34471d5fecbc9306a492efbb47c19530b9
-size 1340628
diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png.aux.xml b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png.aux.xml
deleted file mode 100644
index 761fbb2f643719fcae011bda40747b745e89f458..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png.aux.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<PAMDataset>
-  <SRS>PROJCS["WGS 84 / UTM zone 32N",
-    GEOGCS["WGS 84",
-        DATUM["WGS_1984",
-            SPHEROID["WGS 84",6378137,298.257223563,
-                AUTHORITY["EPSG","7030"]],
-            AUTHORITY["EPSG","6326"]],
-        PRIMEM["Greenwich",0],
-        UNIT["degree",0.0174532925199433],
-        AUTHORITY["EPSG","4326"]],
-    PROJECTION["Transverse_Mercator"],
-    PARAMETER["latitude_of_origin",0],
-    PARAMETER["central_meridian",9],
-    PARAMETER["scale_factor",0.9996],
-    PARAMETER["false_easting",500000],
-    PARAMETER["false_northing",0],
-    UNIT["metre",1,
-        AUTHORITY["EPSG","9001"]],
-    AUTHORITY["EPSG","32632"]]</SRS>
-  <GeoTransform>  4.3913640000000002e+05,  5.9999999999999998e-01,  0.0000000000000000e+00,  5.2737065999999996e+06,  0.0000000000000000e+00, -5.9999999999999998e-01</GeoTransform>
-  <Metadata domain="IMAGE_STRUCTURE">
-    <MDI key="INTERLEAVE">PIXEL</MDI>
-  </Metadata>
-  <Metadata>
-    <MDI key="AREA_OR_POINT">Area</MDI>
-  </Metadata>
-</PAMDataset>
diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.1.png b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.1.png
deleted file mode 100644
index 3bb75ceacc22bea2c6e5b72383c4b972febd74fa..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.1.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b68d89bfa22c07d91a304ff20c04aa4c242197a66cf24b4f7957cc863c1fd2f7
-size 15199
diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png
deleted file mode 100644
index bb6e778dc5e12c0296d21e697596fa5ea9eb8c0d..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:079e3734a9c954f76d4b58596b0ffe9b0bbecb92958774bb7b6c433cb9b7a36d
-size 15220
diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png.aux.xml b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png.aux.xml
deleted file mode 100644
index 21ce935f9d0862129f77af6bd48d60cba2eabf67..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png.aux.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<PAMDataset>
-  <SRS>PROJCS["WGS 84 / UTM zone 32N",
-    GEOGCS["WGS 84",
-        DATUM["WGS_1984",
-            SPHEROID["WGS 84",6378137,298.257223563,
-                AUTHORITY["EPSG","7030"]],
-            AUTHORITY["EPSG","6326"]],
-        PRIMEM["Greenwich",0],
-        UNIT["degree",0.0174532925199433],
-        AUTHORITY["EPSG","4326"]],
-    PROJECTION["Transverse_Mercator"],
-    PARAMETER["latitude_of_origin",0],
-    PARAMETER["central_meridian",9],
-    PARAMETER["scale_factor",0.9996],
-    PARAMETER["false_easting",500000],
-    PARAMETER["false_northing",0],
-    UNIT["metre",1,
-        AUTHORITY["EPSG","9001"]],
-    AUTHORITY["EPSG","32632"]]</SRS>
-  <GeoTransform>  4.3913640000000002e+05,  5.9999999999999998e-01,  0.0000000000000000e+00,  5.2737065999999996e+06,  0.0000000000000000e+00, -5.9999999999999998e-01</GeoTransform>
-  <Metadata>
-    <MDI key="AREA_OR_POINT">Area</MDI>
-  </Metadata>
-</PAMDataset>
diff --git a/Data/Baseline/Examples/FeatureExtraction/SeamCarvingExampleOutput.png b/Data/Baseline/Examples/FeatureExtraction/SeamCarvingExampleOutput.png
deleted file mode 100644
index 426eb10b3d9e1e644289252ae467dbd16d37a9ee..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/FeatureExtraction/SeamCarvingExampleOutput.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4015aa8e7dcf8993def02252301d5f91eb73b970fecd277f799194551bc99ce0
-size 35299
diff --git a/Data/Baseline/Examples/FeatureExtraction/SeamCarvingOtherExampleOutput.png b/Data/Baseline/Examples/FeatureExtraction/SeamCarvingOtherExampleOutput.png
deleted file mode 100644
index eed540571c0e9fe756b6835a6a8782e25d6da40e..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/FeatureExtraction/SeamCarvingOtherExampleOutput.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:da8f331a2806a0c06405abcd7806ebdb668e13a74457151313f13a5ed7c57a32
-size 45234
diff --git a/Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png.aux.xml b/Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png.aux.xml
deleted file mode 100644
index 761fbb2f643719fcae011bda40747b745e89f458..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png.aux.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<PAMDataset>
-  <SRS>PROJCS["WGS 84 / UTM zone 32N",
-    GEOGCS["WGS 84",
-        DATUM["WGS_1984",
-            SPHEROID["WGS 84",6378137,298.257223563,
-                AUTHORITY["EPSG","7030"]],
-            AUTHORITY["EPSG","6326"]],
-        PRIMEM["Greenwich",0],
-        UNIT["degree",0.0174532925199433],
-        AUTHORITY["EPSG","4326"]],
-    PROJECTION["Transverse_Mercator"],
-    PARAMETER["latitude_of_origin",0],
-    PARAMETER["central_meridian",9],
-    PARAMETER["scale_factor",0.9996],
-    PARAMETER["false_easting",500000],
-    PARAMETER["false_northing",0],
-    UNIT["metre",1,
-        AUTHORITY["EPSG","9001"]],
-    AUTHORITY["EPSG","32632"]]</SRS>
-  <GeoTransform>  4.3913640000000002e+05,  5.9999999999999998e-01,  0.0000000000000000e+00,  5.2737065999999996e+06,  0.0000000000000000e+00, -5.9999999999999998e-01</GeoTransform>
-  <Metadata domain="IMAGE_STRUCTURE">
-    <MDI key="INTERLEAVE">PIXEL</MDI>
-  </Metadata>
-  <Metadata>
-    <MDI key="AREA_OR_POINT">Area</MDI>
-  </Metadata>
-</PAMDataset>
diff --git a/Data/Baseline/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndex.tif b/Data/Baseline/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndex.tif
index 0225c9d196f05cec5b484ecdcc45a096f2f3ce03..4361cfbb8aafbcc98f9c8ac99e40739f62f9aaf1 100644
--- a/Data/Baseline/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndex.tif
+++ b/Data/Baseline/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndex.tif
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:42df562a687bdf13d65cacc6da48666b28da72efa79d7d668e607cf82eba4c11
-size 68855
+oid sha256:91667b86ce412524444bde780eee2c7f0baff0c05ecdc5b66a49aca39bc60dda
+size 65842
diff --git a/Data/Baseline/Examples/Radiometry/NDVIRAndNIRVegetationIndex.tif b/Data/Baseline/Examples/Radiometry/NDVIRAndNIRVegetationIndex.tif
deleted file mode 100644
index 0882267d3bfa84e1cf7089f0f6f7aeb50c632151..0000000000000000000000000000000000000000
--- a/Data/Baseline/Examples/Radiometry/NDVIRAndNIRVegetationIndex.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5727e5525e7597823337b25ca4a86b18f96606d68a8fd8b624c6d3a8796372b4
-size 63578
diff --git a/Data/Baseline/OTB-Applications/Files/apTvClTrainRegressionTest_monovar.2.txt b/Data/Baseline/OTB-Applications/Files/apTvClTrainRegressionTest_monovar.2.txt
new file mode 100644
index 0000000000000000000000000000000000000000..da64925e95b925035b8027d2c8ccfd3655d23970
--- /dev/null
+++ b/Data/Baseline/OTB-Applications/Files/apTvClTrainRegressionTest_monovar.2.txt
@@ -0,0 +1 @@
+io.mse: 0.02761062607
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.dbf
deleted file mode 100644
index 872a668071680090e04ee4154d26d68b18630e90..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f9d6c2cacc6b2947ee21de06212d8456f1ad1dd817eb08f0cca74a461982e6fc
-size 13050
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shp
deleted file mode 100644
index 0ae7cfbd6a7bb8fd9ede0766fb817fafdaef3a1b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:03dc018b3fda6afc76870dbb82d43cf954b483d451a44bc9609547a646cd5f69
-size 17244
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shx
deleted file mode 100644
index d7d3c02a05f660729a7ea7f614bb249b23c8dfdb..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9ddb05befb0e32de1d63c65853967329a2e279c8b47ead80a68e659a11f2d692
-size 1516
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.dbf
deleted file mode 100644
index 872a668071680090e04ee4154d26d68b18630e90..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f9d6c2cacc6b2947ee21de06212d8456f1ad1dd817eb08f0cca74a461982e6fc
-size 13050
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.prj
deleted file mode 100644
index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp
deleted file mode 100644
index d989282e41d5a15672cd37b1ec88f1cf38868494..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a761c4931a9325ce306da5c82f1be3c709ab0f888aeab4a412932872c3e8d79d
-size 23692
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shx
deleted file mode 100644
index de9ebdc4ff20d670b2fcea817a3e9ffc5835fb36..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1f99f80a26a8df140d6cdb44d9ed2f1a32a2477927138eca8c5aec56b9ab66e9
-size 1516
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.dbf
deleted file mode 100644
index 0a7f2145c124cc5de965a72bb2b58d5209ddb9ca..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c11d7da214ea38b7c3c0083a92ee13467c13dca735075c01d8ddb73124bc4437
-size 1881
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.prj
deleted file mode 100644
index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shp
deleted file mode 100644
index f4493a2480785e067a59ea8563bff53f69594f84..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f6b7569316bbb6954532949243743a6a02bf59b8e6f15e8768ab74cd49d18ff9
-size 2948
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shx
deleted file mode 100644
index 902c5a761865f19597c28d48f90b02dccbb32fcf..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bd87422448e1242a1b30eb69ae88d4a36a96bfc2d00764a8ec3c35e02063a1c7
-size 292
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.dbf
deleted file mode 100644
index 0a7f2145c124cc5de965a72bb2b58d5209ddb9ca..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c11d7da214ea38b7c3c0083a92ee13467c13dca735075c01d8ddb73124bc4437
-size 1881
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.prj
deleted file mode 100644
index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp
deleted file mode 100644
index e549ed0a01f161cd1bb1e48d37d67a1bb984818c..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c1a477f4f647ebb0feff76da6fe3b92adcac25972372a94e5fa9b5db4b3be02d
-size 4084
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shx
deleted file mode 100644
index 911a74cdb5a4c9e5647301206e325a1f1f2192cf..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:956ffd6cbb30ed2bc8c585e8c938477943d920f7309981a9864bf8f98ae3f992
-size 292
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.dbf
deleted file mode 100644
index 9254d4d3c5008b4dff3d1cd4653a1c8e3d6820c2..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:970b377a49bf3308da27de62de02dc2000e666a4cc49a220023e212cc5082896
-size 713
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.prj
deleted file mode 100644
index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shp
deleted file mode 100644
index b8d4601a93154c3eb59f2a18c30d1e4c224a4af5..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6e9dbd487f0d15fc07a187b9e38649eaef4829ff8a64ffbbe0ebf59c0ced2848
-size 1172
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shx
deleted file mode 100644
index b7889485ca6f854bec6f1120cc7157177b7d3062..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eade214003f288170371c708073838963df379c9d55bfb68b77c488c94d10b7e
-size 164
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.dbf
deleted file mode 100644
index 9254d4d3c5008b4dff3d1cd4653a1c8e3d6820c2..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:970b377a49bf3308da27de62de02dc2000e666a4cc49a220023e212cc5082896
-size 713
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.prj
deleted file mode 100644
index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp
deleted file mode 100644
index b3b4cc6c6425eb929a2a6fe0b4c3611afb8e04ca..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3b83881bd76b1347059066ae1057d27cf0497cb92ac6cb16e07ec3d5ee29f5bd
-size 1172
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shx
deleted file mode 100644
index 1b5b61f68e07a0b7e530125c3df3fe5484a228cd..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:78741d544b7ebd7211d6f2655d31b801443f6a60a75ec18a1dfe94e80f51852c
-size 164
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.dbf
deleted file mode 100644
index 1227f9a239e9e54e85d947eb4eee51ed810d3fe4..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5e98e653523faa8868276d04332dc8a207b8e99bb2e86814c2ecf3e71f64184d
-size 3097
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.prj b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.prj
deleted file mode 100644
index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shp b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shp
deleted file mode 100644
index f4493a2480785e067a59ea8563bff53f69594f84..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f6b7569316bbb6954532949243743a6a02bf59b8e6f15e8768ab74cd49d18ff9
-size 2948
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shx b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shx
deleted file mode 100644
index 902c5a761865f19597c28d48f90b02dccbb32fcf..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bd87422448e1242a1b30eb69ae88d4a36a96bfc2d00764a8ec3c35e02063a1c7
-size 292
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.dbf
deleted file mode 100644
index 1227f9a239e9e54e85d947eb4eee51ed810d3fe4..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5e98e653523faa8868276d04332dc8a207b8e99bb2e86814c2ecf3e71f64184d
-size 3097
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.prj b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.prj
deleted file mode 100644
index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shp b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shp
deleted file mode 100644
index e549ed0a01f161cd1bb1e48d37d67a1bb984818c..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c1a477f4f647ebb0feff76da6fe3b92adcac25972372a94e5fa9b5db4b3be02d
-size 4084
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shx b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shx
deleted file mode 100644
index 911a74cdb5a4c9e5647301206e325a1f1f2192cf..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:956ffd6cbb30ed2bc8c585e8c938477943d920f7309981a9864bf8f98ae3f992
-size 292
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.dbf
deleted file mode 100644
index 9ba00259ac7d3effd149c9bde7c15def5fb69d93..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6ac3987c4408a1c86528898189249cc26502b02b536a0e64a5106f0d230b3a8b
-size 33
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.prj b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.prj
deleted file mode 100644
index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.prj
+++ /dev/null
@@ -1 +0,0 @@
-PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
\ No newline at end of file
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shp b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shp
deleted file mode 100644
index f970b67678a899f87859859d3bcb35a9b4c6c525..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:926401bfc2997f7c001f827859a1281ceb6f688660720f605f14f3e54207568e
-size 100
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shx b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shx
deleted file mode 100644
index f970b67678a899f87859859d3bcb35a9b4c6c525..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:926401bfc2997f7c001f827859a1281ceb6f688660720f605f14f3e54207568e
-size 100
diff --git a/Data/Baseline/OTB-Applications/Files/clDT_ModelQB1.1.dt b/Data/Baseline/OTB-Applications/Files/clDT_ModelQB1.1.dt
new file mode 100644
index 0000000000000000000000000000000000000000..14e83e643867a596baa6b98ae1966dfb8ad58a67
--- /dev/null
+++ b/Data/Baseline/OTB-Applications/Files/clDT_ModelQB1.1.dt
@@ -0,0 +1,57 @@
+%YAML:1.0
+---
+opencv_ml_dtree:
+   format: 3
+   is_classifier: 1
+   var_all: 5
+   var_count: 4
+   ord_var_count: 4
+   cat_var_count: 1
+   training_params:
+      use_surrogates: 0
+      max_categories: 10
+      regression_accuracy: 9.9999997764825821e-03
+      max_depth: 10
+      min_sample_count: 10
+      cross_validation_folds: 0
+   global_var_idx: 1
+   var_idx: [ 0, 1, 2, 3 ]
+   var_type: [ 0, 0, 0, 0, 1 ]
+   cat_ofs: [ 0, 0, 0, 0, 0, 0, 0, 0 ]
+   class_labels: [ 1, 2, 3, 4 ]
+   missing_subst: [ 0., 0., 0., 0., 0. ]
+   nodes:
+      -
+         depth: 0
+         value: 1.
+         norm_class_idx: 0
+         splits:
+            - { var:0, quality:86., le:-8.9000031352043152e-02 }
+      -
+         depth: 1
+         value: 1.
+         norm_class_idx: 0
+         splits:
+            - { var:3, quality:86., le:-1.3876452445983887e+00 }
+      -
+         depth: 2
+         value: 1.
+         norm_class_idx: 0
+      -
+         depth: 2
+         value: 3.
+         norm_class_idx: 2
+      -
+         depth: 1
+         value: 2.
+         norm_class_idx: 1
+         splits:
+            - { var:1, quality:86., le:3.4949243068695068e-01 }
+      -
+         depth: 2
+         value: 2.
+         norm_class_idx: 1
+      -
+         depth: 2
+         value: 4.
+         norm_class_idx: 3
diff --git a/Data/Baseline/OTB-Applications/Images/apTvClKMeansImageClassificationInputCentroids.tif b/Data/Baseline/OTB-Applications/Images/apTvClKMeansImageClassificationInputCentroids.tif
new file mode 100644
index 0000000000000000000000000000000000000000..ce0ecbe5e6e8ea678c4ce3a6e7701d725de1658a
--- /dev/null
+++ b/Data/Baseline/OTB-Applications/Images/apTvClKMeansImageClassificationInputCentroids.tif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:28427a2e951d1b56636568b966922a2d99f68c8e3f477aab99904fa5971fc42d
+size 66540
diff --git a/Data/Baseline/OTB/Files/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt b/Data/Baseline/OTB/Files/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt
deleted file mode 100644
index 4a22e8ff04fcc5b9c47c42cd28b5191c0977cbc6..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt
+++ /dev/null
@@ -1,18048 +0,0 @@
----
-Label        : 1
-Position     : [244.61, 1.64508]
-Measurements : [1399.95, 310113, 0.266257, -0.476478]
----
-Label        : 1
-Position     : [241.128, 6.12]
-Measurements : [1466.45, 487704, 0.232991, -1.2636]
----
-Label        : 1
-Position     : [145.371, 6.6365]
-Measurements : [1208.23, 386771, 0.401874, -0.981297]
----
-Label        : 1
-Position     : [633.408, 8.68]
-Measurements : [1465.12, 382959, 0.372033, -1.244]
----
-Label        : 1
-Position     : [250.856, 9.192]
-Measurements : [993.262, 136479, 0.278658, -0.930991]
----
-Label        : 1
-Position     : [255.214, 10.1541]
-Measurements : [1078.76, 119096, 0.313496, -0.642462]
----
-Label        : 1
-Position     : [390.951, 10.5048]
-Measurements : [1572.18, 315723, -0.278482, -0.414006]
----
-Label        : 1
-Position     : [243.582, 10.5278]
-Measurements : [1045.65, 500117, 1.10216, -0.141367]
----
-Label        : 1
-Position     : [732.736, 10.728]
-Measurements : [1762.88, 822066, -0.103484, -1.57081]
----
-Label        : 1
-Position     : [137.973, 11.0771]
-Measurements : [1256.87, 159712, 0.616424, 0.726392]
----
-Label        : 1
-Position     : [141.8, 11.24]
-Measurements : [1091.2, 260850, 0.559676, -0.294604]
----
-Label        : 1
-Position     : [731.097, 11.4464]
-Measurements : [1592.97, 893144, 0.148556, -1.60652]
----
-Label        : 1
-Position     : [633.484, 11.7069]
-Measurements : [1417.94, 406889, 0.473387, -1.23179]
----
-Label        : 1
-Position     : [631.412, 12.0436]
-Measurements : [1338.02, 330638, 0.756367, -0.51725]
----
-Label        : 1
-Position     : [388.688, 12.264]
-Measurements : [1610.63, 268830, -0.15682, -0.3936]
----
-Label        : 1
-Position     : [255.69, 13.11]
-Measurements : [1106.66, 105507, 0.132854, -0.843231]
----
-Label        : 1
-Position     : [632.879, 13.4648]
-Measurements : [1188.96, 285530, 1.08638, 0.33468]
----
-Label        : 1
-Position     : [636.692, 13.4681]
-Measurements : [1033.69, 268840, 1.51544, 1.83386]
----
-Label        : 1
-Position     : [736.543, 13.4748]
-Measurements : [1164.8, 883154, 1.1134, -0.431529]
----
-Label        : 1
-Position     : [390.222, 13.9819]
-Measurements : [1660.22, 229802, 0.0782276, -0.814122]
----
-Label        : 1
-Position     : [632.384, 14.312]
-Measurements : [1012.4, 177711, 0.772086, 0.107333]
----
-Label        : 1
-Position     : [21.4766, 14.8077]
-Measurements : [795.261, 357152, 1.18748, 0.459446]
----
-Label        : 1
-Position     : [392.641, 16.0582]
-Measurements : [1638.22, 226522, 0.14735, -0.93468]
----
-Label        : 1
-Position     : [249.832, 17.896]
-Measurements : [1307.62, 466036, 1.02525, 0.247706]
----
-Label        : 1
-Position     : [392.272, 17.896]
-Measurements : [1615.52, 211561, 0.107659, -0.903024]
----
-Label        : 1
-Position     : [463.44, 17.896]
-Measurements : [1208.43, 545199, 0.88799, -0.0947112]
----
-Label        : 1
-Position     : [24.0958, 18.4597]
-Measurements : [1141.29, 306141, 1.15167, 1.3369]
----
-Label        : 1
-Position     : [245.902, 18.73]
-Measurements : [1440.71, 720124, 0.354696, -1.28161]
----
-Label        : 1
-Position     : [22.504, 19.432]
-Measurements : [1278.26, 415437, 0.803853, -0.10986]
----
-Label        : 1
-Position     : [514.821, 20.527]
-Measurements : [1898.42, 453807, 0.1057, -1.21854]
----
-Label        : 1
-Position     : [463.682, 20.8592]
-Measurements : [1761.42, 608797, 0.142866, -1.24805]
----
-Label        : 1
-Position     : [516.176, 20.968]
-Measurements : [1914.58, 572565, -0.0181663, -1.35972]
----
-Label        : 1
-Position     : [153.662, 21.1989]
-Measurements : [1506.15, 580964, -0.152713, -1.35291]
----
-Label        : 1
-Position     : [388.377, 21.2292]
-Measurements : [1267.5, 207452, 0.360062, -0.744269]
----
-Label        : 1
-Position     : [250.729, 22.2607]
-Measurements : [1073.09, 473769, 1.24396, 0.868018]
----
-Label        : 1
-Position     : [516.187, 22.3915]
-Measurements : [2146.87, 480967, -0.342337, -1.23822]
----
-Label        : 1
-Position     : [462.482, 22.4791]
-Measurements : [2129.57, 517522, -0.267177, -1.15811]
----
-Label        : 1
-Position     : [506.96, 22.504]
-Measurements : [1908.17, 249995, 0.161354, -0.726865]
----
-Label        : 1
-Position     : [398.494, 22.8755]
-Measurements : [1657.21, 181656, 0.00827773, -0.871096]
----
-Label        : 1
-Position     : [737.143, 23.0831]
-Measurements : [783.959, 227622, 1.37876, 0.616613]
----
-Label        : 1
-Position     : [465.466, 23.1043]
-Measurements : [2152.34, 547081, -0.158895, -1.23519]
----
-Label        : 1
-Position     : [509.553, 23.3008]
-Measurements : [1965.67, 280987, 0.0783567, -1.00579]
----
-Label        : 1
-Position     : [732.224, 24.04]
-Measurements : [1025.3, 238485, 0.672238, -0.889804]
----
-Label        : 1
-Position     : [781.738, 24.5256]
-Measurements : [464.236, 23392.7, 1.45716, 0.94265]
----
-Label        : 1
-Position     : [501.188, 24.5512]
-Measurements : [1608.93, 167753, 0.226801, -0.447532]
----
-Label        : 1
-Position     : [468.56, 24.552]
-Measurements : [2138.24, 554036, -0.226939, -0.996085]
----
-Label        : 1
-Position     : [151.016, 25.064]
-Measurements : [1748.73, 214056, 0.0103525, -0.888018]
----
-Label        : 1
-Position     : [399.44, 25.064]
-Measurements : [1504.12, 316982, -0.312925, -0.924175]
----
-Label        : 1
-Position     : [26.6549, 26.0814]
-Measurements : [1091.79, 305305, 0.576538, -0.74217]
----
-Label        : 1
-Position     : [28.136, 26.6]
-Measurements : [1120.4, 265311, 0.662549, -0.538509]
----
-Label        : 1
-Position     : [511.833, 26.6849]
-Measurements : [1906.72, 445497, -0.27535, -1.01516]
----
-Label        : 1
-Position     : [499.28, 27.624]
-Measurements : [1507.84, 123543, -0.351548, -0.862913]
----
-Label        : 1
-Position     : [398.49, 27.822]
-Measurements : [1379.79, 415076, -0.0775959, -1.37466]
----
-Label        : 1
-Position     : [736.674, 28.041]
-Measurements : [684.173, 210658, 1.89014, 2.60705]
----
-Label        : 1
-Position     : [785.231, 28.2292]
-Measurements : [779.812, 223683, 1.6827, 2.81675]
----
-Label        : 1
-Position     : [785.984, 29.16]
-Measurements : [790.413, 215790, 1.75073, 3.0408]
----
-Label        : 1
-Position     : [503.064, 29.2999]
-Measurements : [1488.67, 276999, -0.132504, -0.813677]
----
-Label        : 1
-Position     : [467.211, 29.4727]
-Measurements : [2357.58, 460440, -0.774753, -0.199534]
----
-Label        : 1
-Position     : [154.914, 29.6333]
-Measurements : [1296.44, 486853, 0.554433, -0.211259]
----
-Label        : 1
-Position     : [33.1288, 31.4463]
-Measurements : [709.888, 109907, 0.782466, 0.0455805]
----
-Label        : 1
-Position     : [474.192, 32.744]
-Measurements : [2346.91, 320418, -1.04922, 0.608591]
----
-Label        : 1
-Position     : [474.373, 35.4507]
-Measurements : [2561.21, 202660, -0.843659, 0.465157]
----
-Label        : 1
-Position     : [469.383, 36.2274]
-Measurements : [2513.07, 331345, -1.47677, 2.25475]
----
-Label        : 1
-Position     : [477.776, 38.888]
-Measurements : [2501.1, 299662, -0.407297, -0.786396]
----
-Label        : 1
-Position     : [476.508, 40.2221]
-Measurements : [2547.82, 277359, -0.337944, -0.875621]
----
-Label        : 1
-Position     : [481.204, 41.0933]
-Measurements : [2436.21, 246087, -0.848396, -0.195383]
----
-Label        : 1
-Position     : [146.811, 42.9006]
-Measurements : [651.591, 127745, 1.1435, 0.595122]
----
-Label        : 1
-Position     : [480.125, 44.6418]
-Measurements : [2439.53, 235119, -0.839143, -0.361184]
----
-Label        : 1
-Position     : [150.438, 44.8023]
-Measurements : [786.291, 238061, 0.976615, 0.295175]
----
-Label        : 1
-Position     : [639.04, 45.032]
-Measurements : [1011.28, 306948, 0.537234, -0.97489]
----
-Label        : 1
-Position     : [401.488, 45.544]
-Measurements : [1072.85, 211038, 0.179089, -1.22378]
----
-Label        : 1
-Position     : [396.788, 46.1598]
-Measurements : [938.122, 220132, 0.588968, -0.970861]
----
-Label        : 1
-Position     : [482.896, 46.568]
-Measurements : [2462.39, 198571, -0.789782, -0.439342]
----
-Label        : 1
-Position     : [478.701, 46.9408]
-Measurements : [2528.31, 225390, -0.654415, -0.417266]
----
-Label        : 1
-Position     : [30.696, 47.08]
-Measurements : [1279.16, 397520, 0.40258, -1.13234]
----
-Label        : 1
-Position     : [148.456, 47.08]
-Measurements : [1060.5, 232907, 0.789113, 0.21222]
----
-Label        : 1
-Position     : [636.712, 47.2538]
-Measurements : [993.879, 330254, 0.537125, -1.12924]
----
-Label        : 1
-Position     : [399.698, 47.6833]
-Measurements : [1003.16, 238939, 0.366465, -1.29767]
----
-Label        : 1
-Position     : [32.0718, 48.8004]
-Measurements : [1227.68, 366444, 0.396699, -1.1008]
----
-Label        : 1
-Position     : [483.182, 48.8229]
-Measurements : [2470.79, 165384, -0.700125, -0.47963]
----
-Label        : 1
-Position     : [146.13, 48.9529]
-Measurements : [1140.38, 163198, 0.522848, -0.842353]
----
-Label        : 1
-Position     : [280.813, 49.2236]
-Measurements : [942.677, 241572, 0.526166, -0.794988]
----
-Label        : 1
-Position     : [639.248, 49.3982]
-Measurements : [833.569, 350365, 1.02295, -0.452583]
----
-Label        : 1
-Position     : [32.9101, 51.4564]
-Measurements : [914.108, 389934, 1.14525, 0.0384974]
----
-Label        : 1
-Position     : [481.821, 51.4818]
-Measurements : [2514.74, 201478, -0.496563, -0.814439]
----
-Label        : 1
-Position     : [281.576, 53.224]
-Measurements : [982.418, 185655, 0.818729, -0.322751]
----
-Label        : 1
-Position     : [150.504, 53.736]
-Measurements : [1613.92, 300809, -0.104234, -0.926321]
----
-Label        : 1
-Position     : [485.968, 53.736]
-Measurements : [2291.15, 219738, -0.0303204, -0.791027]
----
-Label        : 1
-Position     : [408.469, 54.7806]
-Measurements : [1503.82, 414269, 0.102071, -0.983995]
----
-Label        : 1
-Position     : [485.552, 55.1294]
-Measurements : [2260.99, 198482, -0.173856, -0.770322]
----
-Label        : 1
-Position     : [512.892, 55.3723]
-Measurements : [1247.32, 321649, -0.307241, -1.43016]
----
-Label        : 1
-Position     : [406.096, 55.784]
-Measurements : [1487.85, 324277, 0.0955268, -0.564059]
----
-Label        : 1
-Position     : [402.194, 56.0926]
-Measurements : [1173.87, 227091, -0.0469741, -1.26695]
----
-Label        : 1
-Position     : [487.202, 56.3229]
-Measurements : [2209.63, 203604, -0.0750906, -0.907866]
----
-Label        : 1
-Position     : [146.981, 56.3887]
-Measurements : [1464.68, 161968, -0.540099, -0.799225]
----
-Label        : 1
-Position     : [147.923, 56.7645]
-Measurements : [1574.03, 169744, -0.52637, -0.269704]
----
-Label        : 1
-Position     : [646.398, 57.769]
-Measurements : [1019.1, 248626, 0.220451, -0.359875]
----
-Label        : 1
-Position     : [514.128, 57.832]
-Measurements : [1207.79, 357121, -0.139803, -1.63507]
----
-Label        : 1
-Position     : [286.376, 57.8966]
-Measurements : [762.626, 160955, 1.02396, -0.0826948]
----
-Label        : 1
-Position     : [149.827, 57.9983]
-Measurements : [1734.81, 223766, -0.145279, -0.214388]
----
-Label        : 1
-Position     : [512.777, 58.3428]
-Measurements : [1407.02, 230704, -0.777545, -0.589553]
----
-Label        : 1
-Position     : [410.743, 59.3163]
-Measurements : [1466.21, 370036, 0.00546922, -1.14312]
----
-Label        : 1
-Position     : [489.552, 59.88]
-Measurements : [2206.16, 199262, 0.139083, -0.632729]
----
-Label        : 1
-Position     : [150.504, 60.392]
-Measurements : [1564.09, 285351, 0.00264356, -0.629832]
----
-Label        : 1
-Position     : [641.343, 61.6995]
-Measurements : [1123.44, 401059, 0.127394, -1.27937]
----
-Label        : 1
-Position     : [524.025, 62.343]
-Measurements : [678.39, 220280, 1.76188, 2.84388]
----
-Label        : 1
-Position     : [642.624, 62.44]
-Measurements : [1281.61, 341332, -0.199448, -1.04494]
----
-Label        : 1
-Position     : [526.376, 63.0292]
-Measurements : [755.474, 235552, 1.2852, 1.36501]
----
-Label        : 1
-Position     : [409.68, 63.464]
-Measurements : [1344.05, 363137, 0.32516, -1.07766]
----
-Label        : 1
-Position     : [489.304, 64.2746]
-Measurements : [2550.7, 245615, -0.353762, -0.684571]
----
-Label        : 1
-Position     : [153.747, 64.3541]
-Measurements : [1127.62, 387477, 0.528247, -0.89447]
----
-Label        : 1
-Position     : [528.797, 65.0709]
-Measurements : [923.884, 206711, 0.785987, 0.772355]
----
-Label        : 1
-Position     : [411.712, 65.1208]
-Measurements : [1195.28, 444668, 0.501999, -1.10361]
----
-Label        : 1
-Position     : [736.373, 65.2588]
-Measurements : [925.973, 569079, 0.923134, -0.82582]
----
-Label        : 1
-Position     : [526.416, 66.024]
-Measurements : [937.748, 200420, 0.787841, 0.832355]
----
-Label        : 1
-Position     : [634.566, 66.0589]
-Measurements : [1107.19, 437732, 0.288566, -0.990485]
----
-Label        : 1
-Position     : [408.468, 66.9523]
-Measurements : [1271.67, 345809, 0.447664, -0.87485]
----
-Label        : 1
-Position     : [493.648, 67.048]
-Measurements : [2565.87, 318345, -0.862812, 0.120293]
----
-Label        : 1
-Position     : [489.309, 67.1856]
-Measurements : [2778.19, 156517, -0.590919, -0.103957]
----
-Label        : 1
-Position     : [151.016, 67.56]
-Measurements : [951.112, 257371, 0.707459, -0.969823]
----
-Label        : 1
-Position     : [494.365, 68.7431]
-Measurements : [2469.63, 425073, -0.873973, -0.285714]
----
-Label        : 1
-Position     : [531.024, 69.096]
-Measurements : [1060.1, 152696, 0.894956, 1.33329]
----
-Label        : 1
-Position     : [532.841, 69.2365]
-Measurements : [1031.55, 152734, 0.893183, 1.52887]
----
-Label        : 1
-Position     : [731.712, 69.608]
-Measurements : [1750.46, 494126, -0.476515, -0.796277]
----
-Label        : 1
-Position     : [639.552, 70.12]
-Measurements : [1435.04, 407739, -0.113456, -1.35784]
----
-Label        : 1
-Position     : [151.236, 71.2708]
-Measurements : [651.874, 196335, 1.62119, 1.23144]
----
-Label        : 1
-Position     : [407.12, 71.656]
-Measurements : [1190.02, 321318, 0.830741, -0.0541515]
----
-Label        : 1
-Position     : [501.307, 71.8869]
-Measurements : [1765.1, 370415, 0.368729, -0.5675]
----
-Label        : 1
-Position     : [724.253, 72.0387]
-Measurements : [1547.51, 427895, 0.253832, -0.914729]
----
-Label        : 1
-Position     : [38.4345, 72.907]
-Measurements : [1163, 314130, 0.310145, -0.713743]
----
-Label        : 1
-Position     : [299.15, 73.1046]
-Measurements : [973.079, 407487, 0.788035, -0.760626]
----
-Label        : 1
-Position     : [497.744, 73.192]
-Measurements : [2045.32, 569107, -0.0844212, -1.21743]
----
-Label        : 1
-Position     : [730.479, 73.5615]
-Measurements : [1501, 609631, 0.0505779, -1.44031]
----
-Label        : 1
-Position     : [530.782, 73.6834]
-Measurements : [992.847, 70865.1, -0.139589, -0.777455]
----
-Label        : 1
-Position     : [534.608, 74.728]
-Measurements : [1076.39, 54277.8, -0.0403846, -0.619779]
----
-Label        : 1
-Position     : [722.496, 74.728]
-Measurements : [1309.99, 278624, 0.633246, -0.191714]
----
-Label        : 1
-Position     : [637.029, 74.9055]
-Measurements : [1013.84, 510831, 0.825043, -0.926402]
----
-Label        : 1
-Position     : [534.278, 75.1308]
-Measurements : [1098.33, 55019.9, 0.384065, 0.538966]
----
-Label        : 1
-Position     : [35.304, 75.24]
-Measurements : [1287.51, 361736, 0.298422, -1.14136]
----
-Label        : 1
-Position     : [297.825, 75.3346]
-Measurements : [986.428, 433855, 0.69096, -0.968558]
----
-Label        : 1
-Position     : [411.711, 75.5489]
-Measurements : [1704.36, 500308, -0.110353, -1.16457]
----
-Label        : 1
-Position     : [300.112, 75.752]
-Measurements : [1106.38, 364343, 0.585591, -0.972097]
----
-Label        : 1
-Position     : [40.0663, 75.8806]
-Measurements : [1062.4, 201917, 0.444531, -0.966213]
----
-Label        : 1
-Position     : [725.415, 76.5828]
-Measurements : [1286.91, 369058, 0.39385, -0.929769]
----
-Label        : 1
-Position     : [415.312, 76.776]
-Measurements : [1848.33, 716938, -0.219702, -1.43866]
----
-Label        : 1
-Position     : [537.68, 77.8]
-Measurements : [1196.33, 128090, 0.647327, 0.501685]
----
-Label        : 1
-Position     : [534.852, 78.2465]
-Measurements : [1133.03, 99343, 0.339302, 0.434633]
----
-Label        : 0
-Position     : [92.1127, 78.4374]
-Measurements : [1109.44, 7506.35, -1.04267, 1.00777]
----
-Label        : 1
-Position     : [411.345, 78.5972]
-Measurements : [1717.57, 450220, 0.0725332, -1.28834]
----
-Label        : 1
-Position     : [533.148, 78.6543]
-Measurements : [1080.99, 84062.9, -0.0894858, -0.408748]
----
-Label        : 0
-Position     : [95.3936, 78.7711]
-Measurements : [1108.25, 13396.4, 0.482908, 2.23481]
----
-Label        : 0
-Position     : [109.322, 79.1238]
-Measurements : [1071.97, 37925.4, 0.685131, 0.956957]
----
-Label        : 0
-Position     : [87.738, 80.0104]
-Measurements : [1150.49, 9287.65, -2.39312, 5.91688]
----
-Label        : 1
-Position     : [499.792, 80.36]
-Measurements : [2213.86, 503045, -0.259567, -1.03712]
----
-Label        : 1
-Position     : [418.984, 80.6891]
-Measurements : [1368.77, 549868, 0.845426, -0.36176]
----
-Label        : 1
-Position     : [723.008, 80.872]
-Measurements : [1358.47, 349551, 0.640774, -0.592525]
----
-Label        : 1
-Position     : [411.116, 81.0041]
-Measurements : [1510.43, 419937, 0.407037, -0.773012]
----
-Label        : 1
-Position     : [720.457, 81.2607]
-Measurements : [1383.69, 273300, 0.731504, -0.0320697]
----
-Label        : 1
-Position     : [230.957, 81.8943]
-Measurements : [1454.9, 546540, 0.382177, -1.32888]
----
-Label        : 1
-Position     : [541.264, 81.896]
-Measurements : [1450.31, 245132, 0.273894, -0.251411]
----
-Label        : 1
-Position     : [231.437, 82.1053]
-Measurements : [1430.38, 486833, 0.534145, -1.08849]
----
-Label        : 1
-Position     : [310.374, 82.6047]
-Measurements : [971.624, 327632, 0.823834, -0.376812]
----
-Label        : 1
-Position     : [536.303, 82.9859]
-Measurements : [1378.75, 215446, 0.727624, 0.327514]
----
-Label        : 1
-Position     : [313.09, 83.2544]
-Measurements : [1152.17, 286801, 0.79644, 0.0569467]
----
-Label        : 1
-Position     : [505.03, 83.2899]
-Measurements : [1781.76, 209495, 0.398465, -0.453074]
----
-Label        : 1
-Position     : [720.173, 83.6023]
-Measurements : [1486.33, 258472, 0.324757, -0.256891]
----
-Label        : 1
-Position     : [502.527, 84.2095]
-Measurements : [1706.72, 379939, 0.435575, -0.540791]
----
-Label        : 1
-Position     : [545.971, 84.3644]
-Measurements : [1502.72, 189370, 0.597719, 0.193823]
----
-Label        : 1
-Position     : [500.389, 84.472]
-Measurements : [1762.43, 576006, 0.400357, -0.902264]
----
-Label        : 1
-Position     : [247.76, 84.5176]
-Measurements : [1046.37, 432718, 0.45893, -1.19884]
----
-Label        : 1
-Position     : [508.496, 84.968]
-Measurements : [1742.37, 188795, -0.0165191, -0.493912]
----
-Label        : 1
-Position     : [234.984, 85.992]
-Measurements : [1204.86, 228773, 0.848148, 0.435681]
----
-Label        : 1
-Position     : [415.824, 85.992]
-Measurements : [1133.36, 175910, 0.251633, -1.14509]
----
-Label        : 1
-Position     : [643.648, 85.992]
-Measurements : [1312.1, 349484, 0.214303, -0.569861]
----
-Label        : 1
-Position     : [793.834, 86.3359]
-Measurements : [1049.86, 177361, 0.109025, -1.09353]
----
-Label        : 1
-Position     : [641.83, 86.7441]
-Measurements : [1244.36, 350427, 0.403563, -0.466927]
----
-Label        : 1
-Position     : [545.977, 86.789]
-Measurements : [1617.33, 249607, 0.533211, -0.250782]
----
-Label        : 1
-Position     : [227.816, 87.016]
-Measurements : [1616.24, 348367, -0.0880458, -1.27861]
----
-Label        : 1
-Position     : [311.376, 87.016]
-Measurements : [1637.86, 483075, 0.141674, -0.8608]
----
-Label        : 1
-Position     : [793.152, 87.016]
-Measurements : [994.897, 211129, 0.201361, -1.31052]
----
-Label        : 1
-Position     : [234.962, 87.1838]
-Measurements : [1255.91, 256777, 0.748086, 0.224963]
----
-Label        : 1
-Position     : [251.155, 87.3764]
-Measurements : [1410.69, 266279, -0.0403681, -0.772312]
----
-Label        : 1
-Position     : [647.236, 87.4288]
-Measurements : [1342.99, 275609, 0.507612, -0.116743]
----
-Label        : 1
-Position     : [512.434, 88.3334]
-Measurements : [1930.01, 222004, -0.329513, -0.876027]
----
-Label        : 1
-Position     : [220.961, 88.5146]
-Measurements : [1387.2, 218699, -0.310078, -1.0715]
----
-Label        : 1
-Position     : [250.344, 88.552]
-Measurements : [1371.55, 260591, -0.0649667, -0.638483]
----
-Label        : 1
-Position     : [508.06, 88.9408]
-Measurements : [1737.51, 353590, -0.341023, -0.77548]
----
-Label        : 1
-Position     : [513.104, 89.064]
-Measurements : [1953.25, 243690, -0.482045, -0.747181]
----
-Label        : 1
-Position     : [514.67, 89.8881]
-Measurements : [1926.18, 238072, -0.35238, -0.936509]
----
-Label        : 1
-Position     : [544.848, 90.088]
-Measurements : [1625.45, 328196, 0.343572, -0.436161]
----
-Label        : 1
-Position     : [722.496, 90.088]
-Measurements : [1379.22, 213429, -0.901277, -0.752079]
----
-Label        : 1
-Position     : [645.793, 90.2686]
-Measurements : [1288.29, 169307, 0.171626, 0.355703]
----
-Label        : 1
-Position     : [208.699, 90.2753]
-Measurements : [974.846, 163077, -0.0711373, -1.42608]
----
-Label        : 1
-Position     : [416.173, 90.3642]
-Measurements : [813.742, 220021, 1.01131, -0.443239]
----
-Label        : 1
-Position     : [789.228, 90.7935]
-Measurements : [717.319, 255956, 1.15583, -0.290952]
----
-Label        : 1
-Position     : [541.634, 90.8781]
-Measurements : [1618.67, 263329, 0.568741, 0.274917]
----
-Label        : 1
-Position     : [229.384, 91.0036]
-Measurements : [1566.22, 295184, 0.0635331, -1.00503]
----
-Label        : 1
-Position     : [314.538, 91.1327]
-Measurements : [1477.03, 507536, 0.697796, -0.781491]
----
-Label        : 1
-Position     : [510.1, 91.1933]
-Measurements : [1862.81, 416812, -0.734054, -0.438029]
----
-Label        : 1
-Position     : [219.112, 91.624]
-Measurements : [1330.96, 264912, -0.198132, -1.41048]
----
-Label        : 1
-Position     : [646.208, 91.624]
-Measurements : [1225.45, 143585, -0.386217, -0.99674]
----
-Label        : 1
-Position     : [312.4, 92.136]
-Measurements : [1530.97, 560692, 0.338826, -1.08327]
----
-Label        : 1
-Position     : [516.458, 92.2009]
-Measurements : [1770.19, 312177, 0.040679, -1.30023]
----
-Label        : 1
-Position     : [726.724, 92.3023]
-Measurements : [1237.89, 272684, -0.37824, -1.59925]
----
-Label        : 1
-Position     : [719.156, 92.5538]
-Measurements : [1067.91, 339129, 0.110837, -1.81924]
----
-Label        : 1
-Position     : [209.896, 93.16]
-Measurements : [979.264, 145084, -0.0279663, -1.22398]
----
-Label        : 1
-Position     : [645.654, 93.3011]
-Measurements : [1147.74, 144378, -0.25268, -1.09159]
----
-Label        : 1
-Position     : [255.976, 93.672]
-Measurements : [1574.34, 174765, -0.433033, -0.118507]
----
-Label        : 1
-Position     : [516.176, 94.184]
-Measurements : [1704.18, 339435, 0.0761093, -1.13292]
----
-Label        : 1
-Position     : [215.59, 94.2739]
-Measurements : [1138.59, 256619, 0.291274, -1.27282]
----
-Label        : 1
-Position     : [310.847, 95.7036]
-Measurements : [1171.76, 652815, 0.7876, -0.659716]
----
-Label        : 1
-Position     : [208.894, 95.9693]
-Measurements : [900.298, 165919, 0.0614197, -1.36078]
----
-Label        : 1
-Position     : [317.024, 97.5957]
-Measurements : [1090.27, 343145, 0.700512, -0.545723]
----
-Label        : 1
-Position     : [259.572, 97.6378]
-Measurements : [1136.85, 270942, 0.24863, -0.766387]
----
-Label        : 1
-Position     : [522.782, 98.1872]
-Measurements : [1734.26, 206765, -0.3432, -0.991281]
----
-Label        : 1
-Position     : [252.666, 98.5213]
-Measurements : [1171.93, 215554, 0.310786, -1.03181]
----
-Label        : 1
-Position     : [523.087, 98.5224]
-Measurements : [1729.93, 210981, -0.348607, -1.00413]
----
-Label        : 1
-Position     : [715.883, 98.8042]
-Measurements : [888.529, 233329, 0.476561, -1.30497]
----
-Label        : 1
-Position     : [520.272, 99.304]
-Measurements : [1806.94, 192973, -0.680368, -0.0148814]
----
-Label        : 1
-Position     : [527.616, 99.4919]
-Measurements : [1637.93, 233703, -0.216636, -0.989002]
----
-Label        : 1
-Position     : [158.965, 100.627]
-Measurements : [1057.99, 576974, 0.506057, -1.36932]
----
-Label        : 1
-Position     : [319.424, 101.19]
-Measurements : [1289, 357238, 0.00683936, -1.27157]
----
-Label        : 1
-Position     : [518.634, 101.39]
-Measurements : [1690.59, 367844, -0.604401, -0.491386]
----
-Label        : 1
-Position     : [257.705, 101.623]
-Measurements : [1051.64, 198055, 0.185547, -1.15064]
----
-Label        : 1
-Position     : [714.293, 101.693]
-Measurements : [1210.87, 228499, -0.287881, -0.99352]
----
-Label        : 1
-Position     : [167.379, 101.709]
-Measurements : [955.185, 446514, 1.0842, -0.413929]
----
-Label        : 1
-Position     : [716.352, 101.864]
-Measurements : [1162.44, 277330, -0.218701, -1.30119]
----
-Label        : 1
-Position     : [162.792, 102.376]
-Measurements : [1307.06, 507986, 0.191174, -1.53486]
----
-Label        : 1
-Position     : [318.032, 102.376]
-Measurements : [1422.34, 334825, -0.446, -0.904958]
----
-Label        : 1
-Position     : [523.344, 102.888]
-Measurements : [1894.2, 194640, -0.749489, -0.154715]
----
-Label        : 1
-Position     : [261.826, 103.644]
-Measurements : [1160.42, 144003, -0.371143, -0.82547]
----
-Label        : 1
-Position     : [262.12, 103.912]
-Measurements : [1183.55, 151938, -0.242121, -0.650662]
----
-Label        : 1
-Position     : [557.136, 103.912]
-Measurements : [1492.43, 305852, -0.200073, -0.403389]
----
-Label        : 0
-Position     : [118.265, 104.411]
-Measurements : [1242.47, 30363.2, 3.0769, 10.8863]
----
-Label        : 1
-Position     : [667.802, 105.478]
-Measurements : [988.599, 207015, 0.450568, -0.583402]
----
-Label        : 1
-Position     : [528.325, 105.5]
-Measurements : [1643.96, 309566, -0.205076, -1.30918]
----
-Label        : 1
-Position     : [712.708, 105.576]
-Measurements : [1529.85, 199512, -0.446041, -0.403548]
----
-Label        : 1
-Position     : [552.95, 105.776]
-Measurements : [1457.92, 306223, -0.28068, -0.184712]
----
-Label        : 1
-Position     : [318.374, 106.244]
-Measurements : [1380.64, 286111, -0.334023, -0.932676]
----
-Label        : 1
-Position     : [319.056, 107.496]
-Measurements : [1257.26, 294835, -0.104061, -1.29524]
----
-Label        : 1
-Position     : [263.398, 107.806]
-Measurements : [1323.32, 141925, 0.548271, 1.09352]
----
-Label        : 1
-Position     : [267.24, 108.008]
-Measurements : [1297.52, 289741, 0.367777, -0.55024]
----
-Label        : 1
-Position     : [669.76, 108.008]
-Measurements : [1096.11, 207340, 0.330401, -0.997764]
----
-Label        : 1
-Position     : [266.811, 108.092]
-Measurements : [1317.16, 247175, 0.400011, -0.191347]
----
-Label        : 1
-Position     : [712.768, 108.52]
-Measurements : [1649.63, 164183, -0.465255, -0.542033]
----
-Label        : 1
-Position     : [560.955, 108.68]
-Measurements : [1783.91, 228472, -0.233207, -0.411194]
----
-Label        : 1
-Position     : [715.55, 108.875]
-Measurements : [1505.38, 281221, -0.452804, -1.02453]
----
-Label        : 1
-Position     : [320.201, 109.112]
-Measurements : [1094.93, 289132, 0.307046, -1.16672]
----
-Label        : 1
-Position     : [524.368, 109.544]
-Measurements : [1682.74, 307050, -0.41468, -0.57049]
----
-Label        : 1
-Position     : [565.896, 109.876]
-Measurements : [1602.1, 208530, 0.235627, -0.639146]
----
-Label        : 1
-Position     : [703.909, 110.454]
-Measurements : [1554.45, 180969, -0.292626, -0.692169]
----
-Label        : 1
-Position     : [666.324, 110.829]
-Measurements : [953.362, 231893, 0.559366, -0.695741]
----
-Label        : 1
-Position     : [710.066, 110.97]
-Measurements : [1638.12, 226903, -0.642881, -0.373772]
----
-Label        : 1
-Position     : [561.232, 111.592]
-Measurements : [1847.63, 154407, 0.0181275, -0.555982]
----
-Label        : 1
-Position     : [706.624, 111.592]
-Measurements : [1599.78, 168121, -0.300517, -0.586663]
----
-Label        : 0
-Position     : [111.176, 111.596]
-Measurements : [1132.23, 45687.3, -0.693308, 1.8718]
----
-Label        : 1
-Position     : [526.561, 112.25]
-Measurements : [1579.72, 235304, -0.244512, -0.651862]
----
-Label        : 1
-Position     : [699.749, 112.672]
-Measurements : [1251.2, 255559, -0.0256705, -0.969806]
----
-Label        : 1
-Position     : [563.428, 112.678]
-Measurements : [1795.67, 165651, 0.152948, -0.511471]
----
-Label        : 1
-Position     : [167.335, 113.116]
-Measurements : [769.335, 232433, 1.19259, 0.182167]
----
-Label        : 1
-Position     : [325.712, 113.128]
-Measurements : [979.65, 157331, 0.858817, 0.281219]
----
-Label        : 1
-Position     : [523.294, 113.255]
-Measurements : [1442.84, 351951, -0.308333, -0.896829]
----
-Label        : 1
-Position     : [162.792, 113.56]
-Measurements : [923.253, 210067, 0.779048, -0.527959]
----
-Label        : 1
-Position     : [164.882, 113.932]
-Measurements : [894.756, 219335, 0.809942, -0.485659]
----
-Label        : 1
-Position     : [321.412, 114.382]
-Measurements : [729.804, 160832, 1.59829, 2.50418]
----
-Label        : 1
-Position     : [700.48, 114.664]
-Measurements : [1297.14, 241601, 0.141907, -0.876793]
----
-Label        : 1
-Position     : [528.992, 115.24]
-Measurements : [1439.84, 214192, -0.0367069, -0.966983]
----
-Label        : 1
-Position     : [683.072, 115.688]
-Measurements : [1369.02, 382654, 0.110694, -1.30542]
----
-Label        : 1
-Position     : [787.649, 116.056]
-Measurements : [1069.04, 298355, 0.349867, -1.02274]
----
-Label        : 1
-Position     : [282.045, 116.276]
-Measurements : [888.759, 514390, 1.21048, -0.158209]
----
-Label        : 1
-Position     : [703.015, 116.342]
-Measurements : [1255.66, 230138, 0.165227, -0.861112]
----
-Label        : 1
-Position     : [532.728, 116.619]
-Measurements : [1301.11, 192281, 0.316429, -0.825745]
----
-Label        : 1
-Position     : [328.936, 117.268]
-Measurements : [899.582, 131603, 0.749477, 0.890214]
----
-Label        : 1
-Position     : [786.872, 117.296]
-Measurements : [1271.02, 329826, 0.083441, -0.856405]
----
-Label        : 1
-Position     : [784.771, 117.505]
-Measurements : [1346.42, 300073, -0.0267144, -0.645099]
----
-Label        : 1
-Position     : [686.252, 117.957]
-Measurements : [986.837, 440009, 1.04617, -0.347022]
----
-Label        : 1
-Position     : [787.104, 119.325]
-Measurements : [1331.1, 302350, 0.178207, -0.702826]
----
-Label        : 1
-Position     : [279.016, 119.704]
-Measurements : [1349.87, 654100, 0.242578, -1.36819]
----
-Label        : 1
-Position     : [425.724, 119.956]
-Measurements : [928.918, 279548, 0.342888, -1.45729]
----
-Label        : 1
-Position     : [534.518, 119.975]
-Measurements : [1287.76, 203152, 0.38779, -0.597426]
----
-Label        : 1
-Position     : [679.096, 120.442]
-Measurements : [1277.73, 392586, 0.0631674, -1.13376]
----
-Label        : 0
-Position     : [111.436, 121.004]
-Measurements : [973.243, 48617, -0.721266, -0.840469]
----
-Label        : 0
-Position     : [81.0551, 121.076]
-Measurements : [1105.47, 10824.7, 0.584296, 0.979848]
----
-Label        : 0
-Position     : [129.052, 121.197]
-Measurements : [760.452, 15625.3, 0.0282606, 1.66524]
----
-Label        : 1
-Position     : [425.568, 121.384]
-Measurements : [966.733, 244442, 0.385685, -1.39025]
----
-Label        : 1
-Position     : [530.528, 121.384]
-Measurements : [1425.93, 204361, -0.0090095, -0.614752]
----
-Label        : 1
-Position     : [282.599, 121.848]
-Measurements : [1174.81, 688615, 0.662836, -1.10586]
----
-Label        : 1
-Position     : [784.312, 121.904]
-Measurements : [1460.44, 284210, 0.116577, -0.888131]
----
-Label        : 1
-Position     : [41.9856, 122.153]
-Measurements : [783.859, 240284, 0.783098, -0.674306]
----
-Label        : 0
-Position     : [95.8715, 122.848]
-Measurements : [897.204, 40152.7, 0.103602, -1.7928]
----
-Label        : 1
-Position     : [787.268, 123.75]
-Measurements : [1288.25, 293997, 0.573319, -0.808307]
----
-Label        : 1
-Position     : [275.095, 123.757]
-Measurements : [1673.88, 435774, -0.0841427, -0.793278]
----
-Label        : 1
-Position     : [530.447, 123.991]
-Measurements : [1404.69, 249970, 0.0651425, -0.575455]
----
-Label        : 1
-Position     : [44.52, 124.312]
-Measurements : [1072.95, 256575, 0.527127, -0.594927]
----
-Label        : 1
-Position     : [278.504, 125.336]
-Measurements : [1561.76, 478849, 0.0748846, -0.945546]
----
-Label        : 1
-Position     : [778.168, 126]
-Measurements : [1290.07, 281976, 0.14496, -0.793504]
----
-Label        : 1
-Position     : [429.459, 126.113]
-Measurements : [499.872, 76914.2, 3.16918, 10.2205]
----
-Label        : 1
-Position     : [279.561, 127.608]
-Measurements : [1526.21, 498000, 0.116888, -0.971512]
----
-Label        : 1
-Position     : [776.613, 127.692]
-Measurements : [1048.91, 274883, 0.0767666, -1.46346]
----
-Label        : 1
-Position     : [583.501, 127.812]
-Measurements : [630.413, 101710, 1.0013, -0.341788]
----
-Label        : 1
-Position     : [165.864, 127.896]
-Measurements : [1046.98, 195802, 0.375744, -0.594556]
----
-Label        : 1
-Position     : [535.648, 128.552]
-Measurements : [1884.15, 177643, -0.521138, -0.0654111]
----
-Label        : 1
-Position     : [45.4843, 128.665]
-Measurements : [1155.56, 186924, 0.370493, -0.529542]
----
-Label        : 1
-Position     : [168.958, 128.857]
-Measurements : [1124.04, 244409, 0.047706, -1.13973]
----
-Label        : 1
-Position     : [583.459, 129.25]
-Measurements : [739.246, 115252, 0.379303, -1.31422]
----
-Label        : 1
-Position     : [535.975, 129.426]
-Measurements : [1867.47, 209846, -0.799698, 0.459274]
----
-Label        : 1
-Position     : [164.638, 129.947]
-Measurements : [951.631, 191198, 0.365229, -0.689925]
----
-Label        : 1
-Position     : [780.877, 130.637]
-Measurements : [909.113, 222529, 0.69993, -0.85232]
----
-Label        : 1
-Position     : [532.503, 130.641]
-Measurements : [1613.34, 345253, -0.412173, -0.812511]
----
-Label        : 1
-Position     : [280.552, 130.968]
-Measurements : [1328.1, 409007, 0.231777, -0.884732]
----
-Label        : 1
-Position     : [581.184, 132.352]
-Measurements : [959.499, 83611.4, -0.632973, -0.573179]
----
-Label        : 1
-Position     : [276.709, 132.601]
-Measurements : [1227.19, 254635, 0.547162, -0.808944]
----
-Label        : 1
-Position     : [46.568, 133.528]
-Measurements : [1344.19, 255406, 0.319402, -0.901558]
----
-Label        : 1
-Position     : [287.255, 134.418]
-Measurements : [767.178, 207829, 1.15703, 0.124504]
----
-Label        : 1
-Position     : [282.831, 134.513]
-Measurements : [1130.19, 295781, 0.431002, -1.03989]
----
-Label        : 1
-Position     : [51.3268, 134.638]
-Measurements : [1256.62, 200843, 0.550443, -0.672985]
----
-Label        : 1
-Position     : [325.728, 135.72]
-Measurements : [1343.55, 563424, 0.181802, -1.46002]
----
-Label        : 1
-Position     : [42.7433, 136.251]
-Measurements : [1155.67, 347608, 0.508557, -1.01234]
----
-Label        : 1
-Position     : [321.8, 137.406]
-Measurements : [1200.88, 639851, 0.479749, -1.38497]
----
-Label        : 1
-Position     : [559.277, 138.527]
-Measurements : [1579.95, 149686, -0.143497, -0.535129]
----
-Label        : 0
-Position     : [126.879, 138.925]
-Measurements : [971.829, 62864.1, -0.530778, -1.04523]
----
-Label        : 1
-Position     : [322.458, 138.968]
-Measurements : [1192.2, 684416, 0.461354, -1.47774]
----
-Label        : 1
-Position     : [284.136, 139.16]
-Measurements : [807.465, 100527, 0.496844, -0.935616]
----
-Label        : 1
-Position     : [285.511, 139.706]
-Measurements : [771.995, 106183, 0.644265, -0.823326]
----
-Label        : 1
-Position     : [560.704, 140.544]
-Measurements : [1612.83, 142992, -0.239338, -0.434783]
----
-Label        : 1
-Position     : [206.54, 142.21]
-Measurements : [793.994, 101125, 0.191725, -1.34298]
----
-Label        : 1
-Position     : [427.788, 142.527]
-Measurements : [611.776, 111051, 1.26625, 0.671914]
----
-Label        : 1
-Position     : [555.427, 142.816]
-Measurements : [1617.08, 150326, -0.177052, -1.05987]
----
-Label        : 1
-Position     : [164.84, 144.28]
-Measurements : [966.97, 277437, 0.962301, -0.230972]
----
-Label        : 1
-Position     : [556.096, 145.152]
-Measurements : [1678.88, 200841, -0.329494, -0.882302]
----
-Label        : 1
-Position     : [163.359, 145.282]
-Measurements : [1006.48, 258708, 0.930751, -0.241716]
----
-Label        : 1
-Position     : [564.854, 145.326]
-Measurements : [1175.97, 251257, 0.558618, -0.630028]
----
-Label        : 1
-Position     : [54.9896, 145.451]
-Measurements : [640.903, 61901.6, 0.849688, -0.31097]
----
-Label        : 1
-Position     : [168.815, 145.821]
-Measurements : [760.356, 243685, 1.40623, 0.849425]
----
-Label        : 1
-Position     : [432.736, 145.96]
-Measurements : [871.897, 200631, 0.417074, -0.772109]
----
-Label        : 1
-Position     : [202.216, 146.328]
-Measurements : [735.998, 77507.3, 0.486003, -1.20397]
----
-Label        : 1
-Position     : [199.37, 147.35]
-Measurements : [718.547, 93630.1, 0.353925, -1.40405]
----
-Label        : 1
-Position     : [439.491, 147.445]
-Measurements : [708.74, 207666, 1.36753, 0.801427]
----
-Label        : 1
-Position     : [288.658, 147.677]
-Measurements : [820.014, 405995, 1.28555, 0.346208]
----
-Label        : 1
-Position     : [293.013, 147.905]
-Measurements : [689.878, 362867, 1.92391, 2.28359]
----
-Label        : 1
-Position     : [555.565, 148.116]
-Measurements : [1626, 177019, 0.0103185, -1.14299]
----
-Label        : 1
-Position     : [435.109, 149.683]
-Measurements : [1119.72, 281166, 0.430565, -0.748525]
----
-Label        : 1
-Position     : [50.664, 150.424]
-Measurements : [987.126, 342024, 0.981039, 9.90691e-05]
----
-Label        : 0
-Position     : [100.443, 151.887]
-Measurements : [964.573, 24883.9, 0.241763, -1.53948]
----
-Label        : 1
-Position     : [288.864, 152.104]
-Measurements : [1148.26, 381276, 0.332974, -0.883249]
----
-Label        : 1
-Position     : [435.296, 152.104]
-Measurements : [1228.6, 368882, 0.566702, -0.73073]
----
-Label        : 1
-Position     : [548.117, 152.945]
-Measurements : [1248.03, 146106, -0.718104, -0.195879]
----
-Label        : 1
-Position     : [437.238, 153.945]
-Measurements : [1162.21, 400716, 0.603825, -0.726079]
----
-Label        : 1
-Position     : [49.582, 154.739]
-Measurements : [952.488, 406598, 1.13155, -0.0186492]
----
-Label        : 0
-Position     : [93.9722, 154.808]
-Measurements : [1190, 42335.4, 0.741809, -0.136511]
----
-Label        : 1
-Position     : [549.952, 155.904]
-Measurements : [1215.97, 145716, -0.712105, -0.179858]
----
-Label        : 1
-Position     : [437.856, 157.736]
-Measurements : [1194.07, 376919, 0.749542, -0.509319]
----
-Label        : 1
-Position     : [290.912, 158.76]
-Measurements : [1105.7, 220256, 0.171187, -1.18595]
----
-Label        : 1
-Position     : [286.405, 158.931]
-Measurements : [1013.65, 174437, 0.530106, -0.759662]
----
-Label        : 0
-Position     : [116.922, 158.994]
-Measurements : [1020.36, 27234.7, -1.59742, 1.84507]
----
-Label        : 1
-Position     : [548.215, 159]
-Measurements : [1010.95, 229876, -0.162641, -1.4615]
----
-Label        : 1
-Position     : [435.795, 159.645]
-Measurements : [1084.69, 319821, 1.08762, 0.482812]
----
-Label        : 1
-Position     : [173.172, 160.418]
-Measurements : [910.603, 360753, 0.92316, -0.711811]
----
-Label        : 1
-Position     : [434.626, 161.185]
-Measurements : [991.996, 185225, 1.224, 1.78436]
----
-Label        : 1
-Position     : [296.135, 161.251]
-Measurements : [1171.76, 456721, 0.430665, -1.07225]
----
-Label        : 1
-Position     : [288.841, 161.311]
-Measurements : [1144.47, 257208, 0.493746, -0.647602]
----
-Label        : 1
-Position     : [439.961, 161.588]
-Measurements : [1235, 383454, 0.625274, -0.770277]
----
-Label        : 1
-Position     : [170.472, 161.688]
-Measurements : [1108.1, 440775, 0.496568, -1.33749]
----
-Label        : 1
-Position     : [51.24, 162.517]
-Measurements : [721.785, 254747, 1.65975, 1.89345]
----
-Label        : 1
-Position     : [439.392, 163.368]
-Measurements : [1222.62, 298314, 0.82134, -0.208641]
----
-Label        : 1
-Position     : [169.046, 163.37]
-Measurements : [1166.61, 393993, 0.507265, -1.33034]
----
-Label        : 1
-Position     : [439.227, 163.469]
-Measurements : [1222.62, 298314, 0.82134, -0.208641]
----
-Label        : 0
-Position     : [80.6968, 163.915]
-Measurements : [1146.21, 8771.87, 0.102303, -1.03749]
----
-Label        : 1
-Position     : [53.736, 165.272]
-Measurements : [800.873, 221357, 1.64339, 2.1331]
----
-Label        : 1
-Position     : [293.165, 165.495]
-Measurements : [1445.16, 315696, 0.193153, -0.948964]
----
-Label        : 0
-Position     : [85.073, 165.554]
-Measurements : [1088.24, 17474.6, -1.2738, 1.97941]
----
-Label        : 1
-Position     : [293.984, 165.928]
-Measurements : [1445.16, 315696, 0.193153, -0.948964]
----
-Label        : 1
-Position     : [51.1578, 167.01]
-Measurements : [763.843, 231835, 1.73052, 2.19185]
----
-Label        : 1
-Position     : [343.648, 169]
-Measurements : [928.066, 235749, 0.533846, -1.16419]
----
-Label        : 1
-Position     : [346.821, 169.459]
-Measurements : [840.941, 229802, 0.898385, -0.643969]
----
-Label        : 1
-Position     : [200.924, 169.571]
-Measurements : [1027.23, 540995, 0.645869, -1.15679]
----
-Label        : 0
-Position     : [115.217, 169.683]
-Measurements : [846.398, 16393.4, 0.466025, -0.546362]
----
-Label        : 1
-Position     : [343.379, 169.888]
-Measurements : [928.066, 235749, 0.533846, -1.16419]
----
-Label        : 1
-Position     : [202.371, 170.412]
-Measurements : [1227.81, 562870, 0.311362, -1.45724]
----
-Label        : 0
-Position     : [87.0626, 170.842]
-Measurements : [904.53, 31835.2, -0.157591, -1.63508]
----
-Label        : 1
-Position     : [458.099, 171.513]
-Measurements : [1748.77, 230032, -0.80657, -0.0312607]
----
-Label        : 0
-Position     : [100.77, 171.907]
-Measurements : [752.345, 4246.94, 0.00409903, 1.81988]
----
-Label        : 1
-Position     : [205.288, 171.928]
-Measurements : [1381.38, 545814, 0.219604, -1.5491]
----
-Label        : 1
-Position     : [172.454, 172.899]
-Measurements : [769.186, 229563, 1.00374, -0.192638]
----
-Label        : 0
-Position     : [130.268, 173.077]
-Measurements : [1041.78, 13687.9, -1.06755, 0.613121]
----
-Label        : 1
-Position     : [453.728, 174.12]
-Measurements : [1576.33, 275832, -0.406668, -0.164106]
----
-Label        : 1
-Position     : [466.46, 174.791]
-Measurements : [1265.68, 242176, 0.590304, -0.316957]
----
-Label        : 1
-Position     : [452.318, 175.335]
-Measurements : [1454.43, 318888, -0.35921, -0.585877]
----
-Label        : 0
-Position     : [118.619, 176.382]
-Measurements : [947.783, 25016.6, 1.87238, 9.26613]
----
-Label        : 1
-Position     : [175.785, 176.617]
-Measurements : [1179.15, 363424, -0.0431143, -1.2454]
----
-Label        : 1
-Position     : [459.36, 176.68]
-Measurements : [1814.73, 239735, -0.461905, -0.741981]
----
-Label        : 1
-Position     : [718.776, 176.688]
-Measurements : [1344.26, 143039, -0.283975, -0.23451]
----
-Label        : 1
-Position     : [174.568, 177.048]
-Measurements : [1301.67, 324422, -0.302307, -0.943574]
----
-Label        : 1
-Position     : [172.228, 177.982]
-Measurements : [1196.49, 338762, -0.117432, -1.20676]
----
-Label        : 1
-Position     : [463.593, 177.989]
-Measurements : [1584.79, 262685, 0.139275, -1.06502]
----
-Label        : 1
-Position     : [469.066, 178.497]
-Measurements : [1225.01, 192878, 0.14609, -0.472889]
----
-Label        : 1
-Position     : [457.188, 178.617]
-Measurements : [1739.82, 252758, -0.392531, -0.697884]
----
-Label        : 1
-Position     : [468.064, 178.728]
-Measurements : [1205.72, 165909, 0.0544097, -0.530043]
----
-Label        : 1
-Position     : [179.848, 179.5]
-Measurements : [1073.83, 372779, 0.505805, -1.2185]
----
-Label        : 1
-Position     : [472.734, 179.848]
-Measurements : [1420.95, 280567, -0.215442, -1.17759]
----
-Label        : 0
-Position     : [84.4024, 180.274]
-Measurements : [962.054, 19438, -0.666317, -1.0598]
----
-Label        : 1
-Position     : [721.135, 180.474]
-Measurements : [1119.45, 175922, 0.651067, -0.624889]
----
-Label        : 1
-Position     : [715.191, 181.662]
-Measurements : [1145.86, 190723, 0.308976, -1.0098]
----
-Label        : 1
-Position     : [176.104, 182.168]
-Measurements : [1168.06, 351181, 0.24595, -1.3993]
----
-Label        : 1
-Position     : [476.256, 182.312]
-Measurements : [1413.98, 381507, -0.104882, -1.43638]
----
-Label        : 0
-Position     : [119.927, 182.936]
-Measurements : [1034.32, 35375, 2.20187, 6.84498]
----
-Label        : 1
-Position     : [480.888, 183.168]
-Measurements : [993.334, 432702, 0.897719, -0.792276]
----
-Label        : 0
-Position     : [87.6863, 183.363]
-Measurements : [1015.35, 69459.9, 0.914419, 0.550633]
----
-Label        : 0
-Position     : [78.6616, 183.498]
-Measurements : [1011.36, 3655.02, 0.373185, -0.928352]
----
-Label        : 0
-Position     : [124.706, 185.457]
-Measurements : [1051.73, 78638.7, 0.59633, 0.921091]
----
-Label        : 1
-Position     : [875.834, 190.969]
-Measurements : [1006.11, 50158.9, -1.03185, 0.406372]
----
-Label        : 1
-Position     : [24.0479, 194.139]
-Measurements : [511.819, 36538.6, 1.00629, -0.471377]
----
-Label        : 1
-Position     : [28.4819, 194.312]
-Measurements : [587.787, 94716.6, 2.0327, 5.3558]
----
-Label        : 1
-Position     : [210.686, 194.708]
-Measurements : [1081.93, 616511, 0.465294, -1.48121]
----
-Label        : 1
-Position     : [883.424, 194.798]
-Measurements : [890.391, 102875, -0.151164, -1.5192]
----
-Label        : 1
-Position     : [880.712, 195.648]
-Measurements : [824.918, 104315, 0.0428919, -1.56379]
----
-Label        : 1
-Position     : [206.437, 195.744]
-Measurements : [1013.23, 662647, 0.759068, -1.05212]
----
-Label        : 1
-Position     : [28.648, 199.064]
-Measurements : [654.467, 82489.4, 2.02281, 5.76205]
----
-Label        : 1
-Position     : [211.432, 199.064]
-Measurements : [1510.98, 504539, -0.00991282, -1.47667]
----
-Label        : 0
-Position     : [64.8357, 200.144]
-Measurements : [1033.71, 10272.1, 0.797339, 4.29059]
----
-Label        : 0
-Position     : [106.807, 200.498]
-Measurements : [1029.8, 16500.3, -1.30319, 1.23472]
----
-Label        : 1
-Position     : [711.024, 201.745]
-Measurements : [859.114, 162654, 0.969496, 0.252542]
----
-Label        : 0
-Position     : [108.755, 201.787]
-Measurements : [1033.13, 17517, -1.16156, 1.03798]
----
-Label        : 1
-Position     : [706.632, 202.304]
-Measurements : [909.044, 205380, 0.669954, -0.913504]
----
-Label        : 1
-Position     : [862.044, 202.522]
-Measurements : [1090.65, 501719, 0.629952, -1.05298]
----
-Label        : 0
-Position     : [133.631, 203.069]
-Measurements : [1015.21, 19261.5, -2.2191, 4.98905]
----
-Label        : 1
-Position     : [176.3, 203.428]
-Measurements : [1100.39, 432746, 0.522518, -1.20115]
----
-Label        : 1
-Position     : [891.78, 203.667]
-Measurements : [891.333, 421627, 0.970045, -0.602316]
----
-Label        : 1
-Position     : [357.984, 204.328]
-Measurements : [1249.78, 497817, 0.531452, -0.822011]
----
-Label        : 1
-Position     : [889.843, 204.868]
-Measurements : [785.969, 382163, 1.34655, 0.298143]
----
-Label        : 1
-Position     : [360.317, 205.079]
-Measurements : [1113.8, 357503, 0.535817, -1.1484]
----
-Label        : 1
-Position     : [179.176, 205.208]
-Measurements : [1108.75, 417131, 0.654059, -1.15038]
----
-Label        : 1
-Position     : [176.006, 206.321]
-Measurements : [1168.34, 376583, 0.497907, -1.13431]
----
-Label        : 1
-Position     : [863.816, 206.912]
-Measurements : [1183.23, 443396, 0.635468, -1.05555]
----
-Label        : 1
-Position     : [703.397, 207.005]
-Measurements : [556.119, 75660.8, 1.9211, 2.94926]
----
-Label        : 1
-Position     : [894.536, 207.424]
-Measurements : [984.415, 380697, 0.85635, -0.735312]
----
-Label        : 1
-Position     : [301.117, 207.52]
-Measurements : [1469.09, 244028, -0.346245, -0.798871]
----
-Label        : 1
-Position     : [361.807, 208.293]
-Measurements : [1054.72, 357596, 0.695484, -1.06173]
----
-Label        : 1
-Position     : [305.152, 208.656]
-Measurements : [1062.9, 253742, 0.257437, -1.23242]
----
-Label        : 0
-Position     : [103.974, 208.707]
-Measurements : [1044.9, 5652.95, -1.27797, 4.6118]
----
-Label        : 0
-Position     : [65.0811, 209.122]
-Measurements : [1141.98, 18419.1, 1.57678, 2.24398]
----
-Label        : 1
-Position     : [861.112, 210.405]
-Measurements : [1267.54, 360823, 0.35263, -1.10572]
----
-Label        : 1
-Position     : [308.787, 210.95]
-Measurements : [793.141, 216224, 0.916479, -0.735237]
----
-Label        : 1
-Position     : [862.601, 211.896]
-Measurements : [1143.86, 404827, 0.63832, -0.810785]
----
-Label        : 1
-Position     : [719.041, 213.273]
-Measurements : [1026.08, 78610.5, 0.290094, -0.7538]
----
-Label        : 1
-Position     : [860.232, 214.592]
-Measurements : [1031.01, 233719, 0.582786, -0.737979]
----
-Label        : 1
-Position     : [860.301, 216.547]
-Measurements : [1022.67, 230172, 0.624532, -0.629547]
----
-Label        : 1
-Position     : [363.225, 216.858]
-Measurements : [1988.31, 684467, -0.379378, -1.06607]
----
-Label        : 1
-Position     : [364.128, 217.64]
-Measurements : [1897.61, 738105, -0.237603, -1.31869]
----
-Label        : 1
-Position     : [714.824, 218.176]
-Measurements : [821.876, 154001, 0.536069, -0.777765]
----
-Label        : 1
-Position     : [715.735, 218.326]
-Measurements : [890.303, 150882, 0.244042, -0.991735]
----
-Label        : 0
-Position     : [88.1349, 218.534]
-Measurements : [1005.05, 11746.3, 3.01618, 13.4804]
----
-Label        : 1
-Position     : [867.549, 218.703]
-Measurements : [697.238, 154574, 0.835332, -0.779369]
----
-Label        : 1
-Position     : [181.278, 218.732]
-Measurements : [1296.75, 706447, 0.139058, -1.41445]
----
-Label        : 0
-Position     : [108.14, 218.817]
-Measurements : [1065.29, 12187.3, -0.513496, 0.415816]
----
-Label        : 1
-Position     : [863.377, 219.477]
-Measurements : [891.208, 233894, 0.672972, -0.61997]
----
-Label        : 0
-Position     : [133.607, 219.558]
-Measurements : [915.083, 13643.5, -0.846548, 1.17435]
----
-Label        : 1
-Position     : [362.863, 219.67]
-Measurements : [1842.68, 942342, -0.175373, -1.51707]
----
-Label        : 1
-Position     : [182.248, 220.056]
-Measurements : [1535.29, 537093, -0.166385, -1.12571]
----
-Label        : 1
-Position     : [911.873, 220.529]
-Measurements : [981.263, 152723, -0.273252, -1.40202]
----
-Label        : 1
-Position     : [182.637, 220.599]
-Measurements : [1535.29, 537093, -0.166385, -1.12571]
----
-Label        : 0
-Position     : [128.703, 221.589]
-Measurements : [951.459, 16191.8, -0.296294, -0.532626]
----
-Label        : 1
-Position     : [308.951, 222.08]
-Measurements : [802.338, 214555, 0.903603, -0.0462955]
----
-Label        : 1
-Position     : [184.7, 222.318]
-Measurements : [1566.67, 404076, 0.0908016, -0.81289]
----
-Label        : 1
-Position     : [867.4, 223.296]
-Measurements : [1096.75, 236870, 0.240736, -0.759973]
----
-Label        : 1
-Position     : [907.336, 223.296]
-Measurements : [755.819, 144529, 0.752759, -0.785582]
----
-Label        : 1
-Position     : [31.72, 223.64]
-Measurements : [1053.28, 328868, 0.739464, -0.768644]
----
-Label        : 1
-Position     : [908.159, 223.694]
-Measurements : [807.086, 151692, 0.501415, -1.17477]
----
-Label        : 0
-Position     : [67.2161, 223.945]
-Measurements : [1176.23, 47964.9, 1.78288, 3.78042]
----
-Label        : 1
-Position     : [310.272, 224.016]
-Measurements : [1111.51, 495259, 0.570385, -0.92457]
----
-Label        : 1
-Position     : [182.76, 224.152]
-Measurements : [1647.78, 296626, 0.42371, -0.782878]
----
-Label        : 1
-Position     : [310.937, 224.798]
-Measurements : [1111.51, 495259, 0.570385, -0.92457]
----
-Label        : 1
-Position     : [30.803, 225.572]
-Measurements : [1017.8, 355643, 0.745761, -0.834526]
----
-Label        : 1
-Position     : [183.029, 225.933]
-Measurements : [1579.74, 304237, 0.664633, -0.598438]
----
-Label        : 0
-Position     : [123.133, 226.472]
-Measurements : [1068.52, 3217.49, -1.00626, 3.16216]
----
-Label        : 1
-Position     : [869.224, 226.677]
-Measurements : [1015.9, 256264, 0.58223, -0.843968]
----
-Label        : 1
-Position     : [864.84, 226.88]
-Measurements : [1052.3, 226196, 0.529199, -0.607237]
----
-Label        : 1
-Position     : [710.279, 227.086]
-Measurements : [792.157, 134777, 0.50578, -1.19546]
----
-Label        : 1
-Position     : [862.126, 227.76]
-Measurements : [897.374, 215853, 0.983941, 0.153139]
----
-Label        : 1
-Position     : [33.1171, 227.914]
-Measurements : [953.108, 238848, 1.13436, 0.817858]
----
-Label        : 1
-Position     : [710.216, 228.416]
-Measurements : [825.895, 135704, 0.384101, -1.28101]
----
-Label        : 0
-Position     : [60.2701, 228.586]
-Measurements : [1064.9, 6211.3, 0.60023, -0.0306526]
----
-Label        : 1
-Position     : [311.296, 230.672]
-Measurements : [1409.32, 536504, 0.104209, -1.54309]
----
-Label        : 1
-Position     : [715.214, 231.314]
-Measurements : [1009.83, 170971, 0.706218, -0.136483]
----
-Label        : 1
-Position     : [313.87, 231.412]
-Measurements : [1305.46, 574078, 0.335705, -1.51573]
----
-Label        : 1
-Position     : [906.824, 232]
-Measurements : [1111.36, 291222, 0.176541, -1.13685]
----
-Label        : 0
-Position     : [56.9019, 233.286]
-Measurements : [986.829, 7168.76, 0.00846685, -0.22224]
----
-Label        : 1
-Position     : [908.439, 234.492]
-Measurements : [1340.28, 250918, 0.0879431, -0.964828]
----
-Label        : 1
-Position     : [16.2852, 234.852]
-Measurements : [710.914, 168826, 0.682616, -0.931927]
----
-Label        : 1
-Position     : [904.699, 234.95]
-Measurements : [1288.72, 315961, -0.0711211, -1.09406]
----
-Label        : 1
-Position     : [714.312, 235.072]
-Measurements : [1209.51, 258403, 0.177586, -1.38318]
----
-Label        : 1
-Position     : [863.816, 235.072]
-Measurements : [766.333, 86142.7, 0.605089, -0.663795]
----
-Label        : 1
-Position     : [309.719, 235.559]
-Measurements : [835.819, 436572, 1.32409, 0.251109]
----
-Label        : 1
-Position     : [902.899, 235.683]
-Measurements : [1206.66, 332303, 0.0196027, -1.31272]
----
-Label        : 1
-Position     : [712.613, 237.484]
-Measurements : [1349.88, 286555, -0.357925, -1.10482]
----
-Label        : 1
-Position     : [712.354, 237.977]
-Measurements : [1349.88, 286555, -0.357925, -1.10482]
----
-Label        : 1
-Position     : [20.5315, 238.029]
-Measurements : [999.687, 183217, 0.0516971, -1.25309]
----
-Label        : 1
-Position     : [712.214, 238.36]
-Measurements : [1449.11, 265176, -0.603101, -0.696948]
----
-Label        : 1
-Position     : [865.587, 239.052]
-Measurements : [956.124, 120560, 0.0173135, -0.96128]
----
-Label        : 1
-Position     : [908.872, 239.168]
-Measurements : [1200.91, 308237, 0.290084, -1.18105]
----
-Label        : 1
-Position     : [864.745, 239.275]
-Measurements : [985.691, 99090.4, 0.117515, -0.727384]
----
-Label        : 1
-Position     : [16.872, 239.4]
-Measurements : [1051.28, 134981, 0.16584, -0.893489]
----
-Label        : 1
-Position     : [904.082, 241.154]
-Measurements : [985.929, 314813, 0.739275, -0.681034]
----
-Label        : 1
-Position     : [709.237, 241.399]
-Measurements : [1246.95, 290046, -0.0863159, -1.28883]
----
-Label        : 1
-Position     : [859.941, 241.414]
-Measurements : [999.436, 118709, -0.0629683, -1.29704]
----
-Label        : 1
-Position     : [1265.2, 241.432]
-Measurements : [1182.54, 392403, 0.261345, -1.10779]
----
-Label        : 1
-Position     : [712.264, 241.728]
-Measurements : [1372.76, 262720, -0.233318, -1.27239]
----
-Label        : 1
-Position     : [908.5, 241.804]
-Measurements : [1162.23, 266354, 0.359413, -0.89179]
----
-Label        : 1
-Position     : [1258.66, 241.961]
-Measurements : [1380.11, 132033, -0.161983, -0.62962]
----
-Label        : 1
-Position     : [864.84, 242.752]
-Measurements : [868.386, 132788, 0.518228, -0.988712]
----
-Label        : 0
-Position     : [60.1129, 242.932]
-Measurements : [971.734, 29827.2, -0.779773, 0.373738]
----
-Label        : 0
-Position     : [69.4194, 243.353]
-Measurements : [812.667, 19641.8, -0.0692841, -0.810869]
----
-Label        : 1
-Position     : [1261.98, 244.224]
-Measurements : [1464.19, 199725, 0.186734, -0.800198]
----
-Label        : 0
-Position     : [89.3778, 245.656]
-Measurements : [1048.57, 22865.6, 1.52316, 6.60573]
----
-Label        : 0
-Position     : [61.823, 246.283]
-Measurements : [958.351, 50894.5, -0.00415467, -0.677129]
----
-Label        : 1
-Position     : [909.384, 246.336]
-Measurements : [1293.84, 420251, 0.629286, -0.612363]
----
-Label        : 1
-Position     : [317.44, 247.056]
-Measurements : [1159.36, 246411, 0.235154, -0.610881]
----
-Label        : 1
-Position     : [864.598, 247.06]
-Measurements : [762.301, 134820, 0.911803, -0.445678]
----
-Label        : 1
-Position     : [319.013, 247.654]
-Measurements : [1104.21, 250637, 0.397901, -0.618335]
----
-Label        : 1
-Position     : [175.779, 247.798]
-Measurements : [1806.55, 134620, 0.309509, 0.210585]
----
-Label        : 0
-Position     : [56.7737, 248.059]
-Measurements : [1115.22, 21316.3, -1.19701, 3.65595]
----
-Label        : 1
-Position     : [1265.57, 248.32]
-Measurements : [1400.04, 386926, 0.0969364, -1.31645]
----
-Label        : 1
-Position     : [15.7121, 248.405]
-Measurements : [1530.52, 287904, -0.323624, -1.15259]
----
-Label        : 0
-Position     : [148.004, 248.757]
-Measurements : [854.813, 21760, -1.06542, 0.133153]
----
-Label        : 1
-Position     : [1217.95, 248.832]
-Measurements : [1759.71, 361715, -0.213039, -0.93058]
----
-Label        : 1
-Position     : [1264.53, 249.024]
-Measurements : [1379.49, 389613, 0.157555, -1.28122]
----
-Label        : 1
-Position     : [911.806, 249.282]
-Measurements : [1679.18, 384588, 0.282877, -1.10675]
----
-Label        : 1
-Position     : [865.553, 249.663]
-Measurements : [807.124, 204699, 1.02958, -0.302475]
----
-Label        : 1
-Position     : [1261.11, 249.752]
-Measurements : [1404.83, 235070, 0.0643815, -0.710326]
----
-Label        : 1
-Position     : [177.146, 249.785]
-Measurements : [1549.26, 315187, 0.0983008, -0.594274]
----
-Label        : 0
-Position     : [109.77, 249.914]
-Measurements : [1040.92, 10459.9, -1.00389, 0.317522]
----
-Label        : 1
-Position     : [382.501, 250.062]
-Measurements : [1663.87, 892093, 0.0432028, -1.16457]
----
-Label        : 1
-Position     : [15.3317, 250.121]
-Measurements : [1498.05, 334465, -0.36862, -1.2321]
----
-Label        : 1
-Position     : [15.848, 250.152]
-Measurements : [1498.05, 334465, -0.36862, -1.2321]
----
-Label        : 1
-Position     : [178.664, 250.152]
-Measurements : [1327.07, 335769, 0.366534, -0.659771]
----
-Label        : 1
-Position     : [869.147, 250.29]
-Measurements : [684.653, 183146, 1.66781, 1.39747]
----
-Label        : 1
-Position     : [1213.93, 250.322]
-Measurements : [1213.22, 579259, 0.469411, -1.20637]
----
-Label        : 1
-Position     : [1221.8, 250.708]
-Measurements : [1587.12, 604175, -0.00410846, -1.49415]
----
-Label        : 1
-Position     : [310.122, 250.76]
-Measurements : [1212.15, 161163, 0.775936, -0.250635]
----
-Label        : 1
-Position     : [909.279, 251.316]
-Measurements : [1651.8, 443221, 0.0674686, -1.17702]
----
-Label        : 1
-Position     : [315.586, 251.505]
-Measurements : [1322.33, 219288, 0.155867, -0.990853]
----
-Label        : 1
-Position     : [387.072, 251.664]
-Measurements : [1931.64, 390549, 0.0234496, -0.208043]
----
-Label        : 1
-Position     : [910.92, 251.968]
-Measurements : [1668.13, 461662, 0.0513141, -1.22413]
----
-Label        : 0
-Position     : [126.898, 252.351]
-Measurements : [1016.3, 14954.5, -0.048602, -0.46863]
----
-Label        : 1
-Position     : [1250.34, 252.962]
-Measurements : [1247.53, 322880, 0.536272, -0.834595]
----
-Label        : 1
-Position     : [865.352, 253.504]
-Measurements : [853.489, 186985, 0.952944, -0.308027]
----
-Label        : 1
-Position     : [385.403, 253.939]
-Measurements : [2102.93, 424272, 0.0861453, -0.380908]
----
-Label        : 1
-Position     : [865.352, 254.016]
-Measurements : [856.453, 184444, 0.972312, -0.286989]
----
-Label        : 1
-Position     : [1182.35, 254.449]
-Measurements : [1790.33, 484783, 0.0652818, -0.908935]
----
-Label        : 1
-Position     : [867.44, 254.474]
-Measurements : [799.701, 196500, 1.15071, -0.0449687]
----
-Label        : 1
-Position     : [1196.12, 254.549]
-Measurements : [2041.64, 1.02109e+06, -0.411857, -1.54142]
----
-Label        : 1
-Position     : [860.792, 254.757]
-Measurements : [913.826, 138391, 0.559833, -0.863263]
----
-Label        : 1
-Position     : [908.357, 254.809]
-Measurements : [1412.23, 647217, 0.247126, -1.5408]
----
-Label        : 1
-Position     : [1168.67, 254.831]
-Measurements : [1889.79, 719158, 0.194722, -1.24675]
----
-Label        : 1
-Position     : [310.272, 255.248]
-Measurements : [1217.14, 279089, 0.136048, -1.25992]
----
-Label        : 0
-Position     : [128.566, 255.441]
-Measurements : [1109.3, 10061.8, -0.0638821, -1.40931]
----
-Label        : 0
-Position     : [96.3641, 255.457]
-Measurements : [1132.96, 4614.7, -1.08726, 0.881292]
----
-Label        : 1
-Position     : [310.445, 255.895]
-Measurements : [1217.14, 279089, 0.136048, -1.25992]
----
-Label        : 1
-Position     : [388.99, 256.192]
-Measurements : [1854.75, 384452, 0.0546601, -0.696502]
----
-Label        : 0
-Position     : [60.9885, 256.605]
-Measurements : [1113.98, 5532.94, -0.270312, 0.848228]
----
-Label        : 1
-Position     : [392.192, 256.784]
-Measurements : [1501.8, 363354, 0.333766, -0.925513]
----
-Label        : 1
-Position     : [1180.58, 257.024]
-Measurements : [2054.02, 331210, -0.221277, -0.0659788]
----
-Label        : 1
-Position     : [1194.91, 257.024]
-Measurements : [2405.62, 471670, -0.778642, 0.188787]
----
-Label        : 1
-Position     : [1199.29, 257.124]
-Measurements : [1605.35, 1.08056e+06, 0.42958, -1.44912]
----
-Label        : 1
-Position     : [314.796, 257.433]
-Measurements : [1240.97, 511114, 0.392849, -1.28138]
----
-Label        : 1
-Position     : [1247.65, 257.536]
-Measurements : [1223.46, 410436, 0.424089, -1.26315]
----
-Label        : 1
-Position     : [1249.77, 258.028]
-Measurements : [1099.47, 419054, 0.765379, -0.891461]
----
-Label        : 1
-Position     : [1169.31, 258.56]
-Measurements : [2003.74, 564609, 0.333267, -1.26695]
----
-Label        : 0
-Position     : [126.415, 258.636]
-Measurements : [1129.71, 9506.17, -0.0137887, -1.38408]
----
-Label        : 0
-Position     : [121.642, 258.691]
-Measurements : [1088.5, 3613.66, 0.00197447, -0.0827409]
----
-Label        : 1
-Position     : [390.1, 258.793]
-Measurements : [1520, 467194, 0.135573, -1.29076]
----
-Label        : 1
-Position     : [400.896, 258.832]
-Measurements : [1221.76, 239991, 0.442484, -0.513054]
----
-Label        : 1
-Position     : [1183.53, 259.491]
-Measurements : [1973.27, 608379, -0.260823, -1.15329]
----
-Label        : 1
-Position     : [404.432, 259.873]
-Measurements : [1150.14, 189804, 0.76918, 0.402144]
----
-Label        : 1
-Position     : [1152.51, 260.063]
-Measurements : [1204.8, 182669, -0.132697, -0.997134]
----
-Label        : 0
-Position     : [106.77, 261.044]
-Measurements : [1206.28, 1061.79, -0.410888, 0.180622]
----
-Label        : 1
-Position     : [1130.61, 261.144]
-Measurements : [2561.17, 171090, -0.547921, -0.417651]
----
-Label        : 1
-Position     : [401.118, 261.371]
-Measurements : [1123.23, 242041, 0.695339, -0.13039]
----
-Label        : 1
-Position     : [310.784, 261.392]
-Measurements : [1544.54, 506822, -0.163673, -1.30474]
----
-Label        : 1
-Position     : [1143.48, 261.44]
-Measurements : [1644.65, 321743, -0.0512625, -0.222908]
----
-Label        : 0
-Position     : [109.951, 261.974]
-Measurements : [1190.55, 1282.52, -0.0150936, -0.135875]
----
-Label        : 1
-Position     : [913.452, 262.109]
-Measurements : [934.031, 178900, 0.995524, -0.137872]
----
-Label        : 1
-Position     : [910.92, 262.208]
-Measurements : [931.175, 190355, 0.998872, -0.112188]
----
-Label        : 1
-Position     : [311.33, 262.536]
-Measurements : [1620.59, 526601, -0.288033, -1.24224]
----
-Label        : 1
-Position     : [399.863, 262.561]
-Measurements : [1043.41, 249290, 0.564103, -0.323788]
----
-Label        : 1
-Position     : [1156.51, 262.656]
-Measurements : [1462.4, 127159, -0.424693, -0.313032]
----
-Label        : 1
-Position     : [1147.07, 262.849]
-Measurements : [1327.42, 371238, 0.294475, -1.32257]
----
-Label        : 1
-Position     : [1148.14, 262.952]
-Measurements : [1294.73, 319986, 0.319489, -1.14969]
----
-Label        : 1
-Position     : [1167.25, 263.328]
-Measurements : [1410.77, 486064, 1.27753, 0.761903]
----
-Label        : 1
-Position     : [1277.3, 263.8]
-Measurements : [1038.55, 584822, 0.921905, -0.822194]
----
-Label        : 1
-Position     : [1107.2, 264.013]
-Measurements : [2270.68, 226124, 0.0254142, -0.165368]
----
-Label        : 1
-Position     : [1160.18, 264.541]
-Measurements : [1375.61, 208659, -0.14888, -1.05241]
----
-Label        : 1
-Position     : [908.278, 264.649]
-Measurements : [1037.61, 286517, 0.530986, -0.985511]
----
-Label        : 1
-Position     : [313.04, 264.976]
-Measurements : [1618.61, 570162, -0.266746, -1.41386]
----
-Label        : 1
-Position     : [1108.67, 265.389]
-Measurements : [2377.87, 180581, 0.0326631, 0.255546]
----
-Label        : 1
-Position     : [401.408, 265.488]
-Measurements : [947.133, 135441, 0.302264, -1.14469]
----
-Label        : 1
-Position     : [1126.07, 265.536]
-Measurements : [2279.57, 195603, -0.44005, -0.0712758]
----
-Label        : 1
-Position     : [1134.78, 265.536]
-Measurements : [2563.78, 322725, -0.600678, 0.164533]
----
-Label        : 1
-Position     : [1121.19, 266.037]
-Measurements : [1943.03, 310356, -0.431312, -0.823779]
----
-Label        : 1
-Position     : [913.852, 266.153]
-Measurements : [1109.52, 216541, 0.626918, -0.725646]
----
-Label        : 1
-Position     : [649.269, 266.252]
-Measurements : [599.908, 71670.4, 2.3928, 4.93111]
----
-Label        : 1
-Position     : [1102.36, 266.371]
-Measurements : [1796.64, 385031, 0.621278, -0.841863]
----
-Label        : 1
-Position     : [1116.34, 266.56]
-Measurements : [1939.34, 318779, -0.529652, -0.991538]
----
-Label        : 1
-Position     : [731.72, 266.816]
-Measurements : [1678.78, 356094, -0.371261, -1.03643]
----
-Label        : 1
-Position     : [1111.4, 266.824]
-Measurements : [2391.49, 238823, -0.671226, 1.18281]
----
-Label        : 1
-Position     : [215.528, 267.048]
-Measurements : [1048.73, 261716, 0.360984, -1.20366]
----
-Label        : 1
-Position     : [401.209, 267.138]
-Measurements : [848.653, 146968, 0.61596, -0.959477]
----
-Label        : 1
-Position     : [1275.3, 267.264]
-Measurements : [1515.46, 474401, 0.135607, -0.936487]
----
-Label        : 1
-Position     : [310.784, 267.536]
-Measurements : [1784.98, 291353, -0.0732586, -0.961432]
----
-Label        : 1
-Position     : [732.312, 267.725]
-Measurements : [1624.88, 397607, -0.266751, -1.21683]
----
-Label        : 1
-Position     : [737.788, 267.985]
-Measurements : [1495.01, 406252, -0.0158629, -1.35555]
----
-Label        : 1
-Position     : [1106.62, 268.096]
-Measurements : [2313.08, 382844, -0.30995, -0.775084]
----
-Label        : 1
-Position     : [1087.05, 268.174]
-Measurements : [1116.31, 303861, 0.177003, -1.28857]
----
-Label        : 1
-Position     : [1115.53, 268.414]
-Measurements : [2125.92, 383864, -0.4904, -0.522071]
----
-Label        : 1
-Position     : [1011.65, 268.45]
-Measurements : [1449.4, 301681, 0.494051, -0.180817]
----
-Label        : 1
-Position     : [1015.43, 268.595]
-Measurements : [1394.81, 214594, 1.5058, 1.77877]
----
-Label        : 1
-Position     : [735.943, 268.816]
-Measurements : [1467.98, 466659, -0.0267311, -1.39712]
----
-Label        : 1
-Position     : [1126.18, 268.858]
-Measurements : [2266.99, 280026, -0.601528, 0.0327727]
----
-Label        : 1
-Position     : [912.456, 268.864]
-Measurements : [1056.26, 218909, 0.78688, -0.543438]
----
-Label        : 1
-Position     : [218.636, 269.021]
-Measurements : [861.409, 263711, 0.985571, -0.461672]
----
-Label        : 1
-Position     : [1006.08, 269.187]
-Measurements : [1053.38, 498724, 0.880973, -0.493719]
----
-Label        : 1
-Position     : [418.065, 269.348]
-Measurements : [1047.11, 345073, 0.493225, -1.00819]
----
-Label        : 1
-Position     : [737.864, 269.376]
-Measurements : [1377.22, 426667, 0.0218243, -1.34089]
----
-Label        : 0
-Position     : [95.9609, 269.49]
-Measurements : [1213.82, 658.775, -0.438727, 2.60562]
----
-Label        : 0
-Position     : [68.1328, 269.557]
-Measurements : [1072.21, 3184.61, -1.33882, 3.11863]
----
-Label        : 1
-Position     : [1130.29, 269.584]
-Measurements : [2501.73, 275315, -0.678864, 0.10208]
----
-Label        : 1
-Position     : [314.053, 269.852]
-Measurements : [1566.75, 365869, -0.192031, -0.989876]
----
-Label        : 1
-Position     : [1279.13, 269.863]
-Measurements : [1127.24, 620688, 0.865744, -0.656894]
----
-Label        : 1
-Position     : [646.216, 269.888]
-Measurements : [632.767, 85002.5, 1.93003, 2.94433]
----
-Label        : 1
-Position     : [504.57, 269.916]
-Measurements : [1273.55, 200571, 0.942077, 0.818227]
----
-Label        : 1
-Position     : [1101.6, 269.958]
-Measurements : [1666.82, 398976, 0.855085, -0.575542]
----
-Label        : 1
-Position     : [17.5717, 270.067]
-Measurements : [770.188, 189094, 0.675891, -0.738604]
----
-Label        : 1
-Position     : [1011.9, 270.144]
-Measurements : [1379.92, 367636, 0.435525, -0.60348]
----
-Label        : 1
-Position     : [1099.45, 270.144]
-Measurements : [1333.36, 162280, 1.33995, 2.04295]
----
-Label        : 1
-Position     : [1051.49, 270.18]
-Measurements : [877.43, 112723, 0.443687, -1.01122]
----
-Label        : 1
-Position     : [1048.25, 270.656]
-Measurements : [783.695, 115229, 0.976985, -0.304765]
----
-Label        : 1
-Position     : [741.602, 270.67]
-Measurements : [1321.47, 331540, 0.143417, -1.38843]
----
-Label        : 1
-Position     : [214.695, 270.934]
-Measurements : [920.819, 278819, 0.74437, -0.933229]
----
-Label        : 1
-Position     : [17.0385, 270.938]
-Measurements : [770.188, 189094, 0.675891, -0.738604]
----
-Label        : 1
-Position     : [528.172, 270.996]
-Measurements : [886.537, 78060.2, -0.434116, -1.0551]
----
-Label        : 1
-Position     : [430.351, 271.052]
-Measurements : [1192.49, 204780, 0.518345, -0.639888]
----
-Label        : 1
-Position     : [1089.72, 271.168]
-Measurements : [1274.5, 276691, -0.224789, -1.12192]
----
-Label        : 1
-Position     : [1056.66, 271.427]
-Measurements : [1004.53, 125629, 0.209047, -0.959801]
----
-Label        : 1
-Position     : [1063.69, 271.95]
-Measurements : [1199.48, 184916, 0.975555, 0.752526]
----
-Label        : 1
-Position     : [497.964, 271.993]
-Measurements : [1134.95, 141407, 0.251246, 0.0948628]
----
-Label        : 1
-Position     : [648.455, 272.008]
-Measurements : [635.512, 81595.2, 2.05721, 3.32723]
----
-Label        : 1
-Position     : [1008.3, 272.118]
-Measurements : [1108.59, 517710, 0.804248, -0.709147]
----
-Label        : 1
-Position     : [1006.78, 272.192]
-Measurements : [939.057, 480229, 1.2488, 0.245804]
----
-Label        : 1
-Position     : [913.661, 272.262]
-Measurements : [1010.54, 241337, 0.778371, -0.550833]
----
-Label        : 1
-Position     : [1045.81, 272.426]
-Measurements : [687.398, 106725, 1.55161, 1.27755]
----
-Label        : 1
-Position     : [525.824, 272.656]
-Measurements : [779.155, 72012, -0.0877633, -1.51572]
----
-Label        : 1
-Position     : [424.758, 273.124]
-Measurements : [1106.27, 250153, 0.821168, -0.349988]
----
-Label        : 1
-Position     : [420.864, 273.168]
-Measurements : [971.07, 327912, 0.863181, -0.524252]
----
-Label        : 1
-Position     : [178.328, 273.213]
-Measurements : [777.815, 279267, 1.22349, 0.0729725]
----
-Label        : 1
-Position     : [740.122, 273.634]
-Measurements : [1206.5, 377291, 0.275537, -1.35118]
----
-Label        : 0
-Position     : [101.587, 273.676]
-Measurements : [1149.28, 9386.47, -1.92092, 4.36196]
----
-Label        : 1
-Position     : [314.368, 273.68]
-Measurements : [1408.4, 266236, -0.0165045, -1.1435]
----
-Label        : 1
-Position     : [746.324, 273.844]
-Measurements : [1014.73, 264450, 1.02647, 0.13557]
----
-Label        : 1
-Position     : [921.037, 273.907]
-Measurements : [1124.67, 112792, -0.058301, -1.22011]
----
-Label        : 1
-Position     : [422.099, 274.108]
-Measurements : [1027.75, 301602, 0.795925, -0.542135]
----
-Label        : 1
-Position     : [313.585, 274.132]
-Measurements : [1322.23, 249323, -0.0515938, -1.21853]
----
-Label        : 1
-Position     : [425.984, 274.192]
-Measurements : [1051.8, 272227, 0.85042, -0.319709]
----
-Label        : 1
-Position     : [502.272, 274.192]
-Measurements : [1164.56, 304728, 0.669936, -0.490368]
----
-Label        : 1
-Position     : [16.36, 274.216]
-Measurements : [948.219, 141586, 0.406117, -0.555703]
----
-Label        : 1
-Position     : [742.984, 274.496]
-Measurements : [1138.91, 311444, 0.65742, -0.907084]
----
-Label        : 1
-Position     : [432.128, 274.704]
-Measurements : [956.932, 237159, 1.20648, 0.350252]
----
-Label        : 1
-Position     : [1069.08, 274.914]
-Measurements : [1366.27, 660416, 0.487956, -1.31934]
----
-Label        : 1
-Position     : [1087.83, 275.463]
-Measurements : [891.113, 310761, 0.837804, -0.756201]
----
-Label        : 0
-Position     : [90.9274, 275.472]
-Measurements : [1140.01, 16565.8, -1.24683, 1.16419]
----
-Label        : 1
-Position     : [1069.24, 275.776]
-Measurements : [1468.46, 696259, 0.31273, -1.49559]
----
-Label        : 1
-Position     : [317.099, 276.092]
-Measurements : [1457.27, 373348, 0.161787, -0.912438]
----
-Label        : 1
-Position     : [174.568, 276.264]
-Measurements : [1040.6, 268999, 0.436337, -1.16028]
----
-Label        : 1
-Position     : [1059, 276.288]
-Measurements : [1128.86, 172664, 0.185102, -0.839022]
----
-Label        : 1
-Position     : [529.616, 276.682]
-Measurements : [534.419, 52732.9, 1.64724, 1.27171]
----
-Label        : 1
-Position     : [316.416, 276.752]
-Measurements : [1403.25, 359905, 0.222155, -0.835988]
----
-Label        : 1
-Position     : [170.162, 277.019]
-Measurements : [1051.99, 187144, 0.503535, -0.85975]
----
-Label        : 1
-Position     : [427.213, 277.039]
-Measurements : [850.466, 244173, 1.08429, 0.220032]
----
-Label        : 1
-Position     : [916.552, 277.568]
-Measurements : [1408.61, 397947, 0.270215, -1.24312]
----
-Label        : 1
-Position     : [320.447, 278.196]
-Measurements : [1471.97, 415102, 0.120275, -1.11773]
----
-Label        : 1
-Position     : [431.718, 278.245]
-Measurements : [751.49, 200757, 1.53889, 1.33916]
----
-Label        : 1
-Position     : [309.754, 278.32]
-Measurements : [986.378, 229596, 1.05617, 0.135274]
----
-Label        : 1
-Position     : [756.158, 278.327]
-Measurements : [1083.21, 133860, 0.16863, -0.116669]
----
-Label        : 1
-Position     : [748.053, 279.364]
-Measurements : [846.623, 199501, 0.97813, 0.193646]
----
-Label        : 1
-Position     : [458.066, 279.736]
-Measurements : [931.116, 143281, 0.0806578, -1.23171]
----
-Label        : 1
-Position     : [458.24, 279.824]
-Measurements : [931.116, 143281, 0.0806578, -1.23171]
----
-Label        : 1
-Position     : [1064.38, 279.893]
-Measurements : [1477.24, 471231, 0.357937, -1.16676]
----
-Label        : 0
-Position     : [58.0083, 280.441]
-Measurements : [1092.19, 4189, -1.46914, 1.92006]
----
-Label        : 1
-Position     : [920.136, 281.664]
-Measurements : [1413.13, 448823, 0.325568, -1.03628]
----
-Label        : 1
-Position     : [919.335, 281.879]
-Measurements : [1502.83, 404140, 0.210886, -0.979899]
----
-Label        : 1
-Position     : [751.2, 282.04]
-Measurements : [846.636, 179486, 1.11059, 0.34977]
----
-Label        : 1
-Position     : [23.0543, 282.059]
-Measurements : [1060.61, 148375, 0.423553, -1.28133]
----
-Label        : 1
-Position     : [923.619, 283.372]
-Measurements : [936.111, 447133, 1.21034, 0.0298327]
----
-Label        : 1
-Position     : [320, 283.408]
-Measurements : [1223.09, 319019, 0.394555, -1.04137]
----
-Label        : 1
-Position     : [24.04, 283.944]
-Measurements : [1109.57, 185013, 0.71294, -0.317033]
----
-Label        : 1
-Position     : [315.997, 284.254]
-Measurements : [811.549, 105376, 1.51785, 2.92169]
----
-Label        : 1
-Position     : [456.405, 284.475]
-Measurements : [636.738, 126317, 1.13706, -0.175113]
----
-Label        : 1
-Position     : [329.344, 284.507]
-Measurements : [1232.13, 472271, 0.126069, -1.51784]
----
-Label        : 0
-Position     : [99.7498, 285.182]
-Measurements : [1137.23, 5584.55, -1.27538, 1.00551]
----
-Label        : 0
-Position     : [134.817, 285.219]
-Measurements : [881.613, 33029.8, 0.190826, -0.832184]
----
-Label        : 1
-Position     : [920.04, 285.427]
-Measurements : [1098.97, 582074, 0.937742, -0.694146]
----
-Label        : 1
-Position     : [319.756, 285.975]
-Measurements : [1062.69, 245338, 0.659867, -0.730357]
----
-Label        : 1
-Position     : [25.3173, 286.576]
-Measurements : [1390.7, 392585, 0.475601, -0.862898]
----
-Label        : 1
-Position     : [326.144, 286.992]
-Measurements : [1657.95, 321479, -0.262079, -0.556645]
----
-Label        : 1
-Position     : [1266.57, 287.599]
-Measurements : [750.605, 328821, 1.18861, 0.297508]
----
-Label        : 0
-Position     : [82.092, 287.773]
-Measurements : [1124.65, 5412.04, -0.83463, 2.52339]
----
-Label        : 1
-Position     : [327.007, 288.245]
-Measurements : [1677.36, 315908, -0.263151, -0.565996]
----
-Label        : 0
-Position     : [53.4166, 288.46]
-Measurements : [1084.23, 3188.59, -1.87187, 7.62871]
----
-Label        : 0
-Position     : [88.6119, 289.825]
-Measurements : [1087.09, 18243.3, -2.03716, 4.80537]
----
-Label        : 1
-Position     : [241.64, 290.6]
-Measurements : [1209.43, 504772, 0.448527, -1.37282]
----
-Label        : 1
-Position     : [324.126, 291.315]
-Measurements : [1566.78, 298983, -0.0161348, -0.958735]
----
-Label        : 1
-Position     : [328.704, 291.6]
-Measurements : [1633.21, 369999, -0.306372, -0.837135]
----
-Label        : 1
-Position     : [1271.2, 291.84]
-Measurements : [1374.78, 214062, 0.214429, -0.478408]
----
-Label        : 1
-Position     : [302.592, 292.112]
-Measurements : [1169.63, 179053, 0.71615, 0.337299]
----
-Label        : 1
-Position     : [950.114, 292.328]
-Measurements : [1680.49, 291601, 1.32211, 0.949927]
----
-Label        : 1
-Position     : [1301.92, 292.352]
-Measurements : [955.762, 370696, 0.795185, -0.645999]
----
-Label        : 1
-Position     : [1304.67, 292.855]
-Measurements : [979.718, 336644, 0.835387, -0.556105]
----
-Label        : 1
-Position     : [303.353, 292.861]
-Measurements : [1265.01, 181410, 0.710102, 0.106154]
----
-Label        : 1
-Position     : [245.825, 293.012]
-Measurements : [919.762, 436385, 1.24983, 0.0658546]
----
-Label        : 0
-Position     : [107.608, 293.118]
-Measurements : [1138.94, 1207.44, 0.129752, 0.0825713]
----
-Label        : 1
-Position     : [18.3898, 293.199]
-Measurements : [2086.84, 553354, -0.499861, -0.93361]
----
-Label        : 0
-Position     : [103.183, 293.283]
-Measurements : [1152.1, 969.171, 0.477588, 0.25307]
----
-Label        : 1
-Position     : [18.408, 293.672]
-Measurements : [2086.84, 553354, -0.499861, -0.93361]
----
-Label        : 0
-Position     : [88.8033, 294.394]
-Measurements : [1098.51, 11313.5, -3.58635, 13.8647]
----
-Label        : 1
-Position     : [306.176, 294.672]
-Measurements : [1590.16, 252463, -0.0388323, -0.731191]
----
-Label        : 1
-Position     : [237.841, 294.969]
-Measurements : [870.203, 441129, 1.23734, -0.0204835]
----
-Label        : 1
-Position     : [1306.59, 295.279]
-Measurements : [658.351, 211218, 2.04249, 3.60718]
----
-Label        : 0
-Position     : [60.9388, 296.015]
-Measurements : [1116.95, 1229.84, -1.56664, 3.49758]
----
-Label        : 1
-Position     : [299.216, 296.028]
-Measurements : [900.519, 209900, 0.852429, -0.26981]
----
-Label        : 1
-Position     : [325.213, 296.53]
-Measurements : [1405.13, 297875, 0.283657, -0.866397]
----
-Label        : 1
-Position     : [1275.42, 296.595]
-Measurements : [1302.59, 305126, 0.494154, -0.588778]
----
-Label        : 1
-Position     : [1266.34, 296.68]
-Measurements : [1298.97, 495857, 0.221354, -1.40382]
----
-Label        : 1
-Position     : [309.328, 296.733]
-Measurements : [1853.68, 244272, -0.47485, -0.211116]
----
-Label        : 1
-Position     : [307.33, 296.858]
-Measurements : [1784.36, 267463, -0.148655, -0.787287]
----
-Label        : 1
-Position     : [949.856, 296.888]
-Measurements : [1770.62, 407193, 0.170323, -0.727444]
----
-Label        : 1
-Position     : [309.656, 297.175]
-Measurements : [1901.04, 232764, -0.380573, -0.113782]
----
-Label        : 1
-Position     : [920.403, 297.197]
-Measurements : [871.386, 96826.8, 0.503393, 0.0888838]
----
-Label        : 1
-Position     : [331.776, 297.232]
-Measurements : [1420.68, 292436, -0.352953, -1.10581]
----
-Label        : 1
-Position     : [946.274, 297.246]
-Measurements : [1599.99, 398568, -0.00129816, -0.766958]
----
-Label        : 1
-Position     : [251.368, 297.256]
-Measurements : [993.275, 297765, 0.849048, -0.309308]
----
-Label        : 1
-Position     : [334.915, 297.361]
-Measurements : [1084.38, 351454, 0.426584, -1.24256]
----
-Label        : 1
-Position     : [1274.27, 297.984]
-Measurements : [1332.96, 331269, 0.468437, -0.752828]
----
-Label        : 1
-Position     : [22.0759, 297.999]
-Measurements : [1652.09, 1.02569e+06, 0.211875, -1.65132]
----
-Label        : 1
-Position     : [311.296, 298.256]
-Measurements : [1904.36, 261410, -0.702658, 0.32137]
----
-Label        : 1
-Position     : [1279.21, 298.307]
-Measurements : [764.869, 140157, 0.896752, -0.579133]
----
-Label        : 0
-Position     : [69.7364, 298.37]
-Measurements : [1089.44, 758.82, 0.398235, 0.174431]
----
-Label        : 1
-Position     : [917.303, 298.463]
-Measurements : [897.027, 103491, 0.573066, 0.103263]
----
-Label        : 1
-Position     : [760.643, 298.511]
-Measurements : [1266.55, 482232, 0.14761, -1.41716]
----
-Label        : 1
-Position     : [249.713, 298.849]
-Measurements : [923.881, 333406, 0.947606, -0.355207]
----
-Label        : 1
-Position     : [919.136, 298.936]
-Measurements : [946.786, 100771, 0.478163, -0.0212239]
----
-Label        : 1
-Position     : [757.222, 299.487]
-Measurements : [1173.88, 493903, 0.320998, -1.36487]
----
-Label        : 1
-Position     : [248.122, 299.506]
-Measurements : [855.49, 348116, 1.14937, -0.0696434]
----
-Label        : 1
-Position     : [317.066, 300.764]
-Measurements : [1403.29, 280627, 0.168902, -1.20865]
----
-Label        : 1
-Position     : [328.18, 300.867]
-Measurements : [1576.27, 251724, -0.352038, -0.661689]
----
-Label        : 1
-Position     : [760.928, 300.984]
-Measurements : [1313.81, 416547, 0.211536, -1.34137]
----
-Label        : 0
-Position     : [83.0857, 301.136]
-Measurements : [1035.29, 17717.4, -1.12875, -0.0603737]
----
-Label        : 1
-Position     : [313.574, 301.201]
-Measurements : [1721.09, 342123, -0.319195, -0.541381]
----
-Label        : 1
-Position     : [915.915, 301.724]
-Measurements : [788.007, 96760.5, 0.517847, -0.515003]
----
-Label        : 1
-Position     : [314.88, 301.84]
-Measurements : [1661.9, 323981, -0.126379, -0.61667]
----
-Label        : 1
-Position     : [312.988, 301.877]
-Measurements : [1741.87, 349458, -0.422613, -0.414977]
----
-Label        : 1
-Position     : [922.947, 302.058]
-Measurements : [842.803, 140645, 0.708456, -0.642811]
----
-Label        : 1
-Position     : [863.369, 302.592]
-Measurements : [1190.46, 653707, 0.437242, -1.42451]
----
-Label        : 0
-Position     : [73.1564, 302.927]
-Measurements : [1063.72, 1571.58, -1.30126, 2.84423]
----
-Label        : 1
-Position     : [327.977, 303.362]
-Measurements : [1374.89, 362764, -0.025753, -1.1578]
----
-Label        : 1
-Position     : [920.672, 304.056]
-Measurements : [796.024, 135541, 0.988091, -0.0791952]
----
-Label        : 1
-Position     : [329.562, 304.413]
-Measurements : [1460.62, 367780, -0.306666, -0.969825]
----
-Label        : 1
-Position     : [860.914, 304.582]
-Measurements : [1465.11, 534631, -0.0360755, -1.30213]
----
-Label        : 1
-Position     : [858.72, 305.08]
-Measurements : [1509.21, 378380, 0.120227, -0.875933]
----
-Label        : 0
-Position     : [141.946, 305.672]
-Measurements : [1002.69, 8849.39, -0.255284, -1.37972]
----
-Label        : 1
-Position     : [332.288, 305.936]
-Measurements : [1537.35, 457147, -0.304897, -1.12936]
----
-Label        : 0
-Position     : [73.7017, 307.667]
-Measurements : [1036.37, 4929.06, -2.51853, 7.21282]
----
-Label        : 1
-Position     : [274.663, 307.725]
-Measurements : [1783.92, 511878, -0.317551, -1.27095]
----
-Label        : 1
-Position     : [318.464, 308.496]
-Measurements : [1011.89, 221130, 0.296984, -0.978957]
----
-Label        : 0
-Position     : [97.176, 309.451]
-Measurements : [1058.1, 69435.8, 1.18385, 3.79824]
----
-Label        : 1
-Position     : [852.789, 310.726]
-Measurements : [937.268, 343837, 1.06517, 0.251392]
----
-Label        : 1
-Position     : [320.521, 310.807]
-Measurements : [841.622, 155065, 0.508284, -1.18065]
----
-Label        : 1
-Position     : [278.504, 311.08]
-Measurements : [1513.87, 542416, -0.160913, -1.29831]
----
-Label        : 1
-Position     : [855.136, 311.224]
-Measurements : [965.681, 422064, 1.06772, 0.0207412]
----
-Label        : 1
-Position     : [180.397, 311.562]
-Measurements : [878.252, 502288, 1.09733, -0.399046]
----
-Label        : 1
-Position     : [317.416, 313.271]
-Measurements : [676.317, 150744, 1.09745, -0.225275]
----
-Label        : 1
-Position     : [282.503, 313.562]
-Measurements : [1098.62, 561433, 0.660325, -1.02543]
----
-Label        : 0
-Position     : [107.163, 313.761]
-Measurements : [1136.26, 34082.8, 2.67994, 10.7748]
----
-Label        : 0
-Position     : [101.056, 313.921]
-Measurements : [1005.03, 34591.4, -1.2708, 0.688471]
----
-Label        : 1
-Position     : [1292.36, 314.111]
-Measurements : [1329.83, 361625, 0.536734, 0.451267]
----
-Label        : 1
-Position     : [851.409, 315.023]
-Measurements : [518.923, 65611, 3.04831, 8.99739]
----
-Label        : 1
-Position     : [171.161, 315.662]
-Measurements : [1166.81, 347315, 0.114413, -1.49268]
----
-Label        : 1
-Position     : [175.592, 315.688]
-Measurements : [1324.94, 428503, 0.0213319, -1.40666]
----
-Label        : 0
-Position     : [126.002, 316.031]
-Measurements : [1013.5, 6676.78, -0.423331, -0.903568]
----
-Label        : 1
-Position     : [1289.13, 317.056]
-Measurements : [1501.1, 375295, 0.550041, -0.423567]
----
-Label        : 1
-Position     : [36.6487, 318.64]
-Measurements : [892.864, 160753, 0.504941, 0.140527]
----
-Label        : 0
-Position     : [125.931, 319.107]
-Measurements : [1040.87, 4890.14, -0.827509, -0.402262]
----
-Label        : 1
-Position     : [30.0153, 320.214]
-Measurements : [748.116, 203575, 0.936712, 0.052045]
----
-Label        : 1
-Position     : [1287.55, 320.754]
-Measurements : [1689.01, 354636, 0.0633067, -0.810724]
----
-Label        : 1
-Position     : [1297.4, 321.937]
-Measurements : [1304.25, 118013, 0.104143, -0.45438]
----
-Label        : 1
-Position     : [1293.74, 322.688]
-Measurements : [1461.73, 260869, 0.75782, 0.380715]
----
-Label        : 1
-Position     : [32.232, 323.36]
-Measurements : [1124.61, 194880, 0.0505048, -0.763606]
----
-Label        : 0
-Position     : [76.8648, 324.006]
-Measurements : [1036.07, 2884.28, -1.72646, 3.59258]
----
-Label        : 1
-Position     : [1298.34, 324.213]
-Measurements : [1342.83, 161102, 0.218354, -0.630706]
----
-Label        : 1
-Position     : [897.156, 324.979]
-Measurements : [801.316, 273652, 1.11685, 0.472567]
----
-Label        : 1
-Position     : [30.0511, 325.259]
-Measurements : [1221.26, 161346, -0.149396, -0.575983]
----
-Label        : 1
-Position     : [898.656, 327.096]
-Measurements : [900.46, 295303, 0.911096, -0.1566]
----
-Label        : 1
-Position     : [1295.33, 327.368]
-Measurements : [1534.61, 306883, 0.337662, -0.275422]
----
-Label        : 1
-Position     : [28.136, 328.992]
-Measurements : [1137.4, 208439, -0.176804, -1.21257]
----
-Label        : 1
-Position     : [1299.88, 329.856]
-Measurements : [1868.54, 474080, 0.300947, -0.990441]
----
-Label        : 1
-Position     : [1295.53, 330.382]
-Measurements : [1676.95, 511605, 0.300156, -0.778508]
----
-Label        : 1
-Position     : [896.2, 331.308]
-Measurements : [745.264, 314389, 1.45924, 0.790869]
----
-Label        : 1
-Position     : [31.393, 332.068]
-Measurements : [1478.44, 305886, 0.15462, -0.427132]
----
-Label        : 1
-Position     : [24.995, 332.951]
-Measurements : [1004.96, 319137, 0.450735, -1.16757]
----
-Label        : 1
-Position     : [35.304, 333.088]
-Measurements : [1513.98, 266411, 0.837431, -0.169678]
----
-Label        : 1
-Position     : [819.585, 335.624]
-Measurements : [965.229, 172634, 0.236331, -0.664568]
----
-Label        : 1
-Position     : [32.9505, 335.688]
-Measurements : [1660.38, 405910, -0.0888662, -1.11764]
----
-Label        : 1
-Position     : [388.574, 338.077]
-Measurements : [1447.9, 1.08173e+06, 0.354629, -1.54885]
----
-Label        : 1
-Position     : [379.864, 339.331]
-Measurements : [1453.77, 583560, 0.233993, -1.32254]
----
-Label        : 1
-Position     : [30.184, 339.744]
-Measurements : [1722.53, 324170, -0.15393, -0.845581]
----
-Label        : 1
-Position     : [823.904, 339.896]
-Measurements : [1025.37, 218483, 0.41484, -1.05394]
----
-Label        : 1
-Position     : [34.9349, 340.373]
-Measurements : [1653.74, 352450, 0.173884, -1.07396]
----
-Label        : 1
-Position     : [384.512, 341.016]
-Measurements : [1824.12, 664849, -0.0639393, -1.36818]
----
-Label        : 1
-Position     : [828.343, 341.341]
-Measurements : [759.314, 234096, 1.27466, 0.175611]
----
-Label        : 1
-Position     : [31.5786, 342.049]
-Measurements : [1783.36, 255148, -0.283535, -0.372619]
----
-Label        : 1
-Position     : [28.3428, 345.376]
-Measurements : [1622.15, 158889, -0.389945, -0.751115]
----
-Label        : 0
-Position     : [128.417, 347.494]
-Measurements : [966.241, 9470.65, -0.427983, -0.896549]
----
-Label        : 1
-Position     : [27.1152, 347.569]
-Measurements : [1385.11, 243190, -0.218321, -1.37813]
----
-Label        : 1
-Position     : [28.136, 348.448]
-Measurements : [1354.97, 291130, -0.24537, -1.52809]
----
-Label        : 1
-Position     : [225.383, 351.282]
-Measurements : [1295.44, 543542, 0.426287, -1.28963]
----
-Label        : 0
-Position     : [116.786, 352.671]
-Measurements : [1058.12, 12116.4, -2.85104, 9.29506]
----
-Label        : 0
-Position     : [75.7368, 354.428]
-Measurements : [1166.54, 15632.4, 0.894411, 0.616058]
----
-Label        : 1
-Position     : [248.515, 354.812]
-Measurements : [1673.76, 799735, -0.145397, -1.43538]
----
-Label        : 1
-Position     : [494.684, 354.912]
-Measurements : [1102.73, 384686, 0.55021, -0.81691]
----
-Label        : 1
-Position     : [224.232, 355.104]
-Measurements : [1503.57, 547230, 0.0527112, -1.52581]
----
-Label        : 1
-Position     : [1127.2, 355.598]
-Measurements : [2074.99, 518193, -0.127428, -0.528294]
----
-Label        : 1
-Position     : [195.826, 356.224]
-Measurements : [1082.07, 447669, 0.668964, -1.10361]
----
-Label        : 0
-Position     : [116.528, 356.833]
-Measurements : [1029.76, 17913.7, -1.57809, 2.68615]
----
-Label        : 1
-Position     : [491.52, 356.84]
-Measurements : [1473.24, 249410, 0.051303, -0.701314]
----
-Label        : 1
-Position     : [32.7376, 358.172]
-Measurements : [651.011, 91448.5, 1.12431, 0.166156]
----
-Label        : 1
-Position     : [250.856, 358.176]
-Measurements : [1872.36, 643647, -0.398515, -1.24]
----
-Label        : 1
-Position     : [238.575, 358.399]
-Measurements : [971.085, 358901, 0.319499, -1.43387]
----
-Label        : 1
-Position     : [187.979, 358.403]
-Measurements : [978.642, 459926, 0.606149, -1.29002]
----
-Label        : 1
-Position     : [241.14, 359.299]
-Measurements : [1337.75, 254469, -0.313284, -0.814633]
----
-Label        : 1
-Position     : [228.903, 359.66]
-Measurements : [943.164, 542799, 1.27245, 0.224254]
----
-Label        : 1
-Position     : [191.976, 360.224]
-Measurements : [1198.38, 403389, 0.441222, -1.23737]
----
-Label        : 1
-Position     : [1130.68, 360.296]
-Measurements : [2754.45, 546386, -0.828121, -0.255403]
----
-Label        : 1
-Position     : [39.073, 360.72]
-Measurements : [801.782, 71520.4, 0.527475, -0.79077]
----
-Label        : 1
-Position     : [36.328, 360.736]
-Measurements : [740.09, 76900.7, 0.948317, -0.264433]
----
-Label        : 1
-Position     : [207.336, 360.736]
-Measurements : [1083.65, 351551, 0.59436, -0.972166]
----
-Label        : 1
-Position     : [240.616, 360.736]
-Measurements : [1279.16, 259201, -0.336081, -0.905844]
----
-Label        : 1
-Position     : [209.926, 360.996]
-Measurements : [1096.49, 335651, 0.644743, -0.93957]
----
-Label        : 1
-Position     : [255.149, 361.25]
-Measurements : [1025.33, 820394, 1.13797, -0.401646]
----
-Label        : 1
-Position     : [492.046, 361.688]
-Measurements : [1324.93, 304446, 0.359948, -0.787004]
----
-Label        : 1
-Position     : [202.507, 362.779]
-Measurements : [758.795, 326023, 1.61784, 1.14283]
----
-Label        : 1
-Position     : [1125.69, 364.397]
-Measurements : [1748.95, 385271, 1.11641, 0.443763]
----
-Label        : 0
-Position     : [81.9451, 364.568]
-Measurements : [1063.34, 5854.01, 1.05216, 1.8461]
----
-Label        : 1
-Position     : [1178.06, 365.985]
-Measurements : [886.928, 465178, 1.2481, 0.126126]
----
-Label        : 1
-Position     : [273.896, 366.368]
-Measurements : [1143.48, 374598, 0.659708, -0.333251]
----
-Label        : 1
-Position     : [284.648, 367.392]
-Measurements : [954.907, 45656.6, -0.231089, -0.665454]
----
-Label        : 1
-Position     : [1173.93, 367.744]
-Measurements : [1157.86, 403720, 0.581964, -0.807707]
----
-Label        : 1
-Position     : [525.596, 367.949]
-Measurements : [783.268, 364467, 1.24925, 0.334774]
----
-Label        : 1
-Position     : [539.152, 368.117]
-Measurements : [1193.28, 631823, 0.900507, -0.490804]
----
-Label        : 1
-Position     : [278.747, 369.105]
-Measurements : [1012.5, 237941, 1.47042, 2.26681]
----
-Label        : 1
-Position     : [520.393, 369.211]
-Measurements : [1048.66, 416895, 0.492326, -1.15095]
----
-Label        : 1
-Position     : [277.177, 370.136]
-Measurements : [945.034, 189340, 1.48244, 2.90752]
----
-Label        : 1
-Position     : [1171.98, 370.626]
-Measurements : [931.69, 433750, 1.15905, -0.0595133]
----
-Label        : 1
-Position     : [534.528, 370.664]
-Measurements : [1029.14, 364186, 1.57702, 2.36234]
----
-Label        : 1
-Position     : [287.482, 371.23]
-Measurements : [948.184, 59057.7, -0.36291, -0.629689]
----
-Label        : 1
-Position     : [284.838, 372.084]
-Measurements : [899.306, 58401.6, -0.24318, -0.633071]
----
-Label        : 1
-Position     : [524.288, 372.2]
-Measurements : [1197.62, 302897, 0.49929, -1.03499]
----
-Label        : 0
-Position     : [77.9561, 372.201]
-Measurements : [1079.98, 4207.35, 1.0146, 1.71099]
----
-Label        : 1
-Position     : [538.046, 372.35]
-Measurements : [988.993, 339383, 0.971352, -0.151821]
----
-Label        : 0
-Position     : [150.227, 372.757]
-Measurements : [1229.14, 32996.4, 0.494297, -0.745172]
----
-Label        : 1
-Position     : [293.1, 373.368]
-Measurements : [1033.2, 93170.5, -0.255542, -1.0312]
----
-Label        : 1
-Position     : [293.376, 373.784]
-Measurements : [1033.2, 93170.5, -0.255542, -1.0312]
----
-Label        : 1
-Position     : [289.037, 374.518]
-Measurements : [1029.61, 71054.5, -0.145656, -0.636408]
----
-Label        : 0
-Position     : [84.4049, 374.771]
-Measurements : [1094.08, 3891.08, 1.58465, 3.49479]
----
-Label        : 0
-Position     : [120.432, 375.219]
-Measurements : [1059.57, 5005.6, -1.1571, 1.0382]
----
-Label        : 0
-Position     : [78.0707, 375.487]
-Measurements : [1096, 2134.87, 0.634839, 0.533664]
----
-Label        : 0
-Position     : [100.413, 375.896]
-Measurements : [1008.28, 2170.33, -0.190925, 0.356895]
----
-Label        : 0
-Position     : [76.9407, 376.385]
-Measurements : [1086.16, 2849, 0.236747, 0.129677]
----
-Label        : 0
-Position     : [130.29, 377.145]
-Measurements : [803.267, 33189.8, 0.0741495, -1.07347]
----
-Label        : 0
-Position     : [92.1529, 377.833]
-Measurements : [1097.99, 23128, 1.60171, 2.06603]
----
-Label        : 1
-Position     : [342.528, 377.88]
-Measurements : [2102.24, 570240, -0.402955, -0.962667]
----
-Label        : 1
-Position     : [339.165, 379.291]
-Measurements : [1648.96, 1.05003e+06, 0.00722861, -1.66277]
----
-Label        : 1
-Position     : [543.092, 379.536]
-Measurements : [957.537, 484110, 1.15973, -0.240661]
----
-Label        : 1
-Position     : [341.942, 380.04]
-Measurements : [2050.94, 955353, -0.509036, -1.19656]
----
-Label        : 1
-Position     : [302.487, 380.29]
-Measurements : [1173.98, 306768, 0.517941, -0.576989]
----
-Label        : 1
-Position     : [303.104, 380.44]
-Measurements : [1196.92, 304257, 0.46022, -0.652252]
----
-Label        : 1
-Position     : [538.112, 380.904]
-Measurements : [1462.03, 477712, -0.0318375, -1.56297]
----
-Label        : 1
-Position     : [306.948, 381.111]
-Measurements : [1084.41, 333473, 0.793099, -0.507717]
----
-Label        : 0
-Position     : [88.715, 381.723]
-Measurements : [1182.13, 22355.7, 0.821427, 0.160565]
----
-Label        : 0
-Position     : [83.9033, 381.786]
-Measurements : [1159.53, 12281.8, 1.15369, 0.567158]
----
-Label        : 1
-Position     : [306.29, 382.778]
-Measurements : [1067.05, 332709, 0.879665, -0.402924]
----
-Label        : 0
-Position     : [128.7, 383.382]
-Measurements : [964.54, 14395.5, -0.909606, 0.452174]
----
-Label        : 1
-Position     : [307.712, 384.024]
-Measurements : [974.267, 307598, 1.31357, 0.6633]
----
-Label        : 1
-Position     : [542.991, 384.142]
-Measurements : [800.182, 341701, 1.78415, 1.97101]
----
-Label        : 1
-Position     : [33.768, 384.288]
-Measurements : [895.824, 389002, 1.04428, 0.136469]
----
-Label        : 1
-Position     : [536.073, 384.29]
-Measurements : [1412.41, 447854, 0.018311, -1.41854]
----
-Label        : 1
-Position     : [300.132, 384.395]
-Measurements : [1134.16, 182243, 0.36602, -0.510284]
----
-Label        : 0
-Position     : [158.793, 384.688]
-Measurements : [1111.14, 3448.12, 1.253, 2.86972]
----
-Label        : 1
-Position     : [531.32, 385.221]
-Measurements : [1307.26, 334628, 0.361351, -1.09807]
----
-Label        : 1
-Position     : [37.3792, 385.999]
-Measurements : [1415.47, 544143, 0.291589, -1.07497]
----
-Label        : 0
-Position     : [139.365, 386.319]
-Measurements : [947.557, 10998, -0.0164515, 0.296629]
----
-Label        : 1
-Position     : [535.04, 386.536]
-Measurements : [1242.39, 374640, 0.38586, -1.17141]
----
-Label        : 1
-Position     : [36.8771, 386.802]
-Measurements : [1558.57, 639819, 0.534264, -0.486779]
----
-Label        : 1
-Position     : [41.448, 387.872]
-Measurements : [1798.25, 571746, 0.245078, -0.362471]
----
-Label        : 1
-Position     : [38.4414, 389.267]
-Measurements : [1888.62, 689619, 0.227818, -0.778128]
----
-Label        : 0
-Position     : [91.5758, 389.307]
-Measurements : [1046.18, 19292.2, -1.00928, 1.27428]
----
-Label        : 1
-Position     : [42.6246, 391.71]
-Measurements : [1499.46, 652634, 0.552446, -0.592604]
----
-Label        : 1
-Position     : [723.528, 394.24]
-Measurements : [1293.89, 534656, 0.679288, -0.906691]
----
-Label        : 1
-Position     : [728.358, 394.385]
-Measurements : [913.576, 452985, 1.67101, 1.66701]
----
-Label        : 1
-Position     : [540.672, 394.728]
-Measurements : [1036.92, 192689, 0.928732, 0.0844256]
----
-Label        : 0
-Position     : [120.329, 394.979]
-Measurements : [1030.67, 2088.07, -0.00292882, 0.536204]
----
-Label        : 1
-Position     : [53.7728, 396.652]
-Measurements : [1747.54, 297395, -0.0596843, -0.46686]
----
-Label        : 1
-Position     : [535.693, 396.687]
-Measurements : [797.866, 72402.5, 0.441314, -0.190174]
----
-Label        : 1
-Position     : [541.504, 397.342]
-Measurements : [889.472, 163983, 1.30112, 1.33362]
----
-Label        : 1
-Position     : [350.908, 398.532]
-Measurements : [711.83, 191618, 1.49223, 1.16671]
----
-Label        : 1
-Position     : [724.205, 398.75]
-Measurements : [914.407, 561175, 1.41964, 0.668516]
----
-Label        : 1
-Position     : [49.64, 399.136]
-Measurements : [1760.79, 435440, -0.108817, -1.11199]
----
-Label        : 0
-Position     : [154.43, 402.69]
-Measurements : [1092.67, 22119.1, -1.14498, 1.42765]
----
-Label        : 1
-Position     : [353.28, 402.968]
-Measurements : [774.807, 170130, 1.42406, 1.2049]
----
-Label        : 1
-Position     : [51.6486, 403.384]
-Measurements : [1166.88, 578105, 0.863849, -0.616763]
----
-Label        : 0
-Position     : [117.844, 404.396]
-Measurements : [1114.43, 17962.6, -0.886597, 1.18863]
----
-Label        : 1
-Position     : [62.6858, 404.419]
-Measurements : [1178.35, 195504, -0.197495, -1.1333]
----
-Label        : 1
-Position     : [797.47, 406.143]
-Measurements : [507.064, 68048.2, 2.42962, 5.13555]
----
-Label        : 1
-Position     : [916.831, 406.245]
-Measurements : [762.472, 180066, 1.11748, 0.000988982]
----
-Label        : 1
-Position     : [353.501, 407.75]
-Measurements : [553.966, 92119.4, 2.7191, 8.09168]
----
-Label        : 1
-Position     : [62.44, 407.84]
-Measurements : [1245.64, 169765, -0.405401, -0.676118]
----
-Label        : 1
-Position     : [778.594, 407.894]
-Measurements : [837.78, 215531, 0.113253, -1.73944]
----
-Label        : 1
-Position     : [915.08, 408.576]
-Measurements : [807.777, 176175, 0.957463, -0.240786]
----
-Label        : 1
-Position     : [782.408, 409.088]
-Measurements : [933.179, 138430, -0.216412, -1.48188]
----
-Label        : 1
-Position     : [1221.77, 410.184]
-Measurements : [622.695, 204200, 2.32691, 4.57398]
----
-Label        : 1
-Position     : [909.181, 410.456]
-Measurements : [791.064, 183726, 0.602742, -0.857243]
----
-Label        : 1
-Position     : [909.936, 410.463]
-Measurements : [791.064, 183726, 0.602742, -0.857243]
----
-Label        : 1
-Position     : [60.9822, 410.709]
-Measurements : [1115.57, 283113, 0.167235, -0.842756]
----
-Label        : 1
-Position     : [1217.52, 410.993]
-Measurements : [873.734, 255944, 1.00293, 0.00975804]
----
-Label        : 1
-Position     : [792.648, 411.136]
-Measurements : [809.283, 112909, 0.610934, -0.836807]
----
-Label        : 1
-Position     : [797.575, 411.37]
-Measurements : [646.996, 115608, 1.21774, 0.226855]
----
-Label        : 1
-Position     : [68.061, 411.652]
-Measurements : [1527.87, 247014, 0.0294026, -0.994186]
----
-Label        : 1
-Position     : [910.294, 412.547]
-Measurements : [877.468, 169613, 0.63092, -0.651071]
----
-Label        : 1
-Position     : [909.448, 413.184]
-Measurements : [801.535, 146704, 0.620722, -0.356229]
----
-Label        : 1
-Position     : [766.03, 413.862]
-Measurements : [1172.6, 420361, 0.143245, -1.58112]
----
-Label        : 1
-Position     : [786.791, 413.942]
-Measurements : [856.077, 110795, 0.25185, -1.26631]
----
-Label        : 1
-Position     : [1216.94, 414.368]
-Measurements : [899.022, 240505, 1.06321, 0.0829718]
----
-Label        : 1
-Position     : [813.192, 415.232]
-Measurements : [1239.04, 426480, 0.267245, -1.28562]
----
-Label        : 1
-Position     : [930.922, 415.586]
-Measurements : [685.414, 204379, 1.13662, -0.232027]
----
-Label        : 1
-Position     : [768.166, 415.721]
-Measurements : [1317.51, 403060, -0.172306, -1.51637]
----
-Label        : 1
-Position     : [873.984, 415.872]
-Measurements : [590.38, 105650, 1.47544, 0.897345]
----
-Label        : 1
-Position     : [65.512, 416.032]
-Measurements : [1700.58, 290380, -0.00680515, -0.94794]
----
-Label        : 1
-Position     : [768.584, 416.256]
-Measurements : [1324.42, 393554, -0.179794, -1.47335]
----
-Label        : 1
-Position     : [893.119, 416.688]
-Measurements : [939.527, 283659, 0.743562, -0.525585]
----
-Label        : 1
-Position     : [895.112, 417.28]
-Measurements : [1010.12, 246797, 0.683016, -0.43508]
----
-Label        : 1
-Position     : [898.12, 417.804]
-Measurements : [925.398, 290458, 0.789421, -0.527365]
----
-Label        : 1
-Position     : [74.6812, 419.043]
-Measurements : [2073.43, 401342, -0.473729, -0.575139]
----
-Label        : 1
-Position     : [814.578, 419.262]
-Measurements : [1315.69, 325948, 0.0345118, -1.23242]
----
-Label        : 1
-Position     : [871.048, 419.328]
-Measurements : [733.64, 129512, 0.892418, -0.248229]
----
-Label        : 1
-Position     : [933, 419.328]
-Measurements : [809.058, 194305, 0.70812, -0.886597]
----
-Label        : 1
-Position     : [812.492, 419.453]
-Measurements : [1345.87, 287357, 0.113904, -1.18225]
----
-Label        : 1
-Position     : [839.957, 419.915]
-Measurements : [694.174, 213573, 1.54485, 1.61826]
----
-Label        : 1
-Position     : [929.023, 419.974]
-Measurements : [753.367, 175046, 0.94208, -0.369347]
----
-Label        : 1
-Position     : [873.528, 420.529]
-Measurements : [704.959, 134564, 1.02537, -0.144874]
----
-Label        : 1
-Position     : [61.7148, 420.762]
-Measurements : [1297.15, 418280, 0.0260362, -1.39948]
----
-Label        : 1
-Position     : [67.1091, 421.524]
-Measurements : [2090.08, 373632, -0.210323, -0.807548]
----
-Label        : 1
-Position     : [752.214, 421.931]
-Measurements : [537.312, 68072.8, 2.30821, 5.25888]
----
-Label        : 1
-Position     : [70.12, 422.4]
-Measurements : [2191.55, 339292, -0.23023, -0.915324]
----
-Label        : 1
-Position     : [937.318, 423.034]
-Measurements : [695.305, 185857, 1.32909, 0.562202]
----
-Label        : 1
-Position     : [837.256, 423.936]
-Measurements : [925.997, 238192, 1.06973, 0.37556]
----
-Label        : 1
-Position     : [832.613, 425.314]
-Measurements : [875.074, 270150, 1.01821, 0.275156]
----
-Label        : 1
-Position     : [851.894, 425.835]
-Measurements : [832.761, 248294, 0.902637, -0.383226]
----
-Label        : 1
-Position     : [749.64, 425.984]
-Measurements : [948.649, 228955, 0.59698, -0.368217]
----
-Label        : 1
-Position     : [932.488, 425.984]
-Measurements : [900.822, 204635, 0.88108, -0.337504]
----
-Label        : 1
-Position     : [849.053, 426.665]
-Measurements : [897.195, 255519, 0.571282, -0.869123]
----
-Label        : 1
-Position     : [76.264, 428.544]
-Measurements : [2078.04, 544048, -0.674, -0.757565]
----
-Label        : 1
-Position     : [932.095, 428.584]
-Measurements : [975.434, 208625, 0.782362, -0.425091]
----
-Label        : 1
-Position     : [934.89, 428.811]
-Measurements : [1028.9, 241061, 0.446194, -0.928905]
----
-Label        : 1
-Position     : [849.032, 429.056]
-Measurements : [1000.48, 196126, 0.467166, -0.538497]
----
-Label        : 1
-Position     : [77.6479, 429.295]
-Measurements : [1910.85, 706300, -0.350016, -1.35219]
----
-Label        : 1
-Position     : [746.676, 429.75]
-Measurements : [820.053, 132976, 0.335664, -1.09905]
----
-Label        : 1
-Position     : [936.584, 430.08]
-Measurements : [1140.85, 249119, 0.263103, -1.2232]
----
-Label        : 1
-Position     : [928.885, 430.352]
-Measurements : [944.775, 82908.1, 2.11441, 4.56546]
----
-Label        : 1
-Position     : [738.527, 430.575]
-Measurements : [734.847, 139994, 0.397738, -1.51246]
----
-Label        : 1
-Position     : [74.5684, 432.482]
-Measurements : [1827.99, 720857, -0.278373, -1.50905]
----
-Label        : 1
-Position     : [737.864, 435.2]
-Measurements : [1140.51, 105335, -0.643868, 0.011529]
----
-Label        : 1
-Position     : [672.865, 435.417]
-Measurements : [1248.64, 112865, -0.6497, -0.0570891]
----
-Label        : 1
-Position     : [682.741, 436.392]
-Measurements : [898.573, 104883, 0.0898886, -1.54981]
----
-Label        : 1
-Position     : [656.46, 436.438]
-Measurements : [1432.53, 206091, 0.0160037, -0.296242]
----
-Label        : 1
-Position     : [937.347, 437.214]
-Measurements : [1049.51, 321651, 0.84056, -0.508625]
----
-Label        : 1
-Position     : [658.622, 437.368]
-Measurements : [1482.82, 215613, -0.027055, -0.532193]
----
-Label        : 1
-Position     : [640.604, 437.684]
-Measurements : [1082.08, 153135, -0.222277, -0.77468]
----
-Label        : 1
-Position     : [734.722, 437.912]
-Measurements : [1299.21, 171901, 0.266516, -0.402334]
----
-Label        : 1
-Position     : [937.457, 437.972]
-Measurements : [1049.51, 321651, 0.84056, -0.508625]
----
-Label        : 1
-Position     : [939.144, 438.272]
-Measurements : [942.2, 368227, 0.999028, -0.387843]
----
-Label        : 1
-Position     : [672.84, 439.808]
-Measurements : [1341.3, 50934.4, -0.237102, -0.109797]
----
-Label        : 1
-Position     : [731.47, 440.295]
-Measurements : [1543.35, 192591, -0.541051, -0.550148]
----
-Label        : 1
-Position     : [680.008, 440.832]
-Measurements : [1002.36, 81505.6, -0.463097, -0.845906]
----
-Label        : 1
-Position     : [648.203, 441.225]
-Measurements : [1456.05, 76576, -0.301807, -0.307563]
----
-Label        : 1
-Position     : [653.384, 441.344]
-Measurements : [1440.78, 201937, 0.232302, -0.554821]
----
-Label        : 1
-Position     : [663.112, 441.344]
-Measurements : [1519.93, 156782, -0.36463, -0.306364]
----
-Label        : 1
-Position     : [731.351, 441.687]
-Measurements : [1609.03, 156861, -0.587035, -0.233024]
----
-Label        : 1
-Position     : [645.192, 442.368]
-Measurements : [1377.53, 56943.5, -0.341322, -0.169495]
----
-Label        : 1
-Position     : [669.538, 443.666]
-Measurements : [1487.23, 111575, -0.186545, 0.397046]
----
-Label        : 1
-Position     : [735.304, 443.904]
-Measurements : [1497.63, 133602, -0.206007, -0.360222]
----
-Label        : 1
-Position     : [664.384, 444.177]
-Measurements : [1439.95, 157756, -0.514591, -0.0999737]
----
-Label        : 1
-Position     : [110.414, 444.201]
-Measurements : [1226.8, 349611, 0.349913, -1.02005]
----
-Label        : 1
-Position     : [952.316, 444.335]
-Measurements : [1743.24, 866919, -0.137912, -1.48944]
----
-Label        : 1
-Position     : [951.3, 444.617]
-Measurements : [1778.24, 853610, -0.223107, -1.43039]
----
-Label        : 1
-Position     : [676.492, 444.813]
-Measurements : [1270.74, 99444.8, -0.00502241, 0.149872]
----
-Label        : 1
-Position     : [656.548, 445.354]
-Measurements : [1301.54, 217731, 0.0955151, -0.488249]
----
-Label        : 1
-Position     : [947.848, 445.952]
-Measurements : [1813.38, 783301, -0.345384, -1.33575]
----
-Label        : 1
-Position     : [223.344, 446.637]
-Measurements : [1469.86, 350234, 0.777706, -1.01709]
----
-Label        : 1
-Position     : [726.6, 446.976]
-Measurements : [1447.13, 333995, -0.618639, -0.924742]
----
-Label        : 1
-Position     : [639.048, 448]
-Measurements : [1447.78, 182699, -0.258972, -0.39761]
----
-Label        : 1
-Position     : [721.647, 448.221]
-Measurements : [759.222, 356559, 1.21082, -0.230607]
----
-Label        : 1
-Position     : [12.6462, 448.44]
-Measurements : [590.987, 157505, 2.89706, 8.34738]
----
-Label        : 1
-Position     : [107.496, 448.512]
-Measurements : [1167.97, 385140, 0.626117, -1.09912]
----
-Label        : 1
-Position     : [5.97659, 448.64]
-Measurements : [843.677, 310246, 1.22992, 0.562628]
----
-Label        : 1
-Position     : [725.176, 448.99]
-Measurements : [1152.06, 457489, 0.0494439, -1.71895]
----
-Label        : 1
-Position     : [527.264, 449.024]
-Measurements : [1501.23, 430478, 0.240216, -1.26203]
----
-Label        : 1
-Position     : [635.034, 449.472]
-Measurements : [1528.93, 243575, -0.072693, -0.587377]
----
-Label        : 1
-Position     : [126.56, 449.935]
-Measurements : [1001.15, 259217, 0.90875, 0.120479]
----
-Label        : 1
-Position     : [136.162, 450.295]
-Measurements : [1408.87, 289870, 0.156769, -0.651482]
----
-Label        : 1
-Position     : [642.2, 450.737]
-Measurements : [1339.4, 246355, -0.00699209, -1.06775]
----
-Label        : 1
-Position     : [134.958, 451.037]
-Measurements : [1556.1, 207411, 0.488355, -0.699886]
----
-Label        : 1
-Position     : [532.103, 451.064]
-Measurements : [938.794, 438279, 1.3906, 0.723337]
----
-Label        : 1
-Position     : [8.168, 451.072]
-Measurements : [891.489, 271182, 1.42058, 0.888739]
----
-Label        : 1
-Position     : [132.373, 451.389]
-Measurements : [1369.93, 246994, 0.291618, -0.402372]
----
-Label        : 1
-Position     : [528.146, 451.419]
-Measurements : [1457.72, 515785, 0.180012, -1.46798]
----
-Label        : 1
-Position     : [227.304, 451.584]
-Measurements : [1723.93, 415019, -0.421554, -1.04184]
----
-Label        : 1
-Position     : [172.324, 451.762]
-Measurements : [1071.59, 153993, 0.0261246, -1.32803]
----
-Label        : 1
-Position     : [159.783, 451.861]
-Measurements : [1174.08, 384040, 0.389188, -1.10244]
----
-Label        : 1
-Position     : [117.508, 452.061]
-Measurements : [1065.74, 455476, 0.451643, -1.24023]
----
-Label        : 1
-Position     : [120.296, 452.096]
-Measurements : [1142.42, 390763, 0.390965, -1.10479]
----
-Label        : 1
-Position     : [630.835, 452.729]
-Measurements : [1712.56, 204054, -0.083229, -0.749053]
----
-Label        : 1
-Position     : [160.598, 452.779]
-Measurements : [1340.07, 411914, 0.162113, -1.07011]
----
-Label        : 1
-Position     : [103.578, 452.943]
-Measurements : [863.427, 322920, 1.41546, 0.647504]
----
-Label        : 1
-Position     : [130.536, 453.12]
-Measurements : [1207.1, 343233, 0.392211, -0.873326]
----
-Label        : 1
-Position     : [632.392, 453.12]
-Measurements : [1630.88, 310333, -0.208692, -0.798324]
----
-Label        : 1
-Position     : [137.192, 453.632]
-Measurements : [1410.34, 390508, 0.0476933, -1.17026]
----
-Label        : 1
-Position     : [165.352, 454.144]
-Measurements : [1377.33, 358512, 0.106841, -0.794038]
----
-Label        : 1
-Position     : [159.72, 454.656]
-Measurements : [1135.01, 412079, 0.458963, -1.18434]
----
-Label        : 1
-Position     : [627.266, 454.69]
-Measurements : [1813.18, 123260, -0.451422, 0.66334]
----
-Label        : 1
-Position     : [119.219, 454.966]
-Measurements : [1070.43, 393972, 0.613021, -0.87558]
----
-Label        : 1
-Position     : [632.88, 454.968]
-Measurements : [1620.44, 333709, -0.26508, -0.871962]
----
-Label        : 1
-Position     : [170.984, 455.168]
-Measurements : [1154.49, 335000, 0.541179, -0.5096]
----
-Label        : 1
-Position     : [230.572, 455.458]
-Measurements : [1297.81, 720899, 0.302012, -1.66048]
----
-Label        : 1
-Position     : [524.704, 455.68]
-Measurements : [1461.43, 275397, -0.0221619, -1.24211]
----
-Label        : 1
-Position     : [733.529, 456.156]
-Measurements : [985.235, 354557, 1.02509, -0.035532]
----
-Label        : 1
-Position     : [178.399, 456.568]
-Measurements : [901.986, 90239.4, 0.228443, -1.02427]
----
-Label        : 1
-Position     : [168.29, 456.615]
-Measurements : [1219.06, 354372, 0.442171, -0.583136]
----
-Label        : 1
-Position     : [523.599, 456.697]
-Measurements : [1456.96, 276360, -0.184469, -1.43522]
----
-Label        : 1
-Position     : [625.736, 456.704]
-Measurements : [1781.29, 137156, -0.409457, 0.828819]
----
-Label        : 1
-Position     : [158.219, 456.753]
-Measurements : [908.059, 332555, 1.08846, -0.280884]
----
-Label        : 1
-Position     : [167.416, 456.84]
-Measurements : [1223.36, 356828, 0.394666, -0.591263]
----
-Label        : 1
-Position     : [201.192, 457.216]
-Measurements : [933.378, 107552, 0.155343, -1.21194]
----
-Label        : 1
-Position     : [273.116, 457.427]
-Measurements : [848.93, 83433.7, 0.295688, -1.00214]
----
-Label        : 1
-Position     : [629.339, 457.918]
-Measurements : [1686.46, 275729, -0.613071, -0.069262]
----
-Label        : 1
-Position     : [180.712, 458.24]
-Measurements : [876.781, 102409, 0.452063, -1.0902]
----
-Label        : 1
-Position     : [735.922, 459.682]
-Measurements : [1071.95, 321085, 0.857073, -0.0962083]
----
-Label        : 1
-Position     : [526.677, 460.001]
-Measurements : [966.999, 314004, 0.947694, -0.537469]
----
-Label        : 1
-Position     : [205.748, 460.103]
-Measurements : [642.427, 130680, 1.36858, 0.481237]
----
-Label        : 1
-Position     : [625.038, 460.253]
-Measurements : [1676.56, 259427, -0.406202, -0.472816]
----
-Label        : 1
-Position     : [734.28, 460.8]
-Measurements : [1112.77, 301639, 0.829453, -0.103574]
----
-Label        : 1
-Position     : [611.928, 461.373]
-Measurements : [2567.36, 214202, -0.566806, -0.227441]
----
-Label        : 1
-Position     : [271.776, 461.824]
-Measurements : [759.403, 126917, 0.834422, -0.716463]
----
-Label        : 1
-Position     : [518.56, 461.824]
-Measurements : [1307.04, 323766, 0.306164, -1.28303]
----
-Label        : 1
-Position     : [620.616, 461.824]
-Measurements : [2111.78, 217234, -0.248365, -0.0132417]
----
-Label        : 1
-Position     : [659.702, 462.007]
-Measurements : [1248.87, 212375, 0.401319, -0.193886]
----
-Label        : 1
-Position     : [199.358, 462.094]
-Measurements : [748.954, 113780, 0.730454, -0.77978]
----
-Label        : 1
-Position     : [649.759, 462.286]
-Measurements : [1453.68, 237955, 0.186743, -0.814412]
----
-Label        : 1
-Position     : [183.715, 462.562]
-Measurements : [759.815, 116531, 0.787376, -0.591159]
----
-Label        : 1
-Position     : [516.198, 462.776]
-Measurements : [1390.06, 307902, 0.0886769, -1.32882]
----
-Label        : 1
-Position     : [624.499, 462.86]
-Measurements : [1735.56, 265981, -0.143995, -0.538694]
----
-Label        : 1
-Position     : [672.438, 463.223]
-Measurements : [1531.3, 222375, -0.446837, -0.585857]
----
-Label        : 1
-Position     : [667.841, 463.359]
-Measurements : [1589.94, 159504, -0.554411, 0.397613]
----
-Label        : 1
-Position     : [612.936, 463.36]
-Measurements : [2598.89, 156365, -0.283363, -0.214999]
----
-Label        : 1
-Position     : [390.699, 463.9]
-Measurements : [953.982, 240329, 0.61246, -0.859345]
----
-Label        : 1
-Position     : [523.006, 464.194]
-Measurements : [841.746, 288683, 1.57323, 1.47777]
----
-Label        : 1
-Position     : [515.643, 464.224]
-Measurements : [1451.89, 324658, -0.165424, -1.29347]
----
-Label        : 1
-Position     : [281.805, 464.821]
-Measurements : [928.544, 152499, 1.37436, 1.32432]
----
-Label        : 1
-Position     : [653.937, 465.168]
-Measurements : [1389.95, 285490, 0.214694, -0.895179]
----
-Label        : 1
-Position     : [653.384, 465.408]
-Measurements : [1389.95, 285490, 0.214694, -0.895179]
----
-Label        : 1
-Position     : [274.286, 465.806]
-Measurements : [857.849, 226369, 1.49462, 1.87932]
----
-Label        : 1
-Position     : [287.268, 465.866]
-Measurements : [1078.32, 153800, 0.57181, -0.646066]
----
-Label        : 1
-Position     : [611.021, 465.919]
-Measurements : [2485.31, 306380, -0.760804, 0.243711]
----
-Label        : 1
-Position     : [667.72, 465.92]
-Measurements : [1564.51, 137936, -0.497085, 0.0519529]
----
-Label        : 1
-Position     : [674.725, 466.001]
-Measurements : [1530.88, 140729, -0.636649, -0.152479]
----
-Label        : 1
-Position     : [678.056, 466.002]
-Measurements : [1532.06, 83942.1, -0.180043, -0.455521]
----
-Label        : 1
-Position     : [276.016, 466.205]
-Measurements : [952.3, 291512, 1.1692, 0.491303]
----
-Label        : 1
-Position     : [384.456, 466.368]
-Measurements : [1200, 607760, 0.80133, -0.41372]
----
-Label        : 1
-Position     : [386.464, 466.432]
-Measurements : [1125.23, 479432, 1.04214, 0.507311]
----
-Label        : 1
-Position     : [513.44, 466.432]
-Measurements : [1369.01, 301165, -0.0199302, -1.17659]
----
-Label        : 1
-Position     : [661.064, 466.432]
-Measurements : [1260.88, 161930, -0.404024, -1.03649]
----
-Label        : 1
-Position     : [648.776, 466.944]
-Measurements : [1512.77, 152713, -0.139271, -0.353782]
----
-Label        : 1
-Position     : [600.963, 466.963]
-Measurements : [1834.42, 313683, -0.532998, -0.841125]
----
-Label        : 1
-Position     : [684.599, 467.37]
-Measurements : [1694.71, 253093, 0.878805, 0.87761]
----
-Label        : 1
-Position     : [673.864, 467.968]
-Measurements : [1509.78, 182834, -0.878857, -0.121597]
----
-Label        : 1
-Position     : [509.795, 468.69]
-Measurements : [1027.48, 320735, 0.417012, -1.27672]
----
-Label        : 1
-Position     : [286.624, 468.992]
-Measurements : [1206.55, 227639, 0.507718, -0.884645]
----
-Label        : 1
-Position     : [681.544, 468.992]
-Measurements : [1587.81, 80805.8, -0.0797492, -0.512911]
----
-Label        : 1
-Position     : [691.784, 468.992]
-Measurements : [1775.09, 688022, 0.0733174, -1.31853]
----
-Label        : 1
-Position     : [295.159, 469.076]
-Measurements : [1028.37, 293475, 0.537221, -0.974873]
----
-Label        : 1
-Position     : [653.331, 469.441]
-Measurements : [1216.76, 326841, 0.399981, -1.069]
----
-Label        : 1
-Position     : [279.456, 470.016]
-Measurements : [1403.17, 443849, 0.320208, -1.12955]
----
-Label        : 1
-Position     : [696.435, 470.087]
-Measurements : [1156.01, 810201, 0.965591, -0.669568]
----
-Label        : 1
-Position     : [652.34, 470.298]
-Measurements : [1258.21, 328927, 0.285839, -1.17462]
----
-Label        : 1
-Position     : [688.477, 470.455]
-Measurements : [2075.94, 403218, -0.0546087, -0.871039]
----
-Label        : 1
-Position     : [291.232, 470.528]
-Measurements : [1168.67, 287214, 0.341977, -1.23997]
----
-Label        : 1
-Position     : [605.768, 470.528]
-Measurements : [2008.97, 370555, -0.237468, -1.17684]
----
-Label        : 1
-Position     : [946.824, 470.528]
-Measurements : [1182.53, 452263, 0.410711, -1.08387]
----
-Label        : 1
-Position     : [979.08, 470.528]
-Measurements : [1124.51, 172228, 0.00631101, -0.495241]
----
-Label        : 1
-Position     : [663.943, 470.916]
-Measurements : [980.862, 272147, 0.507777, -1.19139]
----
-Label        : 1
-Position     : [278.716, 470.972]
-Measurements : [1345.94, 451075, 0.424035, -1.01057]
----
-Label        : 1
-Position     : [646.216, 471.552]
-Measurements : [1416.11, 135173, -0.516086, 0.147008]
----
-Label        : 1
-Position     : [287.53, 471.65]
-Measurements : [1266.02, 291761, 0.181795, -1.20823]
----
-Label        : 1
-Position     : [305.483, 472.232]
-Measurements : [851.741, 145638, 0.614204, -0.549991]
----
-Label        : 1
-Position     : [942.072, 472.475]
-Measurements : [1080.61, 259532, 0.906377, 0.00731661]
----
-Label        : 1
-Position     : [595.016, 472.576]
-Measurements : [1733.34, 258212, -0.923884, 0.41868]
----
-Label        : 1
-Position     : [674.557, 472.772]
-Measurements : [1178.34, 323354, -0.0910261, -1.57363]
----
-Label        : 1
-Position     : [603.635, 473.302]
-Measurements : [1828.64, 345464, -0.149438, -1.21791]
----
-Label        : 1
-Position     : [596.698, 473.35]
-Measurements : [1801.51, 234249, -0.893691, 0.772139]
----
-Label        : 1
-Position     : [302.496, 473.6]
-Measurements : [770.137, 141844, 0.831649, -0.042973]
----
-Label        : 1
-Position     : [975.604, 473.764]
-Measurements : [734.778, 229011, 1.4425, 0.677822]
----
-Label        : 1
-Position     : [945.652, 474.193]
-Measurements : [1086.58, 408459, 0.865398, -0.512015]
----
-Label        : 1
-Position     : [393.54, 474.219]
-Measurements : [889.456, 175725, 0.398089, -1.348]
----
-Label        : 1
-Position     : [595.621, 474.305]
-Measurements : [1634.54, 332590, -0.780356, -0.443124]
----
-Label        : 1
-Position     : [642.405, 474.507]
-Measurements : [1119.84, 193572, 0.0912902, -1.22246]
----
-Label        : 1
-Position     : [984.041, 474.739]
-Measurements : [1030.24, 67486.9, 1.69136, 5.19346]
----
-Label        : 1
-Position     : [640.473, 475.355]
-Measurements : [1203.43, 284781, 0.363382, -0.937126]
----
-Label        : 1
-Position     : [645.391, 475.639]
-Measurements : [1151.9, 217534, 0.0959684, -1.21377]
----
-Label        : 1
-Position     : [301.851, 477.024]
-Measurements : [618.76, 127621, 1.36534, 0.804601]
----
-Label        : 1
-Position     : [585.007, 477.305]
-Measurements : [1752.69, 854804, -0.271332, -1.66488]
----
-Label        : 1
-Position     : [394.656, 477.696]
-Measurements : [962.181, 163602, 0.16848, -1.41959]
----
-Label        : 1
-Position     : [638.536, 477.696]
-Measurements : [1442.73, 359236, -0.160607, -1.18064]
----
-Label        : 1
-Position     : [637.067, 478.758]
-Measurements : [1573.2, 297211, -0.494839, -0.696645]
----
-Label        : 1
-Position     : [394.519, 478.865]
-Measurements : [949.41, 168507, 0.222663, -1.45861]
----
-Label        : 1
-Position     : [630.498, 479.245]
-Measurements : [1458.34, 210081, -0.662255, -0.293045]
----
-Label        : 1
-Position     : [951.158, 479.53]
-Measurements : [937.038, 530658, 1.27414, 0.101329]
----
-Label        : 1
-Position     : [641.352, 480.053]
-Measurements : [1197.5, 391696, 0.488033, -1.12034]
----
-Label        : 1
-Position     : [731.162, 480.868]
-Measurements : [1263.68, 481731, -0.0628712, -1.36047]
----
-Label        : 1
-Position     : [586.312, 482.304]
-Measurements : [2034.1, 656355, -0.712533, -0.891031]
----
-Label        : 1
-Position     : [632.904, 482.304]
-Measurements : [1578.34, 145295, -0.733559, 0.759693]
----
-Label        : 1
-Position     : [735.304, 482.304]
-Measurements : [1440.9, 344893, -0.171774, -1.07776]
----
-Label        : 1
-Position     : [734.321, 482.861]
-Measurements : [1441.99, 353070, -0.218023, -1.07339]
----
-Label        : 1
-Position     : [585.111, 483.776]
-Measurements : [2245.78, 457103, -0.922618, 0.179196]
----
-Label        : 1
-Position     : [947.848, 484.352]
-Measurements : [1574.49, 715859, -0.0598153, -1.51141]
----
-Label        : 1
-Position     : [8.51251, 485.431]
-Measurements : [1805.83, 466518, -0.142368, -1.41604]
----
-Label        : 1
-Position     : [12.5016, 485.884]
-Measurements : [1478.71, 579231, 0.23233, -1.4544]
----
-Label        : 1
-Position     : [10.216, 486.4]
-Measurements : [1634.46, 592205, 0.0274422, -1.53076]
----
-Label        : 1
-Position     : [499.616, 486.4]
-Measurements : [1222.39, 408170, 1.03882, 0.510449]
----
-Label        : 1
-Position     : [579.144, 486.912]
-Measurements : [2287.17, 292801, -0.0577149, -0.856645]
----
-Label        : 1
-Position     : [583.259, 488.644]
-Measurements : [2202.24, 423646, -0.324615, -0.814626]
----
-Label        : 1
-Position     : [949.453, 488.933]
-Measurements : [1459.24, 867769, 0.210254, -1.74431]
----
-Label        : 1
-Position     : [503.87, 489.373]
-Measurements : [1535.91, 816763, 0.397311, -1.28715]
----
-Label        : 1
-Position     : [576.907, 489.936]
-Measurements : [2092.3, 380156, 0.0469166, -0.749972]
----
-Label        : 1
-Position     : [501.263, 490.444]
-Measurements : [1553.88, 831211, 0.334438, -1.26877]
----
-Label        : 1
-Position     : [623.688, 490.496]
-Measurements : [1385.06, 196047, -0.0627731, -0.31764]
----
-Label        : 1
-Position     : [623.287, 490.496]
-Measurements : [1385.06, 196047, -0.0627731, -0.31764]
----
-Label        : 1
-Position     : [576.157, 490.778]
-Measurements : [2061.91, 415334, -0.00792183, -0.74725]
----
-Label        : 1
-Position     : [572.488, 492.544]
-Measurements : [2011.88, 208174, -0.153713, -0.797107]
----
-Label        : 1
-Position     : [732.061, 492.682]
-Measurements : [1602.18, 476941, -0.00997003, -1.05825]
----
-Label        : 1
-Position     : [618.056, 493.056]
-Measurements : [1788.18, 306689, -0.0969786, -0.420362]
----
-Label        : 1
-Position     : [734.28, 493.056]
-Measurements : [1634.44, 455847, -0.015764, -1.15104]
----
-Label        : 1
-Position     : [603.847, 494.106]
-Measurements : [1298.54, 224126, -0.259836, -1.18882]
----
-Label        : 1
-Position     : [575.65, 494.291]
-Measurements : [1782.06, 330329, -0.130985, -1.03466]
----
-Label        : 1
-Position     : [729.907, 494.373]
-Measurements : [1390.16, 495869, 0.302212, -1.06107]
----
-Label        : 1
-Position     : [611.4, 494.592]
-Measurements : [1885.62, 259295, 0.309637, -0.253785]
----
-Label        : 1
-Position     : [622.606, 494.642]
-Measurements : [1490.11, 334726, 0.188528, -0.605431]
----
-Label        : 1
-Position     : [609.133, 494.79]
-Measurements : [1800.15, 307297, 0.0990803, 0.0708499]
----
-Label        : 1
-Position     : [567.368, 495.104]
-Measurements : [2071.38, 169363, -0.596077, 0.0499229]
----
-Label        : 1
-Position     : [626.27, 495.425]
-Measurements : [906.501, 202015, 0.58991, -1.14779]
----
-Label        : 1
-Position     : [615.016, 496.026]
-Measurements : [2092.95, 284510, -0.48603, -0.207901]
----
-Label        : 1
-Position     : [605.256, 496.64]
-Measurements : [1603.12, 156612, -0.369224, -0.457503]
----
-Label        : 1
-Position     : [563.805, 496.676]
-Measurements : [1945.84, 180293, -0.344369, -0.709229]
----
-Label        : 1
-Position     : [571.648, 497.294]
-Measurements : [1779.53, 314936, -0.102267, -0.873214]
----
-Label        : 1
-Position     : [486.816, 497.664]
-Measurements : [1242.64, 518903, 0.413495, -1.22599]
----
-Label        : 1
-Position     : [618.792, 498.021]
-Measurements : [1743.46, 597174, -0.165338, -1.41454]
----
-Label        : 1
-Position     : [568.863, 498.375]
-Measurements : [1800.74, 318115, -0.2904, -0.817692]
----
-Label        : 1
-Position     : [616.193, 498.896]
-Measurements : [1975.23, 473384, -0.484713, -0.981863]
----
-Label        : 1
-Position     : [561.736, 499.2]
-Measurements : [2045.06, 243167, -0.346029, -0.381696]
----
-Label        : 1
-Position     : [486.047, 500.458]
-Measurements : [1458.84, 576927, -0.040075, -1.43101]
----
-Label        : 1
-Position     : [159.843, 500.629]
-Measurements : [1140.23, 393318, 0.157327, -1.44197]
----
-Label        : 1
-Position     : [483.806, 501.158]
-Measurements : [1033.09, 541746, 0.559267, -1.25066]
----
-Label        : 1
-Position     : [560.411, 502.687]
-Measurements : [2057.6, 381052, -0.540689, -0.812765]
----
-Label        : 1
-Position     : [158.184, 503.416]
-Measurements : [1210.1, 336723, 0.189294, -1.42545]
----
-Label        : 1
-Position     : [157.188, 503.548]
-Measurements : [1223.15, 338510, 0.135225, -1.44452]
----
-Label        : 1
-Position     : [589.887, 507.44]
-Measurements : [1018.12, 368438, 0.551036, -1.37301]
----
-Label        : 1
-Position     : [586.888, 507.744]
-Measurements : [1334.74, 371569, 8.25283e-05, -1.29959]
----
-Label        : 1
-Position     : [547.464, 510.816]
-Measurements : [814.369, 223260, 1.06843, -0.165695]
----
-Label        : 1
-Position     : [584.15, 511.687]
-Measurements : [1687.62, 311475, -0.320604, -0.882119]
----
-Label        : 1
-Position     : [104.747, 511.999]
-Measurements : [1525.06, 391382, -0.381421, -1.1031]
----
-Label        : 1
-Position     : [590.953, 512.092]
-Measurements : [914.364, 335495, 0.938643, -0.64015]
----
-Label        : 1
-Position     : [106.456, 512.57]
-Measurements : [1743.35, 288541, -0.483654, -0.858208]
----
-Label        : 1
-Position     : [581.768, 512.864]
-Measurements : [1607.66, 357197, -0.180509, -1.06948]
----
-Label        : 1
-Position     : [552.257, 512.972]
-Measurements : [945.685, 241239, 1.12092, 1.00038]
----
-Label        : 1
-Position     : [121.482, 513.271]
-Measurements : [1005.89, 316069, 0.404876, -1.07252]
----
-Label        : 1
-Position     : [548.961, 513.526]
-Measurements : [894.349, 216036, 0.758409, -0.657154]
----
-Label        : 1
-Position     : [689.131, 514.299]
-Measurements : [1452.15, 587562, 0.242572, -1.3598]
----
-Label        : 1
-Position     : [356.936, 514.651]
-Measurements : [484.692, 28252.9, 1.48956, 1.46586]
----
-Label        : 1
-Position     : [938.241, 515.137]
-Measurements : [1253.94, 661102, 0.320473, -1.27212]
----
-Label        : 1
-Position     : [96.3726, 515.228]
-Measurements : [1099, 329868, 0.0967388, -1.48977]
----
-Label        : 1
-Position     : [583.944, 516.097]
-Measurements : [1250.48, 528501, 0.63992, -1.22281]
----
-Label        : 1
-Position     : [689.146, 516.399]
-Measurements : [1480.8, 583600, 0.238853, -1.28642]
----
-Label        : 1
-Position     : [575.112, 516.448]
-Measurements : [1470.05, 338931, -0.235598, -1.41402]
----
-Label        : 1
-Position     : [104.424, 516.728]
-Measurements : [1812.31, 242021, -0.118784, -1.00816]
----
-Label        : 1
-Position     : [141.104, 516.996]
-Measurements : [903.29, 272847, 0.848775, -0.00361943]
----
-Label        : 1
-Position     : [115.573, 517.463]
-Measurements : [1559.22, 330148, -0.253316, -0.737935]
----
-Label        : 1
-Position     : [685.886, 517.899]
-Measurements : [2086.71, 401218, -0.515338, -0.744113]
----
-Label        : 1
-Position     : [571.016, 517.984]
-Measurements : [1774.74, 199647, -1.0021, 0.287335]
----
-Label        : 1
-Position     : [98.792, 518.264]
-Measurements : [1252.79, 377801, 0.0753794, -1.02657]
----
-Label        : 1
-Position     : [111.08, 518.264]
-Measurements : [1541.59, 286974, 0.201137, -0.922379]
----
-Label        : 1
-Position     : [122.344, 518.264]
-Measurements : [1257.91, 325551, -0.0265268, -1.46217]
----
-Label        : 1
-Position     : [96.5051, 518.298]
-Measurements : [1002.74, 321256, 0.344161, -1.38253]
----
-Label        : 1
-Position     : [113.021, 518.435]
-Measurements : [1499.71, 270976, 0.198964, -0.59934]
----
-Label        : 1
-Position     : [560.923, 518.462]
-Measurements : [1441.46, 205320, 0.0966524, -0.866899]
----
-Label        : 1
-Position     : [936.288, 518.872]
-Measurements : [1437.21, 480694, 0.251076, -1.00875]
----
-Label        : 1
-Position     : [688.264, 519.008]
-Measurements : [1620.6, 483499, -0.105316, -1.08265]
----
-Label        : 1
-Position     : [570.85, 519.23]
-Measurements : [1756.46, 313467, -0.75002, -0.419572]
----
-Label        : 1
-Position     : [355.264, 519.32]
-Measurements : [503.265, 25277, 1.48944, 1.75196]
----
-Label        : 1
-Position     : [575.022, 519.364]
-Measurements : [1277.05, 407981, 0.283681, -1.59171]
----
-Label        : 1
-Position     : [113.401, 519.512]
-Measurements : [1459.1, 249996, 0.430455, -0.532729]
----
-Label        : 1
-Position     : [674.083, 519.722]
-Measurements : [2350.35, 467233, 0.128373, -0.580424]
----
-Label        : 1
-Position     : [116.712, 519.8]
-Measurements : [1630.29, 236205, -0.106491, -0.682769]
----
-Label        : 1
-Position     : [121.085, 519.846]
-Measurements : [1371.5, 328759, -0.174011, -1.29959]
----
-Label        : 1
-Position     : [574.771, 519.928]
-Measurements : [1365.02, 398939, 0.0656178, -1.66324]
----
-Label        : 1
-Position     : [675.446, 520.461]
-Measurements : [2364.69, 420460, 0.0850419, -0.324506]
----
-Label        : 1
-Position     : [681.096, 520.544]
-Measurements : [2077.24, 277552, -0.133201, -0.951526]
----
-Label        : 1
-Position     : [119.524, 521.265]
-Measurements : [1547.95, 334549, -0.173422, -1.1656]
----
-Label        : 1
-Position     : [671.88, 521.568]
-Measurements : [2196.3, 643005, 0.129993, -1.06851]
----
-Label        : 1
-Position     : [569.104, 521.638]
-Measurements : [1644.6, 400594, -0.341815, -1.17246]
----
-Label        : 1
-Position     : [139.24, 521.848]
-Measurements : [1330.17, 212572, 0.565509, -0.446046]
----
-Label        : 1
-Position     : [358.245, 522.281]
-Measurements : [484.339, 20957.1, 1.95807, 3.62854]
----
-Label        : 1
-Position     : [575.842, 522.293]
-Measurements : [1018.99, 397500, 0.960803, -0.702018]
----
-Label        : 1
-Position     : [932.217, 522.472]
-Measurements : [1170.02, 516493, 0.668956, -0.663862]
----
-Label        : 1
-Position     : [564.872, 522.592]
-Measurements : [1806.28, 211491, -0.39852, -0.0913888]
----
-Label        : 1
-Position     : [82.6851, 522.857]
-Measurements : [1113.26, 218590, 0.076288, -1.28177]
----
-Label        : 1
-Position     : [82.408, 522.872]
-Measurements : [1113.26, 218590, 0.076288, -1.28177]
----
-Label        : 1
-Position     : [73.2248, 523.267]
-Measurements : [1424.03, 296586, -0.29191, -0.568026]
----
-Label        : 1
-Position     : [685.084, 523.582]
-Measurements : [1843.59, 518391, -0.108008, -1.2111]
----
-Label        : 1
-Position     : [668.946, 523.587]
-Measurements : [1680.36, 608905, 0.627474, -0.892091]
----
-Label        : 1
-Position     : [666.248, 524.64]
-Measurements : [1291.07, 555317, 1.14039, 0.50806]
----
-Label        : 1
-Position     : [137.199, 524.875]
-Measurements : [1281.35, 240553, 0.277879, -0.246804]
----
-Label        : 1
-Position     : [555, 524.933]
-Measurements : [1755.88, 349913, -0.0863422, -0.396929]
----
-Label        : 1
-Position     : [561.8, 525.664]
-Measurements : [1811.89, 270634, -0.40539, -0.0551912]
----
-Label        : 1
-Position     : [74.216, 525.944]
-Measurements : [1402.89, 270133, -0.103743, -0.461858]
----
-Label        : 1
-Position     : [76.8979, 526.203]
-Measurements : [1397.18, 224316, 0.126265, -0.257325]
----
-Label        : 1
-Position     : [145.384, 526.456]
-Measurements : [1591.45, 574618, 0.269258, -1.27814]
----
-Label        : 1
-Position     : [555.289, 526.476]
-Measurements : [1992.2, 316911, -0.10351, -0.286562]
----
-Label        : 1
-Position     : [552.298, 526.695]
-Measurements : [2046.1, 402442, -0.394638, -0.639538]
----
-Label        : 1
-Position     : [668.937, 527.078]
-Measurements : [1372.07, 450753, 0.543306, -0.851504]
----
-Label        : 1
-Position     : [79.7832, 527.152]
-Measurements : [1259.84, 186494, 0.798769, 0.262099]
----
-Label        : 1
-Position     : [143.417, 527.593]
-Measurements : [1671.51, 518053, 0.173787, -1.27215]
----
-Label        : 1
-Position     : [561.084, 528.195]
-Measurements : [1596.5, 460391, -0.0946448, -1.12658]
----
-Label        : 1
-Position     : [640.274, 528.224]
-Measurements : [998.217, 148805, 0.513197, -0.15954]
----
-Label        : 1
-Position     : [562.383, 528.385]
-Measurements : [1532.77, 485423, -0.00953177, -1.26468]
----
-Label        : 1
-Position     : [552.584, 528.736]
-Measurements : [2238.68, 247271, -0.482622, 0.00651976]
----
-Label        : 1
-Position     : [555.656, 528.736]
-Measurements : [2080.56, 306242, -0.367825, 0.026926]
----
-Label        : 1
-Position     : [143.943, 529.013]
-Measurements : [1456.08, 638703, 0.444392, -1.24277]
----
-Label        : 1
-Position     : [548.488, 530.784]
-Measurements : [1994.98, 443247, -0.199228, -1.0123]
----
-Label        : 1
-Position     : [549.047, 530.799]
-Measurements : [2049.62, 413702, -0.410612, -0.646898]
----
-Label        : 1
-Position     : [552.159, 531.462]
-Measurements : [1991.5, 603721, -0.622387, -0.859583]
----
-Label        : 1
-Position     : [158.215, 531.896]
-Measurements : [1517.91, 573203, 0.035411, -1.40464]
----
-Label        : 1
-Position     : [859.597, 532.098]
-Measurements : [897.279, 397788, 1.08328, -0.132882]
----
-Label        : 1
-Position     : [856.416, 532.184]
-Measurements : [1075.53, 457210, 0.670769, -1.10685]
----
-Label        : 1
-Position     : [650.888, 532.32]
-Measurements : [1206.69, 211731, -0.230262, -1.15974]
----
-Label        : 1
-Position     : [642.696, 532.832]
-Measurements : [1109.7, 101368, -0.0213611, -1.14778]
----
-Label        : 1
-Position     : [559.738, 532.941]
-Measurements : [1306.38, 586416, 0.431628, -1.36615]
----
-Label        : 1
-Position     : [857.559, 533.069]
-Measurements : [993.012, 443832, 0.896378, -0.736828]
----
-Label        : 1
-Position     : [155.112, 533.112]
-Measurements : [1708.82, 409969, -0.266895, -0.903948]
----
-Label        : 1
-Position     : [632.794, 533.126]
-Measurements : [1260.26, 164790, -0.0556231, -0.775306]
----
-Label        : 1
-Position     : [155.888, 534.121]
-Measurements : [1713.74, 370551, -0.212855, -0.781483]
----
-Label        : 1
-Position     : [653.29, 534.833]
-Measurements : [962.62, 266794, 0.507258, -1.28953]
----
-Label        : 1
-Position     : [652.171, 535.158]
-Measurements : [965.637, 220720, 0.468729, -1.27748]
----
-Label        : 1
-Position     : [634.504, 535.392]
-Measurements : [1224.84, 140926, 0.172546, -0.799324]
----
-Label        : 1
-Position     : [629.701, 535.862]
-Measurements : [1250.58, 117243, 0.0808624, -0.748968]
----
-Label        : 1
-Position     : [638.105, 536.373]
-Measurements : [1177.01, 152568, 0.217958, -0.751288]
----
-Label        : 1
-Position     : [845.715, 536.895]
-Measurements : [972.932, 247036, 0.664486, -0.780894]
----
-Label        : 1
-Position     : [630.584, 537.125]
-Measurements : [1221.53, 145059, 0.291194, -0.854623]
----
-Label        : 1
-Position     : [626.536, 537.176]
-Measurements : [1151.67, 111131, 0.261392, -0.655329]
----
-Label        : 1
-Position     : [154.961, 537.412]
-Measurements : [1580.2, 286988, 0.0357721, -0.632949]
----
-Label        : 1
-Position     : [159.208, 537.72]
-Measurements : [1307.54, 402378, 0.336769, -0.940364]
----
-Label        : 1
-Position     : [739.604, 538.335]
-Measurements : [1008.33, 313859, 0.109282, -1.58644]
----
-Label        : 1
-Position     : [628.36, 538.464]
-Measurements : [1161.36, 122119, 0.38234, -0.75588]
----
-Label        : 1
-Position     : [685.754, 538.863]
-Measurements : [1286.44, 209253, 0.0299302, -0.67024]
----
-Label        : 1
-Position     : [969.568, 539.352]
-Measurements : [1770.55, 329781, -0.214014, -0.797349]
----
-Label        : 1
-Position     : [154.99, 539.973]
-Measurements : [1426.38, 313698, -0.00452222, -1.11009]
----
-Label        : 1
-Position     : [893.28, 540.376]
-Measurements : [1501.89, 665187, 0.164338, -1.44047]
----
-Label        : 1
-Position     : [968.573, 540.837]
-Measurements : [1664.59, 483957, -0.386499, -0.964287]
----
-Label        : 1
-Position     : [850.272, 541.4]
-Measurements : [1215.94, 427054, 0.201133, -1.33611]
----
-Label        : 1
-Position     : [619.656, 541.536]
-Measurements : [1369.65, 227500, 0.62844, 0.175853]
----
-Label        : 1
-Position     : [740.488, 541.536]
-Measurements : [1158.46, 213541, -0.0769387, -1.35516]
----
-Label        : 1
-Position     : [738.541, 541.554]
-Measurements : [1094.43, 228086, 0.0288894, -1.34753]
----
-Label        : 1
-Position     : [620.565, 541.692]
-Measurements : [1301.34, 203838, 0.601099, 0.695094]
----
-Label        : 1
-Position     : [919.392, 541.912]
-Measurements : [1076.82, 127660, -0.465827, -0.285083]
----
-Label        : 1
-Position     : [683.745, 542.12]
-Measurements : [1400.62, 141217, 0.263412, -0.51923]
----
-Label        : 1
-Position     : [847.487, 542.132]
-Measurements : [1152.36, 429045, 0.280138, -1.31061]
----
-Label        : 1
-Position     : [968.737, 542.16]
-Measurements : [1560.14, 540243, -0.191867, -1.24116]
----
-Label        : 1
-Position     : [693.48, 542.19]
-Measurements : [966.508, 423764, 0.948472, -0.766761]
----
-Label        : 1
-Position     : [916.057, 543.093]
-Measurements : [1316.77, 71402.8, 0.0575627, 0.692385]
----
-Label        : 1
-Position     : [897.54, 543.251]
-Measurements : [733.187, 484756, 2.10572, 3.03883]
----
-Label        : 1
-Position     : [689.288, 543.584]
-Measurements : [1394.32, 344312, -0.167991, -1.38606]
----
-Label        : 1
-Position     : [613.512, 544.096]
-Measurements : [1888.24, 314658, -0.583711, -0.672326]
----
-Label        : 1
-Position     : [619.007, 544.412]
-Measurements : [1341.67, 276825, 0.49454, -0.3906]
----
-Label        : 1
-Position     : [68.6158, 545.038]
-Measurements : [988.67, 256931, 1.21836, 0.677322]
----
-Label        : 1
-Position     : [892.053, 545.25]
-Measurements : [996.108, 714571, 1.17468, -0.247991]
----
-Label        : 1
-Position     : [602.542, 545.255]
-Measurements : [1098.34, 463152, 0.443857, -1.44794]
----
-Label        : 1
-Position     : [372.869, 545.29]
-Measurements : [647.698, 162205, 1.54662, 1.56244]
----
-Label        : 1
-Position     : [368.064, 545.432]
-Measurements : [889.225, 194181, 0.667855, -0.706854]
----
-Label        : 1
-Position     : [167.649, 545.473]
-Measurements : [1166.57, 771684, 0.433882, -1.53255]
----
-Label        : 1
-Position     : [171.602, 545.671]
-Measurements : [1186.39, 748694, 0.458735, -1.48851]
----
-Label        : 1
-Position     : [612.092, 545.756]
-Measurements : [1971.11, 274734, -0.802306, -0.182576]
----
-Label        : 1
-Position     : [922.904, 546.419]
-Measurements : [731.19, 136447, 0.710832, -1.14612]
----
-Label        : 1
-Position     : [912.736, 546.52]
-Measurements : [1229.94, 213367, -0.0924437, -0.877466]
----
-Label        : 1
-Position     : [605.257, 546.527]
-Measurements : [1570.41, 602172, -0.372313, -1.4091]
----
-Label        : 1
-Position     : [681.608, 546.656]
-Measurements : [1296.6, 121584, -0.0814027, -0.254927]
----
-Label        : 1
-Position     : [606.856, 547.168]
-Measurements : [1653.51, 567992, -0.466753, -1.22783]
----
-Label        : 1
-Position     : [915.447, 547.538]
-Measurements : [1292.9, 196033, -0.286121, -0.742374]
----
-Label        : 1
-Position     : [674.991, 548.364]
-Measurements : [1440.87, 101237, 0.445724, 2.17182]
----
-Label        : 1
-Position     : [836.785, 548.445]
-Measurements : [847.022, 121326, 0.374717, -0.940934]
----
-Label        : 1
-Position     : [677.95, 548.448]
-Measurements : [1383.8, 90159.1, -0.820815, 0.505858]
----
-Label        : 1
-Position     : [368.574, 548.632]
-Measurements : [897.774, 171249, 0.848018, -0.299431]
----
-Label        : 1
-Position     : [610.801, 548.665]
-Measurements : [1890.6, 333818, -0.660998, -0.598264]
----
-Label        : 1
-Position     : [839.198, 548.815]
-Measurements : [747.295, 157001, 0.689483, -1.03939]
----
-Label        : 1
-Position     : [66.536, 548.984]
-Measurements : [1204.27, 331009, 0.518502, -0.763793]
----
-Label        : 1
-Position     : [585.897, 549.025]
-Measurements : [1470.37, 254436, -0.550692, -0.452917]
----
-Label        : 1
-Position     : [842.535, 549.101]
-Measurements : [630.592, 146847, 1.24269, 0.0450036]
----
-Label        : 1
-Position     : [168.936, 549.496]
-Measurements : [1453.63, 641926, -0.0154559, -1.6177]
----
-Label        : 1
-Position     : [837.472, 549.592]
-Measurements : [832.63, 139672, 0.380043, -1.20935]
----
-Label        : 1
-Position     : [910.551, 549.666]
-Measurements : [1068.28, 361318, 0.116333, -1.5643]
----
-Label        : 1
-Position     : [662.29, 549.743]
-Measurements : [1588.06, 253787, 0.272125, -0.706776]
----
-Label        : 1
-Position     : [685.762, 549.883]
-Measurements : [1281.77, 292865, 0.131181, -1.09337]
----
-Label        : 1
-Position     : [842.293, 549.984]
-Measurements : [630.592, 146847, 1.24269, 0.0450036]
----
-Label        : 1
-Position     : [596.061, 550.501]
-Measurements : [953.189, 151523, -0.126436, -1.40287]
----
-Label        : 1
-Position     : [595.737, 550.569]
-Measurements : [1034.29, 139565, -0.365157, -1.10216]
----
-Label        : 1
-Position     : [595.592, 550.752]
-Measurements : [1034.29, 139565, -0.365157, -1.10216]
----
-Label        : 1
-Position     : [675.464, 550.752]
-Measurements : [1380.79, 112696, -0.562892, 0.967104]
----
-Label        : 1
-Position     : [657.811, 551.747]
-Measurements : [1093.01, 204903, -0.127794, -1.09142]
----
-Label        : 1
-Position     : [68.4228, 552.116]
-Measurements : [1406.42, 258037, 0.349544, -0.802103]
----
-Label        : 1
-Position     : [66.024, 552.568]
-Measurements : [1390.64, 292310, 0.187832, -0.970916]
----
-Label        : 1
-Position     : [659.08, 553.312]
-Measurements : [1192.45, 235697, -0.121543, -1.0075]
----
-Label        : 1
-Position     : [666.76, 553.312]
-Measurements : [1736, 410110, -0.170472, -1.17004]
----
-Label        : 1
-Position     : [587.912, 553.428]
-Measurements : [1762.04, 176261, 0.654696, -0.138235]
----
-Label        : 1
-Position     : [663.729, 553.605]
-Measurements : [1664.34, 365946, -0.0719111, -0.932129]
----
-Label        : 1
-Position     : [839.008, 553.688]
-Measurements : [757.783, 166356, 0.590803, -1.22261]
----
-Label        : 1
-Position     : [584.429, 553.752]
-Measurements : [1920.63, 172586, 0.0358339, -0.551255]
----
-Label        : 1
-Position     : [592.358, 553.79]
-Measurements : [1338.35, 131925, 0.18481, 0.00550019]
----
-Label        : 1
-Position     : [590.472, 553.824]
-Measurements : [1510.32, 182766, 0.214998, 0.0218474]
----
-Label        : 1
-Position     : [662.748, 554.538]
-Measurements : [1457.25, 373951, 0.127051, -0.88248]
----
-Label        : 1
-Position     : [63.8955, 554.694]
-Measurements : [1126.88, 315603, 0.363359, -0.777913]
----
-Label        : 1
-Position     : [584.71, 555.181]
-Measurements : [1974.39, 198851, -0.0698433, -0.841522]
----
-Label        : 1
-Position     : [583.304, 556.384]
-Measurements : [2037.44, 206148, -0.219064, -0.843401]
----
-Label        : 1
-Position     : [68.6961, 557.213]
-Measurements : [1536.18, 171132, 0.0439612, -0.613123]
----
-Label        : 1
-Position     : [580.232, 557.408]
-Measurements : [2125.47, 208773, -0.644862, -0.235574]
----
-Label        : 1
-Position     : [174.719, 557.733]
-Measurements : [898.759, 187005, 0.383145, -1.2097]
----
-Label        : 1
-Position     : [402.869, 557.851]
-Measurements : [1334.78, 720938, 0.0307956, -1.69772]
----
-Label        : 1
-Position     : [384.96, 558.232]
-Measurements : [1402.2, 291162, -0.572213, -0.683802]
----
-Label        : 1
-Position     : [557.563, 558.329]
-Measurements : [1469.41, 146080, 0.0394042, -0.622513]
----
-Label        : 1
-Position     : [578.735, 558.744]
-Measurements : [2063.1, 304911, -0.658747, -0.429547]
----
-Label        : 1
-Position     : [380.415, 559.509]
-Measurements : [1030.78, 387391, 0.189618, -1.72118]
----
-Label        : 1
-Position     : [173.544, 559.608]
-Measurements : [935.883, 178358, 0.323128, -1.25073]
----
-Label        : 1
-Position     : [404.575, 559.807]
-Measurements : [1550.19, 540365, -0.248425, -1.49692]
----
-Label        : 1
-Position     : [574.088, 559.968]
-Measurements : [1726.03, 558886, -0.134103, -1.40458]
----
-Label        : 1
-Position     : [265.694, 560.218]
-Measurements : [1215.62, 396161, 0.385144, -1.13635]
----
-Label        : 1
-Position     : [628.311, 560.542]
-Measurements : [1049.43, 413327, 0.593478, -0.651241]
----
-Label        : 1
-Position     : [560.433, 560.556]
-Measurements : [1323.59, 205601, 0.216717, -0.770939]
----
-Label        : 1
-Position     : [561.288, 560.992]
-Measurements : [1273.38, 238064, 0.245399, -0.938592]
----
-Label        : 1
-Position     : [65.512, 561.144]
-Measurements : [1367.59, 185858, -0.232455, -0.952684]
----
-Label        : 1
-Position     : [833.312, 561.535]
-Measurements : [748.389, 117808, 0.87673, 0.372487]
----
-Label        : 1
-Position     : [174.745, 562.247]
-Measurements : [887.213, 182805, 0.537509, -1.18353]
----
-Label        : 1
-Position     : [751.027, 562.25]
-Measurements : [1129.39, 160728, -0.38824, -1.14525]
----
-Label        : 1
-Position     : [632.968, 562.528]
-Measurements : [1315.61, 443125, 0.279018, -1.09643]
----
-Label        : 1
-Position     : [577.494, 562.593]
-Measurements : [1740.11, 515743, 0.0375038, -1.55101]
----
-Label        : 1
-Position     : [401.856, 562.84]
-Measurements : [1858.27, 373124, -0.72865, -0.387901]
----
-Label        : 1
-Position     : [385.847, 562.841]
-Measurements : [1493.7, 121529, -0.55157, -0.364009]
----
-Label        : 1
-Position     : [266.588, 562.939]
-Measurements : [1385.16, 382181, 0.0929111, -1.15831]
----
-Label        : 1
-Position     : [746.12, 563.04]
-Measurements : [1030.86, 186221, 0.0629092, -1.47482]
----
-Label        : 1
-Position     : [63.9099, 563.448]
-Measurements : [1259.14, 220281, 0.0236837, -1.07392]
----
-Label        : 1
-Position     : [548.352, 563.508]
-Measurements : [1621.1, 186553, -0.408011, -0.233939]
----
-Label        : 1
-Position     : [60.8789, 563.579]
-Measurements : [961.026, 207415, 0.515273, -0.754784]
----
-Label        : 1
-Position     : [637.953, 563.604]
-Measurements : [1077.7, 557523, 0.877909, -0.850592]
----
-Label        : 1
-Position     : [266.728, 563.704]
-Measurements : [1443.75, 340373, -0.00392614, -1.00391]
----
-Label        : 1
-Position     : [511.636, 563.716]
-Measurements : [741.791, 48736.9, 0.0456055, -0.831354]
----
-Label        : 1
-Position     : [389.056, 564.376]
-Measurements : [1552.88, 219631, -0.046529, -0.744055]
----
-Label        : 1
-Position     : [271.17, 564.402]
-Measurements : [1011.81, 458750, 0.876486, -0.545166]
----
-Label        : 1
-Position     : [569.686, 564.755]
-Measurements : [955.968, 348778, 2.13753, 3.77168]
----
-Label        : 1
-Position     : [61.986, 564.807]
-Measurements : [1071.06, 226942, 0.344579, -0.963342]
----
-Label        : 1
-Position     : [835.426, 565.056]
-Measurements : [826.632, 174667, 1.04292, 0.201201]
----
-Label        : 1
-Position     : [543.368, 565.088]
-Measurements : [1550.01, 275781, -0.0652288, -1.07195]
----
-Label        : 1
-Position     : [386.036, 565.286]
-Measurements : [1426.85, 142805, -0.0853821, -0.743422]
----
-Label        : 1
-Position     : [531.431, 566.444]
-Measurements : [1161.49, 436970, 0.42866, -1.35793]
----
-Label        : 1
-Position     : [837.984, 566.488]
-Measurements : [853.543, 217003, 0.844863, -0.525593]
----
-Label        : 1
-Position     : [514.506, 567.217]
-Measurements : [811.119, 30515, 0.131191, -0.529126]
----
-Label        : 1
-Position     : [261.608, 567.288]
-Measurements : [1396.15, 162422, 0.333017, 0.678383]
----
-Label        : 1
-Position     : [514.696, 567.648]
-Measurements : [811.119, 30515, 0.131191, -0.529126]
----
-Label        : 1
-Position     : [388.104, 567.705]
-Measurements : [1402.95, 215284, 0.331956, -0.933168]
----
-Label        : 1
-Position     : [750.551, 567.846]
-Measurements : [783.311, 226485, 0.698776, -0.987802]
----
-Label        : 1
-Position     : [68.072, 568.312]
-Measurements : [1101.56, 234792, 0.320168, -1.23589]
----
-Label        : 1
-Position     : [546.841, 568.539]
-Measurements : [1359.75, 295609, 0.10771, -1.13195]
----
-Label        : 1
-Position     : [977.56, 568.583]
-Measurements : [1460.08, 168090, 0.305359, -1.12439]
----
-Label        : 1
-Position     : [403.547, 568.903]
-Measurements : [1802.22, 320711, -0.394287, -0.573665]
----
-Label        : 1
-Position     : [543.272, 569.248]
-Measurements : [1208.41, 233405, 0.537796, -0.647323]
----
-Label        : 1
-Position     : [261.948, 569.404]
-Measurements : [1237.46, 196129, 0.0414693, -0.258032]
----
-Label        : 1
-Position     : [406.517, 570.499]
-Measurements : [1690.69, 354578, -0.217451, -0.722075]
----
-Label        : 1
-Position     : [530.568, 570.72]
-Measurements : [1551.89, 430978, -0.344007, -1.19749]
----
-Label        : 1
-Position     : [254.952, 570.872]
-Measurements : [854.434, 197704, 0.815986, -0.783936]
----
-Label        : 1
-Position     : [404.416, 571.032]
-Measurements : [1914.2, 278546, -0.454741, -0.0690502]
----
-Label        : 1
-Position     : [505.448, 571.474]
-Measurements : [763.208, 95622.2, 0.199647, -1.07823]
----
-Label        : 1
-Position     : [635.94, 571.514]
-Measurements : [888.983, 142813, 0.347177, -1.11481]
----
-Label        : 1
-Position     : [184.542, 571.529]
-Measurements : [882.651, 320351, 0.668785, -0.916971]
----
-Label        : 1
-Position     : [251.019, 572.145]
-Measurements : [785.131, 188297, 1.19931, 0.112167]
----
-Label        : 1
-Position     : [639.624, 572.256]
-Measurements : [962.002, 145217, 0.253866, -1.05929]
----
-Label        : 1
-Position     : [529.055, 572.424]
-Measurements : [1712.57, 324797, -0.422305, -0.685713]
----
-Label        : 1
-Position     : [254.04, 572.445]
-Measurements : [822.708, 169408, 1.04385, -0.219536]
----
-Label        : 1
-Position     : [978.824, 572.481]
-Measurements : [1556.71, 170622, -0.350726, -0.666874]
----
-Label        : 1
-Position     : [70.6349, 572.587]
-Measurements : [1135.09, 370077, 0.336241, -1.53432]
----
-Label        : 1
-Position     : [978.272, 572.632]
-Measurements : [1556.71, 170622, -0.350726, -0.666874]
----
-Label        : 1
-Position     : [521.382, 572.646]
-Measurements : [1156.46, 187809, 1.03322, 0.140461]
----
-Label        : 1
-Position     : [523.4, 572.768]
-Measurements : [1343.39, 253992, 0.636051, -0.690359]
----
-Label        : 1
-Position     : [539.784, 572.768]
-Measurements : [870.082, 95191, 0.968062, 1.2117]
----
-Label        : 1
-Position     : [509.064, 573.28]
-Measurements : [873.357, 71712.8, 0.234021, -0.551763]
----
-Label        : 1
-Position     : [642.027, 573.887]
-Measurements : [961.326, 156466, 0.453651, -1.2085]
----
-Label        : 1
-Position     : [409.875, 573.926]
-Measurements : [1744.69, 639076, -0.23923, -1.33732]
----
-Label        : 1
-Position     : [542.833, 574.579]
-Measurements : [1007.82, 131515, 1.04116, 1.11113]
----
-Label        : 1
-Position     : [511.082, 574.72]
-Measurements : [884.891, 72490.3, 0.188584, -0.699274]
----
-Label        : 1
-Position     : [179.688, 574.968]
-Measurements : [1170.41, 239662, 0.36655, -0.867454]
----
-Label        : 1
-Position     : [527.026, 575.482]
-Measurements : [1650.04, 269915, 0.116529, -0.938832]
----
-Label        : 1
-Position     : [183.561, 576.483]
-Measurements : [1111.18, 237710, 0.605415, -0.878042]
----
-Label        : 1
-Position     : [406.976, 577.688]
-Measurements : [1732.12, 616186, -0.158667, -1.44916]
----
-Label        : 1
-Position     : [71.3052, 578.356]
-Measurements : [1130.47, 277750, 0.555065, -1.03163]
----
-Label        : 1
-Position     : [71.144, 578.552]
-Measurements : [1130.47, 277750, 0.555065, -1.03163]
----
-Label        : 1
-Position     : [248.241, 578.62]
-Measurements : [1304.08, 408362, 0.135407, -1.33895]
----
-Label        : 1
-Position     : [746.632, 578.912]
-Measurements : [1120.32, 386986, 0.13633, -1.36769]
----
-Label        : 1
-Position     : [245.736, 579.576]
-Measurements : [1616.03, 309322, -0.36443, -0.641314]
----
-Label        : 1
-Position     : [743.621, 579.768]
-Measurements : [1033.71, 372602, 0.40827, -1.20577]
----
-Label        : 1
-Position     : [748.2, 579.824]
-Measurements : [1138.5, 313170, 0.228065, -1.0469]
----
-Label        : 1
-Position     : [493.349, 580.168]
-Measurements : [988.673, 372587, 0.660684, -0.886268]
----
-Label        : 1
-Position     : [926.194, 580.478]
-Measurements : [1023.71, 465297, 0.468546, -1.3932]
----
-Label        : 1
-Position     : [244.925, 580.944]
-Measurements : [1678.39, 316686, -0.375423, -0.631309]
----
-Label        : 1
-Position     : [405.149, 581.285]
-Measurements : [1317.17, 655870, 0.565245, -1.24558]
----
-Label        : 1
-Position     : [839.447, 581.833]
-Measurements : [802.678, 295910, 1.09132, -0.000274494]
----
-Label        : 1
-Position     : [243.287, 582.179]
-Measurements : [1631.35, 381332, -0.294742, -0.978722]
----
-Label        : 1
-Position     : [68.3426, 582.724]
-Measurements : [842.06, 258088, 0.941284, -0.285413]
----
-Label        : 1
-Position     : [495.24, 583.008]
-Measurements : [1205.29, 379650, 0.294275, -1.22413]
----
-Label        : 1
-Position     : [495.224, 583.154]
-Measurements : [1205.29, 379650, 0.294275, -1.22413]
----
-Label        : 1
-Position     : [743.721, 583.698]
-Measurements : [1251.07, 298139, -0.0894589, -1.02486]
----
-Label        : 1
-Position     : [853.971, 583.894]
-Measurements : [710.569, 284400, 1.45034, 0.705734]
----
-Label        : 1
-Position     : [924.738, 584.356]
-Measurements : [1500.64, 279100, -0.714514, -0.373187]
----
-Label        : 1
-Position     : [841.056, 584.408]
-Measurements : [848.275, 265194, 1.14014, 0.165961]
----
-Label        : 1
-Position     : [925.536, 584.408]
-Measurements : [1457.3, 291992, -0.708653, -0.483691]
----
-Label        : 1
-Position     : [837.943, 584.962]
-Measurements : [918.6, 205224, 0.986566, 0.719513]
----
-Label        : 1
-Position     : [246.76, 585.208]
-Measurements : [1561.69, 395193, 0.0846826, -1.27315]
----
-Label        : 1
-Position     : [11.24, 585.72]
-Measurements : [1143.59, 408355, 0.749213, -0.760661]
----
-Label        : 1
-Position     : [11.7226, 585.96]
-Measurements : [1143.59, 408355, 0.749213, -0.760661]
----
-Label        : 1
-Position     : [898.592, 587.811]
-Measurements : [579.844, 176294, 1.89768, 2.30228]
----
-Label        : 1
-Position     : [747.656, 588.128]
-Measurements : [1010.54, 216731, 0.348892, -0.96938]
----
-Label        : 1
-Position     : [851.296, 588.504]
-Measurements : [1151.27, 422687, 0.338834, -1.46978]
----
-Label        : 1
-Position     : [715.921, 588.879]
-Measurements : [701.596, 152342, 1.35382, 0.642622]
----
-Label        : 1
-Position     : [904.458, 589.052]
-Measurements : [1162.55, 285568, -0.31184, -1.37231]
----
-Label        : 1
-Position     : [462.229, 589.187]
-Measurements : [839.65, 121406, 0.483044, -0.0888554]
----
-Label        : 1
-Position     : [233.563, 589.361]
-Measurements : [1622.14, 727175, -0.0163402, -1.34372]
----
-Label        : 1
-Position     : [11.6735, 589.581]
-Measurements : [1086.43, 414430, 0.918486, -0.546414]
----
-Label        : 1
-Position     : [244.748, 589.826]
-Measurements : [1313.36, 449772, 0.537817, -1.04497]
----
-Label        : 1
-Position     : [711.128, 590.216]
-Measurements : [1057.7, 176709, 0.229219, -0.86216]
----
-Label        : 1
-Position     : [749.165, 590.339]
-Measurements : [1017.2, 222417, 0.32214, -1.06224]
----
-Label        : 1
-Position     : [478.928, 590.672]
-Measurements : [1262.51, 320258, 0.0130173, -1.19643]
----
-Label        : 1
-Position     : [902.496, 591.576]
-Measurements : [1277.2, 270413, -0.623602, -0.924674]
----
-Label        : 1
-Position     : [757.32, 591.865]
-Measurements : [843.647, 68779.1, 1.13773, 0.714861]
----
-Label        : 1
-Position     : [461.887, 592.259]
-Measurements : [933.14, 145461, 0.280867, -0.367128]
----
-Label        : 1
-Position     : [463.056, 592.72]
-Measurements : [972.805, 136255, 0.208593, -0.39157]
----
-Label        : 1
-Position     : [854.326, 592.743]
-Measurements : [1046.82, 399715, 0.715332, -1.05331]
----
-Label        : 1
-Position     : [480.773, 593.01]
-Measurements : [1091.26, 361036, 0.615515, -1.08109]
----
-Label        : 1
-Position     : [862.585, 593.05]
-Measurements : [1039.14, 445840, 0.434074, -1.31525]
----
-Label        : 1
-Position     : [482.201, 593.436]
-Measurements : [946.43, 338296, 1.09066, -0.272114]
----
-Label        : 1
-Position     : [237.544, 593.912]
-Measurements : [1775.91, 505416, -0.189363, -0.979268]
----
-Label        : 1
-Position     : [76.7464, 593.912]
-Measurements : [660.127, 151778, 1.05948, -0.202266]
----
-Label        : 1
-Position     : [711.567, 594.355]
-Measurements : [1274.37, 277809, 0.320062, -0.780299]
----
-Label        : 1
-Position     : [72.471, 595.219]
-Measurements : [828.364, 245901, 0.451359, -1.33849]
----
-Label        : 1
-Position     : [754.136, 595.336]
-Measurements : [878.371, 154193, 0.857089, -0.0780638]
----
-Label        : 1
-Position     : [757.393, 596.246]
-Measurements : [981.482, 152651, 0.989848, -0.00492299]
----
-Label        : 1
-Position     : [860.168, 597.073]
-Measurements : [1137.38, 272944, 0.225, -1.17512]
----
-Label        : 1
-Position     : [866.144, 597.208]
-Measurements : [1257.32, 360017, 0.16117, -1.37078]
----
-Label        : 1
-Position     : [647.128, 597.384]
-Measurements : [1561.71, 168324, 0.318716, -1.08179]
----
-Label        : 1
-Position     : [878.693, 597.435]
-Measurements : [550.549, 81253.4, 1.04893, 0.0897637]
----
-Label        : 1
-Position     : [233.886, 597.516]
-Measurements : [1708.33, 525824, 0.250936, -1.02923]
----
-Label        : 1
-Position     : [231.503, 597.681]
-Measurements : [1726.27, 622316, 0.0226395, -1.30381]
----
-Label        : 1
-Position     : [860, 597.72]
-Measurements : [1137.38, 272944, 0.225, -1.17512]
----
-Label        : 1
-Position     : [870.141, 598.328]
-Measurements : [939.392, 446753, 0.893889, -0.854915]
----
-Label        : 1
-Position     : [653.09, 598.483]
-Measurements : [1777.2, 431892, -0.418814, -0.77937]
----
-Label        : 1
-Position     : [74.728, 598.52]
-Measurements : [913.674, 181069, 0.425305, -1.0491]
----
-Label        : 1
-Position     : [402.401, 598.682]
-Measurements : [744.985, 140465, 1.07279, -0.0605856]
----
-Label        : 1
-Position     : [882.528, 598.744]
-Measurements : [582.059, 75458.8, 1.03263, -0.020056]
----
-Label        : 1
-Position     : [650.528, 598.905]
-Measurements : [1828.76, 266579, -0.150144, -0.455498]
----
-Label        : 1
-Position     : [864.829, 599.396]
-Measurements : [1304.75, 320838, 0.0112484, -1.25766]
----
-Label        : 1
-Position     : [643.57, 600.182]
-Measurements : [1354.87, 205802, 0.35983, -0.804705]
----
-Label        : 1
-Position     : [236.008, 600.568]
-Measurements : [1416.61, 340729, 0.36803, -0.68806]
----
-Label        : 1
-Position     : [879.16, 601.397]
-Measurements : [539.633, 67361.4, 1.39999, 1.17747]
----
-Label        : 1
-Position     : [400.08, 601.424]
-Measurements : [928.427, 131395, 0.287644, -1.10852]
----
-Label        : 1
-Position     : [756.696, 601.992]
-Measurements : [965.798, 199167, 0.818095, -0.442147]
----
-Label        : 1
-Position     : [650.2, 602.504]
-Measurements : [1923.79, 198597, 0.00330806, -0.807094]
----
-Label        : 1
-Position     : [757.708, 603.448]
-Measurements : [944.493, 208444, 0.831763, -0.455454]
----
-Label        : 1
-Position     : [956.679, 603.612]
-Measurements : [970.499, 684615, 1.1671, -0.159297]
----
-Label        : 1
-Position     : [401.375, 603.957]
-Measurements : [995.404, 183760, 0.236748, -1.2496]
----
-Label        : 1
-Position     : [461.393, 604.89]
-Measurements : [1021.32, 155816, 0.027004, -1.36898]
----
-Label        : 1
-Position     : [237.863, 604.999]
-Measurements : [1170.57, 213156, 0.0315384, -1.42252]
----
-Label        : 1
-Position     : [459.427, 605.004]
-Measurements : [1051.56, 154372, -0.196236, -1.22849]
----
-Label        : 1
-Position     : [228.235, 605.075]
-Measurements : [941.204, 142612, 0.534915, -0.338781]
----
-Label        : 1
-Position     : [228.844, 605.703]
-Measurements : [941.204, 142612, 0.534915, -0.338781]
----
-Label        : 1
-Position     : [460.496, 606.032]
-Measurements : [1040.11, 157960, -0.139297, -1.28395]
----
-Label        : 1
-Position     : [647.393, 606.296]
-Measurements : [1589.79, 156739, 0.454352, -1.17883]
----
-Label        : 1
-Position     : [952.672, 606.424]
-Measurements : [1622.38, 532442, -0.0479366, -1.22267]
----
-Label        : 0
-Position     : [557.598, 606.698]
-Measurements : [996.762, 12374.8, 1.36408, 1.58708]
----
-Label        : 1
-Position     : [752.5, 606.756]
-Measurements : [644.077, 199924, 1.64222, 1.51838]
----
-Label        : 1
-Position     : [954.957, 607.045]
-Measurements : [1493.77, 706392, 0.0411678, -1.52663]
----
-Label        : 1
-Position     : [402.128, 608.592]
-Measurements : [1131, 191411, -0.0195369, -1.19049]
----
-Label        : 1
-Position     : [625.624, 608.648]
-Measurements : [1661.4, 34736.2, 0.660168, 1.94285]
----
-Label        : 1
-Position     : [687.576, 608.648]
-Measurements : [1257.51, 75274.1, -0.399507, -0.759956]
----
-Label        : 1
-Position     : [231.912, 609.272]
-Measurements : [1164.12, 111774, -0.0561663, -0.94059]
----
-Label        : 1
-Position     : [690.292, 609.977]
-Measurements : [1167.77, 132603, -0.383219, -1.08329]
----
-Label        : 1
-Position     : [400.974, 610.01]
-Measurements : [1307.3, 117289, -0.332864, -0.470128]
----
-Label        : 1
-Position     : [682.408, 610.606]
-Measurements : [1357.08, 104314, 0.429524, 0.249075]
----
-Label        : 1
-Position     : [406.029, 611.106]
-Measurements : [855.939, 211554, 0.773161, -0.739853]
----
-Label        : 1
-Position     : [622.078, 611.881]
-Measurements : [1593.51, 53048.9, -0.411448, 2.05418]
----
-Label        : 1
-Position     : [407.019, 611.953]
-Measurements : [769.182, 192695, 1.10807, -0.0263169]
----
-Label        : 1
-Position     : [627.24, 612.058]
-Measurements : [1469.08, 94869.6, -0.14857, 0.0954542]
----
-Label        : 1
-Position     : [691.021, 612.203]
-Measurements : [1174.15, 157046, 0.0377585, -0.761364]
----
-Label        : 1
-Position     : [618.968, 612.232]
-Measurements : [1518.66, 43584.4, -0.902702, 0.764844]
----
-Label        : 0
-Position     : [553.348, 612.359]
-Measurements : [908.398, 1915.39, -0.588395, 2.46765]
----
-Label        : 1
-Position     : [621.214, 612.44]
-Measurements : [1553.12, 51804.4, -0.32645, 0.803664]
----
-Label        : 1
-Position     : [22.504, 612.856]
-Measurements : [1574.99, 469838, -0.564517, -0.977363]
----
-Label        : 1
-Position     : [677.848, 613.256]
-Measurements : [1339.91, 129476, 0.817102, -0.41253]
----
-Label        : 1
-Position     : [165.443, 614.299]
-Measurements : [914.874, 374348, 1.26298, 0.189669]
----
-Label        : 1
-Position     : [229.864, 614.392]
-Measurements : [1399.63, 94221.3, -0.461732, 0.0481431]
----
-Label        : 1
-Position     : [397.52, 614.736]
-Measurements : [1155.51, 195162, -0.211604, -1.331]
----
-Label        : 1
-Position     : [399.149, 615.156]
-Measurements : [1028.56, 215820, 0.159365, -1.44649]
----
-Label        : 1
-Position     : [160.928, 615.23]
-Measurements : [1209.76, 251965, 0.825494, -0.131135]
----
-Label        : 1
-Position     : [27.0727, 615.61]
-Measurements : [1730.59, 507650, -0.412145, -1.16127]
----
-Label        : 1
-Position     : [162.792, 615.928]
-Measurements : [1132.84, 305035, 0.799962, -0.431372]
----
-Label        : 1
-Position     : [24.9003, 616.489]
-Measurements : [1884.29, 338993, -0.572864, -0.677153]
----
-Label        : 1
-Position     : [620.246, 616.856]
-Measurements : [1399.81, 79414.4, -0.494323, 0.0157049]
----
-Label        : 1
-Position     : [25.064, 617.464]
-Measurements : [1740.64, 474181, -0.301654, -1.28318]
----
-Label        : 1
-Position     : [679.078, 617.517]
-Measurements : [1228.53, 118710, 1.39538, 0.899681]
----
-Label        : 1
-Position     : [763.626, 617.551]
-Measurements : [904.116, 171680, 0.285781, -0.837869]
----
-Label        : 1
-Position     : [449.464, 617.587]
-Measurements : [1007.73, 429732, 0.754016, -0.924057]
----
-Label        : 1
-Position     : [757.66, 617.863]
-Measurements : [715.401, 195274, 0.866902, -0.585923]
----
-Label        : 1
-Position     : [225.465, 618.122]
-Measurements : [1576.52, 140558, -0.51971, 0.515011]
----
-Label        : 0
-Position     : [517.259, 618.376]
-Measurements : [905.346, 10356.9, 1.09423, 6.74397]
----
-Label        : 1
-Position     : [226.963, 619.391]
-Measurements : [1593.66, 122213, -0.346648, -0.566329]
----
-Label        : 1
-Position     : [27.9968, 620.279]
-Measurements : [1347.66, 633807, 0.486464, -1.41245]
----
-Label        : 1
-Position     : [22.8439, 620.437]
-Measurements : [1362.71, 527984, 0.241686, -1.31979]
----
-Label        : 1
-Position     : [227.304, 621.048]
-Measurements : [1500.74, 182489, -0.265723, -1.05499]
----
-Label        : 1
-Position     : [397.74, 621.228]
-Measurements : [1294.33, 608484, 0.435371, -1.35002]
----
-Label        : 1
-Position     : [224.9, 621.331]
-Measurements : [1588.34, 212879, 0.0994024, -0.55914]
----
-Label        : 0
-Position     : [547.315, 621.367]
-Measurements : [858.335, 12813.8, -1.24825, 2.37543]
----
-Label        : 1
-Position     : [630.232, 621.448]
-Measurements : [1653.59, 243765, 0.166521, -0.863138]
----
-Label        : 1
-Position     : [445.648, 621.904]
-Measurements : [1793.47, 249477, -0.341991, -0.941242]
----
-Label        : 1
-Position     : [1005.62, 622.247]
-Measurements : [1290, 558674, 0.089665, -1.45355]
----
-Label        : 1
-Position     : [760.28, 622.472]
-Measurements : [1312.64, 200230, 0.0510056, -1.0254]
----
-Label        : 0
-Position     : [503.897, 622.593]
-Measurements : [1289.92, 77478, 0.527279, -0.703087]
----
-Label        : 1
-Position     : [394.96, 622.928]
-Measurements : [1422.88, 538847, 0.183259, -1.32484]
----
-Label        : 1
-Position     : [438.111, 623.097]
-Measurements : [1093.15, 381161, 0.882787, -0.0819444]
----
-Label        : 1
-Position     : [966.471, 623.478]
-Measurements : [1008.86, 339500, 0.264693, -1.43376]
----
-Label        : 1
-Position     : [1008.55, 623.648]
-Measurements : [1514.1, 375138, -0.128177, -0.92859]
----
-Label        : 1
-Position     : [223.525, 623.759]
-Measurements : [1628.24, 297663, 0.401837, -0.302095]
----
-Label        : 1
-Position     : [393.035, 623.839]
-Measurements : [1374.65, 553140, 0.235271, -1.24485]
----
-Label        : 0
-Position     : [547.771, 624.497]
-Measurements : [838.306, 16471.2, -0.594663, 0.551508]
----
-Label        : 1
-Position     : [634.282, 624.588]
-Measurements : [1429.07, 187364, 0.614137, -0.202062]
----
-Label        : 1
-Position     : [439.392, 624.681]
-Measurements : [1146.97, 307115, 0.7285, -0.0404627]
----
-Label        : 1
-Position     : [1012.4, 624.732]
-Measurements : [1424.75, 329039, 0.62268, -0.974572]
----
-Label        : 1
-Position     : [449.939, 624.807]
-Measurements : [1480.06, 291421, -0.161697, -1.38779]
----
-Label        : 1
-Position     : [225.674, 624.859]
-Measurements : [1495.61, 236804, 0.610501, 0.709149]
----
-Label        : 1
-Position     : [632.719, 625.139]
-Measurements : [1538.43, 244454, 0.493099, -0.61549]
----
-Label        : 1
-Position     : [225.969, 625.226]
-Measurements : [1448.69, 236898, 0.744014, 0.995808]
----
-Label        : 1
-Position     : [78.7339, 625.981]
-Measurements : [1050.8, 606251, 0.572999, -1.08684]
----
-Label        : 1
-Position     : [87.1652, 625.993]
-Measurements : [862.626, 242984, 2.05207, 4.50996]
----
-Label        : 1
-Position     : [83.432, 626.68]
-Measurements : [1136.01, 516264, 0.740574, -0.643966]
----
-Label        : 1
-Position     : [963.496, 626.72]
-Measurements : [1209.7, 261596, 0.0189527, -1.39528]
----
-Label        : 1
-Position     : [635.963, 626.817]
-Measurements : [1394.26, 175477, 0.622809, -0.210303]
----
-Label        : 1
-Position     : [761.875, 626.825]
-Measurements : [1599.66, 226034, -0.28443, -0.746557]
----
-Label        : 1
-Position     : [224.232, 627.192]
-Measurements : [1511.04, 270670, 0.76139, 0.454238]
----
-Label        : 1
-Position     : [966.576, 627.42]
-Measurements : [1038.25, 308571, 0.312293, -1.42961]
----
-Label        : 0
-Position     : [515.403, 628.015]
-Measurements : [879.467, 5137.89, 1.44959, 7.48975]
----
-Label        : 1
-Position     : [442.576, 628.048]
-Measurements : [1210.42, 127373, 0.50762, 0.935571]
----
-Label        : 1
-Position     : [650.696, 628.182]
-Measurements : [1123.87, 49497.6, -0.17434, -0.770055]
----
-Label        : 1
-Position     : [652.76, 628.616]
-Measurements : [1155.73, 53051.8, -0.286533, -0.816427]
----
-Label        : 0
-Position     : [515.568, 628.895]
-Measurements : [879.467, 5137.89, 1.44959, 7.48975]
----
-Label        : 1
-Position     : [759.256, 629.128]
-Measurements : [1422.45, 342307, 0.0222468, -1.29925]
----
-Label        : 1
-Position     : [657.442, 629.734]
-Measurements : [1198.25, 50291.5, -0.26236, -0.802717]
----
-Label        : 1
-Position     : [80.3839, 629.97]
-Measurements : [1577.12, 441700, -0.0447074, -1.22484]
----
-Label        : 1
-Position     : [80.36, 630.264]
-Measurements : [1578.59, 429767, 0.0344501, -1.3347]
----
-Label        : 1
-Position     : [79.8048, 630.576]
-Measurements : [1586.45, 443481, -0.0441499, -1.3246]
----
-Label        : 0
-Position     : [527.556, 630.69]
-Measurements : [838.26, 11052.5, -0.579509, 0.0756377]
----
-Label        : 1
-Position     : [635.352, 631.688]
-Measurements : [1494.18, 177045, 0.113623, -0.553691]
----
-Label        : 1
-Position     : [763.164, 631.767]
-Measurements : [1168.13, 466586, 0.570538, -1.34331]
----
-Label        : 1
-Position     : [18.92, 631.8]
-Measurements : [991.241, 285977, 0.742128, -0.833555]
----
-Label        : 1
-Position     : [220.508, 632.123]
-Measurements : [1796.79, 199863, -0.200005, 0.62394]
----
-Label        : 1
-Position     : [20.5197, 632.497]
-Measurements : [933.061, 287088, 0.961963, -0.518892]
----
-Label        : 1
-Position     : [959.4, 633.376]
-Measurements : [899.198, 208629, 0.690542, -0.496948]
----
-Label        : 1
-Position     : [719.32, 633.736]
-Measurements : [1354.96, 147443, -0.106377, -0.998034]
----
-Label        : 0
-Position     : [527.043, 633.867]
-Measurements : [809.132, 12263.1, -0.249287, -0.605208]
----
-Label        : 1
-Position     : [963.67, 633.894]
-Measurements : [683.155, 178853, 1.46831, 1.35291]
----
-Label        : 1
-Position     : [19.7224, 634.069]
-Measurements : [900.164, 311706, 0.949301, -0.563988]
----
-Label        : 1
-Position     : [718.006, 634.517]
-Measurements : [1284.63, 177830, -0.0829044, -1.11961]
----
-Label        : 0
-Position     : [540.648, 634.618]
-Measurements : [953.967, 12861.9, 0.655317, -0.783391]
----
-Label        : 1
-Position     : [689.461, 635.13]
-Measurements : [962.756, 73066.3, 1.23401, 1.33694]
----
-Label        : 1
-Position     : [636.717, 635.378]
-Measurements : [1767.92, 224343, -0.00251318, -0.939323]
----
-Label        : 1
-Position     : [220.136, 635.896]
-Measurements : [1851.48, 216171, -1.1947, 1.02695]
----
-Label        : 1
-Position     : [638.717, 636.163]
-Measurements : [1830.87, 257753, -0.200122, -1.08728]
----
-Label        : 1
-Position     : [693.72, 636.296]
-Measurements : [1169.43, 154007, 0.853101, -0.184185]
----
-Label        : 1
-Position     : [78.312, 636.408]
-Measurements : [1254.12, 337591, 0.914237, -0.500015]
----
-Label        : 1
-Position     : [716.984, 636.418]
-Measurements : [1056.63, 183055, 0.551762, -0.683357]
----
-Label        : 1
-Position     : [691.927, 636.819]
-Measurements : [1062.01, 102471, 0.95495, -0.0353323]
----
-Label        : 1
-Position     : [79.7674, 636.826]
-Measurements : [1269.06, 357447, 0.850762, -0.718324]
----
-Label        : 1
-Position     : [638.936, 637.832]
-Measurements : [1840.86, 258591, -0.283776, -1.00201]
----
-Label        : 1
-Position     : [658.176, 637.861]
-Measurements : [1511.8, 191555, -0.180277, -1.022]
----
-Label        : 1
-Position     : [955.556, 637.937]
-Measurements : [736.643, 96568.3, 0.53228, -0.945341]
----
-Label        : 1
-Position     : [224.634, 638.018]
-Measurements : [1553.21, 383484, -0.176531, -1.49962]
----
-Label        : 1
-Position     : [660.782, 638.093]
-Measurements : [1584.1, 160129, -0.305115, -0.649177]
----
-Label        : 1
-Position     : [78.7125, 638.388]
-Measurements : [1077.97, 164820, 1.10866, 0.606104]
----
-Label        : 1
-Position     : [661.464, 638.856]
-Measurements : [1571.78, 150928, -0.285468, -0.612174]
----
-Label        : 1
-Position     : [367.348, 639.047]
-Measurements : [969.606, 336796, 0.849322, 0.144531]
----
-Label        : 1
-Position     : [639.406, 639.134]
-Measurements : [1864.95, 246250, -0.0962476, -0.97583]
----
-Label        : 1
-Position     : [215.9, 640.49]
-Measurements : [891.219, 491725, 1.09034, -0.512876]
----
-Label        : 1
-Position     : [217.138, 640.535]
-Measurements : [1124.14, 627990, 0.534546, -1.48007]
----
-Label        : 1
-Position     : [719.32, 641.416]
-Measurements : [1052.48, 162883, 0.627541, -0.31508]
----
-Label        : 1
-Position     : [220.648, 641.528]
-Measurements : [1223.89, 581861, 0.3473, -1.58541]
----
-Label        : 1
-Position     : [371.92, 641.872]
-Measurements : [1371.47, 628345, 0.335862, -1.28753]
----
-Label        : 1
-Position     : [164.925, 642.383]
-Measurements : [997.215, 332672, 0.447158, -1.20729]
----
-Label        : 0
-Position     : [487.669, 643.062]
-Measurements : [872.865, 130906, 0.678553, -0.488235]
----
-Label        : 1
-Position     : [72.68, 643.064]
-Measurements : [1370.61, 174143, 0.412515, -0.152904]
----
-Label        : 1
-Position     : [71.1286, 643.487]
-Measurements : [1363.65, 159548, 0.516921, 0.155043]
----
-Label        : 1
-Position     : [721.987, 643.529]
-Measurements : [1151.98, 186851, 0.602096, -0.273056]
----
-Label        : 0
-Position     : [481.56, 643.934]
-Measurements : [1278.77, 75714.6, 0.499343, -0.533136]
----
-Label        : 1
-Position     : [345.932, 643.965]
-Measurements : [898.039, 109657, 0.293744, -0.800513]
----
-Label        : 0
-Position     : [526.188, 644.129]
-Measurements : [800.554, 7117.08, -1.27835, 1.38297]
----
-Label        : 1
-Position     : [17.5728, 644.171]
-Measurements : [784.825, 151363, 0.590761, -0.902371]
----
-Label        : 1
-Position     : [14.824, 644.6]
-Measurements : [887.17, 130667, 0.193671, -0.962131]
----
-Label        : 1
-Position     : [68.6911, 644.736]
-Measurements : [1438.19, 306986, 0.809448, 0.131956]
----
-Label        : 1
-Position     : [375.677, 646.253]
-Measurements : [1160.14, 710975, 0.786928, -1.10194]
----
-Label        : 1
-Position     : [715.046, 646.263]
-Measurements : [1019.72, 75845.4, 0.954942, 2.73266]
----
-Label        : 1
-Position     : [68.3374, 646.365]
-Measurements : [1720.93, 455144, 0.476677, -0.793437]
----
-Label        : 1
-Position     : [646.903, 646.556]
-Measurements : [2221.57, 434222, -0.264716, -0.912646]
----
-Label        : 1
-Position     : [666.584, 647.048]
-Measurements : [1246.22, 122547, 0.136985, -0.769833]
----
-Label        : 1
-Position     : [767.949, 647.067]
-Measurements : [743.155, 147586, 1.46344, 2.33072]
----
-Label        : 1
-Position     : [167.912, 647.16]
-Measurements : [1545.59, 352033, 0.124075, -0.683738]
----
-Label        : 1
-Position     : [646.616, 647.56]
-Measurements : [2209.56, 442573, -0.202485, -1.07395]
----
-Label        : 1
-Position     : [19.2643, 647.622]
-Measurements : [725.527, 126482, 1.09316, -0.0232116]
----
-Label        : 1
-Position     : [425.173, 647.85]
-Measurements : [1161.71, 463657, 0.197698, -1.6399]
----
-Label        : 1
-Position     : [350.928, 648.528]
-Measurements : [982.83, 225073, 0.652522, -0.376124]
----
-Label        : 1
-Position     : [667.803, 648.61]
-Measurements : [1294.38, 127354, 0.258762, -0.450068]
----
-Label        : 1
-Position     : [348.665, 649.488]
-Measurements : [906.754, 267424, 0.902725, -0.104222]
----
-Label        : 1
-Position     : [646.31, 649.623]
-Measurements : [2089.38, 509254, 0.0794223, -1.32463]
----
-Label        : 1
-Position     : [666.352, 649.786]
-Measurements : [1253.58, 111373, 0.299511, -0.699559]
----
-Label        : 1
-Position     : [428.24, 650.576]
-Measurements : [1481.36, 351115, -0.356533, -1.06592]
----
-Label        : 1
-Position     : [166.567, 650.653]
-Measurements : [1549.69, 340416, -0.105348, -0.760685]
----
-Label        : 1
-Position     : [71.656, 650.744]
-Measurements : [1988.6, 427646, 0.196713, -1.2895]
----
-Label        : 1
-Position     : [69.8398, 650.968]
-Measurements : [1962.14, 468000, 0.119201, -1.24634]
----
-Label        : 1
-Position     : [764.888, 651.144]
-Measurements : [1163.79, 318225, 0.551722, -0.860368]
----
-Label        : 1
-Position     : [424.362, 652.544]
-Measurements : [1749.67, 347800, -0.614633, -0.673145]
----
-Label        : 1
-Position     : [760.961, 652.765]
-Measurements : [1084.96, 348471, 0.60671, -0.862569]
----
-Label        : 1
-Position     : [337.464, 653.225]
-Measurements : [1154.71, 184391, -0.160176, -0.523177]
----
-Label        : 1
-Position     : [968.483, 654.121]
-Measurements : [761.38, 227911, 0.923138, -0.448279]
----
-Label        : 1
-Position     : [726.114, 654.151]
-Measurements : [1745.4, 689909, 0.0751936, -1.6574]
----
-Label        : 1
-Position     : [336.08, 654.16]
-Measurements : [1144.03, 180941, -0.409782, -0.920301]
----
-Label        : 1
-Position     : [1017.77, 654.368]
-Measurements : [1214.95, 241826, -0.380885, -0.958212]
----
-Label        : 1
-Position     : [335.701, 654.57]
-Measurements : [1115.77, 188132, -0.314346, -1.09653]
----
-Label        : 1
-Position     : [162.28, 654.84]
-Measurements : [1295.62, 216478, 0.161164, -1.08242]
----
-Label        : 1
-Position     : [665.715, 654.854]
-Measurements : [1262.22, 90788.8, 0.0866523, -0.832344]
----
-Label        : 1
-Position     : [1020.47, 654.876]
-Measurements : [1352.78, 96442.4, 0.458003, -0.821514]
----
-Label        : 1
-Position     : [651.771, 655.597]
-Measurements : [1336.6, 52841.8, -0.173577, -0.896528]
----
-Label        : 1
-Position     : [722.657, 655.597]
-Measurements : [1649.8, 515605, 0.0252072, -1.561]
----
-Label        : 1
-Position     : [70.3483, 655.777]
-Measurements : [1849.38, 489910, 0.204139, -0.945411]
----
-Label        : 1
-Position     : [645.958, 655.794]
-Measurements : [1404.18, 94598.8, 1.04068, 1.87631]
----
-Label        : 0
-Position     : [538.063, 656.278]
-Measurements : [877.367, 68801.9, 1.44427, 3.37491]
----
-Label        : 0
-Position     : [556.593, 656.368]
-Measurements : [795.135, 39279.8, 1.82693, 7.55009]
----
-Label        : 1
-Position     : [1021.26, 656.547]
-Measurements : [1240.64, 137130, 0.375484, -0.4541]
----
-Label        : 1
-Position     : [961.58, 657.077]
-Measurements : [921.766, 190029, 0.170197, -1.06815]
----
-Label        : 1
-Position     : [766.413, 657.165]
-Measurements : [1197.69, 410140, 0.437892, -1.31718]
----
-Label        : 1
-Position     : [665.048, 657.288]
-Measurements : [1204.65, 67675.6, 0.879421, -0.115793]
----
-Label        : 1
-Position     : [422.608, 657.744]
-Measurements : [1596.29, 549647, -0.345803, -1.2793]
----
-Label        : 1
-Position     : [162.151, 657.783]
-Measurements : [1068.91, 340271, 0.452176, -1.23948]
----
-Label        : 1
-Position     : [649.176, 657.8]
-Measurements : [1294.57, 60500.7, -0.229286, -1.02879]
----
-Label        : 1
-Position     : [769.496, 657.8]
-Measurements : [1112.1, 356364, 0.716973, -1.06177]
----
-Label        : 1
-Position     : [72.168, 657.912]
-Measurements : [1648.33, 355796, 0.463576, -0.237449]
----
-Label        : 1
-Position     : [965.032, 657.952]
-Measurements : [922.708, 217739, 0.337217, -1.14451]
----
-Label        : 0
-Position     : [483.084, 658.044]
-Measurements : [854.813, 3977.18, -0.266403, -0.294176]
----
-Label        : 1
-Position     : [327.57, 658.195]
-Measurements : [837.054, 108616, 0.42112, -0.807673]
----
-Label        : 1
-Position     : [764.587, 658.316]
-Measurements : [1001.37, 406383, 0.71888, -1.00224]
----
-Label        : 1
-Position     : [422.673, 658.76]
-Measurements : [1481.02, 644628, -0.112398, -1.5576]
----
-Label        : 1
-Position     : [724.952, 658.824]
-Measurements : [2079.1, 431633, -0.646768, -0.357068]
----
-Label        : 1
-Position     : [167.184, 659.083]
-Measurements : [627.541, 154888, 1.80979, 2.8991]
----
-Label        : 1
-Position     : [205.567, 659.474]
-Measurements : [651.925, 146220, 1.19523, 0.194839]
----
-Label        : 0
-Position     : [518.574, 660.945]
-Measurements : [783.345, 17212.2, -0.228475, -1.30841]
----
-Label        : 1
-Position     : [72.7293, 661.025]
-Measurements : [1441.44, 331111, 0.107511, -1.00881]
----
-Label        : 1
-Position     : [421.074, 661.214]
-Measurements : [957.763, 588225, 1.00047, -0.617813]
----
-Label        : 1
-Position     : [668.466, 661.664]
-Measurements : [1138.64, 63929.5, 1.33893, 0.921879]
----
-Label        : 0
-Position     : [537.113, 661.682]
-Measurements : [790.204, 19786, -0.135555, 0.571849]
----
-Label        : 1
-Position     : [325.84, 662.352]
-Measurements : [985.124, 93874.5, -0.279558, -0.827325]
----
-Label        : 0
-Position     : [536.07, 662.384]
-Measurements : [797.187, 14836.7, -0.85645, 0.644137]
----
-Label        : 1
-Position     : [209.384, 663.032]
-Measurements : [772.789, 133137, 0.821945, -0.533571]
----
-Label        : 1
-Position     : [213.506, 663.095]
-Measurements : [689.269, 115301, 1.32993, 0.721288]
----
-Label        : 1
-Position     : [73.192, 664.056]
-Measurements : [1245.63, 312267, 0.50745, -0.608178]
----
-Label        : 1
-Position     : [655.963, 664.085]
-Measurements : [1458.53, 143172, 0.548294, 0.220907]
----
-Label        : 1
-Position     : [77.8493, 665.478]
-Measurements : [1116.62, 214089, 1.50817, 1.70207]
----
-Label        : 1
-Position     : [621.528, 665.992]
-Measurements : [1799.15, 149477, 0.423776, -0.610854]
----
-Label        : 1
-Position     : [651.224, 666.504]
-Measurements : [1556.11, 163002, 0.247162, -0.496522]
----
-Label        : 1
-Position     : [618.79, 666.802]
-Measurements : [1766.73, 195275, 0.604378, -0.214534]
----
-Label        : 1
-Position     : [321.858, 666.888]
-Measurements : [655.148, 144978, 0.794163, -0.989915]
----
-Label        : 1
-Position     : [1016.38, 667.902]
-Measurements : [1286.93, 587223, 0.282382, -1.19698]
----
-Label        : 1
-Position     : [410.125, 668.006]
-Measurements : [1083.49, 320184, 0.43898, -1.02464]
----
-Label        : 1
-Position     : [77.7727, 668.073]
-Measurements : [1009.71, 241215, 1.43994, 1.92425]
----
-Label        : 1
-Position     : [653.23, 668.291]
-Measurements : [1681.02, 206143, 0.176655, -0.784201]
----
-Label        : 0
-Position     : [515.781, 668.499]
-Measurements : [883.445, 8828.79, -0.8104, -0.0532019]
----
-Label        : 1
-Position     : [616.685, 668.705]
-Measurements : [1728.95, 215951, 0.392863, -0.847413]
----
-Label        : 1
-Position     : [968.773, 669.793]
-Measurements : [934.552, 257789, 0.524287, -1.14392]
----
-Label        : 1
-Position     : [1013.61, 670.298]
-Measurements : [1234.39, 684096, 0.306861, -1.45858]
----
-Label        : 0
-Position     : [588.996, 670.617]
-Measurements : [1422.8, 29963.7, 2.69111, 11.7876]
----
-Label        : 1
-Position     : [973.736, 670.752]
-Measurements : [1520.1, 278319, -0.516057, -0.285793]
----
-Label        : 0
-Position     : [579.748, 671.414]
-Measurements : [1431.96, 106078, 2.46061, 6.13458]
----
-Label        : 1
-Position     : [972.275, 671.734]
-Measurements : [1490.81, 277405, -0.266265, -0.31192]
----
-Label        : 0
-Position     : [547.265, 672.059]
-Measurements : [778.818, 37190.3, -0.0268415, -0.167969]
----
-Label        : 1
-Position     : [655.444, 672.47]
-Measurements : [1908.63, 351348, -0.181535, -1.13199]
----
-Label        : 1
-Position     : [622.04, 672.648]
-Measurements : [2141.65, 148466, 0.248506, -0.988989]
----
-Label        : 1
-Position     : [413.272, 672.656]
-Measurements : [1135.69, 307467, 0.510597, -0.642238]
----
-Label        : 1
-Position     : [1018.28, 672.8]
-Measurements : [1856.35, 259595, 0.156641, -1.14678]
----
-Label        : 1
-Position     : [620.299, 673.163]
-Measurements : [2093.52, 175901, 0.0830093, -0.786095]
----
-Label        : 1
-Position     : [622.065, 673.247]
-Measurements : [2112.96, 147719, 0.390355, -0.875959]
----
-Label        : 1
-Position     : [688.381, 673.909]
-Measurements : [1205.05, 119376, 0.00799213, -1.24933]
----
-Label        : 0
-Position     : [534.536, 674.111]
-Measurements : [919.752, 4337.91, 0.87782, 2.11114]
----
-Label        : 0
-Position     : [527.383, 674.5]
-Measurements : [1096.82, 117395, 1.82919, 2.56327]
----
-Label        : 1
-Position     : [653.784, 675.208]
-Measurements : [1890.34, 311800, 0.0807829, -1.1148]
----
-Label        : 1
-Position     : [690.648, 675.208]
-Measurements : [1286.24, 100594, -0.176539, -0.686918]
----
-Label        : 1
-Position     : [693.533, 675.27]
-Measurements : [1304.31, 78387.3, 0.229361, -0.822617]
----
-Label        : 1
-Position     : [975.774, 675.582]
-Measurements : [1929.67, 134623, 0.0651155, -0.819899]
----
-Label        : 0
-Position     : [515.307, 675.665]
-Measurements : [943.436, 54382.4, 2.37623, 6.52189]
----
-Label        : 1
-Position     : [407.64, 675.728]
-Measurements : [1320.52, 304427, 0.147623, -1.17011]
----
-Label        : 1
-Position     : [622.12, 675.976]
-Measurements : [2115.05, 146358, 0.425116, -0.960373]
----
-Label        : 0
-Position     : [534.066, 676.051]
-Measurements : [936.045, 5261.81, 0.805183, 1.68575]
----
-Label        : 1
-Position     : [406.791, 676.117]
-Measurements : [1314.99, 364777, 0.149226, -1.20072]
----
-Label        : 0
-Position     : [517.311, 676.278]
-Measurements : [1079.21, 166704, 1.74736, 2.69667]
----
-Label        : 1
-Position     : [649.626, 676.426]
-Measurements : [1551.55, 277559, 0.683601, -0.796943]
----
-Label        : 1
-Position     : [416.29, 677.167]
-Measurements : [950.588, 113002, 0.397363, -0.430585]
----
-Label        : 1
-Position     : [977.832, 677.408]
-Measurements : [2012.3, 168949, 0.0242875, -0.752349]
----
-Label        : 1
-Position     : [405.518, 677.462]
-Measurements : [1348.23, 425943, 0.170571, -1.16512]
----
-Label        : 1
-Position     : [621.528, 678.792]
-Measurements : [1901.38, 149894, 0.692104, -0.182475]
----
-Label        : 0
-Position     : [574.408, 679.108]
-Measurements : [1168.51, 40995.7, -0.122898, -0.763841]
----
-Label        : 0
-Position     : [576.008, 679.187]
-Measurements : [1225.92, 27986.3, 0.01316, -1.15928]
----
-Label        : 1
-Position     : [616.812, 679.71]
-Measurements : [1531.25, 168993, 1.15595, 0.159621]
----
-Label        : 1
-Position     : [407.84, 680.184]
-Measurements : [1199.85, 485625, 0.779406, -0.83389]
----
-Label        : 1
-Position     : [982.286, 680.676]
-Measurements : [1718.36, 187728, -0.105281, -0.680188]
----
-Label        : 0
-Position     : [487.025, 680.714]
-Measurements : [906.276, 4556.15, -0.882028, 0.577918]
----
-Label        : 1
-Position     : [650.951, 680.747]
-Measurements : [1500.31, 229516, 1.0241, 0.26796]
----
-Label        : 1
-Position     : [402.038, 680.978]
-Measurements : [1215.16, 449075, 0.66182, -0.729854]
----
-Label        : 1
-Position     : [978.217, 681.305]
-Measurements : [1859.57, 134594, 0.480071, -0.713095]
----
-Label        : 1
-Position     : [402.52, 681.36]
-Measurements : [1196.93, 425444, 0.760612, -0.485687]
----
-Label        : 1
-Position     : [725.531, 681.621]
-Measurements : [1202.61, 67219.6, -0.122566, -0.647671]
----
-Label        : 1
-Position     : [658.167, 682.413]
-Measurements : [1695.73, 147622, 0.607021, -0.154088]
----
-Label        : 1
-Position     : [980.904, 682.528]
-Measurements : [1767.16, 144774, -0.0258514, -0.405201]
----
-Label        : 1
-Position     : [390.15, 684.46]
-Measurements : [1117.16, 507760, 0.367595, -1.535]
----
-Label        : 1
-Position     : [737.24, 684.936]
-Measurements : [1320.38, 42841.3, -0.2018, -0.224263]
----
-Label        : 1
-Position     : [387.16, 684.944]
-Measurements : [1321.3, 447000, -0.0174756, -1.54706]
----
-Label        : 1
-Position     : [736.083, 685.06]
-Measurements : [1356.46, 37994.9, -0.310419, -0.145552]
----
-Label        : 1
-Position     : [739.274, 685.082]
-Measurements : [1299.13, 47068.5, -0.184465, -0.579972]
----
-Label        : 1
-Position     : [654.296, 685.448]
-Measurements : [1673.69, 194879, 0.246342, -0.327918]
----
-Label        : 1
-Position     : [55.272, 685.536]
-Measurements : [838.736, 170550, 0.679353, -0.423567]
----
-Label        : 1
-Position     : [49.5741, 685.626]
-Measurements : [901.655, 111832, 0.557721, 0.103901]
----
-Label        : 1
-Position     : [56.8424, 685.661]
-Measurements : [807.758, 161795, 0.781385, -0.132215]
----
-Label        : 0
-Position     : [548.86, 685.866]
-Measurements : [980.933, 42147.1, 1.13393, 3.13981]
----
-Label        : 1
-Position     : [49.64, 686.048]
-Measurements : [928.037, 101081, 0.61425, 0.203384]
----
-Label        : 0
-Position     : [485.44, 686.102]
-Measurements : [887.81, 19268.9, 0.995044, 2.67467]
----
-Label        : 0
-Position     : [543.41, 686.241]
-Measurements : [1041.13, 52347.5, 1.95783, 4.51984]
----
-Label        : 0
-Position     : [524.397, 686.464]
-Measurements : [1162.19, 101653, 2.18648, 6.96006]
----
-Label        : 1
-Position     : [682.968, 686.472]
-Measurements : [1222.65, 98592.7, 0.160611, -0.661722]
----
-Label        : 1
-Position     : [727, 686.472]
-Measurements : [1356.1, 57905.2, -0.57116, -0.0947079]
----
-Label        : 1
-Position     : [978.983, 686.91]
-Measurements : [1613.2, 163208, -0.22867, 0.642146]
----
-Label        : 1
-Position     : [713.863, 687.646]
-Measurements : [1451.33, 140160, 0.00523052, -1.12502]
----
-Label        : 1
-Position     : [206.972, 687.695]
-Measurements : [983.275, 355616, 0.789767, -0.482866]
----
-Label        : 1
-Position     : [206.566, 687.709]
-Measurements : [983.275, 355616, 0.789767, -0.482866]
----
-Label        : 1
-Position     : [723.544, 687.898]
-Measurements : [1297.93, 69015.3, 0.276871, -0.616712]
----
-Label        : 1
-Position     : [686.711, 688.307]
-Measurements : [1377.23, 77359.3, 0.895343, 1.77447]
----
-Label        : 0
-Position     : [571.043, 688.738]
-Measurements : [901.792, 4547.6, -0.731337, 1.4039]
----
-Label        : 1
-Position     : [719.579, 688.845]
-Measurements : [1393.49, 144740, 0.696712, -0.663996]
----
-Label        : 1
-Position     : [164.969, 688.965]
-Measurements : [715.536, 325148, 1.52069, 0.96285]
----
-Label        : 1
-Position     : [715.736, 689.032]
-Measurements : [1542.32, 151163, 0.153088, -0.905249]
----
-Label        : 1
-Position     : [54.8825, 689.621]
-Measurements : [1011.74, 114194, 0.406325, -0.163878]
----
-Label        : 1
-Position     : [391.765, 689.631]
-Measurements : [1081.16, 376163, 0.707204, -0.953504]
----
-Label        : 0
-Position     : [551.418, 689.811]
-Measurements : [884.593, 30976, 1.06188, 3.67884]
----
-Label        : 1
-Position     : [708.545, 690.159]
-Measurements : [1726.49, 235613, 0.0238457, -1.00875]
----
-Label        : 1
-Position     : [983.464, 690.208]
-Measurements : [1331.81, 367534, -0.0399181, -1.23515]
----
-Label        : 1
-Position     : [47.6013, 690.502]
-Measurements : [856.738, 146734, 0.692348, -0.287713]
----
-Label        : 1
-Position     : [703.96, 690.568]
-Measurements : [1779.34, 256063, -0.276257, -1.10143]
----
-Label        : 0
-Position     : [477.421, 690.616]
-Measurements : [798.826, 8898.81, 0.203135, 0.557101]
----
-Label        : 0
-Position     : [490.179, 690.819]
-Measurements : [989.34, 15028.7, 0.0997386, 1.83382]
----
-Label        : 0
-Position     : [524.779, 690.85]
-Measurements : [1113.43, 104904, 2.49195, 7.80539]
----
-Label        : 1
-Position     : [206.824, 691.168]
-Measurements : [1355.14, 281065, 0.155999, -0.747438]
----
-Label        : 1
-Position     : [685.015, 691.303]
-Measurements : [1412.51, 70869.9, 0.99385, 1.72712]
----
-Label        : 0
-Position     : [469.71, 691.368]
-Measurements : [856.655, 9324.99, -1.14346, 0.142251]
----
-Label        : 0
-Position     : [505.637, 691.796]
-Measurements : [1017.56, 93842.1, 3.18601, 10.3167]
----
-Label        : 0
-Position     : [448.147, 691.965]
-Measurements : [1044.07, 17306.6, 0.694973, -0.20513]
----
-Label        : 1
-Position     : [701.035, 692.544]
-Measurements : [1724.98, 298547, -0.054249, -1.47061]
----
-Label        : 1
-Position     : [630.264, 693.2]
-Measurements : [1801.23, 94509.7, 0.18025, -0.41504]
----
-Label        : 1
-Position     : [163.816, 693.216]
-Measurements : [1430.95, 600693, 0.0389097, -1.39027]
----
-Label        : 1
-Position     : [983.618, 693.519]
-Measurements : [1098.45, 345384, 0.535119, -0.963905]
----
-Label        : 0
-Position     : [503.696, 693.567]
-Measurements : [956.55, 54666.3, 3.53276, 13.4114]
----
-Label        : 1
-Position     : [982.624, 693.645]
-Measurements : [1145.16, 334227, 0.389084, -1.02992]
----
-Label        : 1
-Position     : [47.3356, 693.752]
-Measurements : [886.538, 138820, 0.746525, -0.023753]
----
-Label        : 1
-Position     : [46.8316, 693.921]
-Measurements : [861.162, 136460, 0.719406, -0.0108743]
----
-Label        : 1
-Position     : [165.907, 695.516]
-Measurements : [1514.23, 699505, 0.108439, -1.49279]
----
-Label        : 1
-Position     : [30.5928, 696.046]
-Measurements : [812.548, 105313, 0.29701, -1.10928]
----
-Label        : 1
-Position     : [42.984, 696.288]
-Measurements : [720.49, 107204, 1.23598, 1.21211]
----
-Label        : 1
-Position     : [633.507, 696.501]
-Measurements : [1730.11, 73242.4, 1.22178, 0.729323]
----
-Label        : 1
-Position     : [211.513, 696.641]
-Measurements : [1484.06, 184561, -0.0754644, -1.38894]
----
-Label        : 0
-Position     : [440.551, 697.159]
-Measurements : [1089.97, 25064.2, 0.78966, -0.1101]
----
-Label        : 1
-Position     : [299.608, 697.232]
-Measurements : [794.254, 213956, 1.26757, 0.359448]
----
-Label        : 0
-Position     : [490.757, 697.281]
-Measurements : [1123.08, 113316, 1.94013, 3.9328]
----
-Label        : 1
-Position     : [30.696, 697.312]
-Measurements : [855.093, 101910, 0.396883, -0.694619]
----
-Label        : 1
-Position     : [364.632, 697.744]
-Measurements : [989.14, 197569, 0.23462, -1.34218]
----
-Label        : 1
-Position     : [634.847, 697.976]
-Measurements : [1628.92, 74376.4, 0.984118, 1.91579]
----
-Label        : 1
-Position     : [161.256, 698.336]
-Measurements : [2052.31, 332781, -0.612827, -0.186191]
----
-Label        : 1
-Position     : [164.181, 698.869]
-Measurements : [1811.12, 580326, -0.282066, -1.27242]
----
-Label        : 1
-Position     : [158.924, 698.901]
-Measurements : [2032.69, 246344, -0.385655, 0.209423]
----
-Label        : 1
-Position     : [299.17, 698.99]
-Measurements : [837.191, 227512, 1.06925, -0.197763]
----
-Label        : 1
-Position     : [164.612, 699.103]
-Measurements : [1729.77, 648245, -0.137421, -1.44267]
----
-Label        : 0
-Position     : [488.985, 699.288]
-Measurements : [1108.09, 122490, 1.81843, 3.34549]
----
-Label        : 1
-Position     : [367.681, 699.56]
-Measurements : [987.821, 191059, 0.243993, -1.24114]
----
-Label        : 1
-Position     : [205.788, 699.67]
-Measurements : [1275.03, 447995, 0.21942, -1.51897]
----
-Label        : 1
-Position     : [209.384, 699.872]
-Measurements : [1357.6, 398827, -0.00553489, -1.47772]
----
-Label        : 1
-Position     : [349.034, 700.386]
-Measurements : [708.733, 135316, 0.638928, -1.19979]
----
-Label        : 1
-Position     : [981.928, 700.448]
-Measurements : [949.902, 103593, 0.402101, 0.0802957]
----
-Label        : 1
-Position     : [979.481, 700.679]
-Measurements : [995.192, 101721, 0.236388, -0.0629493]
----
-Label        : 1
-Position     : [360.412, 700.9]
-Measurements : [853.195, 166116, 0.566104, -0.899401]
----
-Label        : 1
-Position     : [353.368, 701.328]
-Measurements : [819.785, 124189, 0.12974, -1.48596]
----
-Label        : 1
-Position     : [300.57, 701.388]
-Measurements : [1008.2, 441653, 0.94759, -0.383009]
----
-Label        : 1
-Position     : [154.947, 701.613]
-Measurements : [1868.02, 288631, -0.285888, -0.699148]
----
-Label        : 1
-Position     : [32.7158, 701.613]
-Measurements : [815.192, 74028.6, 0.59833, -0.330883]
----
-Label        : 0
-Position     : [498.827, 701.643]
-Measurements : [868.608, 8156.59, 0.150489, -0.898373]
----
-Label        : 1
-Position     : [24.5461, 701.854]
-Measurements : [1030.43, 225769, 0.325376, -1.01796]
----
-Label        : 0
-Position     : [574.13, 702.349]
-Measurements : [905.362, 28444.8, 3.08757, 9.50173]
----
-Label        : 1
-Position     : [25.576, 703.456]
-Measurements : [1099.73, 182046, 0.412705, -0.961149]
----
-Label        : 1
-Position     : [155.112, 703.456]
-Measurements : [1785.8, 404679, -0.276363, -0.775961]
----
-Label        : 1
-Position     : [978.969, 703.885]
-Measurements : [1095.63, 44329.1, 0.997515, 2.32127]
----
-Label        : 1
-Position     : [299.717, 704.649]
-Measurements : [1367.15, 628364, 0.342345, -1.0069]
----
-Label        : 0
-Position     : [520.946, 705.086]
-Measurements : [871.161, 8660.73, -0.560863, 0.205994]
----
-Label        : 0
-Position     : [519.869, 705.272]
-Measurements : [873.83, 8245.93, -0.699065, 0.38047]
----
-Label        : 1
-Position     : [150.78, 705.75]
-Measurements : [1483.63, 272587, 0.280781, -0.730247]
----
-Label        : 1
-Position     : [299.096, 705.936]
-Measurements : [1483.34, 557034, 0.114789, -0.854361]
----
-Label        : 1
-Position     : [350.728, 706.152]
-Measurements : [500.694, 68732.8, 2.36473, 4.51725]
----
-Label        : 1
-Position     : [21.8929, 706.172]
-Measurements : [808.934, 280206, 0.923856, -0.651785]
----
-Label        : 0
-Position     : [546.041, 707.56]
-Measurements : [927.314, 878.759, 0.900077, 0.942395]
----
-Label        : 0
-Position     : [542.421, 708.379]
-Measurements : [955.462, 8109.82, 3.30465, 15.8433]
----
-Label        : 1
-Position     : [153.064, 710.112]
-Measurements : [1490.61, 162933, -0.374763, -0.439229]
----
-Label        : 1
-Position     : [157.228, 710.235]
-Measurements : [1216.04, 314988, 0.162348, -1.26141]
----
-Label        : 1
-Position     : [302.798, 710.389]
-Measurements : [1823.33, 579270, -0.287856, -0.998621]
----
-Label        : 1
-Position     : [294.963, 710.607]
-Measurements : [1455.99, 239799, -0.230773, -0.575386]
----
-Label        : 0
-Position     : [536.318, 710.642]
-Measurements : [1029.55, 50313.8, 1.05986, 2.76013]
----
-Label        : 0
-Position     : [533.06, 710.674]
-Measurements : [1010.07, 54411.4, 1.10119, 2.35511]
----
-Label        : 0
-Position     : [546.055, 711.866]
-Measurements : [912.763, 631.624, 0.515326, 0.425384]
----
-Label        : 0
-Position     : [510.557, 712.676]
-Measurements : [951.179, 9523.27, 0.350709, 1.27443]
----
-Label        : 1
-Position     : [297.56, 713.104]
-Measurements : [1457.39, 438392, -0.0212596, -1.09904]
----
-Label        : 1
-Position     : [18.916, 714.461]
-Measurements : [876.194, 266915, 0.718832, -1.08181]
----
-Label        : 1
-Position     : [14.7209, 715.368]
-Measurements : [1370.26, 497980, 0.5686, -0.134113]
----
-Label        : 0
-Position     : [452.911, 715.449]
-Measurements : [1007.5, 3226.47, -0.743682, 6.73847]
----
-Label        : 1
-Position     : [149.48, 715.744]
-Measurements : [1520.04, 119428, 0.040345, -1.16042]
----
-Label        : 1
-Position     : [148.225, 715.854]
-Measurements : [1474.07, 113152, 0.106992, -1.10525]
----
-Label        : 0
-Position     : [463.798, 716.417]
-Measurements : [917.118, 6401.58, -2.20401, 5.22719]
----
-Label        : 1
-Position     : [300.191, 716.606]
-Measurements : [1025.55, 487672, 1.02716, -0.499084]
----
-Label        : 1
-Position     : [16.872, 717.28]
-Measurements : [1305.97, 363071, 0.378194, -0.247805]
----
-Label        : 0
-Position     : [479.692, 717.48]
-Measurements : [887.859, 3070.38, 0.126614, -0.179796]
----
-Label        : 1
-Position     : [144.227, 717.49]
-Measurements : [1216.61, 99596, -0.1486, 0.192024]
----
-Label        : 1
-Position     : [14.807, 717.57]
-Measurements : [1564.15, 447249, 0.4224, -0.257984]
----
-Label        : 0
-Position     : [398.984, 718.227]
-Measurements : [1079.88, 9404.83, -0.785823, 3.18214]
----
-Label        : 0
-Position     : [435.373, 718.349]
-Measurements : [946.567, 4530.59, 0.241578, 0.757157]
----
-Label        : 0
-Position     : [479.643, 718.359]
-Measurements : [888.926, 3277.37, 0.109919, -0.451952]
----
-Label        : 1
-Position     : [150.555, 719.225]
-Measurements : [1350.55, 203038, -0.398947, -0.835851]
----
-Label        : 1
-Position     : [143.848, 719.84]
-Measurements : [1126.2, 105042, -0.601984, -0.0887272]
----
-Label        : 1
-Position     : [149.746, 720.238]
-Measurements : [1288.84, 217938, -0.18522, -1.0689]
----
-Label        : 0
-Position     : [483.335, 720.341]
-Measurements : [864.603, 4307.41, 0.452438, -0.605493]
----
-Label        : 1
-Position     : [10.728, 720.352]
-Measurements : [1959.16, 289383, 0.202743, -0.765113]
----
-Label        : 1
-Position     : [6.76788, 720.422]
-Measurements : [1990.33, 305216, -0.220494, -0.268993]
----
-Label        : 0
-Position     : [426.593, 720.486]
-Measurements : [902.532, 3949.37, 0.506826, 2.43821]
----
-Label        : 0
-Position     : [516.346, 721.2]
-Measurements : [919.769, 1646.43, -4.1801, 19.9773]
----
-Label        : 0
-Position     : [407.554, 722.727]
-Measurements : [1074.67, 14572.7, 0.539467, 0.894414]
----
-Label        : 0
-Position     : [396.521, 722.912]
-Measurements : [1089.46, 18536.5, 1.01886, 5.31848]
----
-Label        : 1
-Position     : [301.133, 723.324]
-Measurements : [1082.89, 452901, 0.630436, -1.28609]
----
-Label        : 1
-Position     : [208.593, 723.495]
-Measurements : [792.26, 264020, 1.46991, 1.21366]
----
-Label        : 0
-Position     : [400.205, 723.766]
-Measurements : [1081.19, 16669.1, 0.725756, 4.98747]
----
-Label        : 0
-Position     : [539.691, 723.831]
-Measurements : [883.911, 3124.93, -0.836513, 1.71221]
----
-Label        : 1
-Position     : [343.64, 724.368]
-Measurements : [1363.48, 319999, 0.0557857, -0.395136]
----
-Label        : 0
-Position     : [554.138, 725.039]
-Measurements : [837.309, 7230.07, -1.25863, 1.34441]
----
-Label        : 0
-Position     : [466.075, 725.567]
-Measurements : [877.945, 9238.56, -0.168896, 1.45514]
----
-Label        : 1
-Position     : [296.536, 725.904]
-Measurements : [1303.35, 326101, 0.119228, -1.40762]
----
-Label        : 1
-Position     : [340.171, 725.939]
-Measurements : [1436.62, 265703, 0.131347, -0.25]
----
-Label        : 1
-Position     : [205.288, 726.496]
-Measurements : [1142.84, 346413, 0.331069, -1.15071]
----
-Label        : 1
-Position     : [340.615, 726.943]
-Measurements : [1450.16, 258917, 0.131909, -0.263018]
----
-Label        : 1
-Position     : [200.867, 727.247]
-Measurements : [1373.48, 291841, 0.0125284, -0.975884]
----
-Label        : 0
-Position     : [581.972, 727.627]
-Measurements : [923.717, 56879, 2.01018, 4.93828]
----
-Label        : 1
-Position     : [339.315, 727.777]
-Measurements : [1387.39, 306196, 0.0890325, -0.480073]
----
-Label        : 0
-Position     : [402.263, 727.829]
-Measurements : [1049.48, 22114.9, 0.479931, 0.00627351]
----
-Label        : 0
-Position     : [472.937, 727.956]
-Measurements : [887.559, 14798.6, 1.63847, 4.70775]
----
-Label        : 0
-Position     : [567.791, 728.593]
-Measurements : [821.142, 12877.4, -0.094109, 0.473949]
----
-Label        : 0
-Position     : [610.329, 728.81]
-Measurements : [1068.94, 9102.36, 0.0778781, -0.422164]
----
-Label        : 1
-Position     : [131.786, 730.118]
-Measurements : [645.702, 136877, 1.89997, 2.78578]
----
-Label        : 1
-Position     : [296.239, 730.356]
-Measurements : [933.382, 413438, 0.865803, -0.800469]
----
-Label        : 0
-Position     : [404.326, 730.402]
-Measurements : [987.636, 11928.6, 1.2798, 1.84055]
----
-Label        : 1
-Position     : [125.004, 731.019]
-Measurements : [948.202, 145777, 1.04496, 0.252978]
----
-Label        : 1
-Position     : [339.032, 732.56]
-Measurements : [1107.89, 243406, -0.151434, -1.39355]
----
-Label        : 1
-Position     : [126.952, 733.152]
-Measurements : [932.05, 182010, 0.897258, -0.44654]
----
-Label        : 0
-Position     : [441.692, 733.191]
-Measurements : [917.017, 7418.56, -1.11122, 1.63796]
----
-Label        : 1
-Position     : [340.749, 733.652]
-Measurements : [1075.76, 262199, -0.110577, -1.50152]
----
-Label        : 1
-Position     : [200.13, 734.259]
-Measurements : [1648.39, 145918, -0.613778, -0.147282]
----
-Label        : 1
-Position     : [202.216, 734.688]
-Measurements : [1646.15, 127933, -0.421052, -0.373464]
----
-Label        : 0
-Position     : [449.489, 735.474]
-Measurements : [785.06, 7171.23, 1.24803, 1.18435]
----
-Label        : 0
-Position     : [404.214, 736.317]
-Measurements : [934.788, 2440.22, 0.395013, 2.19353]
----
-Label        : 1
-Position     : [197.596, 736.869]
-Measurements : [1530.75, 371290, -0.359357, -0.891723]
----
-Label        : 1
-Position     : [128.925, 737.457]
-Measurements : [880.94, 293498, 1.08283, -0.349099]
----
-Label        : 0
-Position     : [566.236, 739.33]
-Measurements : [756.121, 8821.46, 0.228477, 0.574167]
----
-Label        : 1
-Position     : [204.4, 740.441]
-Measurements : [1680.24, 279485, -0.341007, -0.554946]
----
-Label        : 0
-Position     : [527.65, 741.596]
-Measurements : [770.698, 8427.35, 0.645325, -0.762257]
----
-Label        : 0
-Position     : [555.308, 741.75]
-Measurements : [745.614, 14617.6, -0.559165, -0.338662]
----
-Label        : 0
-Position     : [406.845, 741.877]
-Measurements : [951.874, 1633.05, -0.336642, 0.0556783]
----
-Label        : 1
-Position     : [207.293, 741.999]
-Measurements : [1367.88, 267306, 0.347429, -0.853305]
----
-Label        : 1
-Position     : [124.904, 742.368]
-Measurements : [1436.05, 245284, -0.0935654, -0.463012]
----
-Label        : 1
-Position     : [202.728, 742.368]
-Measurements : [1941.4, 210551, -0.477076, -0.338577]
----
-Label        : 0
-Position     : [436.442, 742.88]
-Measurements : [929.375, 3476.89, -2.89425, 9.90368]
----
-Label        : 0
-Position     : [608.333, 743.344]
-Measurements : [676.344, 20690.8, 1.16242, 1.8409]
----
-Label        : 0
-Position     : [377.893, 744.509]
-Measurements : [795.482, 8235.47, 0.619007, 0.212924]
----
-Label        : 0
-Position     : [448.467, 744.899]
-Measurements : [916.978, 55301.6, 3.14786, 11.2395]
----
-Label        : 1
-Position     : [126.058, 745.517]
-Measurements : [1303.37, 299609, 0.267953, -0.787432]
----
-Label        : 1
-Position     : [124.491, 746.281]
-Measurements : [1358.46, 230129, 0.481434, -0.372796]
----
-Label        : 0
-Position     : [409.131, 746.994]
-Measurements : [965.738, 13623.5, 0.15015, 7.06839]
----
-Label        : 0
-Position     : [405.584, 747.124]
-Measurements : [968.589, 828.08, -0.212032, 0.319205]
----
-Label        : 1
-Position     : [123.368, 747.488]
-Measurements : [1268.68, 236351, 0.613354, -0.0155157]
----
-Label        : 1
-Position     : [202.531, 749.362]
-Measurements : [1550.72, 538206, -0.17467, -1.50601]
----
-Label        : 1
-Position     : [202.216, 749.536]
-Measurements : [1550.72, 538206, -0.17467, -1.50601]
----
-Label        : 1
-Position     : [126.543, 750.378]
-Measurements : [870.957, 174961, 0.776442, -0.0393626]
----
-Label        : 1
-Position     : [206.858, 750.895]
-Measurements : [1323.48, 374871, 0.666633, -0.960716]
----
-Label        : 0
-Position     : [572.392, 751.168]
-Measurements : [868.874, 42944, -0.252169, -1.00631]
----
-Label        : 1
-Position     : [111.08, 756.704]
-Measurements : [682.166, 115105, 1.50987, 1.34086]
----
-Label        : 1
-Position     : [112.859, 758.152]
-Measurements : [637.038, 116498, 1.7813, 2.06441]
----
-Label        : 1
-Position     : [190.72, 760.326]
-Measurements : [1756.4, 804807, -0.336199, -1.44325]
----
-Label        : 1
-Position     : [109.278, 761.408]
-Measurements : [518.056, 47028.6, 2.73031, 7.31028]
----
-Label        : 1
-Position     : [191.976, 762.848]
-Measurements : [1929.87, 611779, -0.689289, -0.802071]
----
-Label        : 1
-Position     : [184.296, 765.408]
-Measurements : [1980.57, 434789, -0.789138, -0.09661]
----
-Label        : 0
-Position     : [453.542, 765.888]
-Measurements : [770.904, 4723.78, 1.27278, 0.867494]
----
-Label        : 1
-Position     : [182.834, 767.159]
-Measurements : [1517.09, 731151, 0.0485414, -1.54421]
----
-Label        : 1
-Position     : [194.997, 767.624]
-Measurements : [1576.76, 503234, 0.35626, -1.25176]
----
-Label        : 0
-Position     : [430.101, 767.938]
-Measurements : [891.728, 9875.54, 0.0311174, -1.52266]
----
-Label        : 1
-Position     : [101.864, 768.48]
-Measurements : [1253.94, 214279, -0.156842, -0.85546]
----
-Label        : 1
-Position     : [183.079, 770.282]
-Measurements : [1145.28, 603485, 0.708353, -0.974022]
----
-Label        : 0
-Position     : [411.914, 770.36]
-Measurements : [816.374, 7840.96, -0.848821, 0.660832]
----
-Label        : 1
-Position     : [103.579, 770.97]
-Measurements : [1180.54, 197496, -0.144821, -1.14796]
----
-Label        : 1
-Position     : [98.8285, 771.336]
-Measurements : [1330.28, 228535, -0.0586775, -0.898468]
----
-Label        : 0
-Position     : [398.203, 773.414]
-Measurements : [891.812, 4488.79, -0.721596, -0.157861]
----
-Label        : 1
-Position     : [175.723, 774.71]
-Measurements : [1351.99, 448310, -0.114202, -1.65025]
----
-Label        : 1
-Position     : [727.647, 776.137]
-Measurements : [1361.34, 220402, 0.453899, -0.274435]
----
-Label        : 1
-Position     : [177.128, 777.184]
-Measurements : [1542.77, 366358, -0.648092, -0.983654]
----
-Label        : 1
-Position     : [688.828, 778.215]
-Measurements : [993.332, 69085.1, -0.464187, -0.403541]
----
-Label        : 0
-Position     : [423.556, 778.671]
-Measurements : [873.206, 9689.22, 0.719962, -0.391072]
----
-Label        : 1
-Position     : [702.725, 780.122]
-Measurements : [987.145, 235863, 0.622212, -0.818241]
----
-Label        : 1
-Position     : [725.208, 780.552]
-Measurements : [1177.82, 331716, 0.617446, -0.759791]
----
-Label        : 1
-Position     : [178.707, 781.444]
-Measurements : [1406.65, 350074, -0.116546, -1.37383]
----
-Label        : 1
-Position     : [643.8, 782.6]
-Measurements : [837.502, 131171, 0.876622, 0.412439]
----
-Label        : 1
-Position     : [687.832, 782.6]
-Measurements : [747.243, 106233, 0.728561, -0.706801]
----
-Label        : 1
-Position     : [647.243, 782.658]
-Measurements : [894.672, 147214, 0.50246, -0.537846]
----
-Label        : 0
-Position     : [398.736, 782.81]
-Measurements : [750.757, 3018.91, -0.243828, 3.54585]
----
-Label        : 1
-Position     : [173.429, 783.826]
-Measurements : [1151.13, 361522, 0.388328, -1.18903]
----
-Label        : 1
-Position     : [728.049, 784.078]
-Measurements : [776.553, 355639, 1.67998, 1.40744]
----
-Label        : 1
-Position     : [702.168, 784.136]
-Measurements : [1045.13, 293026, 0.516226, -1.16655]
----
-Label        : 1
-Position     : [685.987, 784.181]
-Measurements : [630.937, 107448, 1.47644, 0.762472]
----
-Label        : 1
-Position     : [698.181, 784.234]
-Measurements : [915.99, 278636, 0.744965, -0.898467]
----
-Label        : 1
-Position     : [715.132, 785.009]
-Measurements : [917.661, 246715, 0.828443, -0.633303]
----
-Label        : 1
-Position     : [753.989, 785.83]
-Measurements : [953.973, 291075, 0.731503, -0.970358]
----
-Label        : 1
-Position     : [716.054, 786.124]
-Measurements : [769.879, 190007, 1.34962, 0.560458]
----
-Label        : 1
-Position     : [755.699, 786.407]
-Measurements : [828.681, 273702, 1.13027, -0.261738]
----
-Label        : 1
-Position     : [647.418, 786.811]
-Measurements : [626.344, 124163, 1.98432, 3.64173]
----
-Label        : 1
-Position     : [167.663, 787.376]
-Measurements : [1214.17, 374087, 0.247525, -1.3402]
----
-Label        : 1
-Position     : [711.384, 788.232]
-Measurements : [1246.33, 514960, 0.692925, -0.79513]
----
-Label        : 1
-Position     : [169.448, 788.448]
-Measurements : [1175.54, 368199, 0.390895, -1.21202]
----
-Label        : 1
-Position     : [87.2985, 788.683]
-Measurements : [1396.07, 335246, -0.33232, -1.00375]
----
-Label        : 1
-Position     : [750.808, 788.744]
-Measurements : [1078.01, 292720, 0.235907, -1.35835]
----
-Label        : 1
-Position     : [839.488, 788.81]
-Measurements : [1014.05, 248274, 0.000140983, -1.46939]
----
-Label        : 1
-Position     : [92.136, 789.984]
-Measurements : [1610.89, 669868, -0.161827, -1.0152]
----
-Label        : 1
-Position     : [841.374, 790.788]
-Measurements : [934.327, 255970, 0.326117, -1.42665]
----
-Label        : 1
-Position     : [95.5657, 791.06]
-Measurements : [2041.53, 828238, -0.326321, -0.996807]
----
-Label        : 1
-Position     : [842.968, 791.304]
-Measurements : [871.098, 238724, 0.528133, -1.28029]
----
-Label        : 1
-Position     : [92.5887, 791.677]
-Measurements : [2049.67, 547736, -0.181618, -0.257574]
----
-Label        : 1
-Position     : [600.916, 794.077]
-Measurements : [660.541, 98200, 1.48347, 1.53605]
----
-Label        : 1
-Position     : [93.16, 795.104]
-Measurements : [2123.82, 623187, -0.254688, -0.876846]
----
-Label        : 1
-Position     : [94.588, 795.95]
-Measurements : [2146.49, 678407, -0.344582, -0.953312]
----
-Label        : 1
-Position     : [600.792, 796.424]
-Measurements : [683.142, 117605, 1.41414, 1.15]
----
-Label        : 1
-Position     : [157.36, 799.948]
-Measurements : [628.692, 221438, 2.03286, 2.85365]
----
-Label        : 1
-Position     : [598.809, 800.246]
-Measurements : [651.803, 100101, 1.8684, 2.77073]
----
-Label        : 1
-Position     : [153.064, 803.8]
-Measurements : [1235.38, 347266, -0.0708498, -1.4657]
----
-Label        : 1
-Position     : [582.033, 803.973]
-Measurements : [1541.09, 669227, -0.189835, -1.27048]
----
-Label        : 1
-Position     : [583.896, 804.616]
-Measurements : [1716.45, 635471, -0.308924, -1.05274]
----
-Label        : 1
-Position     : [583.731, 808.164]
-Measurements : [1896.01, 789177, -0.135868, -1.35621]
----
-Label        : 1
-Position     : [153.003, 808.514]
-Measurements : [1008.08, 348311, 0.510919, -1.24226]
----
-Label        : 1
-Position     : [1121.2, 809.614]
-Measurements : [1393.42, 631285, 1.06351, -0.317079]
----
-Label        : 1
-Position     : [927.864, 810.944]
-Measurements : [922.958, 219204, 0.729247, -0.639748]
----
-Label        : 1
-Position     : [1124.02, 814.52]
-Measurements : [2098.79, 779215, -0.205201, -1.42675]
----
-Label        : 1
-Position     : [983.643, 814.68]
-Measurements : [1406.45, 349006, 0.0679644, -0.7236]
----
-Label        : 1
-Position     : [504.817, 815.373]
-Measurements : [1010.51, 273922, 0.254172, -1.4478]
----
-Label        : 1
-Position     : [927.928, 815.544]
-Measurements : [1004.66, 237640, 0.332741, -1.12483]
----
-Label        : 1
-Position     : [526.689, 815.604]
-Measurements : [1760.95, 600355, -0.540524, -0.951703]
----
-Label        : 1
-Position     : [923.869, 815.796]
-Measurements : [852.063, 252255, 0.626028, -0.878785]
----
-Label        : 1
-Position     : [980.005, 815.833]
-Measurements : [1171.83, 429539, 0.40623, -0.989969]
----
-Label        : 1
-Position     : [984.76, 816.568]
-Measurements : [1251.43, 490108, 0.220337, -1.26225]
----
-Label        : 1
-Position     : [508.696, 818.136]
-Measurements : [1017.42, 245081, 0.400866, -1.30747]
----
-Label        : 1
-Position     : [1126.45, 818.502]
-Measurements : [1594.38, 1.16569e+06, 0.369868, -1.59389]
----
-Label        : 1
-Position     : [525.592, 819.16]
-Measurements : [1939.86, 697908, -0.499201, -1.08774]
----
-Label        : 1
-Position     : [1011.67, 820.962]
-Measurements : [699.013, 81657.6, 0.551357, -1.1875]
----
-Label        : 1
-Position     : [1091.68, 821.026]
-Measurements : [1000.83, 398136, 1.14559, -0.118122]
----
-Label        : 1
-Position     : [522.719, 821.123]
-Measurements : [1917.55, 882256, -0.451932, -1.08717]
----
-Label        : 1
-Position     : [508.462, 822.044]
-Measurements : [839.852, 222281, 0.979814, -0.367721]
----
-Label        : 1
-Position     : [1010.62, 822.244]
-Measurements : [693.392, 87487, 0.535667, -1.30036]
----
-Label        : 1
-Position     : [1012.41, 822.712]
-Measurements : [706.398, 81647, 0.553716, -1.28203]
----
-Label        : 1
-Position     : [1096.6, 823.242]
-Measurements : [1166.25, 478414, 0.61613, -1.1612]
----
-Label        : 1
-Position     : [1076.83, 824.726]
-Measurements : [1101, 481090, 0.364083, -1.35838]
----
-Label        : 1
-Position     : [1096.72, 824.918]
-Measurements : [1122.23, 469781, 0.733959, -1.00201]
----
-Label        : 1
-Position     : [1078.97, 827.32]
-Measurements : [1418.91, 502602, 0.0250882, -1.28341]
----
-Label        : 1
-Position     : [1392.91, 829.002]
-Measurements : [1066.29, 262211, 0.601476, -0.641817]
----
-Label        : 1
-Position     : [1390.94, 829.202]
-Measurements : [1005.35, 265933, 0.610088, -0.575108]
----
-Label        : 1
-Position     : [1390.7, 829.344]
-Measurements : [1005.35, 265933, 0.610088, -0.575108]
----
-Label        : 1
-Position     : [488.216, 829.912]
-Measurements : [1675.12, 615787, -0.00773813, -1.42912]
----
-Label        : 1
-Position     : [486.43, 830.311]
-Measurements : [1635.72, 765951, -0.15554, -1.46854]
----
-Label        : 1
-Position     : [1075.93, 831.578]
-Measurements : [1252.62, 648251, 0.284949, -1.4399]
----
-Label        : 1
-Position     : [1389.76, 832.043]
-Measurements : [944.15, 382907, 0.950516, -0.234103]
----
-Label        : 1
-Position     : [656.414, 832.214]
-Measurements : [1014.19, 216866, 0.193605, -1.22599]
----
-Label        : 1
-Position     : [661.203, 832.696]
-Measurements : [934.508, 187096, 0.403865, -1.17238]
----
-Label        : 1
-Position     : [657.112, 833.8]
-Measurements : [1131.95, 224355, 0.191712, -1.08847]
----
-Label        : 1
-Position     : [1394.55, 834.327]
-Measurements : [1207.62, 339921, 0.450709, -0.80088]
----
-Label        : 1
-Position     : [465.381, 834.549]
-Measurements : [1269.39, 560439, 0.483274, -1.30411]
----
-Label        : 1
-Position     : [486.064, 834.81]
-Measurements : [1472.21, 840553, 0.180824, -1.56869]
----
-Label        : 1
-Position     : [682.025, 836.066]
-Measurements : [831.306, 369037, 1.16729, 0.119046]
----
-Label        : 1
-Position     : [461.08, 838.616]
-Measurements : [1540.14, 621071, 0.0158363, -1.6649]
----
-Label        : 1
-Position     : [1393.74, 838.732]
-Measurements : [1243.49, 422273, 0.134774, -1.22674]
----
-Label        : 1
-Position     : [745.941, 839.601]
-Measurements : [721.25, 148263, 0.476498, -1.29222]
----
-Label        : 1
-Position     : [750.808, 839.944]
-Measurements : [876.858, 171370, 0.0564525, -1.37813]
----
-Label        : 1
-Position     : [460.526, 840.057]
-Measurements : [1461.23, 614667, 0.236308, -1.59414]
----
-Label        : 1
-Position     : [706.264, 840.456]
-Measurements : [1518.17, 235134, 0.357997, -0.361697]
----
-Label        : 1
-Position     : [685.272, 840.968]
-Measurements : [1410.48, 351858, -0.15485, -1.17376]
----
-Label        : 1
-Position     : [751.871, 841.211]
-Measurements : [961.414, 123696, 0.00551949, -1.07051]
----
-Label        : 1
-Position     : [662.744, 841.48]
-Measurements : [1760.19, 362517, -0.253148, -0.549244]
----
-Label        : 1
-Position     : [659.618, 841.535]
-Measurements : [1759.12, 386165, -0.341652, -0.636809]
----
-Label        : 1
-Position     : [1394.55, 841.7]
-Measurements : [1318.22, 289341, -0.0578254, -0.768137]
----
-Label        : 1
-Position     : [1393.92, 843.227]
-Measurements : [1114.5, 316590, 0.0662469, -1.37404]
----
-Label        : 1
-Position     : [689.976, 844.064]
-Measurements : [1713.82, 213085, -0.192337, -0.0320576]
----
-Label        : 1
-Position     : [664.721, 844.966]
-Measurements : [1639.19, 328917, 0.0605871, -1.04421]
----
-Label        : 1
-Position     : [707.341, 845.123]
-Measurements : [1566.02, 156165, 0.552855, -0.00697981]
----
-Label        : 1
-Position     : [1396.99, 845.125]
-Measurements : [1255.95, 271208, -0.0655448, -0.837552]
----
-Label        : 1
-Position     : [706.142, 845.203]
-Measurements : [1592.19, 147406, 0.544595, 0.237633]
----
-Label        : 1
-Position     : [13.5127, 847.721]
-Measurements : [1584.98, 367069, -0.152733, -1.35335]
----
-Label        : 1
-Position     : [590.132, 847.762]
-Measurements : [1044.98, 643190, 0.355244, -1.64142]
----
-Label        : 1
-Position     : [8.68, 848.856]
-Measurements : [1711.14, 345707, -0.859543, -0.394889]
----
-Label        : 1
-Position     : [110.354, 849.309]
-Measurements : [853.596, 335338, 1.12422, -0.017195]
----
-Label        : 1
-Position     : [595.049, 849.98]
-Measurements : [1348, 508362, -0.109955, -1.45194]
----
-Label        : 1
-Position     : [993.792, 850.122]
-Measurements : [915.718, 401442, 0.637145, -0.859409]
----
-Label        : 1
-Position     : [12.6837, 851.051]
-Measurements : [2003.24, 168964, -1.29156, 1.49374]
----
-Label        : 1
-Position     : [593.112, 851.208]
-Measurements : [1606.55, 308071, -0.57708, -0.623877]
----
-Label        : 1
-Position     : [104.202, 851.349]
-Measurements : [1353.46, 410771, 0.113735, -0.935532]
----
-Label        : 1
-Position     : [11.2482, 852.281]
-Measurements : [2060.85, 120579, -1.17542, 1.54768]
----
-Label        : 1
-Position     : [990.073, 852.401]
-Measurements : [934.613, 391474, 0.823001, -0.501332]
----
-Label        : 1
-Position     : [106.984, 852.44]
-Measurements : [1316.43, 304185, -0.13726, -1.05284]
----
-Label        : 1
-Position     : [421.144, 852.952]
-Measurements : [779.29, 192547, 1.11826, -0.228148]
----
-Label        : 1
-Position     : [420.158, 853.031]
-Measurements : [727.772, 192207, 1.28991, 0.219668]
----
-Label        : 1
-Position     : [993.976, 853.432]
-Measurements : [959.583, 355747, 0.700384, -0.692653]
----
-Label        : 1
-Position     : [90.1196, 854.567]
-Measurements : [1225.8, 242224, -0.00433429, -1.09973]
----
-Label        : 1
-Position     : [403.868, 854.704]
-Measurements : [1012.63, 294462, 1.27885, 0.230693]
----
-Label        : 1
-Position     : [417.957, 855.686]
-Measurements : [592.937, 187145, 1.79708, 1.78397]
----
-Label        : 1
-Position     : [14.312, 856.024]
-Measurements : [1516.56, 502317, -0.10657, -1.62387]
----
-Label        : 1
-Position     : [94.696, 858.072]
-Measurements : [1256.24, 233511, -0.0519922, -1.26718]
----
-Label        : 1
-Position     : [402.712, 858.584]
-Measurements : [1140.94, 365857, 0.646759, -1.17146]
----
-Label        : 1
-Position     : [1088.95, 858.617]
-Measurements : [639.46, 320670, 1.53932, 0.754779]
----
-Label        : 1
-Position     : [9.61627, 858.619]
-Measurements : [1362.01, 538862, 0.0774656, -1.71921]
----
-Label        : 1
-Position     : [407.178, 858.736]
-Measurements : [813.824, 358104, 1.40807, 0.538078]
----
-Label        : 1
-Position     : [86.9959, 859.599]
-Measurements : [1315.49, 208442, -0.100612, -1.31077]
----
-Label        : 1
-Position     : [1350.27, 860.121]
-Measurements : [1360.53, 466743, 0.31565, -1.10715]
----
-Label        : 1
-Position     : [87.528, 861.144]
-Measurements : [1347.13, 190787, -0.0978204, -1.34031]
----
-Label        : 1
-Position     : [398.699, 861.411]
-Measurements : [1127.94, 390716, 0.556052, -1.20021]
----
-Label        : 1
-Position     : [90.8185, 862.803]
-Measurements : [1308.74, 218087, 0.116613, -1.41721]
----
-Label        : 1
-Position     : [84.8054, 863.139]
-Measurements : [1304.88, 270682, -0.0658039, -1.12477]
----
-Label        : 1
-Position     : [1092.28, 863.16]
-Measurements : [1103.4, 429164, 0.566091, -1.0663]
----
-Label        : 1
-Position     : [1351.54, 863.777]
-Measurements : [1657.46, 491844, -0.343795, -1.09062]
----
-Label        : 1
-Position     : [536.344, 864.216]
-Measurements : [1392.48, 504212, 0.0501853, -1.06102]
----
-Label        : 1
-Position     : [539.136, 864.336]
-Measurements : [1301.44, 342270, 0.253072, -0.751042]
----
-Label        : 1
-Position     : [394.52, 865.24]
-Measurements : [813.826, 242964, 1.46898, 1.19216]
----
-Label        : 1
-Position     : [536.249, 865.286]
-Measurements : [1466.3, 423626, 0.0638285, -0.940062]
----
-Label        : 1
-Position     : [1351.97, 865.334]
-Measurements : [1792.51, 366586, -0.637944, -0.320197]
----
-Label        : 1
-Position     : [1352.46, 866.495]
-Measurements : [1969.74, 227778, -0.660137, 0.632833]
----
-Label        : 1
-Position     : [1089.01, 866.649]
-Measurements : [915.721, 348570, 0.910774, -0.729368]
----
-Label        : 1
-Position     : [378.455, 867.208]
-Measurements : [797.688, 131558, 0.693292, -0.00532097]
----
-Label        : 1
-Position     : [390.851, 867.792]
-Measurements : [739.163, 253963, 1.71448, 1.76073]
----
-Label        : 1
-Position     : [1354.82, 868.282]
-Measurements : [2085.98, 96248.3, -0.541486, 0.804039]
----
-Label        : 1
-Position     : [374.459, 869.947]
-Measurements : [601.646, 103520, 1.39887, 1.23019]
----
-Label        : 1
-Position     : [1357.82, 870.712]
-Measurements : [1951.38, 255655, -0.930187, 0.0135338]
----
-Label        : 1
-Position     : [1356.31, 871.223]
-Measurements : [1937.93, 217556, -0.733659, -0.458504]
----
-Label        : 1
-Position     : [378.648, 871.384]
-Measurements : [913.122, 213766, 0.454937, -0.925105]
----
-Label        : 1
-Position     : [1357.28, 874.426]
-Measurements : [1755.66, 243534, -0.137658, -1.21485]
----
-Label        : 1
-Position     : [1359.45, 874.506]
-Measurements : [1714.99, 247016, -0.354065, -0.706264]
----
-Label        : 1
-Position     : [1335.43, 876.67]
-Measurements : [977.106, 190180, 0.805482, -0.0668259]
----
-Label        : 1
-Position     : [1331.47, 878.522]
-Measurements : [1113.42, 217978, 0.398027, -0.938594]
----
-Label        : 1
-Position     : [1360.14, 879.342]
-Measurements : [1504.3, 286266, -0.261859, -0.748138]
----
-Label        : 1
-Position     : [1360.6, 881.598]
-Measurements : [1308.77, 363854, -0.0981414, -1.35151]
----
-Label        : 1
-Position     : [1327.44, 882.36]
-Measurements : [1021.71, 186068, 0.622267, -0.562923]
----
-Label        : 1
-Position     : [1358.69, 884.162]
-Measurements : [1018.02, 366700, 0.663221, -0.834437]
----
-Label        : 1
-Position     : [1323.72, 885.397]
-Measurements : [987.997, 131056, 0.672591, 0.258901]
----
-Label        : 1
-Position     : [1370.23, 887.491]
-Measurements : [1196.16, 483304, 0.395851, -1.30308]
----
-Label        : 1
-Position     : [1321.64, 889.991]
-Measurements : [952.203, 119131, 0.526279, -0.42824]
----
-Label        : 1
-Position     : [1367.11, 891.22]
-Measurements : [1581.9, 379109, -0.371943, -0.742567]
----
-Label        : 1
-Position     : [1370.21, 892.802]
-Measurements : [1749.54, 333167, -0.436785, -0.755464]
----
-Label        : 1
-Position     : [1317.4, 894.677]
-Measurements : [987.684, 163583, 0.974074, 0.672006]
----
-Label        : 1
-Position     : [441.28, 896.605]
-Measurements : [754.039, 266570, 1.07992, -0.415476]
----
-Label        : 1
-Position     : [1338.58, 897.148]
-Measurements : [844.142, 370783, 0.866646, -0.887677]
----
-Label        : 1
-Position     : [310.051, 897.317]
-Measurements : [1642.91, 450312, 0.431277, -1.30074]
----
-Label        : 1
-Position     : [443.73, 897.595]
-Measurements : [970.346, 372047, 0.597941, -0.922058]
----
-Label        : 1
-Position     : [1370.38, 897.774]
-Measurements : [1736.55, 252793, -0.153219, -0.612233]
----
-Label        : 1
-Position     : [1338.95, 899.334]
-Measurements : [929.947, 377326, 0.609126, -1.17868]
----
-Label        : 1
-Position     : [1372.53, 899.488]
-Measurements : [1617.85, 327265, -0.166481, -0.959381]
----
-Label        : 1
-Position     : [311.118, 899.598]
-Measurements : [1694.55, 458203, 0.145349, -1.2514]
----
-Label        : 1
-Position     : [311.576, 900.056]
-Measurements : [1649.26, 509218, 0.147253, -1.31435]
----
-Label        : 1
-Position     : [1340.89, 900.231]
-Measurements : [1210.14, 396268, 0.0399636, -1.22353]
----
-Label        : 1
-Position     : [1365.84, 900.386]
-Measurements : [1347.79, 226145, 0.0430409, -0.888964]
----
-Label        : 1
-Position     : [1370.8, 901.031]
-Measurements : [1654.92, 207509, -0.217958, -0.353529]
----
-Label        : 1
-Position     : [444.184, 901.08]
-Measurements : [1408.5, 249528, 0.00859062, -0.0444654]
----
-Label        : 1
-Position     : [1371.71, 901.885]
-Measurements : [1669.16, 227071, -0.334292, -0.384933]
----
-Label        : 1
-Position     : [1313.45, 902.279]
-Measurements : [1155.08, 263720, 0.734679, -0.573918]
----
-Label        : 1
-Position     : [1344.99, 903.918]
-Measurements : [1664.24, 131069, -0.158953, -0.355933]
----
-Label        : 1
-Position     : [1369.98, 903.918]
-Measurements : [1552.83, 228220, -0.40741, -0.663213]
----
-Label        : 1
-Position     : [1347.3, 904.789]
-Measurements : [1647.86, 194091, -0.571519, 0.058703]
----
-Label        : 1
-Position     : [1312.19, 905.26]
-Measurements : [1214.92, 320095, 0.599268, -0.947832]
----
-Label        : 1
-Position     : [1381.36, 905.843]
-Measurements : [1433.63, 366810, 0.00304647, -1.13223]
----
-Label        : 1
-Position     : [1311.4, 906.375]
-Measurements : [1288.25, 352475, 0.512827, -1.00289]
----
-Label        : 1
-Position     : [1317.99, 906.767]
-Measurements : [802.219, 244578, 1.82594, 2.25175]
----
-Label        : 1
-Position     : [1377.76, 907.194]
-Measurements : [1812.67, 202106, -0.490066, -0.456009]
----
-Label        : 1
-Position     : [1344.2, 908.08]
-Measurements : [1801.69, 247778, -0.207808, -0.247204]
----
-Label        : 1
-Position     : [1309.77, 909.028]
-Measurements : [1503.32, 365710, 0.132882, -1.26226]
----
-Label        : 1
-Position     : [1304.98, 909.298]
-Measurements : [1114.62, 257036, 1.48359, 0.992389]
----
-Label        : 1
-Position     : [1349.09, 909.652]
-Measurements : [1808.35, 187628, 0.409092, -0.203753]
----
-Label        : 1
-Position     : [1314.06, 910.128]
-Measurements : [1241.28, 552366, 0.560998, -1.12998]
----
-Label        : 1
-Position     : [278.78, 910.639]
-Measurements : [1052.43, 198290, 0.709195, -0.44075]
----
-Label        : 1
-Position     : [1377.47, 910.662]
-Measurements : [1805.52, 205937, -0.4432, -0.489332]
----
-Label        : 1
-Position     : [1310.99, 910.881]
-Measurements : [1555.26, 428401, 0.0515261, -1.12426]
----
-Label        : 1
-Position     : [1344.38, 911.067]
-Measurements : [1705.3, 348722, -0.280617, -0.572913]
----
-Label        : 1
-Position     : [1355.08, 911.266]
-Measurements : [1334.08, 178895, 0.38702, -0.0808079]
----
-Label        : 1
-Position     : [1308.34, 912.263]
-Measurements : [1651.1, 417759, -0.106689, -1.06493]
----
-Label        : 1
-Position     : [1380.88, 912.322]
-Measurements : [1863.7, 217354, 0.09701, -0.801904]
----
-Label        : 1
-Position     : [1313.28, 912.39]
-Measurements : [1374.87, 603493, 0.303465, -1.39198]
----
-Label        : 1
-Position     : [1379.81, 912.929]
-Measurements : [1826.95, 207047, -0.0182558, -0.835847]
----
-Label        : 1
-Position     : [1315.99, 912.974]
-Measurements : [1089.22, 523414, 0.905834, -0.723987]
----
-Label        : 1
-Position     : [1345.1, 913.112]
-Measurements : [1656.43, 375478, -0.134821, -0.708498]
----
-Label        : 1
-Position     : [1309.8, 913.827]
-Measurements : [1653.29, 424036, -0.168739, -0.998167]
----
-Label        : 1
-Position     : [1378.64, 914.07]
-Measurements : [1754.65, 315330, -0.149315, -0.606496]
----
-Label        : 1
-Position     : [1347.47, 914.105]
-Measurements : [1662.43, 324659, 0.123628, -0.606828]
----
-Label        : 1
-Position     : [1307.72, 914.158]
-Measurements : [1562.79, 476833, 0.0181253, -1.19859]
----
-Label        : 1
-Position     : [279.009, 914.3]
-Measurements : [1366.56, 388548, 0.0890594, -0.935212]
----
-Label        : 1
-Position     : [282.6, 915.312]
-Measurements : [1487.31, 361021, -0.119785, -0.958643]
----
-Label        : 1
-Position     : [1350.72, 916.206]
-Measurements : [1543.63, 247092, 0.268943, 0.293164]
----
-Label        : 1
-Position     : [1304.13, 916.83]
-Measurements : [1185.31, 464956, 0.684796, -0.723125]
----
-Label        : 1
-Position     : [1384.22, 917.527]
-Measurements : [2022.49, 317242, -0.743431, 0.0562226]
----
-Label        : 1
-Position     : [1380.29, 917.839]
-Measurements : [1892.03, 310838, -0.269586, -0.727556]
----
-Label        : 1
-Position     : [9.704, 917.872]
-Measurements : [1677.17, 344801, -0.0800956, -0.979602]
----
-Label        : 1
-Position     : [1306.08, 918.254]
-Measurements : [1153.55, 579639, 0.70006, -0.88961]
----
-Label        : 1
-Position     : [1382.67, 918.254]
-Measurements : [2033.86, 258517, -0.378087, -0.504246]
----
-Label        : 1
-Position     : [254.44, 918.896]
-Measurements : [981.842, 225045, 1.12517, 0.722067]
----
-Label        : 1
-Position     : [1357.82, 919.479]
-Measurements : [1411.59, 169269, 0.291539, -0.443166]
----
-Label        : 1
-Position     : [14.2546, 919.735]
-Measurements : [1422.03, 435005, 0.445337, -1.21085]
----
-Label        : 1
-Position     : [258.811, 920.619]
-Measurements : [755.978, 264977, 1.76497, 2.00019]
----
-Label        : 1
-Position     : [13.3561, 920.786]
-Measurements : [1410.39, 378258, 0.446486, -1.14964]
----
-Label        : 1
-Position     : [396.701, 921.349]
-Measurements : [851.464, 159996, 0.111258, -1.57735]
----
-Label        : 1
-Position     : [1386.77, 921.53]
-Measurements : [1922.41, 233572, -0.216135, -0.277221]
----
-Label        : 1
-Position     : [250.275, 922.04]
-Measurements : [749.487, 219285, 1.70187, 2.12975]
----
-Label        : 1
-Position     : [1388.03, 923.141]
-Measurements : [1829.97, 211304, -0.81067, 0.407732]
----
-Label        : 1
-Position     : [396.742, 923.556]
-Measurements : [975.906, 122734, -0.467624, -1.0378]
----
-Label        : 1
-Position     : [1358.51, 923.596]
-Measurements : [1653.38, 168150, -0.316608, -0.74935]
----
-Label        : 1
-Position     : [1382.68, 923.698]
-Measurements : [1621.07, 399783, -0.189171, -0.914576]
----
-Label        : 1
-Position     : [229.496, 924.766]
-Measurements : [1467.21, 151784, 0.642844, 0.124609]
----
-Label        : 1
-Position     : [11.752, 926.064]
-Measurements : [1088.83, 195833, 0.53577, -0.345884]
----
-Label        : 1
-Position     : [399.622, 926.262]
-Measurements : [1108.24, 36530.4, -0.225094, 1.15346]
----
-Label        : 1
-Position     : [1362.37, 926.38]
-Measurements : [1777.85, 323361, -0.187217, -0.537177]
----
-Label        : 1
-Position     : [11.9413, 926.939]
-Measurements : [1088.83, 195833, 0.53577, -0.345884]
----
-Label        : 1
-Position     : [1360.68, 926.962]
-Measurements : [1885.33, 225604, -0.252562, 0.534732]
----
-Label        : 1
-Position     : [1391.23, 928.576]
-Measurements : [1614.94, 223249, -0.809094, -0.155135]
----
-Label        : 1
-Position     : [233.448, 928.624]
-Measurements : [1379.28, 368824, 0.168835, -0.869992]
----
-Label        : 1
-Position     : [1388.41, 928.903]
-Measurements : [1734.74, 137741, -0.727034, 0.556726]
----
-Label        : 1
-Position     : [387.983, 929.422]
-Measurements : [1005.45, 195362, 0.856133, 0.591008]
----
-Label        : 1
-Position     : [383.225, 929.7]
-Measurements : [1030.51, 271277, 0.571568, -0.601491]
----
-Label        : 1
-Position     : [15.453, 930.93]
-Measurements : [597.419, 50386.3, 1.79512, 2.64196]
----
-Label        : 1
-Position     : [1385.97, 930.933]
-Measurements : [1451.7, 250329, -0.40493, -0.896998]
----
-Label        : 1
-Position     : [1297.31, 930.943]
-Measurements : [1085.54, 297588, 0.51451, -0.775278]
----
-Label        : 1
-Position     : [1359.33, 930.969]
-Measurements : [2006.63, 187830, 0.129712, -0.113602]
----
-Label        : 1
-Position     : [383.201, 931.922]
-Measurements : [1073.06, 230781, 0.71069, -0.323576]
----
-Label        : 1
-Position     : [1298.97, 932.232]
-Measurements : [1287.64, 316610, 0.190588, -1.00842]
----
-Label        : 1
-Position     : [1392.48, 932.37]
-Measurements : [1624.03, 205862, -0.994572, 0.209212]
----
-Label        : 1
-Position     : [231.717, 933.143]
-Measurements : [788.692, 261960, 1.41576, 0.912168]
----
-Label        : 1
-Position     : [1392.09, 933.409]
-Measurements : [1553.88, 228873, -0.832886, -0.297996]
----
-Label        : 1
-Position     : [1299.93, 933.836]
-Measurements : [1336.81, 307293, 0.193923, -1.00883]
----
-Label        : 1
-Position     : [1364.15, 934.026]
-Measurements : [1727.94, 239776, 0.582757, 0.0616711]
----
-Label        : 1
-Position     : [1358.67, 935.089]
-Measurements : [1746.49, 301812, 0.425325, -0.322816]
----
-Label        : 1
-Position     : [1363.01, 936.294]
-Measurements : [1740.47, 206841, 0.742914, 0.547904]
----
-Label        : 1
-Position     : [1367.89, 936.402]
-Measurements : [1474.94, 214456, 0.291324, -0.240963]
----
-Label        : 1
-Position     : [1364.93, 936.909]
-Measurements : [1681.28, 189985, 0.793199, 0.552424]
----
-Label        : 1
-Position     : [1295.84, 937.113]
-Measurements : [1744.59, 254166, -0.655035, -0.0659341]
----
-Label        : 1
-Position     : [238.568, 937.328]
-Measurements : [1752.95, 727925, -0.113518, -1.42252]
----
-Label        : 1
-Position     : [1395.21, 937.415]
-Measurements : [960.416, 374398, 0.723517, -1.18658]
----
-Label        : 1
-Position     : [1292.5, 937.881]
-Measurements : [1576.62, 342358, -0.162155, -1.15955]
----
-Label        : 1
-Position     : [1296.9, 937.911]
-Measurements : [1757.45, 240680, -0.642067, -0.0605149]
----
-Label        : 1
-Position     : [1291.66, 939.699]
-Measurements : [1655.87, 350009, -0.244849, -1.13558]
----
-Label        : 1
-Position     : [241.941, 940.249]
-Measurements : [1421.3, 1.00111e+06, 0.39758, -1.49566]
----
-Label        : 1
-Position     : [1297.07, 940.39]
-Measurements : [1764.71, 371315, -0.408776, -0.837409]
----
-Label        : 1
-Position     : [1290.94, 940.608]
-Measurements : [1631.15, 359476, 0.051328, -1.16273]
----
-Label        : 1
-Position     : [235.818, 940.667]
-Measurements : [1632.58, 957543, -0.0286218, -1.57044]
----
-Label        : 1
-Position     : [1293.96, 941.008]
-Measurements : [1935.94, 255872, -0.38041, -0.147309]
----
-Label        : 1
-Position     : [1366.7, 941.209]
-Measurements : [1621, 164736, 0.254338, -0.470992]
----
-Label        : 1
-Position     : [1368.61, 944.387]
-Measurements : [1918.95, 264503, -0.491088, -0.661444]
----
-Label        : 1
-Position     : [1292.15, 944.486]
-Measurements : [1936.13, 239531, -0.431684, 0.297378]
----
-Label        : 1
-Position     : [208.076, 945.005]
-Measurements : [1776.23, 544390, -0.392976, -1.29132]
----
-Label        : 1
-Position     : [207.848, 946.032]
-Measurements : [1730.32, 584975, -0.313938, -1.3991]
----
-Label        : 1
-Position     : [1369.11, 946.276]
-Measurements : [2064.8, 199610, -0.540836, -0.163299]
----
-Label        : 1
-Position     : [1296.95, 946.402]
-Measurements : [1611.98, 575976, -0.136454, -1.35887]
----
-Label        : 1
-Position     : [203.292, 947]
-Measurements : [1529.59, 464873, 0.166712, -1.19976]
----
-Label        : 1
-Position     : [1369.16, 947.353]
-Measurements : [2093.44, 168690, -0.366583, -0.451855]
----
-Label        : 1
-Position     : [195.048, 947.568]
-Measurements : [1291.4, 320011, 0.34542, -0.736432]
----
-Label        : 1
-Position     : [1371.11, 947.7]
-Measurements : [1976.45, 191598, -0.399862, -0.502816]
----
-Label        : 1
-Position     : [1290.92, 948.582]
-Measurements : [1703.03, 435514, -0.361576, -0.8701]
----
-Label        : 1
-Position     : [196.05, 950.246]
-Measurements : [1044.09, 406448, 0.725438, -0.619105]
----
-Label        : 1
-Position     : [1295.56, 950.571]
-Measurements : [1245.72, 645404, 0.651453, -1.13169]
----
-Label        : 1
-Position     : [1372.97, 951.201]
-Measurements : [1922.69, 219277, -0.27453, -0.934681]
----
-Label        : 1
-Position     : [1372.43, 951.858]
-Measurements : [1922.69, 219277, -0.27453, -0.934681]
----
-Label        : 1
-Position     : [191.506, 951.889]
-Measurements : [878.1, 319047, 1.26602, 0.503631]
----
-Label        : 1
-Position     : [1287.53, 952.088]
-Measurements : [1048.82, 407059, 0.767239, -0.977461]
----
-Label        : 1
-Position     : [1376.4, 954.064]
-Measurements : [1582.31, 246184, 0.125043, -0.313266]
----
-Label        : 1
-Position     : [888.663, 954.188]
-Measurements : [1159.73, 23273.9, -1.05327, 2.42529]
----
-Label        : 1
-Position     : [841.554, 954.816]
-Measurements : [979.789, 365070, 0.734822, -1.08396]
----
-Label        : 1
-Position     : [840.209, 956.297]
-Measurements : [1253.09, 441696, 0.242059, -1.40154]
----
-Label        : 1
-Position     : [885.606, 956.63]
-Measurements : [1239.21, 116137, 1.15831, 2.26557]
----
-Label        : 1
-Position     : [839.67, 957.321]
-Measurements : [1475.47, 409509, -0.0776988, -1.14681]
----
-Label        : 1
-Position     : [1374.89, 957.593]
-Measurements : [1540.92, 273953, 0.168189, -0.634327]
----
-Label        : 1
-Position     : [839.73, 957.858]
-Measurements : [1475.47, 409509, -0.0776988, -1.14681]
----
-Label        : 1
-Position     : [883.191, 958.106]
-Measurements : [1226.58, 281657, 0.36399, -0.120447]
----
-Label        : 1
-Position     : [1287.83, 958.414]
-Measurements : [1188.42, 392427, 0.451114, -1.15636]
----
-Label        : 1
-Position     : [1285.41, 958.77]
-Measurements : [1244.06, 390274, 0.293909, -1.26782]
----
-Label        : 1
-Position     : [1379.02, 958.919]
-Measurements : [1452.55, 212764, -0.0662891, -0.542317]
----
-Label        : 1
-Position     : [887.32, 959.206]
-Measurements : [1289.12, 175148, 1.253, 1.39717]
----
-Label        : 1
-Position     : [178.678, 959.246]
-Measurements : [727.864, 115788, 0.698264, -0.893239]
----
-Label        : 1
-Position     : [834.72, 959.368]
-Measurements : [1473.53, 282455, 0.17718, -0.792214]
----
-Label        : 1
-Position     : [281.167, 959.472]
-Measurements : [1384.4, 574360, 0.148977, -1.39461]
----
-Label        : 1
-Position     : [1287.24, 960.05]
-Measurements : [1363.4, 399184, 0.197987, -1.29322]
----
-Label        : 1
-Position     : [180.867, 960.145]
-Measurements : [811.565, 147067, 0.572313, -0.79385]
----
-Label        : 1
-Position     : [1375.51, 960.314]
-Measurements : [1477.23, 297461, 0.16776, -0.117573]
----
-Label        : 1
-Position     : [836.454, 960.316]
-Measurements : [1604.09, 255789, 0.0548937, -0.684292]
----
-Label        : 1
-Position     : [883.967, 960.726]
-Measurements : [1184.06, 320393, 0.364136, -0.490117]
----
-Label        : 1
-Position     : [1372.55, 960.819]
-Measurements : [1213.1, 317284, 0.225814, -0.76732]
----
-Label        : 1
-Position     : [181.736, 960.88]
-Measurements : [821.101, 138823, 0.610745, -0.6679]
----
-Label        : 1
-Position     : [287.251, 961.625]
-Measurements : [1045.38, 721053, 0.987592, -0.6074]
----
-Label        : 1
-Position     : [839.617, 962.3]
-Measurements : [1505.98, 347870, -0.10427, -0.87655]
----
-Label        : 1
-Position     : [880.215, 962.714]
-Measurements : [917.971, 314032, 0.904646, -0.121773]
----
-Label        : 1
-Position     : [1377.76, 962.918]
-Measurements : [1717.5, 287861, -0.0890835, -0.53074]
----
-Label        : 1
-Position     : [897.49, 963.068]
-Measurements : [992.493, 123270, 0.677473, 0.387253]
----
-Label        : 1
-Position     : [1282.73, 963.327]
-Measurements : [1352.54, 433273, -0.0321354, -1.3333]
----
-Label        : 1
-Position     : [283.624, 963.44]
-Measurements : [1629.07, 593929, -0.104435, -1.32794]
----
-Label        : 1
-Position     : [1289.06, 964.131]
-Measurements : [1147.7, 498800, 0.581777, -1.20601]
----
-Label        : 1
-Position     : [1382.68, 964.62]
-Measurements : [1762.07, 247023, -0.242182, -0.021285]
----
-Label        : 1
-Position     : [281.159, 964.684]
-Measurements : [1806.79, 393250, -0.267757, -0.7197]
----
-Label        : 1
-Position     : [885.074, 965.368]
-Measurements : [1194.36, 303639, 0.605657, -0.551981]
----
-Label        : 1
-Position     : [267.288, 965.647]
-Measurements : [1212.79, 606103, 0.615202, -1.18908]
----
-Label        : 1
-Position     : [1385.18, 966.271]
-Measurements : [1618.88, 280590, -0.349398, -0.812694]
----
-Label        : 1
-Position     : [834.815, 966.46]
-Measurements : [1318.66, 255139, 0.780854, 0.11283]
----
-Label        : 1
-Position     : [906.39, 966.591]
-Measurements : [927.715, 215368, 0.761438, -0.607984]
----
-Label        : 1
-Position     : [279.652, 966.659]
-Measurements : [1697.84, 399210, 0.00594428, -0.716991]
----
-Label        : 1
-Position     : [1280.94, 966.849]
-Measurements : [1116.31, 445566, 0.535014, -1.16033]
----
-Label        : 1
-Position     : [1380.52, 967.415]
-Measurements : [1941.89, 153684, -0.157177, 0.0782797]
----
-Label        : 1
-Position     : [901.58, 967.689]
-Measurements : [1237.3, 315334, -0.00845597, -1.41541]
----
-Label        : 1
-Position     : [277.992, 968.56]
-Measurements : [1393.87, 376511, 0.354448, -0.664421]
----
-Label        : 1
-Position     : [881.1, 968.918]
-Measurements : [990.499, 202267, 0.648434, -0.236861]
----
-Label        : 1
-Position     : [834.601, 968.95]
-Measurements : [1321.05, 194508, 0.335078, -0.528258]
----
-Label        : 1
-Position     : [1381.85, 969.062]
-Measurements : [1861.88, 218240, -0.470967, 0.388907]
----
-Label        : 1
-Position     : [832.242, 969.803]
-Measurements : [1405.66, 195558, 0.164312, -0.749677]
----
-Label        : 1
-Position     : [1390.21, 969.824]
-Measurements : [1251.35, 199288, 0.139184, -0.902565]
----
-Label        : 1
-Position     : [881.902, 969.851]
-Measurements : [993.101, 152971, 0.309769, -0.891556]
----
-Label        : 1
-Position     : [1279.41, 970.221]
-Measurements : [1112.48, 367915, 0.449666, -1.15283]
----
-Label        : 1
-Position     : [266.216, 970.608]
-Measurements : [1597.04, 574038, -0.0380824, -1.50985]
----
-Label        : 1
-Position     : [1381.49, 970.79]
-Measurements : [1810.97, 259356, -0.737676, 0.505784]
----
-Label        : 1
-Position     : [834.041, 970.855]
-Measurements : [1349.53, 218768, 0.114165, -0.795617]
----
-Label        : 1
-Position     : [832.358, 971.375]
-Measurements : [1525.59, 227676, -0.0261145, -0.698119]
----
-Label        : 1
-Position     : [899.122, 971.785]
-Measurements : [1452.86, 159947, -0.238656, -0.489898]
----
-Label        : 1
-Position     : [829.576, 972.77]
-Measurements : [1547.52, 250192, 0.311495, -0.308267]
----
-Label        : 1
-Position     : [1282.32, 973.977]
-Measurements : [1526.38, 469876, -0.0336208, -0.84676]
----
-Label        : 1
-Position     : [896.581, 974.116]
-Measurements : [1309.6, 196984, 0.247839, -0.938235]
----
-Label        : 1
-Position     : [1385.54, 974.386]
-Measurements : [1645.3, 162172, -0.0592037, -0.591863]
----
-Label        : 1
-Position     : [270.791, 974.484]
-Measurements : [1152.94, 508081, 0.989463, -0.385044]
----
-Label        : 1
-Position     : [253.969, 974.856]
-Measurements : [1318.6, 512263, 0.413012, -1.39054]
----
-Label        : 1
-Position     : [831.129, 975.062]
-Measurements : [1679.04, 241175, 0.0265257, -0.246265]
----
-Label        : 1
-Position     : [897.535, 976.112]
-Measurements : [1358.78, 196563, 0.12645, -0.830182]
----
-Label        : 1
-Position     : [901.227, 976.191]
-Measurements : [1295.93, 264711, -0.0760443, -0.968626]
----
-Label        : 1
-Position     : [877.004, 976.29]
-Measurements : [1116.66, 225062, 0.377058, -0.670743]
----
-Label        : 1
-Position     : [826.286, 976.862]
-Measurements : [1351.26, 220933, 0.177212, -0.944346]
----
-Label        : 1
-Position     : [1284.15, 977.551]
-Measurements : [1821.92, 280682, 0.200975, -0.625485]
----
-Label        : 1
-Position     : [248.008, 978.166]
-Measurements : [1499.06, 699766, -0.0514878, -1.65725]
----
-Label        : 1
-Position     : [251.88, 978.288]
-Measurements : [1656.71, 488833, -0.117968, -1.45545]
----
-Label        : 1
-Position     : [876.193, 978.927]
-Measurements : [1149.59, 303422, 0.32204, -1.08348]
----
-Label        : 1
-Position     : [881.111, 979.819]
-Measurements : [1152.07, 218253, 1.06564, 0.74056]
----
-Label        : 1
-Position     : [897.484, 979.977]
-Measurements : [1162.16, 247030, 0.114829, -1.09992]
----
-Label        : 1
-Position     : [1386.36, 980.121]
-Measurements : [1369.07, 133664, 0.511641, 0.451447]
----
-Label        : 1
-Position     : [827.852, 980.386]
-Measurements : [1476.57, 191894, 0.0869782, -0.389603]
----
-Label        : 1
-Position     : [897.272, 980.399]
-Measurements : [1101.28, 259293, 0.35185, -1.09649]
----
-Label        : 1
-Position     : [955.127, 980.592]
-Measurements : [1214.9, 107748, 0.988645, 1.16339]
----
-Label        : 1
-Position     : [1281.46, 981.162]
-Measurements : [1485.92, 231315, 0.493536, 0.599135]
----
-Label        : 1
-Position     : [1392.4, 981.27]
-Measurements : [1260.96, 204932, 0.415416, 0.168656]
----
-Label        : 1
-Position     : [828.196, 981.294]
-Measurements : [1546.73, 213615, 0.311081, -0.251995]
----
-Label        : 1
-Position     : [1280.27, 981.759]
-Measurements : [1411.94, 194601, 0.310734, 0.383798]
----
-Label        : 1
-Position     : [1284.51, 982.712]
-Measurements : [1447.79, 338113, 0.547702, 0.110556]
----
-Label        : 1
-Position     : [1385.26, 983.696]
-Measurements : [1180.72, 177156, 0.0379326, -0.378221]
----
-Label        : 1
-Position     : [955.177, 983.774]
-Measurements : [1075.65, 180390, 0.709784, -0.102524]
----
-Label        : 1
-Position     : [829.41, 983.858]
-Measurements : [1389.14, 227555, -0.177149, -0.992502]
----
-Label        : 1
-Position     : [875.366, 984.073]
-Measurements : [1417.13, 539295, 0.154007, -1.31158]
----
-Label        : 1
-Position     : [897.658, 984.445]
-Measurements : [1169.97, 385368, 0.303398, -1.46837]
----
-Label        : 1
-Position     : [1384.29, 984.45]
-Measurements : [1051.99, 197370, 0.288829, -0.769384]
----
-Label        : 1
-Position     : [1392.5, 984.626]
-Measurements : [1346.61, 203993, 0.329467, -0.366172]
----
-Label        : 1
-Position     : [953.055, 984.735]
-Measurements : [1021.22, 203614, 0.831625, -0.242744]
----
-Label        : 1
-Position     : [820.918, 984.776]
-Measurements : [987.366, 151414, 0.459284, -0.507995]
----
-Label        : 1
-Position     : [831.953, 985.012]
-Measurements : [1129.68, 334292, 0.341506, -1.41518]
----
-Label        : 1
-Position     : [1400.35, 985.37]
-Measurements : [1050.77, 156916, 0.13651, -1.14777]
----
-Label        : 1
-Position     : [825.394, 985.711]
-Measurements : [1158.59, 302558, 0.171643, -1.38353]
----
-Label        : 1
-Position     : [1390.67, 986.844]
-Measurements : [1335.72, 231852, 0.10142, -0.421343]
----
-Label        : 1
-Position     : [874.373, 986.901]
-Measurements : [1497.22, 455005, 0.125584, -1.17985]
----
-Label        : 1
-Position     : [235.056, 987.666]
-Measurements : [823.383, 260125, 1.37442, 0.455146]
----
-Label        : 1
-Position     : [928.821, 987.682]
-Measurements : [864.292, 283639, 1.0375, -0.290745]
----
-Label        : 1
-Position     : [875.401, 988.633]
-Measurements : [1458.98, 484773, 0.172421, -1.21011]
----
-Label        : 1
-Position     : [876.574, 988.663]
-Measurements : [1443.8, 471873, 0.304372, -1.19915]
----
-Label        : 1
-Position     : [892.875, 988.736]
-Measurements : [1313.69, 352399, 0.0736347, -1.20572]
----
-Label        : 1
-Position     : [873.727, 988.988]
-Measurements : [1417.67, 548627, 0.119971, -1.31317]
----
-Label        : 1
-Position     : [895.436, 988.988]
-Measurements : [1323.42, 403326, -0.0106431, -1.40192]
----
-Label        : 1
-Position     : [1400.65, 988.995]
-Measurements : [1094.77, 157604, 0.125781, -1.12968]
----
-Label        : 1
-Position     : [1275.77, 989.542]
-Measurements : [957.331, 78178.5, 0.979546, 0.153178]
----
-Label        : 1
-Position     : [931.077, 989.802]
-Measurements : [976.837, 240082, 0.840538, -0.420916]
----
-Label        : 1
-Position     : [931.071, 989.807]
-Measurements : [976.837, 240082, 0.840538, -0.420916]
----
-Label        : 1
-Position     : [950.401, 990.117]
-Measurements : [1090.42, 340565, 0.620222, -1.06339]
----
-Label        : 1
-Position     : [1395.78, 990.361]
-Measurements : [1336.31, 173508, 0.508083, -0.226791]
----
-Label        : 1
-Position     : [823.788, 990.474]
-Measurements : [947.459, 263002, 0.662846, -0.981008]
----
-Label        : 1
-Position     : [877.057, 991.052]
-Measurements : [1147.23, 351626, 0.910869, -0.253719]
----
-Label        : 1
-Position     : [894.207, 991.446]
-Measurements : [1506.11, 233771, -0.0437177, -0.863989]
----
-Label        : 1
-Position     : [1271.75, 991.563]
-Measurements : [1068.1, 111909, 0.507661, -0.757213]
----
-Label        : 1
-Position     : [337.038, 991.959]
-Measurements : [1843.31, 597338, -0.380222, -1.28537]
----
-Label        : 1
-Position     : [234.472, 992.112]
-Measurements : [1199.61, 359850, 0.665756, -0.847942]
----
-Label        : 1
-Position     : [927.804, 992.513]
-Measurements : [905.049, 259122, 0.880369, -0.410013]
----
-Label        : 1
-Position     : [953.538, 992.785]
-Measurements : [1000.68, 358701, 0.877751, -0.825523]
----
-Label        : 1
-Position     : [890.335, 992.952]
-Measurements : [1244.63, 203391, 0.478306, -0.77062]
----
-Label        : 1
-Position     : [336.288, 993.472]
-Measurements : [1966.99, 667634, -0.431387, -1.31037]
----
-Label        : 1
-Position     : [228.84, 993.648]
-Measurements : [888.157, 219491, 0.977918, 0.430083]
----
-Label        : 1
-Position     : [338.687, 993.799]
-Measurements : [1777.53, 868985, -0.192584, -1.643]
----
-Label        : 1
-Position     : [1273.19, 993.931]
-Measurements : [1297.16, 227104, 0.700475, -0.527313]
----
-Label        : 1
-Position     : [1275.78, 994.132]
-Measurements : [1424.22, 238687, 0.447421, -0.910747]
----
-Label        : 1
-Position     : [822.937, 994.722]
-Measurements : [1076.47, 241128, 0.311301, -1.01506]
----
-Label        : 1
-Position     : [894.384, 995.16]
-Measurements : [1165.59, 344817, 0.441789, -1.02893]
----
-Label        : 1
-Position     : [899.112, 995.171]
-Measurements : [874.958, 377127, 1.30061, 0.185286]
----
-Label        : 1
-Position     : [236.654, 995.231]
-Measurements : [1108.41, 333085, 1.03938, -0.106948]
----
-Label        : 1
-Position     : [890.93, 995.542]
-Measurements : [1033.65, 241372, 0.688002, -0.503646]
----
-Label        : 1
-Position     : [891.275, 995.774]
-Measurements : [1090.8, 285980, 0.641451, -0.636577]
----
-Label        : 1
-Position     : [231.86, 996.209]
-Measurements : [1120.07, 309761, 1.00491, 0.103579]
----
-Label        : 1
-Position     : [1271.67, 996.505]
-Measurements : [1435.34, 134651, 0.466114, -0.459477]
----
-Label        : 1
-Position     : [950.422, 996.827]
-Measurements : [896.464, 380539, 1.05439, -0.539485]
----
-Label        : 1
-Position     : [224.103, 996.846]
-Measurements : [647.548, 91030.6, 0.941581, -0.386955]
----
-Label        : 1
-Position     : [931.881, 996.897]
-Measurements : [1069.97, 301124, 0.975649, 0.108209]
----
-Label        : 1
-Position     : [929.433, 997.18]
-Measurements : [1190.73, 388327, 0.616594, -0.605661]
----
-Label        : 1
-Position     : [1269.47, 998.164]
-Measurements : [1441.64, 93522.6, 0.56024, -0.13933]
----
-Label        : 1
-Position     : [923.878, 998.225]
-Measurements : [948.878, 366884, 0.777027, -0.704832]
----
-Label        : 1
-Position     : [1022.12, 999.198]
-Measurements : [1219.98, 493217, 0.551643, -1.08479]
----
-Label        : 1
-Position     : [213.992, 999.28]
-Measurements : [1030.47, 342705, 0.50527, -1.21772]
----
-Label        : 1
-Position     : [1392.66, 999.361]
-Measurements : [987.046, 257082, 0.705102, -0.484276]
----
-Label        : 1
-Position     : [995.609, 999.441]
-Measurements : [1377.52, 500426, 0.492417, -1.0831]
----
-Label        : 1
-Position     : [824.318, 999.503]
-Measurements : [1141.09, 178572, 0.568994, -0.35397]
----
-Label        : 1
-Position     : [1394.14, 1000.19]
-Measurements : [1184.25, 301255, 0.41854, -0.942255]
----
-Label        : 1
-Position     : [1392.1, 1000.64]
-Measurements : [984.914, 275909, 0.697065, -0.681816]
----
-Label        : 1
-Position     : [886.747, 1000.76]
-Measurements : [1089.03, 408982, 0.974528, -0.390945]
----
-Label        : 1
-Position     : [926.975, 1000.87]
-Measurements : [1275.47, 390118, 0.353751, -0.819639]
----
-Label        : 1
-Position     : [1267.72, 1000.92]
-Measurements : [1410.81, 161462, 0.262529, -0.405459]
----
-Label        : 1
-Position     : [1015.1, 1001.07]
-Measurements : [1273.03, 279041, 0.329967, -0.609171]
----
-Label        : 1
-Position     : [888.128, 1001.33]
-Measurements : [1127.05, 486644, 0.726622, -1.00996]
----
-Label        : 1
-Position     : [1019.48, 1001.39]
-Measurements : [1442.73, 360975, 0.00625498, -0.806646]
----
-Label        : 1
-Position     : [216.181, 1001.43]
-Measurements : [1105.2, 314518, 0.451184, -1.31583]
----
-Label        : 1
-Position     : [926.778, 1001.76]
-Measurements : [1284.46, 379248, 0.369351, -0.787604]
----
-Label        : 1
-Position     : [869.934, 1002.46]
-Measurements : [1390.57, 575316, 0.1615, -1.34199]
----
-Label        : 1
-Position     : [217.249, 1002.78]
-Measurements : [1067.01, 328301, 0.513509, -1.24531]
----
-Label        : 1
-Position     : [992.86, 1003.43]
-Measurements : [1779.6, 399661, -0.564617, -0.692851]
----
-Label        : 1
-Position     : [870.077, 1003.45]
-Measurements : [1440.52, 504865, 0.209036, -1.25108]
----
-Label        : 1
-Position     : [1269.21, 1003.88]
-Measurements : [1459.03, 128136, 0.663002, -0.357936]
----
-Label        : 0
-Position     : [282.567, 1003.91]
-Measurements : [1252.8, 25843.1, -0.0383469, 0.362406]
----
-Label        : 1
-Position     : [703.424, 1004.03]
-Measurements : [1048.61, 243968, 0.763644, -0.436417]
----
-Label        : 1
-Position     : [709.977, 1004.48]
-Measurements : [1061.13, 206013, 0.896454, 0.163068]
----
-Label        : 1
-Position     : [888.882, 1004.55]
-Measurements : [1141.59, 522293, 0.615074, -1.24156]
----
-Label        : 1
-Position     : [867.877, 1004.69]
-Measurements : [1655.86, 395553, -0.341958, -0.729228]
----
-Label        : 1
-Position     : [868.94, 1004.78]
-Measurements : [1633.78, 403401, -0.217203, -0.946224]
----
-Label        : 1
-Position     : [699.718, 1005.26]
-Measurements : [1138.25, 139985, 0.205838, -0.342353]
----
-Label        : 1
-Position     : [991.52, 1005.97]
-Measurements : [1882.88, 257856, -0.595033, -0.113627]
----
-Label        : 1
-Position     : [870.117, 1006.2]
-Measurements : [1621.85, 380527, 0.147772, -1.32299]
----
-Label        : 1
-Position     : [696.433, 1006.28]
-Measurements : [1140.91, 203703, 1.55049, 4.04098]
----
-Label        : 1
-Position     : [816.972, 1006.32]
-Measurements : [817.865, 171304, 0.782614, -0.658862]
----
-Label        : 1
-Position     : [995.586, 1006.45]
-Measurements : [1817.98, 382625, -0.518557, -0.947025]
----
-Label        : 1
-Position     : [867.066, 1006.56]
-Measurements : [1794.13, 276251, -0.372612, -0.366228]
----
-Label        : 1
-Position     : [712.407, 1006.69]
-Measurements : [1010.34, 158028, 0.929452, 0.548854]
----
-Label        : 1
-Position     : [696.714, 1006.9]
-Measurements : [1140.91, 203703, 1.55049, 4.04098]
----
-Label        : 1
-Position     : [946.753, 1006.9]
-Measurements : [1082.25, 462942, 0.647338, -1.08076]
----
-Label        : 1
-Position     : [710.077, 1007.22]
-Measurements : [1227.13, 301506, 0.866963, -0.1058]
----
-Label        : 1
-Position     : [1019.48, 1007.53]
-Measurements : [1693.31, 251576, -0.0321073, -0.569145]
----
-Label        : 1
-Position     : [693.992, 1007.61]
-Measurements : [1565.98, 376726, 0.746471, -0.134896]
----
-Label        : 1
-Position     : [924.927, 1007.83]
-Measurements : [1200.83, 331153, 0.368665, -0.861583]
----
-Label        : 1
-Position     : [704.215, 1007.92]
-Measurements : [1282.04, 377201, 0.612415, -0.585596]
----
-Label        : 1
-Position     : [947.394, 1007.94]
-Measurements : [1187.06, 489086, 0.440758, -1.25083]
----
-Label        : 1
-Position     : [1265.95, 1008.18]
-Measurements : [1211.42, 202578, 0.746548, 0.0767465]
----
-Label        : 1
-Position     : [992.45, 1008.35]
-Measurements : [1838.33, 274682, -0.375355, -0.516956]
----
-Label        : 1
-Position     : [1273.46, 1008.42]
-Measurements : [1608.58, 302901, -0.015788, -1.12544]
----
-Label        : 1
-Position     : [824.096, 1008.47]
-Measurements : [773.892, 144827, 1.03437, -0.0792007]
----
-Label        : 1
-Position     : [335.85, 1009.13]
-Measurements : [704.709, 180870, 1.46501, 0.967326]
----
-Label        : 1
-Position     : [80.4177, 1009.16]
-Measurements : [1237.15, 164794, 0.687169, -0.0888316]
----
-Label        : 1
-Position     : [987.753, 1009.31]
-Measurements : [1416.1, 393782, -0.182936, -1.09392]
----
-Label        : 1
-Position     : [918.862, 1009.34]
-Measurements : [851.816, 240039, 0.707326, -0.93859]
----
-Label        : 1
-Position     : [79.336, 1009.52]
-Measurements : [1249.22, 159618, 0.804945, -0.0250845]
----
-Label        : 1
-Position     : [186.436, 1009.55]
-Measurements : [1508.42, 512819, -0.437206, -1.35607]
----
-Label        : 1
-Position     : [1014.54, 1010.22]
-Measurements : [1347.25, 325720, 0.553551, -0.607395]
----
-Label        : 1
-Position     : [865.651, 1010.22]
-Measurements : [1790.28, 360478, -0.303782, -0.551975]
----
-Label        : 1
-Position     : [195.171, 1010.32]
-Measurements : [1209.92, 481432, 0.606674, -0.833103]
----
-Label        : 1
-Position     : [689.47, 1010.38]
-Measurements : [1805.01, 636897, 0.0295537, -1.13368]
----
-Label        : 1
-Position     : [673.432, 1010.39]
-Measurements : [1336.94, 384086, 0.00522749, -1.45692]
----
-Label        : 1
-Position     : [699.446, 1010.49]
-Measurements : [1230.52, 246358, 0.699893, 0.429139]
----
-Label        : 1
-Position     : [197.516, 1010.57]
-Measurements : [1007.05, 491115, 1.05784, -0.0912116]
----
-Label        : 0
-Position     : [284.955, 1010.59]
-Measurements : [1175.09, 34992.5, 0.439273, -0.52895]
----
-Label        : 1
-Position     : [1020.54, 1010.65]
-Measurements : [1638.64, 299475, 0.0354473, -0.446996]
----
-Label        : 1
-Position     : [819.962, 1010.66]
-Measurements : [1000.88, 192175, 0.401885, -0.845193]
----
-Label        : 1
-Position     : [865.838, 1010.66]
-Measurements : [1790.28, 360478, -0.303782, -0.551975]
----
-Label        : 1
-Position     : [1019.11, 1010.79]
-Measurements : [1665.97, 261209, 0.207698, -0.410138]
----
-Label        : 1
-Position     : [1021.94, 1010.79]
-Measurements : [1572.58, 380566, -0.0685909, -0.775831]
----
-Label        : 1
-Position     : [667.983, 1010.87]
-Measurements : [1403.72, 281906, 0.0296296, -0.897928]
----
-Label        : 1
-Position     : [984.209, 1011.02]
-Measurements : [1070.4, 341697, 0.165734, -1.55756]
----
-Label        : 1
-Position     : [949.623, 1011.02]
-Measurements : [1477.17, 489272, 0.202019, -1.11097]
----
-Label        : 1
-Position     : [925.642, 1011.05]
-Measurements : [1355, 168027, -0.0345495, -0.550903]
----
-Label        : 1
-Position     : [672.676, 1011.2]
-Measurements : [1410.35, 344015, -0.060858, -1.30959]
----
-Label        : 1
-Position     : [56.4424, 1011.35]
-Measurements : [1359.7, 108998, 0.983302, 0.0592867]
----
-Label        : 1
-Position     : [1266.52, 1011.39]
-Measurements : [1336.94, 247599, 1.14334, 0.649429]
----
-Label        : 1
-Position     : [949.78, 1011.48]
-Measurements : [1477.17, 489272, 0.202019, -1.11097]
----
-Label        : 1
-Position     : [986.242, 1011.82]
-Measurements : [1340.04, 355859, -0.313639, -1.18363]
----
-Label        : 1
-Position     : [1063.72, 1012.04]
-Measurements : [1334.52, 218216, 0.43014, -0.821782]
----
-Label        : 1
-Position     : [673.82, 1012.06]
-Measurements : [1313.82, 381209, 0.120558, -1.46653]
----
-Label        : 1
-Position     : [685.148, 1012.22]
-Measurements : [1354.64, 892285, 0.370112, -1.52039]
----
-Label        : 1
-Position     : [331.168, 1012.42]
-Measurements : [872.201, 167807, 0.808887, -0.581203]
----
-Label        : 1
-Position     : [186.477, 1012.43]
-Measurements : [1958.34, 311656, -0.87901, 0.25566]
----
-Label        : 1
-Position     : [945.756, 1012.45]
-Measurements : [1621.86, 332817, 0.286001, -0.772931]
----
-Label        : 1
-Position     : [195.048, 1012.59]
-Measurements : [1341.3, 493984, 0.368361, -1.10725]
----
-Label        : 1
-Position     : [922.879, 1012.74]
-Measurements : [1397.02, 194509, -0.394176, -0.492827]
----
-Label        : 1
-Position     : [927.255, 1012.75]
-Measurements : [1319.35, 168888, 0.345695, -0.781819]
----
-Label        : 1
-Position     : [870.076, 1012.77]
-Measurements : [1362.65, 346276, 0.995693, -0.378502]
----
-Label        : 1
-Position     : [944.969, 1012.9]
-Measurements : [1553.33, 335442, 0.422129, -0.641062]
----
-Label        : 1
-Position     : [1268.01, 1012.91]
-Measurements : [1505.08, 357987, 0.837311, -0.471997]
----
-Label        : 1
-Position     : [670.942, 1013.03]
-Measurements : [1398.96, 363892, -0.0279529, -1.35289]
----
-Label        : 1
-Position     : [720.199, 1013.06]
-Measurements : [2089.01, 248990, -0.384212, 0.283971]
----
-Label        : 1
-Position     : [721.875, 1013.18]
-Measurements : [2198.27, 219843, -0.155778, -0.182142]
----
-Label        : 1
-Position     : [184.294, 1013.21]
-Measurements : [1974.89, 352723, -0.964301, 0.507504]
----
-Label        : 1
-Position     : [1017.44, 1013.26]
-Measurements : [1531.1, 381005, 0.247374, -0.963339]
----
-Label        : 1
-Position     : [1088.62, 1013.6]
-Measurements : [930.082, 333463, 0.503889, -1.31492]
----
-Label        : 1
-Position     : [666.532, 1013.66]
-Measurements : [1087.4, 355167, 0.615583, -0.850368]
----
-Label        : 1
-Position     : [718.961, 1013.66]
-Measurements : [1858.75, 360391, -0.482358, -0.52879]
----
-Label        : 1
-Position     : [77.8269, 1013.67]
-Measurements : [1090.83, 296080, 0.508568, -1.00207]
----
-Label        : 1
-Position     : [186.856, 1014.13]
-Measurements : [2101.7, 221535, -0.704568, 0.395886]
----
-Label        : 1
-Position     : [1135.61, 1014.8]
-Measurements : [1228.02, 201853, 0.404409, -0.332593]
----
-Label        : 1
-Position     : [59.1503, 1014.96]
-Measurements : [1362.87, 193627, 0.434068, -0.849415]
----
-Label        : 1
-Position     : [1133.21, 1014.99]
-Measurements : [1159.18, 249625, 0.367655, -0.651623]
----
-Label        : 1
-Position     : [182.248, 1015.15]
-Measurements : [1803.83, 444958, -0.550203, -0.577508]
----
-Label        : 1
-Position     : [864.199, 1015.16]
-Measurements : [1580.98, 309313, 0.230618, -0.634304]
----
-Label        : 1
-Position     : [921.54, 1015.26]
-Measurements : [1374.97, 170005, -0.306728, -0.351232]
----
-Label        : 0
-Position     : [295.886, 1015.38]
-Measurements : [942.082, 26170.4, -1.51034, 2.19124]
----
-Label        : 1
-Position     : [333.215, 1015.51]
-Measurements : [657.631, 129639, 1.62728, 1.56926]
----
-Label        : 1
-Position     : [924.758, 1015.53]
-Measurements : [1375.63, 122818, 0.388242, -0.525013]
----
-Label        : 1
-Position     : [1086.67, 1015.6]
-Measurements : [1155.62, 297921, -0.082828, -1.31987]
----
-Label        : 1
-Position     : [55.272, 1015.66]
-Measurements : [1421.39, 228913, 0.114756, -1.18742]
----
-Label        : 1
-Position     : [988.764, 1015.72]
-Measurements : [1747, 192495, -0.70219, 0.628138]
----
-Label        : 1
-Position     : [916.676, 1015.95]
-Measurements : [873.293, 253077, 0.619499, -1.04358]
----
-Label        : 1
-Position     : [814.228, 1015.98]
-Measurements : [1596.2, 484646, -0.0122618, -1.15247]
----
-Label        : 1
-Position     : [1065.29, 1016.05]
-Measurements : [1479.7, 227645, -0.0332878, -1.08239]
----
-Label        : 1
-Position     : [1062.34, 1016.09]
-Measurements : [1544.05, 173198, -0.395395, -0.837399]
----
-Label        : 1
-Position     : [726.612, 1016.1]
-Measurements : [2505.57, 215771, -0.443571, -1.00279]
----
-Label        : 1
-Position     : [863.672, 1016.26]
-Measurements : [1480.3, 366424, 0.198295, -0.682477]
----
-Label        : 1
-Position     : [810.009, 1016.4]
-Measurements : [1611.51, 482474, 0.121139, -1.10883]
----
-Label        : 1
-Position     : [1135.03, 1016.42]
-Measurements : [1132.47, 264809, 0.479531, -0.858834]
----
-Label        : 1
-Position     : [882.738, 1016.43]
-Measurements : [808.791, 183831, 1.08666, -0.122231]
----
-Label        : 1
-Position     : [1012.11, 1016.54]
-Measurements : [1075.15, 284075, 0.640175, -0.200572]
----
-Label        : 1
-Position     : [1088.45, 1016.72]
-Measurements : [1174.37, 332319, -0.0538544, -1.48596]
----
-Label        : 1
-Position     : [1059.02, 1016.84]
-Measurements : [1415.14, 253189, -0.398233, -1.02097]
----
-Label        : 1
-Position     : [1007.46, 1017.03]
-Measurements : [808.232, 152855, 1.05815, 1.12507]
----
-Label        : 1
-Position     : [946.022, 1017.22]
-Measurements : [1264.41, 466567, 0.695817, -0.526606]
----
-Label        : 1
-Position     : [882.754, 1017.57]
-Measurements : [809.583, 181378, 1.1162, -0.0656009]
----
-Label        : 1
-Position     : [726.009, 1017.64]
-Measurements : [2507.08, 224688, -0.455013, -0.97684]
----
-Label        : 1
-Position     : [920.831, 1017.66]
-Measurements : [1313.54, 199176, -0.484826, -0.416592]
----
-Label        : 1
-Position     : [941.66, 1017.77]
-Measurements : [1053.78, 276813, 0.701267, -0.5894]
----
-Label        : 1
-Position     : [1062.49, 1017.77]
-Measurements : [1555.64, 169523, -0.333063, -0.878641]
----
-Label        : 1
-Position     : [736.771, 1017.96]
-Measurements : [2099.71, 384312, 0.314329, -0.894207]
----
-Label        : 1
-Position     : [738.224, 1018.28]
-Measurements : [1970.34, 390868, 0.566064, -0.615688]
----
-Label        : 1
-Position     : [886.533, 1018.6]
-Measurements : [718.274, 164740, 1.5961, 1.2792]
----
-Label        : 1
-Position     : [984.698, 1018.64]
-Measurements : [1664.76, 442059, -0.603316, -0.580731]
----
-Label        : 1
-Position     : [187.35, 1018.84]
-Measurements : [1859.34, 464470, -0.307346, -1.12286]
----
-Label        : 1
-Position     : [862.151, 1018.85]
-Measurements : [1264.47, 439200, 0.571673, -0.639777]
----
-Label        : 1
-Position     : [989.174, 1019]
-Measurements : [1744.47, 314479, -0.364403, -0.523934]
----
-Label        : 1
-Position     : [1264.32, 1019.05]
-Measurements : [1342.94, 74487.3, 0.300554, 0.745904]
----
-Label        : 1
-Position     : [1087.69, 1019.52]
-Measurements : [1344.85, 209870, -0.381023, -0.823602]
----
-Label        : 1
-Position     : [867.407, 1019.66]
-Measurements : [1107.94, 285563, 1.4988, 1.83825]
----
-Label        : 1
-Position     : [738.195, 1019.91]
-Measurements : [1991.97, 398039, 0.687494, -0.573591]
----
-Label        : 1
-Position     : [936.976, 1020.05]
-Measurements : [1033.79, 219848, 0.759106, -0.407318]
----
-Label        : 1
-Position     : [721.718, 1020.26]
-Measurements : [2227.96, 470670, -0.909593, -0.0630635]
----
-Label        : 1
-Position     : [738.533, 1020.27]
-Measurements : [2003.48, 415460, 0.699372, -0.6297]
----
-Label        : 1
-Position     : [1085.44, 1020.51]
-Measurements : [1376.22, 163704, -0.358114, -0.831619]
----
-Label        : 1
-Position     : [812.46, 1020.57]
-Measurements : [2077.83, 216722, -0.575687, 0.558243]
----
-Label        : 1
-Position     : [813.409, 1020.9]
-Measurements : [2067, 279280, -0.671777, 0.218464]
----
-Label        : 1
-Position     : [984.081, 1020.91]
-Measurements : [1795.22, 411441, -0.670199, -0.264932]
----
-Label        : 1
-Position     : [1016.45, 1020.92]
-Measurements : [854.084, 249593, 1.17708, 0.201372]
----
-Label        : 1
-Position     : [170.763, 1020.97]
-Measurements : [734.544, 129177, 0.817929, -0.615007]
----
-Label        : 1
-Position     : [986.102, 1020.99]
-Measurements : [1942.9, 225167, -0.391199, 0.0327143]
----
-Label        : 1
-Position     : [861.695, 1021.2]
-Measurements : [1126.9, 344118, 0.630967, -0.611473]
----
-Label        : 1
-Position     : [733.575, 1021.42]
-Measurements : [2325.61, 338787, 0.0441115, -1.03222]
----
-Label        : 1
-Position     : [741.358, 1021.42]
-Measurements : [1600.48, 132763, 0.217706, 0.087064]
----
-Label        : 1
-Position     : [1064.32, 1022.06]
-Measurements : [1382.81, 205260, 0.142206, -1.26915]
----
-Label        : 1
-Position     : [1268.34, 1022.33]
-Measurements : [1330.16, 197968, -0.223445, -0.612095]
----
-Label        : 1
-Position     : [1131.8, 1022.61]
-Measurements : [1085.66, 390413, 0.43084, -1.36876]
----
-Label        : 1
-Position     : [175.08, 1022.78]
-Measurements : [1166.78, 167020, -0.319599, -0.729617]
----
-Label        : 1
-Position     : [986.325, 1022.91]
-Measurements : [1866.08, 355468, -0.67631, -0.244939]
----
-Label        : 1
-Position     : [1009.93, 1022.98]
-Measurements : [1031.95, 522264, 0.837611, -0.843353]
----
-Label        : 1
-Position     : [986.306, 1023.1]
-Measurements : [1751.63, 460529, -0.473679, -0.913764]
----
-Label        : 1
-Position     : [1060.85, 1023.1]
-Measurements : [1576.69, 157170, -0.641684, -0.343446]
----
-Label        : 1
-Position     : [815.865, 1023.23]
-Measurements : [1805.28, 582916, -0.302783, -1.32167]
----
-Label        : 1
-Position     : [653.921, 1023.46]
-Measurements : [1388.13, 586669, 0.153146, -1.53759]
----
-Label        : 1
-Position     : [655.063, 1023.49]
-Measurements : [1428.91, 551402, 0.102909, -1.50477]
----
-Label        : 1
-Position     : [855.637, 1023.5]
-Measurements : [1093.63, 423964, 0.488439, -1.04901]
----
-Label        : 1
-Position     : [862.968, 1023.55]
-Measurements : [1119.25, 357591, 0.897059, -0.252146]
----
-Label        : 1
-Position     : [1267.46, 1023.56]
-Measurements : [1384.85, 187349, -0.237141, -0.541418]
----
-Label        : 1
-Position     : [1131.76, 1023.79]
-Measurements : [1121.9, 387088, 0.377765, -1.41704]
----
-Label        : 1
-Position     : [656.101, 1024.08]
-Measurements : [1418.41, 575588, 0.154365, -1.577]
----
-Label        : 1
-Position     : [749.55, 1024.29]
-Measurements : [2003.47, 254689, 0.190488, -0.639311]
----
-Label        : 1
-Position     : [1080.88, 1024.32]
-Measurements : [1165.23, 164307, 0.160771, -0.914066]
----
-Label        : 1
-Position     : [814.771, 1024.45]
-Measurements : [1751.83, 639973, -0.275082, -1.37547]
----
-Label        : 1
-Position     : [756.95, 1024.53]
-Measurements : [1505.41, 270464, -0.0122335, -1.01706]
----
-Label        : 1
-Position     : [1057.35, 1024.58]
-Measurements : [1583.02, 131644, -0.981531, 0.853314]
----
-Label        : 1
-Position     : [656.443, 1024.59]
-Measurements : [1418.41, 575588, 0.154365, -1.577]
----
-Label        : 1
-Position     : [761.921, 1024.92]
-Measurements : [1373.73, 222951, 0.158324, -0.943853]
----
-Label        : 1
-Position     : [1060.18, 1024.96]
-Measurements : [1554.76, 156984, -0.766471, -0.197774]
----
-Label        : 1
-Position     : [941.525, 1025]
-Measurements : [1312.09, 517932, 0.252852, -1.452]
----
-Label        : 1
-Position     : [940.841, 1025.14]
-Measurements : [1504.59, 491499, -0.129409, -1.33678]
----
-Label        : 1
-Position     : [1262.27, 1025.2]
-Measurements : [1701.02, 157066, -0.030413, -1.02152]
----
-Label        : 1
-Position     : [326.048, 1025.22]
-Measurements : [980.903, 218349, 0.906212, -0.191418]
----
-Label        : 1
-Position     : [1133.28, 1025.3]
-Measurements : [1191.19, 328797, 0.343022, -1.34542]
----
-Label        : 1
-Position     : [810.542, 1025.4]
-Measurements : [1539.92, 573228, -0.0647194, -1.34218]
----
-Label        : 1
-Position     : [1082.96, 1025.52]
-Measurements : [1277.9, 187131, -0.0419008, -1.03164]
----
-Label        : 1
-Position     : [642.366, 1025.53]
-Measurements : [1360.34, 487289, 0.210597, -1.41078]
----
-Label        : 1
-Position     : [880.863, 1025.66]
-Measurements : [1131.23, 314135, 0.380774, -1.07941]
----
-Label        : 1
-Position     : [762.185, 1025.69]
-Measurements : [1523.17, 215515, 0.0387865, -0.51673]
----
-Label        : 1
-Position     : [1083.4, 1025.84]
-Measurements : [1309.23, 185522, -0.123782, -1.0246]
----
-Label        : 1
-Position     : [177.093, 1025.86]
-Measurements : [1210.52, 113802, -0.172761, -0.929843]
----
-Label        : 1
-Position     : [944.637, 1025.93]
-Measurements : [1107.62, 572645, 0.802953, -0.963507]
----
-Label        : 1
-Position     : [328.101, 1026.07]
-Measurements : [843.462, 252753, 1.24953, 0.263152]
----
-Label        : 1
-Position     : [1257.29, 1026.1]
-Measurements : [1615.18, 266341, -0.198848, -1.00919]
----
-Label        : 1
-Position     : [858.874, 1026.22]
-Measurements : [1459.64, 420848, -0.0181147, -1.26278]
----
-Label        : 1
-Position     : [815.491, 1026.28]
-Measurements : [1355.87, 674522, 0.453067, -1.3458]
----
-Label        : 1
-Position     : [644.935, 1026.34]
-Measurements : [1294.27, 573366, 0.480333, -1.17723]
----
-Label        : 1
-Position     : [1057.99, 1026.37]
-Measurements : [1542.85, 137728, -0.791577, 0.323243]
----
-Label        : 1
-Position     : [935.254, 1026.67]
-Measurements : [1476.71, 354669, 0.173339, -1.11225]
----
-Label        : 1
-Position     : [1007.2, 1026.78]
-Measurements : [1350.49, 363882, 0.0987247, -0.793205]
----
-Label        : 1
-Position     : [812.409, 1026.82]
-Measurements : [1430.55, 598980, 0.169515, -1.4309]
----
-Label        : 0
-Position     : [272.167, 1027.14]
-Measurements : [1038.38, 48306.7, 0.966819, 0.267208]
----
-Label        : 1
-Position     : [756.103, 1027.16]
-Measurements : [1731.74, 230366, -0.0394879, -0.223761]
----
-Label        : 1
-Position     : [1064.07, 1027.57]
-Measurements : [1167.02, 145886, 0.587079, -0.65369]
----
-Label        : 0
-Position     : [257.6, 1027.78]
-Measurements : [1244.32, 27589.8, -0.135492, -0.0876443]
----
-Label        : 1
-Position     : [882.117, 1027.78]
-Measurements : [1285.63, 493198, 0.446053, -0.904536]
----
-Label        : 1
-Position     : [640.762, 1027.88]
-Measurements : [1659.11, 430891, -0.0117133, -0.967989]
----
-Label        : 1
-Position     : [1060.53, 1028.02]
-Measurements : [1464.46, 197097, -0.474405, -0.804553]
----
-Label        : 1
-Position     : [655.379, 1028.06]
-Measurements : [1125.46, 628663, 0.801665, -1.02351]
----
-Label        : 1
-Position     : [749.852, 1028.2]
-Measurements : [2075.55, 282163, -0.0782922, -0.504301]
----
-Label        : 0
-Position     : [251.691, 1028.21]
-Measurements : [1301.12, 23487.7, -0.680369, 0.843609]
----
-Label        : 1
-Position     : [860.775, 1028.35]
-Measurements : [1402.43, 398964, 0.309612, -1.18305]
----
-Label        : 1
-Position     : [754.064, 1028.61]
-Measurements : [1832.58, 232607, -0.0412702, 0.161256]
----
-Label        : 1
-Position     : [1080.66, 1028.79]
-Measurements : [1290.42, 163005, 0.151376, -0.800647]
----
-Label        : 1
-Position     : [324.001, 1028.87]
-Measurements : [997.57, 206857, 0.829232, 0.116221]
----
-Label        : 1
-Position     : [883.836, 1028.89]
-Measurements : [1301.99, 537376, 0.407466, -1.08298]
----
-Label        : 1
-Position     : [941.932, 1029.02]
-Measurements : [1701.05, 509993, -0.448159, -1.15055]
----
-Label        : 1
-Position     : [856.671, 1029.06]
-Measurements : [1398.6, 473694, 0.0240091, -1.35056]
----
-Label        : 1
-Position     : [763.886, 1029.21]
-Measurements : [1895.26, 241352, 0.54383, -0.635985]
----
-Label        : 1
-Position     : [940.022, 1029.24]
-Measurements : [1814.52, 390505, -0.638647, -0.609735]
----
-Label        : 1
-Position     : [880.454, 1029.34]
-Measurements : [1686.67, 360723, 0.0448314, -0.593499]
----
-Label        : 1
-Position     : [856.826, 1029.5]
-Measurements : [1398.6, 473694, 0.0240091, -1.35056]
----
-Label        : 1
-Position     : [1005.78, 1029.5]
-Measurements : [1460.45, 253642, 0.0529343, -0.417337]
----
-Label        : 1
-Position     : [1260.13, 1029.62]
-Measurements : [1903.15, 202993, -1.15059, 0.948008]
----
-Label        : 1
-Position     : [167.4, 1029.94]
-Measurements : [1184.95, 299723, 0.890291, -0.132169]
----
-Label        : 1
-Position     : [877.518, 1029.95]
-Measurements : [1681.92, 292992, 0.11127, -0.448425]
----
-Label        : 0
-Position     : [269.418, 1029.99]
-Measurements : [1007.05, 33156.2, 1.00998, 0.401464]
----
-Label        : 0
-Position     : [242.957, 1030.17]
-Measurements : [1255, 17424.4, 0.972226, 1.28589]
----
-Label        : 1
-Position     : [1085.1, 1030.21]
-Measurements : [1213.74, 312211, 0.187014, -1.36812]
----
-Label        : 1
-Position     : [1082.17, 1030.22]
-Measurements : [1386.25, 206264, -0.0311393, -0.962463]
----
-Label        : 1
-Position     : [857.55, 1030.27]
-Measurements : [1387.95, 471130, 0.100029, -1.37031]
----
-Label        : 1
-Position     : [1080.94, 1030.34]
-Measurements : [1387.24, 180290, 0.0585538, -0.683365]
----
-Label        : 1
-Position     : [935.021, 1030.51]
-Measurements : [1781.97, 356160, -0.486212, -0.757765]
----
-Label        : 1
-Position     : [159.303, 1030.58]
-Measurements : [1594.29, 338365, -0.0868325, -0.801627]
----
-Label        : 1
-Position     : [1265.33, 1030.69]
-Measurements : [1695.76, 273317, -0.462513, -0.875079]
----
-Label        : 1
-Position     : [1077.03, 1031.25]
-Measurements : [1282.05, 192334, 0.626232, 0.0199522]
----
-Label        : 0
-Position     : [238.223, 1031.41]
-Measurements : [1242.49, 20201.5, 1.26403, 1.00798]
----
-Label        : 1
-Position     : [1133.58, 1031.57]
-Measurements : [1138.15, 219688, 0.795919, -0.185524]
----
-Label        : 1
-Position     : [1007.2, 1031.7]
-Measurements : [1587, 215822, -0.011973, -0.360132]
----
-Label        : 1
-Position     : [1053.89, 1031.7]
-Measurements : [1632.77, 177635, -0.646424, 0.16489]
----
-Label        : 1
-Position     : [1261.45, 1031.75]
-Measurements : [1730.4, 392720, -0.76864, -0.749569]
----
-Label        : 1
-Position     : [935.162, 1031.77]
-Measurements : [1837.56, 326526, -0.571069, -0.575642]
----
-Label        : 1
-Position     : [987.652, 1031.91]
-Measurements : [1094.94, 289525, 0.761332, -0.686408]
----
-Label        : 0
-Position     : [286.021, 1032.02]
-Measurements : [809.406, 62497.4, -0.102264, -1.50675]
----
-Label        : 1
-Position     : [760.207, 1032.15]
-Measurements : [1838.53, 420923, -0.207162, -0.858116]
----
-Label        : 1
-Position     : [875.645, 1032.28]
-Measurements : [1668.09, 400150, -0.100869, -0.837956]
----
-Label        : 1
-Position     : [912.242, 1032.29]
-Measurements : [1383.41, 495121, -0.0460259, -1.38845]
----
-Label        : 1
-Position     : [146.655, 1032.44]
-Measurements : [976.944, 414042, 0.830243, -0.821906]
----
-Label        : 1
-Position     : [881.681, 1032.46]
-Measurements : [1866.71, 517759, -0.461058, -0.74473]
----
-Label        : 1
-Position     : [770.849, 1032.48]
-Measurements : [1482.36, 236619, -0.306471, -1.02113]
----
-Label        : 1
-Position     : [165.265, 1032.68]
-Measurements : [1441.79, 419345, 0.471949, -1.10492]
----
-Label        : 1
-Position     : [1054.74, 1032.72]
-Measurements : [1669.25, 137403, -0.218256, -0.588729]
----
-Label        : 1
-Position     : [167.408, 1032.75]
-Measurements : [1186.03, 287936, 1.0184, -0.0205003]
----
-Label        : 1
-Position     : [983.03, 1032.93]
-Measurements : [1266.25, 393476, 0.0919286, -1.56161]
----
-Label        : 1
-Position     : [1082.36, 1032.97]
-Measurements : [1400.67, 269406, 0.146483, -0.878449]
----
-Label        : 1
-Position     : [160.744, 1033.02]
-Measurements : [1654.36, 371864, -0.0919938, -1.01792]
----
-Label        : 1
-Position     : [641.956, 1033.32]
-Measurements : [1798.7, 652497, -0.262156, -1.22929]
----
-Label        : 1
-Position     : [150.804, 1033.44]
-Measurements : [1500.68, 423158, -0.400539, -0.989649]
----
-Label        : 1
-Position     : [913.804, 1033.56]
-Measurements : [1552.28, 446671, -0.225919, -1.07268]
----
-Label        : 1
-Position     : [1126.38, 1033.72]
-Measurements : [1046.26, 131728, -0.0776579, -1.03481]
----
-Label        : 1
-Position     : [915.27, 1033.85]
-Measurements : [1469.71, 511551, -0.0580154, -1.31591]
----
-Label        : 1
-Position     : [938.285, 1033.87]
-Measurements : [1870.49, 422287, -0.774424, -0.493746]
----
-Label        : 1
-Position     : [1129.3, 1034.03]
-Measurements : [1170.67, 120077, 0.0862773, -0.443696]
----
-Label        : 1
-Position     : [155.112, 1034.04]
-Measurements : [1866.39, 233003, -0.627476, 0.160293]
----
-Label        : 1
-Position     : [852.409, 1034.04]
-Measurements : [896.976, 279769, 1.03476, 0.430181]
----
-Label        : 1
-Position     : [637.977, 1034.07]
-Measurements : [1287.39, 779676, 0.484678, -1.39557]
----
-Label        : 1
-Position     : [1011.28, 1034.07]
-Measurements : [1293.2, 338822, 0.0345925, -1.18182]
----
-Label        : 1
-Position     : [813.164, 1034.09]
-Measurements : [975.84, 428454, 1.19036, -0.0895063]
----
-Label        : 1
-Position     : [1054.49, 1034.15]
-Measurements : [1674.4, 160525, -0.293266, -0.353772]
----
-Label        : 1
-Position     : [937.974, 1034.15]
-Measurements : [1875.16, 377493, -0.676508, -0.513657]
----
-Label        : 1
-Position     : [883.58, 1034.17]
-Measurements : [1658.68, 762804, -0.0607206, -1.51013]
----
-Label        : 1
-Position     : [1080.12, 1034.44]
-Measurements : [1502.55, 215302, -0.00869173, -0.625372]
----
-Label        : 1
-Position     : [1056.53, 1034.79]
-Measurements : [1610.14, 153409, -0.0891148, -0.630557]
----
-Label        : 1
-Position     : [807.369, 1034.87]
-Measurements : [1442.14, 509837, -0.0458841, -1.32057]
----
-Label        : 1
-Position     : [153.259, 1034.89]
-Measurements : [1870.4, 198087, -0.768268, 0.704529]
----
-Label        : 1
-Position     : [1005.16, 1035.2]
-Measurements : [1482.87, 282322, -0.213725, -0.869752]
----
-Label        : 1
-Position     : [929.824, 1035.22]
-Measurements : [1538.04, 338878, 0.272465, -1.4371]
----
-Label        : 1
-Position     : [808.494, 1035.23]
-Measurements : [1543.7, 523076, -0.0880556, -1.07464]
----
-Label        : 1
-Position     : [774.828, 1035.69]
-Measurements : [969.554, 332057, 1.07781, -0.334684]
----
-Label        : 1
-Position     : [1260.87, 1035.75]
-Measurements : [1154.42, 711934, 0.434936, -1.60446]
----
-Label        : 1
-Position     : [879.225, 1035.9]
-Measurements : [1967.05, 492325, -0.558617, -0.502236]
----
-Label        : 1
-Position     : [638.094, 1035.98]
-Measurements : [1348.38, 858416, 0.438947, -1.44851]
----
-Label        : 1
-Position     : [148.968, 1036.09]
-Measurements : [1426.17, 489730, -0.176841, -1.53226]
----
-Label        : 1
-Position     : [912.592, 1036.42]
-Measurements : [1529.38, 475893, -0.18154, -1.23275]
----
-Label        : 1
-Position     : [934.287, 1036.61]
-Measurements : [1907.55, 314310, -0.838271, -0.0506724]
----
-Label        : 1
-Position     : [770.767, 1036.78]
-Measurements : [1281.68, 328566, 0.208758, -1.37306]
----
-Label        : 0
-Position     : [239.025, 1036.85]
-Measurements : [1293.66, 16028.4, 1.08529, 0.360448]
----
-Label        : 1
-Position     : [911.26, 1037.02]
-Measurements : [1361.74, 564362, 0.162223, -1.46272]
----
-Label        : 1
-Position     : [913.631, 1037.12]
-Measurements : [1528.85, 468633, -0.0826088, -1.29753]
----
-Label        : 1
-Position     : [983.695, 1037.27]
-Measurements : [1497.89, 280322, -0.229051, -1.21935]
----
-Label        : 1
-Position     : [854.778, 1037.28]
-Measurements : [795.104, 129969, 0.519423, -1.2366]
----
-Label        : 1
-Position     : [158.596, 1037.38]
-Measurements : [1512.37, 464476, 0.205104, -1.25934]
----
-Label        : 1
-Position     : [627.62, 1037.41]
-Measurements : [1154.03, 300318, -0.0207254, -1.47387]
----
-Label        : 1
-Position     : [981.554, 1037.71]
-Measurements : [1611.52, 221362, -0.560527, -0.604136]
----
-Label        : 1
-Position     : [631.524, 1037.74]
-Measurements : [1015.36, 333822, 0.481501, -1.47823]
----
-Label        : 1
-Position     : [979.753, 1037.84]
-Measurements : [1644.13, 214514, -0.536419, -0.433746]
----
-Label        : 1
-Position     : [1055.53, 1038.25]
-Measurements : [1397.33, 349448, -0.0910156, -1.19059]
----
-Label        : 1
-Position     : [155.898, 1038.33]
-Measurements : [1628.8, 421966, -0.151455, -1.27603]
----
-Label        : 1
-Position     : [322.976, 1038.53]
-Measurements : [1139.71, 247121, 0.663428, -0.28784]
----
-Label        : 1
-Position     : [1080.92, 1038.65]
-Measurements : [1707.92, 285089, -0.225023, -0.595941]
----
-Label        : 0
-Position     : [289.017, 1038.73]
-Measurements : [1082.72, 22752.4, -2.76782, 7.6198]
----
-Label        : 1
-Position     : [1007.61, 1039.07]
-Measurements : [1363.53, 271353, 0.377418, -0.884089]
----
-Label        : 1
-Position     : [125.861, 1039.14]
-Measurements : [651.268, 187701, 2.35487, 4.8285]
----
-Label        : 1
-Position     : [321.93, 1039.41]
-Measurements : [1155.02, 217567, 0.711923, 0.0246444]
----
-Label        : 1
-Position     : [321.633, 1039.68]
-Measurements : [1155.02, 217567, 0.711923, 0.0246444]
----
-Label        : 1
-Position     : [622.903, 1040.3]
-Measurements : [713.301, 212250, 1.3097, 0.285215]
----
-Label        : 1
-Position     : [135.026, 1040.52]
-Measurements : [1656.79, 358402, -0.325768, -0.925886]
----
-Label        : 1
-Position     : [806.446, 1040.97]
-Measurements : [1907.42, 332193, 0.273794, -0.395531]
----
-Label        : 1
-Position     : [1079.3, 1040.99]
-Measurements : [1769.55, 232067, -0.216072, -0.34918]
----
-Label        : 1
-Position     : [1129.3, 1040.99]
-Measurements : [1334.24, 161281, 0.198236, -0.875272]
----
-Label        : 1
-Position     : [976.563, 1041.09]
-Measurements : [1606.62, 295623, -0.690447, -0.437781]
----
-Label        : 1
-Position     : [1051.44, 1041.11]
-Measurements : [1048.97, 312331, 0.602824, -0.978273]
----
-Label        : 1
-Position     : [1131.81, 1041.21]
-Measurements : [1272.24, 167795, 0.541475, -0.911862]
----
-Label        : 1
-Position     : [853.113, 1041.47]
-Measurements : [695.979, 130009, 0.928513, -0.739818]
----
-Label        : 1
-Position     : [138.728, 1041.72]
-Measurements : [1528.77, 400717, -0.0632972, -1.30892]
----
-Label        : 1
-Position     : [932.269, 1041.78]
-Measurements : [1658.61, 355829, -0.0486442, -0.947067]
----
-Label        : 1
-Position     : [1082.81, 1042.25]
-Measurements : [1521.01, 459423, -0.109999, -1.35876]
----
-Label        : 1
-Position     : [617.439, 1042.25]
-Measurements : [683.637, 107433, 1.58998, 3.88638]
----
-Label        : 1
-Position     : [1050.53, 1042.3]
-Measurements : [1041.54, 326445, 0.664316, -0.842964]
----
-Label        : 1
-Position     : [805.073, 1042.66]
-Measurements : [1821.69, 329339, 0.399071, -0.209585]
----
-Label        : 1
-Position     : [1003.57, 1042.9]
-Measurements : [1194.3, 219613, 0.969682, 0.253967]
----
-Label        : 1
-Position     : [1006.7, 1042.96]
-Measurements : [1234.41, 231249, 0.697452, -0.182632]
----
-Label        : 1
-Position     : [905.134, 1043.02]
-Measurements : [855.489, 273619, 0.9507, -0.646299]
----
-Label        : 1
-Position     : [1126.51, 1043.19]
-Measurements : [1514.7, 189144, -0.227025, -0.440306]
----
-Label        : 1
-Position     : [978.948, 1043.45]
-Measurements : [1564.47, 298323, -0.429589, -0.908748]
----
-Label        : 1
-Position     : [1258.19, 1043.57]
-Measurements : [867.112, 505976, 1.11019, -0.0693125]
----
-Label        : 1
-Position     : [129, 1043.77]
-Measurements : [813.898, 180564, 0.982528, -0.177614]
----
-Label        : 1
-Position     : [800.931, 1043.81]
-Measurements : [1365.89, 243373, 0.684081, 0.0443715]
----
-Label        : 1
-Position     : [809.213, 1044.01]
-Measurements : [1440.64, 670291, 0.518934, -0.90807]
----
-Label        : 1
-Position     : [872.671, 1044.09]
-Measurements : [1045.58, 211320, 0.219806, -0.887694]
----
-Label        : 1
-Position     : [1074.61, 1044.52]
-Measurements : [1560.07, 251991, -0.761766, -0.360482]
----
-Label        : 1
-Position     : [865.912, 1044.84]
-Measurements : [968.715, 60020.7, 0.143519, 0.358597]
----
-Label        : 1
-Position     : [1077.25, 1045.09]
-Measurements : [1772.23, 238859, -0.522419, -0.0823446]
----
-Label        : 1
-Position     : [617.38, 1045.19]
-Measurements : [954.533, 398827, 1.36306, 0.764816]
----
-Label        : 1
-Position     : [870.265, 1045.34]
-Measurements : [1098.49, 168294, 0.155758, -0.537022]
----
-Label        : 1
-Position     : [907.724, 1045.44]
-Measurements : [1015.01, 282826, 0.536376, -1.17681]
----
-Label        : 1
-Position     : [932.663, 1045.5]
-Measurements : [1180.45, 349897, 0.663551, -0.326637]
----
-Label        : 1
-Position     : [1127.43, 1045.54]
-Measurements : [1517.45, 179369, 0.137356, -0.868399]
----
-Label        : 1
-Position     : [982.624, 1045.68]
-Measurements : [1229.86, 235079, 0.368175, -1.04298]
----
-Label        : 1
-Position     : [909.126, 1045.73]
-Measurements : [1056.16, 263460, 0.519544, -1.18938]
----
-Label        : 1
-Position     : [134.316, 1045.82]
-Measurements : [1433.67, 392368, 0.120719, -1.12437]
----
-Label        : 1
-Position     : [803.169, 1045.88]
-Measurements : [1528.5, 261624, 0.239072, 0.147247]
----
-Label        : 1
-Position     : [871.946, 1045.89]
-Measurements : [1121.3, 183930, 0.051699, -0.663256]
----
-Label        : 1
-Position     : [1126.84, 1045.91]
-Measurements : [1542.98, 183047, 0.00208728, -0.749214]
----
-Label        : 1
-Position     : [937.331, 1046]
-Measurements : [842.393, 271272, 1.59062, 1.84349]
----
-Label        : 1
-Position     : [1007.36, 1046.25]
-Measurements : [1027.95, 126471, 0.395127, 0.0841846]
----
-Label        : 1
-Position     : [129.758, 1046.26]
-Measurements : [835.443, 191020, 0.735665, -0.829876]
----
-Label        : 1
-Position     : [1050.22, 1046.32]
-Measurements : [1166.11, 280870, 0.366481, -0.873089]
----
-Label        : 1
-Position     : [977.763, 1046.59]
-Measurements : [1381.23, 416021, 0.00481041, -1.44734]
----
-Label        : 1
-Position     : [1051.71, 1046.62]
-Measurements : [1128.98, 271536, 0.485715, -0.689879]
----
-Label        : 1
-Position     : [617.04, 1046.74]
-Measurements : [1071.1, 491430, 1.08382, -0.103324]
----
-Label        : 1
-Position     : [317.32, 1047.15]
-Measurements : [1051.57, 119132, 1.19844, 2.23283]
----
-Label        : 1
-Position     : [1079.83, 1047.45]
-Measurements : [1709.19, 330201, -0.498402, -0.741726]
----
-Label        : 1
-Position     : [316.186, 1047.52]
-Measurements : [1088.32, 93810.7, 1.79004, 3.65468]
----
-Label        : 1
-Position     : [1003.52, 1047.54]
-Measurements : [1304.44, 198918, 0.956867, 0.606773]
----
-Label        : 1
-Position     : [615.033, 1047.83]
-Measurements : [1035.56, 387285, 1.27463, 0.513677]
----
-Label        : 1
-Position     : [1256.13, 1048.14]
-Measurements : [1293.1, 506495, 0.514867, -0.861389]
----
-Label        : 1
-Position     : [870.214, 1048.59]
-Measurements : [1022.73, 216333, 0.219913, -0.987739]
----
-Label        : 1
-Position     : [1008.35, 1048.69]
-Measurements : [957.903, 178701, 0.957115, 1.44583]
----
-Label        : 1
-Position     : [1046.83, 1049.01]
-Measurements : [1520.06, 183308, -0.391479, -0.4481]
----
-Label        : 1
-Position     : [1079.76, 1049.24]
-Measurements : [1565.78, 348606, -0.172452, -1.18587]
----
-Label        : 1
-Position     : [925.042, 1049.38]
-Measurements : [987.199, 173607, 0.761037, -0.00246961]
----
-Label        : 1
-Position     : [997.141, 1049.77]
-Measurements : [1508.23, 214924, 0.0442669, -0.34706]
----
-Label        : 1
-Position     : [1121.95, 1050.21]
-Measurements : [1586.91, 392851, -0.360307, -0.806532]
----
-Label        : 1
-Position     : [910.547, 1050.22]
-Measurements : [1105.9, 189706, 0.586327, -0.596418]
----
-Label        : 1
-Position     : [318.88, 1050.3]
-Measurements : [952.444, 145415, 1.00934, 1.53209]
----
-Label        : 1
-Position     : [975.208, 1050.47]
-Measurements : [1533.34, 656235, 0.105515, -1.41531]
----
-Label        : 1
-Position     : [798.224, 1050.5]
-Measurements : [1153.53, 233636, 0.770138, -0.127555]
----
-Label        : 0
-Position     : [258.748, 1050.65]
-Measurements : [1095.94, 8304.45, -0.799745, 0.674058]
----
-Label        : 1
-Position     : [803.218, 1050.67]
-Measurements : [1384.5, 329222, 0.187012, -1.15357]
----
-Label        : 1
-Position     : [797.255, 1050.72]
-Measurements : [1074.87, 174195, 0.767915, -0.0886368]
----
-Label        : 1
-Position     : [1121.3, 1050.76]
-Measurements : [1586.91, 392851, -0.360307, -0.806532]
----
-Label        : 1
-Position     : [801.53, 1051.21]
-Measurements : [1281.85, 334847, 0.510889, -0.923391]
----
-Label        : 1
-Position     : [1048.99, 1051.23]
-Measurements : [1639.05, 160186, -0.186034, -0.907807]
----
-Label        : 1
-Position     : [1075.2, 1051.23]
-Measurements : [1777.11, 225173, -0.42666, -0.343258]
----
-Label        : 1
-Position     : [1125.61, 1051.23]
-Measurements : [1680.33, 256829, 0.313642, -0.747994]
----
-Label        : 0
-Position     : [288.453, 1051.36]
-Measurements : [1109.3, 5293.05, -0.468844, -0.386417]
----
-Label        : 1
-Position     : [998.609, 1051.64]
-Measurements : [1716.58, 219349, -0.309246, 0.065714]
----
-Label        : 1
-Position     : [115.87, 1051.99]
-Measurements : [799.408, 133161, 0.768401, -0.92898]
----
-Label        : 1
-Position     : [610.417, 1052.16]
-Measurements : [1142.33, 363484, 0.792953, -0.683519]
----
-Label        : 1
-Position     : [930.143, 1052.23]
-Measurements : [1134.03, 277817, 0.422687, -1.06236]
----
-Label        : 1
-Position     : [906.668, 1052.28]
-Measurements : [1341.53, 402028, 0.576998, -0.385132]
----
-Label        : 1
-Position     : [111.592, 1052.47]
-Measurements : [1077.79, 205038, 0.550374, -0.120052]
----
-Label        : 1
-Position     : [1076.54, 1052.6]
-Measurements : [1719.44, 267034, -0.481618, -0.39879]
----
-Label        : 1
-Position     : [928.127, 1052.67]
-Measurements : [1100.97, 257146, 0.569195, -0.773579]
----
-Label        : 1
-Position     : [846.177, 1052.84]
-Measurements : [964.73, 380438, 0.969626, -0.105411]
----
-Label        : 1
-Position     : [974.442, 1052.87]
-Measurements : [1697.81, 604654, -0.248171, -1.27509]
----
-Label        : 1
-Position     : [865.223, 1052.9]
-Measurements : [732.874, 61694.9, 0.568375, -0.298471]
----
-Label        : 1
-Position     : [1256.8, 1052.9]
-Measurements : [1059.92, 589559, 0.929202, -0.525249]
----
-Label        : 1
-Position     : [972.573, 1053.33]
-Measurements : [1837.58, 448769, -0.418098, -0.807762]
----
-Label        : 1
-Position     : [905.387, 1053.35]
-Measurements : [1505.94, 495612, 0.458989, -0.72498]
----
-Label        : 1
-Position     : [972.479, 1053.35]
-Measurements : [1837.58, 448769, -0.418098, -0.807762]
----
-Label        : 1
-Position     : [1070.35, 1053.57]
-Measurements : [1412.66, 299370, 0.0755788, -1.06022]
----
-Label        : 1
-Position     : [1001.8, 1053.9]
-Measurements : [1623.29, 318967, -0.107101, -0.908495]
----
-Label        : 1
-Position     : [1046.03, 1053.96]
-Measurements : [1738.85, 193868, -0.540937, -0.185425]
----
-Label        : 1
-Position     : [929.796, 1054.1]
-Measurements : [1217.79, 261489, 0.358849, -1.12273]
----
-Label        : 1
-Position     : [337.332, 1054.88]
-Measurements : [850.507, 324075, 1.46102, 1.45049]
----
-Label        : 1
-Position     : [844.012, 1055]
-Measurements : [1419.14, 510664, 0.266561, -1.12152]
----
-Label        : 1
-Position     : [105.448, 1055.03]
-Measurements : [1094.18, 181039, 1.02743, 0.853446]
----
-Label        : 1
-Position     : [1127.23, 1055.08]
-Measurements : [1594.68, 350975, 0.602476, -1.09504]
----
-Label        : 1
-Position     : [106.684, 1055.2]
-Measurements : [1111.09, 176408, 0.994577, 0.791618]
----
-Label        : 1
-Position     : [1117.07, 1055.26]
-Measurements : [1654.44, 484840, -0.658031, -0.876579]
----
-Label        : 1
-Position     : [1072.75, 1055.33]
-Measurements : [1546.28, 313498, -0.0150045, -0.962835]
----
-Label        : 1
-Position     : [611.919, 1055.36]
-Measurements : [1528.36, 490826, 0.133547, -1.3979]
----
-Label        : 1
-Position     : [850.808, 1055.79]
-Measurements : [1153.16, 505734, 1.02158, -0.149594]
----
-Label        : 1
-Position     : [1049, 1055.81]
-Measurements : [1702.35, 225970, -0.417514, -0.487913]
----
-Label        : 0
-Position     : [289.116, 1055.85]
-Measurements : [1135.28, 5788.38, -0.00519308, -0.0597098]
----
-Label        : 1
-Position     : [1046.3, 1055.85]
-Measurements : [1659.61, 300955, -0.571582, -0.577136]
----
-Label        : 1
-Position     : [997.856, 1055.89]
-Measurements : [1727.6, 268656, -0.353362, -0.680182]
----
-Label        : 1
-Position     : [1048.17, 1056.15]
-Measurements : [1632.04, 305645, -0.488434, -0.701371]
----
-Label        : 1
-Position     : [1068.69, 1056.52]
-Measurements : [1336.91, 292278, 0.0955927, -1.21503]
----
-Label        : 1
-Position     : [997.79, 1056.56]
-Measurements : [1748.74, 289518, -0.449271, -0.697178]
----
-Label        : 1
-Position     : [105.819, 1056.7]
-Measurements : [1066.3, 142990, 1.07015, 1.20709]
----
-Label        : 1
-Position     : [98.792, 1057.08]
-Measurements : [802.419, 177501, 1.07965, 0.648146]
----
-Label        : 1
-Position     : [904.654, 1057.1]
-Measurements : [2022.07, 438824, -0.296728, -1.06199]
----
-Label        : 1
-Position     : [101.372, 1057.14]
-Measurements : [974.655, 130285, 0.97067, 0.635444]
----
-Label        : 1
-Position     : [906.668, 1057.19]
-Measurements : [1966.3, 443170, -0.0517302, -1.31557]
----
-Label        : 1
-Position     : [976.976, 1057.22]
-Measurements : [1785.62, 347067, 0.0505175, -0.760573]
----
-Label        : 1
-Position     : [911.113, 1057.25]
-Measurements : [1420.77, 441843, 1.32058, 0.458534]
----
-Label        : 1
-Position     : [926.929, 1057.38]
-Measurements : [1042.01, 234798, 0.758304, -0.471581]
----
-Label        : 1
-Position     : [973.214, 1057.38]
-Measurements : [2010.68, 228552, -0.293219, -0.0684569]
----
-Label        : 1
-Position     : [1121.93, 1057.38]
-Measurements : [2000.37, 242978, -0.753109, -0.0060464]
----
-Label        : 1
-Position     : [339.872, 1057.47]
-Measurements : [1148.04, 340716, 1.04136, 0.425993]
----
-Label        : 1
-Position     : [868.985, 1057.6]
-Measurements : [784.432, 182482, 1.81052, 2.81234]
----
-Label        : 1
-Position     : [102.221, 1057.61]
-Measurements : [1025.33, 125675, 0.91573, 0.506751]
----
-Label        : 1
-Position     : [841.688, 1057.8]
-Measurements : [1294.57, 649347, 0.262355, -1.28919]
----
-Label        : 1
-Position     : [1126.57, 1057.87]
-Measurements : [1595.36, 347265, 0.588473, -1.04231]
----
-Label        : 1
-Position     : [607.171, 1057.95]
-Measurements : [1565.33, 337078, 0.124421, -0.827565]
----
-Label        : 1
-Position     : [868.796, 1058.07]
-Measurements : [845.924, 203528, 1.6002, 1.73355]
----
-Label        : 1
-Position     : [993.941, 1058.13]
-Measurements : [1508.46, 327185, 0.0190726, -1.05082]
----
-Label        : 1
-Position     : [924.641, 1058.15]
-Measurements : [925.107, 153068, 1.08353, 0.886399]
----
-Label        : 0
-Position     : [207.424, 1058.21]
-Measurements : [962.915, 7884.55, 0.396345, 0.364765]
----
-Label        : 1
-Position     : [340.703, 1058.28]
-Measurements : [1207.9, 284350, 1.29453, 0.898262]
----
-Label        : 1
-Position     : [1069.29, 1058.31]
-Measurements : [1519.54, 322567, -0.203577, -1.13118]
----
-Label        : 1
-Position     : [846.059, 1058.41]
-Measurements : [1712.39, 476106, -0.0555056, -1.10709]
----
-Label        : 1
-Position     : [905.675, 1058.44]
-Measurements : [2100.28, 379834, -0.342308, -1.08011]
----
-Label        : 1
-Position     : [800.302, 1058.58]
-Measurements : [1219.53, 356753, 0.833432, -0.54805]
----
-Label        : 1
-Position     : [846.996, 1058.58]
-Measurements : [1712.39, 476106, -0.0555056, -1.10709]
----
-Label        : 1
-Position     : [1121.44, 1058.67]
-Measurements : [1911.98, 346773, -0.678545, -0.581628]
----
-Label        : 1
-Position     : [103.624, 1059.05]
-Measurements : [994.706, 129850, 1.05942, 0.690652]
----
-Label        : 1
-Position     : [606.321, 1059.12]
-Measurements : [1773.98, 283211, 0.150544, -0.804767]
----
-Label        : 1
-Position     : [996.486, 1059.13]
-Measurements : [1671.17, 282950, -0.0334571, -0.997012]
----
-Label        : 1
-Position     : [968.705, 1059.56]
-Measurements : [1725.68, 370500, -0.532943, -0.693264]
----
-Label        : 1
-Position     : [1119.06, 1059.83]
-Measurements : [1708.38, 483007, -0.4506, -1.11343]
----
-Label        : 1
-Position     : [866.25, 1059.97]
-Measurements : [867.421, 177349, 1.68383, 2.31091]
----
-Label        : 1
-Position     : [804.462, 1059.99]
-Measurements : [1359.06, 438861, 0.542758, -1.20987]
----
-Label        : 1
-Position     : [999.118, 1060.01]
-Measurements : [1454.32, 434362, 0.182151, -1.27538]
----
-Label        : 1
-Position     : [924.319, 1060.19]
-Measurements : [970.069, 166881, 0.714521, -0.267998]
----
-Label        : 1
-Position     : [1071.11, 1060.24]
-Measurements : [1524.65, 352321, -0.203653, -1.27576]
----
-Label        : 1
-Position     : [863.633, 1060.45]
-Measurements : [780.231, 91256.6, 2.29349, 7.20465]
----
-Label        : 1
-Position     : [1069.23, 1060.56]
-Measurements : [1477.95, 387995, -0.225492, -1.27019]
----
-Label        : 1
-Position     : [921.279, 1060.58]
-Measurements : [885.65, 105641, 0.800119, 0.599259]
----
-Label        : 1
-Position     : [312.71, 1060.64]
-Measurements : [1365.12, 221263, 0.879898, -0.505644]
----
-Label        : 1
-Position     : [849.731, 1060.8]
-Measurements : [1515.81, 526526, 0.576047, -1.1026]
----
-Label        : 1
-Position     : [866.118, 1060.88]
-Measurements : [864.166, 178458, 1.68781, 2.29674]
----
-Label        : 1
-Position     : [995.332, 1061.06]
-Measurements : [1497.22, 291500, 0.422557, -0.754634]
----
-Label        : 1
-Position     : [903.559, 1061.06]
-Measurements : [2125.98, 400561, -0.77346, -0.27881]
----
-Label        : 1
-Position     : [319.267, 1061.85]
-Measurements : [971.91, 434783, 0.907669, -0.7131]
----
-Label        : 1
-Position     : [605.555, 1061.85]
-Measurements : [1930.81, 240604, 0.0233634, -0.761725]
----
-Label        : 1
-Position     : [314.784, 1062.08]
-Measurements : [1351.44, 315591, 0.322096, -1.01958]
----
-Label        : 1
-Position     : [799.932, 1062.09]
-Measurements : [1679.64, 467193, 0.090277, -1.34986]
----
-Label        : 1
-Position     : [1119.52, 1062.16]
-Measurements : [1320.5, 535895, 0.262037, -1.4792]
----
-Label        : 0
-Position     : [264.919, 1062.22]
-Measurements : [947.521, 9754.69, -2.22606, 6.17138]
----
-Label        : 1
-Position     : [845.358, 1062.26]
-Measurements : [1857.4, 361084, -0.216791, -0.73041]
----
-Label        : 1
-Position     : [610.995, 1062.44]
-Measurements : [1566.65, 553475, 0.164027, -1.41697]
----
-Label        : 1
-Position     : [971.166, 1063.11]
-Measurements : [1648.51, 277050, -0.0587585, -0.892408]
----
-Label        : 1
-Position     : [903.391, 1063.34]
-Measurements : [2034.85, 437816, -0.604398, -0.73877]
----
-Label        : 1
-Position     : [1259.12, 1063.4]
-Measurements : [1408, 480784, 0.0517758, -0.955122]
----
-Label        : 1
-Position     : [869.884, 1063.41]
-Measurements : [859.995, 206160, 1.54423, 1.43863]
----
-Label        : 1
-Position     : [600.996, 1063.63]
-Measurements : [1561.85, 299040, -0.108586, -0.62191]
----
-Label        : 1
-Position     : [792.851, 1063.67]
-Measurements : [1300.18, 343930, 0.587613, -0.640732]
----
-Label        : 1
-Position     : [905.344, 1063.86]
-Measurements : [1980.23, 477944, -0.338716, -1.22766]
----
-Label        : 1
-Position     : [866.677, 1064.28]
-Measurements : [925.403, 225097, 1.11015, 0.174159]
----
-Label        : 1
-Position     : [925.29, 1064.75]
-Measurements : [1024.01, 258943, 0.593828, -0.984644]
----
-Label        : 1
-Position     : [796.615, 1065.13]
-Measurements : [1758.95, 279434, 0.159316, -0.738881]
----
-Label        : 1
-Position     : [845.523, 1065.26]
-Measurements : [1644.56, 338287, 0.065939, -0.726038]
----
-Label        : 1
-Position     : [1260.22, 1065.34]
-Measurements : [1726.87, 382837, 0.238911, -0.796858]
----
-Label        : 1
-Position     : [966.954, 1065.73]
-Measurements : [1330.81, 283578, 0.341488, -0.602699]
----
-Label        : 1
-Position     : [1116.6, 1065.83]
-Measurements : [1212.69, 517389, 0.32524, -1.53127]
----
-Label        : 1
-Position     : [994.103, 1065.98]
-Measurements : [1482.39, 234906, 0.460918, -0.489004]
----
-Label        : 0
-Position     : [231.642, 1066.08]
-Measurements : [848.298, 35588, 0.140787, -0.506194]
----
-Label        : 1
-Position     : [1264.43, 1066.37]
-Measurements : [1894.16, 431908, -0.152023, -1.14118]
----
-Label        : 1
-Position     : [992.488, 1066.51]
-Measurements : [1469.24, 246718, 0.326009, -0.548977]
----
-Label        : 1
-Position     : [902.572, 1066.62]
-Measurements : [1937.24, 395620, -0.648701, -0.727676]
----
-Label        : 1
-Position     : [842.49, 1066.77]
-Measurements : [1637.13, 347456, -0.126214, -0.368328]
----
-Label        : 0
-Position     : [289.664, 1066.88]
-Measurements : [1471.52, 60326.6, 0.474587, -1.09782]
----
-Label        : 1
-Position     : [602.315, 1067]
-Measurements : [1699.82, 300423, -0.113697, -0.517193]
----
-Label        : 1
-Position     : [998.833, 1067.04]
-Measurements : [1295.64, 399196, 0.467405, -0.87565]
----
-Label        : 1
-Position     : [1068.52, 1067.27]
-Measurements : [1026.09, 352227, 0.795086, -0.529614]
----
-Label        : 1
-Position     : [335.48, 1067.6]
-Measurements : [1001.06, 223427, 0.538648, -0.846757]
----
-Label        : 1
-Position     : [898.804, 1067.67]
-Measurements : [1749.79, 509874, -0.613197, -0.866149]
----
-Label        : 1
-Position     : [844.011, 1067.84]
-Measurements : [1588.18, 319056, 0.176613, -0.452007]
----
-Label        : 1
-Position     : [968.298, 1068.02]
-Measurements : [1186.48, 319544, 0.971109, 0.500699]
----
-Label        : 1
-Position     : [794.383, 1068.1]
-Measurements : [1531.21, 369563, -0.146678, -0.79932]
----
-Label        : 1
-Position     : [862.431, 1068.25]
-Measurements : [1164.19, 327143, 0.40999, -0.918946]
----
-Label        : 1
-Position     : [790.878, 1068.61]
-Measurements : [1062.67, 268315, 0.437988, -0.950832]
----
-Label        : 0
-Position     : [180.523, 1068.69]
-Measurements : [1071.55, 18919.2, 0.469124, -0.0707115]
----
-Label        : 1
-Position     : [844.631, 1068.79]
-Measurements : [1465.66, 323926, 0.0957246, -0.738181]
----
-Label        : 1
-Position     : [600.989, 1069.08]
-Measurements : [1365.89, 411326, 0.227273, -1.10557]
----
-Label        : 1
-Position     : [995.106, 1069.22]
-Measurements : [1603.19, 308413, 0.183582, -1.20052]
----
-Label        : 1
-Position     : [860.674, 1069.33]
-Measurements : [1285.42, 343648, 0.320842, -0.878393]
----
-Label        : 1
-Position     : [600.586, 1069.36]
-Measurements : [1365.89, 411326, 0.227273, -1.10557]
----
-Label        : 0
-Position     : [276.915, 1069.5]
-Measurements : [1030.63, 44566, -1.1906, 0.792699]
----
-Label        : 1
-Position     : [1116.19, 1069.66]
-Measurements : [1524.84, 521870, -0.300372, -1.50815]
----
-Label        : 1
-Position     : [332.784, 1069.77]
-Measurements : [857.081, 262337, 0.870197, -0.727657]
----
-Label        : 1
-Position     : [900.114, 1069.89]
-Measurements : [1881.1, 263231, -0.563128, -0.26125]
----
-Label        : 1
-Position     : [794.567, 1070.05]
-Measurements : [1281.75, 396428, 0.132021, -1.19865]
----
-Label        : 1
-Position     : [922.189, 1070.08]
-Measurements : [1289, 453605, 0.249878, -1.479]
----
-Label        : 1
-Position     : [1112.63, 1070.3]
-Measurements : [1687.14, 348641, -0.606228, -0.744031]
----
-Label        : 1
-Position     : [1114.23, 1070.35]
-Measurements : [1746.72, 349510, -0.801723, -0.467484]
----
-Label        : 1
-Position     : [1114.58, 1070.41]
-Measurements : [1746.72, 349510, -0.801723, -0.467484]
----
-Label        : 1
-Position     : [896.297, 1070.56]
-Measurements : [1574.03, 471911, -0.441687, -1.05252]
----
-Label        : 1
-Position     : [843.719, 1070.87]
-Measurements : [1229.55, 349929, 0.214774, -1.21616]
----
-Label        : 1
-Position     : [1040.39, 1070.89]
-Measurements : [1013.16, 322562, 0.523158, -0.729431]
----
-Label        : 1
-Position     : [1066.19, 1070.89]
-Measurements : [931.271, 200962, 0.558388, -1.13704]
----
-Label        : 1
-Position     : [967.427, 1071.23]
-Measurements : [941.259, 131265, -0.0610348, -1.39455]
----
-Label        : 1
-Position     : [842.918, 1071.57]
-Measurements : [1110.06, 378066, 0.457115, -1.1367]
----
-Label        : 1
-Position     : [338.822, 1071.67]
-Measurements : [1018.08, 119680, 1.3749, 0.611555]
----
-Label        : 1
-Position     : [1253.36, 1071.74]
-Measurements : [1539.84, 421758, -0.0912068, -1.44408]
----
-Label        : 1
-Position     : [1068.76, 1071.76]
-Measurements : [830.833, 161066, 0.85298, -0.748251]
----
-Label        : 1
-Position     : [596.732, 1072.26]
-Measurements : [1088.59, 238493, 0.256296, -1.36753]
----
-Label        : 1
-Position     : [970.785, 1072.27]
-Measurements : [894.876, 123202, 0.502103, -0.646614]
----
-Label        : 1
-Position     : [994.922, 1072.53]
-Measurements : [1782.24, 231276, -0.343096, -0.735451]
----
-Label        : 1
-Position     : [895.714, 1072.61]
-Measurements : [1489.41, 469906, -0.35282, -1.16363]
----
-Label        : 1
-Position     : [866.36, 1072.77]
-Measurements : [1229.22, 471682, 0.455838, -1.23022]
----
-Label        : 1
-Position     : [916.774, 1072.95]
-Measurements : [1281.79, 415539, 0.486748, -1.14991]
----
-Label        : 0
-Position     : [286.474, 1073.27]
-Measurements : [1494.5, 107251, 0.528237, -1.1887]
----
-Label        : 1
-Position     : [921.604, 1073.35]
-Measurements : [1560.31, 507638, -0.086204, -1.25262]
----
-Label        : 1
-Position     : [960.695, 1073.5]
-Measurements : [857.156, 267104, 0.795523, -0.712916]
----
-Label        : 1
-Position     : [842.382, 1073.51]
-Measurements : [901.878, 272405, 0.770158, -0.837331]
----
-Label        : 1
-Position     : [861.612, 1073.58]
-Measurements : [1770.69, 275464, -0.415215, -0.684394]
----
-Label        : 1
-Position     : [1257.74, 1073.64]
-Measurements : [1933.22, 374694, -0.434486, -0.630972]
----
-Label        : 1
-Position     : [899.759, 1073.76]
-Measurements : [1838.89, 257462, -0.325163, -0.402379]
----
-Label        : 1
-Position     : [1044.41, 1073.9]
-Measurements : [1175.24, 465016, 0.940931, 0.0780993]
----
-Label        : 1
-Position     : [600.686, 1074.13]
-Measurements : [1241.33, 275759, 0.0843598, -1.2792]
----
-Label        : 1
-Position     : [991.703, 1074.41]
-Measurements : [1747.47, 203351, -0.254667, -0.48618]
----
-Label        : 1
-Position     : [1113.74, 1074.58]
-Measurements : [1940.71, 182133, -1.0065, 0.714931]
----
-Label        : 1
-Position     : [792.051, 1074.67]
-Measurements : [715.469, 228424, 1.44681, 0.596601]
----
-Label        : 1
-Position     : [899.295, 1074.81]
-Measurements : [1835.52, 268824, -0.262589, -0.454564]
----
-Label        : 1
-Position     : [599.746, 1074.88]
-Measurements : [1220.5, 269013, 0.0416882, -1.30075]
----
-Label        : 1
-Position     : [1038.78, 1075.17]
-Measurements : [1631.37, 426967, 0.0229473, -0.664653]
----
-Label        : 1
-Position     : [966.322, 1075.34]
-Measurements : [1158.12, 439663, 0.487083, -1.21011]
----
-Label        : 1
-Position     : [1037.3, 1075.37]
-Measurements : [1547.85, 496089, 0.0398388, -0.83847]
----
-Label        : 1
-Position     : [1042.74, 1075.57]
-Measurements : [1506.97, 438894, 0.491883, -0.674477]
----
-Label        : 1
-Position     : [1256.57, 1075.64]
-Measurements : [1985.18, 305919, -0.749865, -0.148024]
----
-Label        : 1
-Position     : [315.651, 1075.87]
-Measurements : [596.397, 101244, 2.07012, 3.22618]
----
-Label        : 1
-Position     : [77.8, 1076.02]
-Measurements : [1929.62, 458453, -0.111483, -1.18215]
----
-Label        : 1
-Position     : [896.631, 1076.25]
-Measurements : [1699.78, 271108, -0.550469, 0.140458]
----
-Label        : 1
-Position     : [916.334, 1076.8]
-Measurements : [1403.13, 391279, 0.346963, -1.17856]
----
-Label        : 1
-Position     : [894.636, 1076.99]
-Measurements : [1412.66, 425870, -0.290103, -1.1361]
----
-Label        : 1
-Position     : [965.431, 1077.04]
-Measurements : [1439.73, 533332, -0.0946199, -1.43516]
----
-Label        : 1
-Position     : [993.069, 1077.31]
-Measurements : [1643.59, 327515, -0.463382, -0.770623]
----
-Label        : 1
-Position     : [310.904, 1077.33]
-Measurements : [927.341, 162883, 0.594919, -0.649925]
----
-Label        : 1
-Position     : [77.286, 1077.38]
-Measurements : [1945.15, 439803, -0.099796, -1.20879]
----
-Label        : 1
-Position     : [333.001, 1077.42]
-Measurements : [1039.98, 270648, 0.813768, -0.396275]
----
-Label        : 1
-Position     : [991.236, 1077.45]
-Measurements : [1650.33, 249390, -0.382364, -0.559288]
----
-Label        : 1
-Position     : [987.44, 1077.69]
-Measurements : [1573.01, 233269, -0.163239, -0.518413]
----
-Label        : 1
-Position     : [73.2249, 1077.84]
-Measurements : [1438.74, 626886, 0.307536, -1.11043]
----
-Label        : 1
-Position     : [920.375, 1077.86]
-Measurements : [1738.94, 342593, -0.0267431, -0.827248]
----
-Label        : 1
-Position     : [1039.16, 1077.86]
-Measurements : [1547.48, 514159, 0.0941747, -1.05196]
----
-Label        : 1
-Position     : [920.966, 1077.86]
-Measurements : [1738.94, 342593, -0.0267431, -0.827248]
----
-Label        : 1
-Position     : [599.358, 1077.96]
-Measurements : [966.224, 232590, 0.643817, -1.08672]
----
-Label        : 0
-Position     : [214.447, 1078.07]
-Measurements : [721.977, 29834.3, -0.0459263, -1.38373]
----
-Label        : 1
-Position     : [311.36, 1078.2]
-Measurements : [866.952, 197828, 0.939155, -0.265792]
----
-Label        : 1
-Position     : [967.904, 1078.26]
-Measurements : [1397.09, 541304, 0.181655, -1.38845]
----
-Label        : 1
-Position     : [860.383, 1078.49]
-Measurements : [1567.44, 521605, -0.154939, -1.54392]
----
-Label        : 1
-Position     : [861.111, 1078.54]
-Measurements : [1595.14, 513244, -0.210322, -1.52303]
----
-Label        : 1
-Position     : [894.835, 1078.89]
-Measurements : [1437.07, 431862, -0.355293, -1.14035]
----
-Label        : 1
-Position     : [896.018, 1078.9]
-Measurements : [1690.76, 263301, -0.484804, -0.0525624]
----
-Label        : 1
-Position     : [1257.2, 1078.93]
-Measurements : [2076.1, 359988, -0.501825, -0.368702]
----
-Label        : 1
-Position     : [840.602, 1079.54]
-Measurements : [755.837, 189173, 1.54833, 1.52975]
----
-Label        : 1
-Position     : [920.037, 1079.92]
-Measurements : [1582.08, 431210, 0.214176, -1.04835]
----
-Label        : 1
-Position     : [331.896, 1080.4]
-Measurements : [1079.64, 292382, 0.545597, -0.813138]
----
-Label        : 1
-Position     : [837.166, 1080.7]
-Measurements : [869.584, 259128, 1.00008, -0.32103]
----
-Label        : 1
-Position     : [917.098, 1080.72]
-Measurements : [1234.31, 458614, 0.707147, -0.681752]
----
-Label        : 1
-Position     : [858.3, 1081.12]
-Measurements : [1244.4, 442540, 0.652034, -0.968102]
----
-Label        : 1
-Position     : [1111.28, 1081.13]
-Measurements : [1994.06, 277345, -0.218568, -0.189735]
----
-Label        : 1
-Position     : [857.654, 1081.17]
-Measurements : [1188.35, 401978, 0.80195, -0.655809]
----
-Label        : 1
-Position     : [987.55, 1081.54]
-Measurements : [1686.29, 203534, -0.465899, -0.140304]
----
-Label        : 1
-Position     : [920.487, 1082.01]
-Measurements : [1183.15, 471970, 1.06077, 0.191637]
----
-Label        : 0
-Position     : [257.478, 1082.03]
-Measurements : [1124.28, 24691.8, -0.74802, 1.9546]
----
-Label        : 1
-Position     : [1258.56, 1082.25]
-Measurements : [1682.68, 660515, 0.225929, -1.26408]
----
-Label        : 1
-Position     : [987.201, 1082.33]
-Measurements : [1754.46, 190202, -0.0437528, -0.751095]
----
-Label        : 1
-Position     : [1114.23, 1082.56]
-Measurements : [1754.38, 495281, -0.0284473, -1.2201]
----
-Label        : 1
-Position     : [990.889, 1082.89]
-Measurements : [1656.11, 317262, -0.523784, -0.681794]
----
-Label        : 1
-Position     : [896.428, 1083]
-Measurements : [1336.07, 490480, 0.171446, -1.22902]
----
-Label        : 1
-Position     : [963.383, 1083.18]
-Measurements : [2234.85, 198235, -0.567996, 0.269718]
----
-Label        : 1
-Position     : [894.069, 1083.46]
-Measurements : [1033.45, 480487, 0.688529, -0.967521]
----
-Label        : 1
-Position     : [900.901, 1083.68]
-Measurements : [1317.95, 372376, 0.568797, -0.575312]
----
-Label        : 1
-Position     : [1254.56, 1083.89]
-Measurements : [1192.77, 386288, 0.857423, -0.620612]
----
-Label        : 1
-Position     : [331.163, 1084.4]
-Measurements : [1143.3, 249384, 0.579623, -0.684709]
----
-Label        : 1
-Position     : [967.159, 1084.82]
-Measurements : [1895.45, 510439, -0.0225459, -1.42963]
----
-Label        : 1
-Position     : [963.393, 1084.97]
-Measurements : [2306.45, 209188, -0.657404, 0.575012]
----
-Label        : 1
-Position     : [1110.05, 1085.23]
-Measurements : [1925.52, 361631, -0.28424, -0.484604]
----
-Label        : 1
-Position     : [839.129, 1085.34]
-Measurements : [863.717, 179706, 1.10735, 0.620948]
----
-Label        : 1
-Position     : [1115.81, 1085.36]
-Measurements : [1520.48, 515730, 0.589413, -1.0736]
----
-Label        : 0
-Position     : [219.044, 1085.89]
-Measurements : [1206.72, 30036.2, -0.773169, -0.764504]
----
-Label        : 1
-Position     : [1105.82, 1085.89]
-Measurements : [1409.69, 559898, 0.0741824, -1.21507]
----
-Label        : 1
-Position     : [858.335, 1086.28]
-Measurements : [1309.72, 398950, 0.703431, -0.444962]
----
-Label        : 1
-Position     : [914.356, 1086.63]
-Measurements : [1140.36, 355302, 0.590514, -0.980791]
----
-Label        : 1
-Position     : [1111.94, 1086.98]
-Measurements : [1880.54, 396975, -0.210773, -0.79487]
----
-Label        : 1
-Position     : [310.231, 1087.07]
-Measurements : [1009.42, 515162, 1.00145, -0.545091]
----
-Label        : 1
-Position     : [1105, 1087.36]
-Measurements : [1260.09, 549398, 0.27972, -1.21554]
----
-Label        : 1
-Position     : [307.832, 1087.57]
-Measurements : [1279.73, 432804, 0.57088, -0.97877]
----
-Label        : 1
-Position     : [989.188, 1087.69]
-Measurements : [1723.64, 349520, -0.349601, -0.572529]
----
-Label        : 1
-Position     : [962.154, 1088.1]
-Measurements : [2283.52, 271865, -0.59973, -0.166411]
----
-Label        : 0
-Position     : [192.306, 1088.22]
-Measurements : [928.518, 48296.5, 0.110534, -0.0699811]
----
-Label        : 1
-Position     : [1027.18, 1088.36]
-Measurements : [775.299, 246501, 0.794162, -0.850706]
----
-Label        : 1
-Position     : [856.069, 1088.57]
-Measurements : [1638.53, 389914, 0.132686, -0.915477]
----
-Label        : 1
-Position     : [913.822, 1089.32]
-Measurements : [1025.2, 385520, 0.833213, -0.806066]
----
-Label        : 1
-Position     : [994.122, 1089.91]
-Measurements : [1095.31, 549862, 0.982881, -0.422543]
----
-Label        : 1
-Position     : [988.788, 1089.99]
-Measurements : [1689.6, 319573, -0.0963518, -0.663632]
----
-Label        : 1
-Position     : [309.636, 1090.01]
-Measurements : [1036.69, 511944, 1.00362, -0.492388]
----
-Label        : 1
-Position     : [957.325, 1090.26]
-Measurements : [1818.3, 586214, -0.51928, -0.803871]
----
-Label        : 1
-Position     : [861.099, 1090.5]
-Measurements : [1317.37, 630893, 0.594882, -1.03761]
----
-Label        : 1
-Position     : [856.483, 1090.61]
-Measurements : [1793.77, 390805, -0.0429731, -0.853561]
----
-Label        : 1
-Position     : [1032.9, 1090.67]
-Measurements : [900.749, 498700, 1.15203, -0.130886]
----
-Label        : 1
-Position     : [3.83146, 1091.01]
-Measurements : [1331.57, 196835, 1.24546, 0.672271]
----
-Label        : 1
-Position     : [1028.51, 1091.37]
-Measurements : [1172.9, 513420, 0.428752, -1.01562]
----
-Label        : 1
-Position     : [1108.41, 1091.37]
-Measurements : [1351.51, 535827, 0.399753, -0.853249]
----
-Label        : 0
-Position     : [142.98, 1091.38]
-Measurements : [1070, 9078.42, -0.88087, 0.923298]
----
-Label        : 1
-Position     : [856.697, 1091.6]
-Measurements : [1807.37, 393397, -0.0973794, -0.900549]
----
-Label        : 1
-Position     : [985.092, 1091.78]
-Measurements : [1734.76, 265564, -0.221991, -0.595334]
----
-Label        : 1
-Position     : [607.864, 1091.89]
-Measurements : [880.579, 542044, 0.951025, -0.64557]
----
-Label        : 1
-Position     : [1262.18, 1091.98]
-Measurements : [548.588, 93782.4, 1.38609, 1.61379]
----
-Label        : 1
-Position     : [1055.57, 1092.17]
-Measurements : [1272.1, 344471, 0.139039, -1.47984]
----
-Label        : 1
-Position     : [991.827, 1092.28]
-Measurements : [1418.46, 580540, 0.232185, -1.37755]
----
-Label        : 1
-Position     : [964.894, 1093.12]
-Measurements : [1877.96, 578463, 0.104338, -1.51049]
----
-Label        : 1
-Position     : [960.106, 1093.42]
-Measurements : [2092.33, 391258, -0.450804, -0.445903]
----
-Label        : 1
-Position     : [916.242, 1093.78]
-Measurements : [1121.09, 348810, 0.533025, -1.0389]
----
-Label        : 1
-Position     : [854.581, 1093.88]
-Measurements : [1592.07, 604030, 0.00240911, -1.34817]
----
-Label        : 1
-Position     : [958.886, 1094.17]
-Measurements : [2009.72, 343332, -0.533888, -0.0558652]
----
-Label        : 1
-Position     : [892.169, 1094.2]
-Measurements : [1186.33, 351057, 0.134356, -1.35697]
----
-Label        : 1
-Position     : [985.902, 1094.38]
-Measurements : [1843.62, 222345, -0.128628, -0.414821]
----
-Label        : 0
-Position     : [259.044, 1094.82]
-Measurements : [753.567, 68497.3, 0.272122, -1.48026]
----
-Label        : 1
-Position     : [853.83, 1094.88]
-Measurements : [1409.6, 714758, 0.297433, -1.47687]
----
-Label        : 1
-Position     : [1269.54, 1094.96]
-Measurements : [976.922, 240002, 0.417818, -0.905896]
----
-Label        : 1
-Position     : [7.656, 1094.97]
-Measurements : [1485.79, 395766, 0.0283435, -1.18202]
----
-Label        : 1
-Position     : [855.503, 1095.08]
-Measurements : [1441.48, 743631, 0.256967, -1.49925]
----
-Label        : 1
-Position     : [1107.51, 1095.19]
-Measurements : [814.851, 377390, 1.44917, 0.534495]
----
-Label        : 1
-Position     : [888.779, 1095.35]
-Measurements : [1335.52, 308509, -0.323976, -1.03263]
----
-Label        : 1
-Position     : [1267.17, 1095.35]
-Measurements : [967.295, 218363, 0.461424, -0.676289]
----
-Label        : 1
-Position     : [613.408, 1095.48]
-Measurements : [1703.96, 613294, -0.213562, -1.43754]
----
-Label        : 1
-Position     : [1058.41, 1095.88]
-Measurements : [1524.43, 347279, -0.191113, -1.3013]
----
-Label        : 0
-Position     : [96.7612, 1096.08]
-Measurements : [1269.01, 17415.6, 0.752649, 1.23866]
----
-Label        : 1
-Position     : [986.304, 1096.55]
-Measurements : [1694.49, 375471, -0.272519, -0.83505]
----
-Label        : 1
-Position     : [609.918, 1096.6]
-Measurements : [1610.28, 542468, -0.270672, -1.13973]
----
-Label        : 0
-Position     : [247.757, 1096.94]
-Measurements : [1293.76, 71110.3, 0.607419, -0.764484]
----
-Label        : 1
-Position     : [327, 1097]
-Measurements : [784.893, 157105, 1.30623, 1.11276]
----
-Label        : 1
-Position     : [1030.27, 1097.32]
-Measurements : [1681.5, 376593, -0.320268, -1.04321]
----
-Label        : 1
-Position     : [984.682, 1097.52]
-Measurements : [1761.07, 329786, -0.474931, -0.382438]
----
-Label        : 1
-Position     : [6.47254, 1097.54]
-Measurements : [1484.49, 401640, 0.00481478, -1.20688]
----
-Label        : 1
-Position     : [326.734, 1097.57]
-Measurements : [750.509, 165709, 1.39889, 1.17512]
----
-Label        : 1
-Position     : [912.622, 1097.71]
-Measurements : [1143.47, 359919, 0.249579, -1.42336]
----
-Label        : 1
-Position     : [889.055, 1097.74]
-Measurements : [1456.72, 196778, -0.348067, -0.47207]
----
-Label        : 1
-Position     : [303.904, 1097.82]
-Measurements : [1087.77, 189526, 0.66936, -0.24755]
----
-Label        : 0
-Position     : [253.41, 1098.11]
-Measurements : [895.033, 67286.7, -0.435044, -1.11304]
----
-Label        : 1
-Position     : [956.83, 1098.34]
-Measurements : [1539.5, 616414, 0.00355931, -1.40037]
----
-Label        : 0
-Position     : [168.583, 1098.67]
-Measurements : [752.491, 43880, 0.0205883, -1.39981]
----
-Label        : 1
-Position     : [985.723, 1098.98]
-Measurements : [1657.69, 404132, -0.281057, -0.918316]
----
-Label        : 1
-Position     : [913.822, 1099.15]
-Measurements : [1163.75, 338017, 0.246734, -1.38487]
----
-Label        : 0
-Position     : [270.11, 1099.24]
-Measurements : [1096.86, 10493.4, 0.281709, 0.572445]
----
-Label        : 1
-Position     : [858.791, 1099.45]
-Measurements : [787.524, 428708, 2.04554, 3.10989]
----
-Label        : 1
-Position     : [1060.11, 1099.56]
-Measurements : [1514.94, 429286, -0.074932, -1.28052]
----
-Label        : 0
-Position     : [134.613, 1099.81]
-Measurements : [973.458, 6331.39, -0.52856, -0.335983]
----
-Label        : 1
-Position     : [917.793, 1100.11]
-Measurements : [1094.8, 299121, 0.518578, -1.10227]
----
-Label        : 1
-Position     : [890.983, 1100.11]
-Measurements : [1400.35, 161844, 0.074681, -0.84253]
----
-Label        : 1
-Position     : [1359.6, 1100.5]
-Measurements : [1774.64, 377057, -0.788745, -0.456058]
----
-Label        : 1
-Position     : [309.43, 1100.51]
-Measurements : [559.242, 82491, 2.59435, 6.89053]
----
-Label        : 1
-Position     : [975.45, 1100.52]
-Measurements : [1073.3, 233622, 0.609561, -0.584929]
----
-Label        : 1
-Position     : [324.58, 1100.56]
-Measurements : [537.909, 48414.5, 2.28277, 5.78213]
----
-Label        : 1
-Position     : [978.538, 1100.79]
-Measurements : [1282.55, 392357, 0.334611, -0.943155]
----
-Label        : 1
-Position     : [1029.74, 1100.79]
-Measurements : [1784.61, 332989, -0.481679, -0.8367]
----
-Label        : 1
-Position     : [1055.13, 1100.79]
-Measurements : [1793.87, 165248, -0.0695641, -0.163157]
----
-Label        : 1
-Position     : [958.643, 1101.01]
-Measurements : [1300.85, 551935, 0.485265, -1.15511]
----
-Label        : 1
-Position     : [1374.05, 1101.19]
-Measurements : [1659.42, 357622, -0.350888, -0.380255]
----
-Label        : 1
-Position     : [304.76, 1101.39]
-Measurements : [1006.51, 251423, 0.519497, -1.10284]
----
-Label        : 1
-Position     : [887.826, 1101.43]
-Measurements : [1458.54, 187384, -0.414354, -0.208829]
----
-Label        : 1
-Position     : [1366.24, 1101.9]
-Measurements : [1712.72, 299374, -0.212772, -0.633687]
----
-Label        : 1
-Position     : [974.083, 1101.96]
-Measurements : [959.43, 184929, 0.758253, -0.131308]
----
-Label        : 1
-Position     : [1370.64, 1101.99]
-Measurements : [1396.58, 248339, -0.316641, -0.334658]
----
-Label        : 1
-Position     : [1058.75, 1102.49]
-Measurements : [1628.46, 302853, -0.188964, -0.753754]
----
-Label        : 1
-Position     : [1.57639, 1102.61]
-Measurements : [1601.33, 289616, -0.219549, -0.721911]
----
-Label        : 1
-Position     : [1351.91, 1102.71]
-Measurements : [1484.21, 352827, -0.0893716, -0.946487]
----
-Label        : 1
-Position     : [1374.8, 1102.88]
-Measurements : [1738.75, 288032, -0.372391, -0.0228555]
----
-Label        : 1
-Position     : [953.439, 1103.15]
-Measurements : [984.832, 346054, 0.856744, -0.588939]
----
-Label        : 0
-Position     : [160.971, 1103.19]
-Measurements : [724.351, 44779.5, -0.059758, -1.40541]
----
-Label        : 0
-Position     : [207.841, 1103.28]
-Measurements : [1796.71, 54799.9, -0.671429, -0.369486]
----
-Label        : 0
-Position     : [108.015, 1103.47]
-Measurements : [1269.7, 112492, 1.16842, 0.816407]
----
-Label        : 0
-Position     : [107.22, 1103.59]
-Measurements : [1285.44, 109878, 1.12114, 0.730062]
----
-Label        : 1
-Position     : [1026.96, 1103.87]
-Measurements : [1777.23, 320502, -0.294373, -0.329193]
----
-Label        : 1
-Position     : [890.33, 1104.27]
-Measurements : [1299.04, 187758, 0.438932, -0.610869]
----
-Label        : 1
-Position     : [1362.6, 1104.36]
-Measurements : [1950.16, 219665, -0.46113, -0.819057]
----
-Label        : 1
-Position     : [1383.49, 1104.36]
-Measurements : [1244.92, 331576, 1.1062, 0.490336]
----
-Label        : 1
-Position     : [1382.66, 1104.39]
-Measurements : [1401.5, 352386, 0.886507, -0.481211]
----
-Label        : 1
-Position     : [1354.91, 1104.62]
-Measurements : [1682.52, 273612, -0.373785, -0.51851]
----
-Label        : 1
-Position     : [1059.7, 1104.76]
-Measurements : [1350.82, 406200, 0.37374, -1.02033]
----
-Label        : 1
-Position     : [1368.34, 1104.77]
-Measurements : [1691.7, 200827, 0.368456, -0.26652]
----
-Label        : 1
-Position     : [1023.87, 1104.96]
-Measurements : [1458, 389818, -0.209666, -0.829614]
----
-Label        : 1
-Position     : [1025.89, 1105.49]
-Measurements : [1756.79, 279987, -0.117236, -0.0488144]
----
-Label        : 1
-Position     : [8.95123, 1105.63]
-Measurements : [1303.79, 454884, 0.291148, -1.36364]
----
-Label        : 1
-Position     : [1358.7, 1105.7]
-Measurements : [2031.7, 158278, -0.423964, -0.477682]
----
-Label        : 1
-Position     : [5.096, 1105.72]
-Measurements : [1570.48, 340261, -0.103748, -1.17403]
----
-Label        : 1
-Position     : [906.602, 1105.98]
-Measurements : [964.055, 268656, 0.725827, -0.919944]
----
-Label        : 1
-Position     : [1376.12, 1106]
-Measurements : [1828.25, 224641, -0.0527603, -0.740408]
----
-Label        : 1
-Position     : [1027.23, 1106.06]
-Measurements : [1864.37, 211691, 0.211352, -0.57113]
----
-Label        : 1
-Position     : [1054.68, 1106.47]
-Measurements : [1572.47, 307838, -0.072663, -0.763482]
----
-Label        : 1
-Position     : [1343.89, 1106.63]
-Measurements : [981.832, 344030, 0.488675, -1.10683]
----
-Label        : 1
-Position     : [1347.04, 1106.82]
-Measurements : [1366.16, 267692, -0.259933, -0.695874]
----
-Label        : 1
-Position     : [1101.96, 1107.06]
-Measurements : [693.533, 246960, 1.72661, 1.89091]
----
-Label        : 1
-Position     : [1297.39, 1107.21]
-Measurements : [1697.71, 187214, -0.204008, -0.379521]
----
-Label        : 1
-Position     : [1366.5, 1107.48]
-Measurements : [1897.71, 183652, 0.0371842, -1.19696]
----
-Label        : 1
-Position     : [1280.99, 1107.58]
-Measurements : [1486.57, 370590, -0.40729, -0.873565]
----
-Label        : 1
-Position     : [956.079, 1107.69]
-Measurements : [1066.09, 285122, 0.601048, -0.64029]
----
-Label        : 1
-Position     : [1388.23, 1107.98]
-Measurements : [735.539, 93974.7, 0.727868, -1.10259]
----
-Label        : 1
-Position     : [1286.68, 1108]
-Measurements : [1931.54, 412761, -0.216404, -1.05659]
----
-Label        : 1
-Position     : [1278.63, 1108.05]
-Measurements : [1336.12, 378464, -0.312573, -1.35284]
----
-Label        : 1
-Position     : [1354, 1108.05]
-Measurements : [1738.64, 198563, -0.142728, -0.353238]
----
-Label        : 1
-Position     : [1045.38, 1108.09]
-Measurements : [1177.11, 274813, 0.64846, -0.664975]
----
-Label        : 1
-Position     : [1286.83, 1108.46]
-Measurements : [1931.06, 413266, -0.226095, -1.04297]
----
-Label        : 1
-Position     : [1053.66, 1108.46]
-Measurements : [1422.39, 325971, 0.100455, -1.05721]
----
-Label        : 1
-Position     : [1104.34, 1108.46]
-Measurements : [575.281, 57501.1, 1.22683, 1.04365]
----
-Label        : 1
-Position     : [946.603, 1108.5]
-Measurements : [782.057, 193687, 1.07718, 0.646128]
----
-Label        : 1
-Position     : [1054.17, 1108.78]
-Measurements : [1383.63, 338687, 0.129883, -1.06391]
----
-Label        : 1
-Position     : [1333.11, 1108.87]
-Measurements : [1033.58, 287961, 0.39674, -1.13897]
----
-Label        : 1
-Position     : [10.8959, 1108.96]
-Measurements : [1170.48, 463215, 0.493087, -1.38174]
----
-Label        : 1
-Position     : [1028.03, 1108.97]
-Measurements : [1773.71, 216997, 0.405007, -0.17]
----
-Label        : 1
-Position     : [1052.52, 1109.13]
-Measurements : [1367.04, 357078, 0.155066, -1.24615]
----
-Label        : 1
-Position     : [956.372, 1109.34]
-Measurements : [1172.45, 242434, 0.337028, -0.490947]
----
-Label        : 1
-Position     : [1289.57, 1109.87]
-Measurements : [1979.6, 404496, -0.406364, -0.864684]
----
-Label        : 1
-Position     : [978.567, 1109.96]
-Measurements : [1150.55, 377732, 0.396928, -1.21534]
----
-Label        : 1
-Position     : [911.574, 1110.01]
-Measurements : [845.849, 213549, 1.41013, 0.460357]
----
-Label        : 1
-Position     : [908.039, 1110.16]
-Measurements : [945.205, 241040, 0.875315, -0.74]
----
-Label        : 1
-Position     : [1049.76, 1110.16]
-Measurements : [1329.51, 413382, 0.208955, -1.4339]
----
-Label        : 1
-Position     : [1101.37, 1110.57]
-Measurements : [995.652, 389863, 0.814415, -0.643937]
----
-Label        : 1
-Position     : [1324.85, 1110.69]
-Measurements : [884.812, 314874, 1.11923, -0.151081]
----
-Label        : 1
-Position     : [1337.67, 1110.81]
-Measurements : [957.856, 354605, 0.610579, -1.23341]
----
-Label        : 1
-Position     : [7.656, 1110.84]
-Measurements : [1562, 411152, -0.244827, -1.25374]
----
-Label        : 1
-Position     : [978.49, 1110.98]
-Measurements : [1232.67, 377358, 0.163689, -1.34218]
----
-Label        : 1
-Position     : [612.892, 1111.5]
-Measurements : [864.653, 307860, 0.687751, -1.14504]
----
-Label        : 1
-Position     : [1096.4, 1111.57]
-Measurements : [1354.82, 395499, 0.0452553, -1.24968]
----
-Label        : 1
-Position     : [951.457, 1111.8]
-Measurements : [1278.37, 129893, 0.122527, 0.827308]
----
-Label        : 1
-Position     : [1025.59, 1111.8]
-Measurements : [1434.87, 383222, 0.206401, -0.280155]
----
-Label        : 1
-Position     : [1307.06, 1112.04]
-Measurements : [1687.16, 264750, 0.130994, -1.141]
----
-Label        : 1
-Position     : [2.80576, 1112.05]
-Measurements : [1442.89, 286329, 0.0951319, -1.16083]
----
-Label        : 1
-Position     : [1293.79, 1112.15]
-Measurements : [1753.35, 306211, -0.230339, -0.333576]
----
-Label        : 1
-Position     : [1280.12, 1112.24]
-Measurements : [1545.92, 294644, -0.352696, -0.902354]
----
-Label        : 1
-Position     : [618.399, 1112.39]
-Measurements : [1400.61, 378591, -0.269551, -1.18181]
----
-Label        : 1
-Position     : [1328.58, 1112.93]
-Measurements : [796.678, 196306, 1.02998, -0.154111]
----
-Label        : 1
-Position     : [617.7, 1113.39]
-Measurements : [1425.42, 362603, -0.337889, -1.06499]
----
-Label        : 0
-Position     : [130.119, 1113.8]
-Measurements : [984.168, 59335, 0.30838, -1.12156]
----
-Label        : 1
-Position     : [8.58797, 1113.86]
-Measurements : [1536.36, 404599, -0.164655, -1.29883]
----
-Label        : 1
-Position     : [956.635, 1113.88]
-Measurements : [1268.47, 153921, 0.618902, -0.11014]
----
-Label        : 1
-Position     : [984.364, 1114.12]
-Measurements : [1046.4, 337437, 0.667562, -0.749976]
----
-Label        : 0
-Position     : [248.516, 1114.17]
-Measurements : [1113.12, 11579.1, -1.39855, 3.19304]
----
-Label        : 1
-Position     : [1101.55, 1114.5]
-Measurements : [1282.52, 374272, 0.506245, -0.888592]
----
-Label        : 1
-Position     : [1320.41, 1114.6]
-Measurements : [1032.15, 270371, 0.861253, -0.49313]
----
-Label        : 1
-Position     : [948.112, 1114.65]
-Measurements : [1270.24, 179928, -0.104498, -0.519677]
----
-Label        : 1
-Position     : [891.655, 1114.67]
-Measurements : [1530.64, 390562, -0.0528693, -1.10978]
----
-Label        : 1
-Position     : [1295.07, 1114.68]
-Measurements : [1653.16, 179768, -0.267496, -0.691445]
----
-Label        : 1
-Position     : [1302.8, 1115.01]
-Measurements : [1648.35, 236677, -0.464077, -1.00253]
----
-Label        : 1
-Position     : [1098.09, 1115.08]
-Measurements : [1475.44, 305910, 0.0457305, -0.926588]
----
-Label        : 1
-Position     : [1302.74, 1115.3]
-Measurements : [1648.35, 236677, -0.464077, -1.00253]
----
-Label        : 1
-Position     : [296.146, 1115.3]
-Measurements : [1233.36, 173292, 0.214674, -0.832506]
----
-Label        : 0
-Position     : [260.476, 1115.4]
-Measurements : [823.993, 24804.4, -0.332099, -0.353432]
----
-Label        : 1
-Position     : [894.226, 1115.45]
-Measurements : [1443.88, 406293, 0.214301, -1.19304]
----
-Label        : 1
-Position     : [320.12, 1115.73]
-Measurements : [1070.28, 292634, 0.670746, -0.554849]
----
-Label        : 1
-Position     : [1302.22, 1115.74]
-Measurements : [1648.35, 236677, -0.464077, -1.00253]
----
-Label        : 1
-Position     : [974.292, 1115.86]
-Measurements : [1336.8, 240706, -0.242379, -0.928976]
----
-Label        : 1
-Position     : [1310.58, 1116.24]
-Measurements : [1252.35, 204340, 0.579078, -0.194194]
----
-Label        : 1
-Position     : [1024.84, 1116.43]
-Measurements : [925.682, 275505, 0.602451, -1.18428]
----
-Label        : 1
-Position     : [953.459, 1116.57]
-Measurements : [1343.78, 154165, 0.183803, -0.887349]
----
-Label        : 1
-Position     : [1315.21, 1116.59]
-Measurements : [1089.48, 148798, 0.326079, -0.771989]
----
-Label        : 1
-Position     : [621.295, 1116.65]
-Measurements : [1077.61, 392418, 0.611573, -1.22381]
----
-Label        : 1
-Position     : [950.638, 1116.71]
-Measurements : [1398.97, 142219, -0.0764231, -0.526]
----
-Label        : 1
-Position     : [297.592, 1116.75]
-Measurements : [1148.73, 207589, 0.288315, -1.13186]
----
-Label        : 1
-Position     : [7.144, 1116.98]
-Measurements : [1672.28, 250227, -0.613578, -0.382394]
----
-Label        : 1
-Position     : [1315.69, 1117.06]
-Measurements : [1052.25, 128330, 0.30612, -0.789024]
----
-Label        : 1
-Position     : [322.204, 1117.2]
-Measurements : [1072.93, 231534, 1.07337, 0.251528]
----
-Label        : 1
-Position     : [976.936, 1117.26]
-Measurements : [1466.07, 232995, 0.150008, -0.445359]
----
-Label        : 1
-Position     : [980.538, 1117.53]
-Measurements : [1380.98, 200485, 0.198664, -0.4273]
----
-Label        : 1
-Position     : [318.379, 1117.76]
-Measurements : [922.922, 330255, 0.989479, -0.28201]
----
-Label        : 1
-Position     : [293.031, 1118.43]
-Measurements : [1183.39, 110523, 0.586584, -0.21553]
----
-Label        : 1
-Position     : [896.518, 1118.63]
-Measurements : [1135.73, 502124, 0.773855, -0.946832]
----
-Label        : 0
-Position     : [162.013, 1118.89]
-Measurements : [1046.11, 3723.81, -0.18434, -0.555536]
----
-Label        : 1
-Position     : [947.969, 1119.13]
-Measurements : [1296.02, 313995, -0.281319, -1.34654]
----
-Label        : 1
-Position     : [1040.98, 1119.33]
-Measurements : [817.424, 132441, 0.391018, -0.924471]
----
-Label        : 0
-Position     : [107.701, 1119.51]
-Measurements : [1004.92, 15855.4, -0.504019, 1.26513]
----
-Label        : 1
-Position     : [617.7, 1119.53]
-Measurements : [1110.42, 314501, 0.461469, -1.24448]
----
-Label        : 1
-Position     : [954.222, 1119.68]
-Measurements : [1350.9, 197683, 0.187335, -1.30852]
----
-Label        : 1
-Position     : [979.157, 1120.44]
-Measurements : [1218.54, 187873, 0.34507, 0.00234448]
----
-Label        : 1
-Position     : [1022.52, 1120.46]
-Measurements : [1025.14, 321899, 0.33598, -1.43068]
----
-Label        : 1
-Position     : [1095.19, 1120.64]
-Measurements : [1535.75, 232272, -0.142176, -0.500953]
----
-Label        : 1
-Position     : [1097.72, 1120.92]
-Measurements : [1554.26, 258599, 0.0481866, -0.942775]
----
-Label        : 0
-Position     : [224.089, 1120.93]
-Measurements : [1030.74, 2676.05, -2.31253, 8.00231]
----
-Label        : 1
-Position     : [1019.45, 1121.22]
-Measurements : [1185.69, 358416, -0.0286825, -1.36273]
----
-Label        : 1
-Position     : [1095.64, 1121.22]
-Measurements : [1529.92, 191916, -0.126115, -0.578863]
----
-Label        : 1
-Position     : [6.71789, 1121.62]
-Measurements : [1591.16, 264087, -0.287199, -1.10858]
----
-Label        : 1
-Position     : [949.825, 1121.73]
-Measurements : [1363.53, 299022, -0.430466, -1.25047]
----
-Label        : 1
-Position     : [1021.64, 1122.08]
-Measurements : [1250.54, 324483, -0.13649, -1.24278]
----
-Label        : 0
-Position     : [230.059, 1122.35]
-Measurements : [929.305, 11586.8, -0.75956, -0.103885]
----
-Label        : 1
-Position     : [974.394, 1123.27]
-Measurements : [1524.68, 369930, 0.49282, -0.548381]
----
-Label        : 1
-Position     : [1044.44, 1123.27]
-Measurements : [1032.55, 276660, -0.0447536, -1.51575]
----
-Label        : 1
-Position     : [1022.65, 1123.3]
-Measurements : [1290.52, 294234, -0.0652611, -1.0898]
----
-Label        : 1
-Position     : [968.949, 1123.43]
-Measurements : [1471.81, 415163, 0.457305, -0.784827]
----
-Label        : 1
-Position     : [624.191, 1124]
-Measurements : [890.2, 244990, 1.03644, -0.172235]
----
-Label        : 1
-Position     : [621.857, 1124.07]
-Measurements : [696.259, 94737.2, 2.18233, 5.84234]
----
-Label        : 1
-Position     : [949.818, 1124.09]
-Measurements : [1065.72, 362022, 0.449653, -1.43843]
----
-Label        : 1
-Position     : [631.038, 1124.12]
-Measurements : [1591.81, 319505, -0.41229, -0.844146]
----
-Label        : 1
-Position     : [9.704, 1124.15]
-Measurements : [1231.3, 422557, 0.200027, -1.68301]
----
-Label        : 0
-Position     : [157.119, 1124.41]
-Measurements : [1056.4, 38740.7, 0.247114, 1.08397]
----
-Label        : 1
-Position     : [626.302, 1124.45]
-Measurements : [1135.07, 375979, 0.387306, -1.30277]
----
-Label        : 1
-Position     : [1018.56, 1124.71]
-Measurements : [1454.8, 237028, -0.350559, -0.532075]
----
-Label        : 1
-Position     : [1018.22, 1124.91]
-Measurements : [1454.8, 237028, -0.350559, -0.532075]
----
-Label        : 1
-Position     : [978.837, 1125.23]
-Measurements : [1029.9, 317605, 1.10817, 0.583133]
----
-Label        : 1
-Position     : [1091.56, 1125.33]
-Measurements : [1160.73, 394681, 0.120183, -1.66112]
----
-Label        : 1
-Position     : [10.8516, 1125.62]
-Measurements : [1072.72, 420117, 0.609403, -1.38314]
----
-Label        : 1
-Position     : [1094, 1125.73]
-Measurements : [1281.12, 329526, -0.17595, -1.51126]
----
-Label        : 1
-Position     : [1047.27, 1125.95]
-Measurements : [1123.06, 295589, 0.135125, -1.40774]
----
-Label        : 1
-Position     : [744.838, 1126.11]
-Measurements : [1022.72, 313192, 0.0629765, -1.35426]
----
-Label        : 1
-Position     : [969.889, 1126.14]
-Measurements : [1628.39, 366728, 0.126048, -0.745168]
----
-Label        : 1
-Position     : [295.032, 1126.48]
-Measurements : [1047.8, 249877, 0.483722, -1.19177]
----
-Label        : 1
-Position     : [291.874, 1126.57]
-Measurements : [1226.69, 138531, 0.392667, -0.314183]
----
-Label        : 1
-Position     : [292.404, 1126.67]
-Measurements : [1184.46, 174180, 0.208548, -0.657442]
----
-Label        : 1
-Position     : [969.433, 1126.79]
-Measurements : [1628.39, 366728, 0.126048, -0.745168]
----
-Label        : 0
-Position     : [151.959, 1126.84]
-Measurements : [1303.66, 157811, 0.0185304, -1.25052]
----
-Label        : 0
-Position     : [120.577, 1127.36]
-Measurements : [928.118, 13857.8, -1.64526, 1.98989]
----
-Label        : 1
-Position     : [1039.26, 1127.91]
-Measurements : [1241.12, 142161, -0.0150767, -0.759667]
----
-Label        : 1
-Position     : [5.30779, 1128.1]
-Measurements : [944.431, 304391, 1.04353, -0.335558]
----
-Label        : 1
-Position     : [1044.95, 1128.21]
-Measurements : [1454.37, 136002, -0.408306, -0.050401]
----
-Label        : 1
-Position     : [311.796, 1128.43]
-Measurements : [516.136, 43139.8, 1.83871, 2.18098]
----
-Label        : 1
-Position     : [746.724, 1128.54]
-Measurements : [1272.59, 222451, -0.216323, -0.631394]
----
-Label        : 0
-Position     : [100.428, 1128.93]
-Measurements : [969.132, 17879.2, -1.87672, 3.23088]
----
-Label        : 1
-Position     : [629.988, 1128.95]
-Measurements : [1700.89, 271813, -0.587899, -0.553474]
----
-Label        : 1
-Position     : [1086.68, 1129]
-Measurements : [787.301, 243765, 0.993342, -0.472551]
----
-Label        : 1
-Position     : [317.693, 1129]
-Measurements : [683.774, 58613.4, 0.188041, -0.887551]
----
-Label        : 1
-Position     : [971.558, 1129.4]
-Measurements : [1583.45, 291772, 0.569015, -0.192093]
----
-Label        : 1
-Position     : [969.959, 1129.88]
-Measurements : [1568.55, 315171, 0.451701, -0.295612]
----
-Label        : 1
-Position     : [1093.55, 1130.14]
-Measurements : [1096.95, 319763, 0.296364, -1.56766]
----
-Label        : 0
-Position     : [159.72, 1130.31]
-Measurements : [1085.67, 24078.9, -1.41563, 0.937455]
----
-Label        : 1
-Position     : [632.224, 1130.54]
-Measurements : [1875.29, 224853, -0.527495, -0.187398]
----
-Label        : 1
-Position     : [36.0026, 1130.6]
-Measurements : [1136.47, 392664, 0.141498, -1.26417]
----
-Label        : 1
-Position     : [1042.8, 1130.64]
-Measurements : [1521.63, 124932, -0.389979, -0.22042]
----
-Label        : 1
-Position     : [758.59, 1130.77]
-Measurements : [1512.8, 209622, -0.204781, -0.762893]
----
-Label        : 1
-Position     : [744.207, 1130.96]
-Measurements : [1195.6, 321731, -0.103009, -1.15426]
----
-Label        : 1
-Position     : [972.346, 1131.46]
-Measurements : [1481.66, 277398, 0.499083, 0.146027]
----
-Label        : 1
-Position     : [1091.02, 1131.51]
-Measurements : [1122.69, 319490, 0.114157, -1.64666]
----
-Label        : 0
-Position     : [205.482, 1131.59]
-Measurements : [1024.32, 12456.4, -2.56799, 8.61018]
----
-Label        : 1
-Position     : [43.844, 1131.87]
-Measurements : [1165.39, 284950, 0.863729, -0.753485]
----
-Label        : 1
-Position     : [39.4, 1131.9]
-Measurements : [1323.52, 251333, 0.317063, -1.07014]
----
-Label        : 1
-Position     : [314.488, 1132.62]
-Measurements : [766.555, 98758.9, 0.502569, -0.347876]
----
-Label        : 1
-Position     : [755.735, 1132.64]
-Measurements : [1504.91, 199923, 0.0839969, -1.0132]
----
-Label        : 1
-Position     : [631.11, 1133.04]
-Measurements : [1912.48, 211997, -0.537191, -0.172032]
----
-Label        : 1
-Position     : [1013.17, 1133.05]
-Measurements : [894.744, 184817, 0.300538, -1.50086]
----
-Label        : 1
-Position     : [1091.54, 1133.92]
-Measurements : [1186.44, 283275, -0.077929, -1.60438]
----
-Label        : 1
-Position     : [636.554, 1134.26]
-Measurements : [1660.44, 458292, -0.295868, -1.13566]
----
-Label        : 1
-Position     : [763.518, 1134.28]
-Measurements : [1230.6, 175525, 0.292462, -0.451196]
----
-Label        : 1
-Position     : [632.855, 1134.69]
-Measurements : [1893.81, 243747, -0.403782, -0.526413]
----
-Label        : 0
-Position     : [138.906, 1135.02]
-Measurements : [853.322, 12556.1, -1.76641, 2.77119]
----
-Label        : 0
-Position     : [200.477, 1135.77]
-Measurements : [828.799, 54698.7, -0.23034, -1.74816]
----
-Label        : 0
-Position     : [108.981, 1135.89]
-Measurements : [983.519, 5901.38, 0.460685, -1.0713]
----
-Label        : 1
-Position     : [1041.57, 1135.97]
-Measurements : [1251.27, 327451, -0.15749, -1.4196]
----
-Label        : 1
-Position     : [627.992, 1135.99]
-Measurements : [1501.21, 319429, 0.354041, -1.01453]
----
-Label        : 1
-Position     : [291.948, 1136.01]
-Measurements : [932.205, 216500, 0.937441, 0.266747]
----
-Label        : 1
-Position     : [1014.94, 1136.38]
-Measurements : [1153.14, 210896, -0.307712, -1.17327]
----
-Label        : 1
-Position     : [751.069, 1136.78]
-Measurements : [1308.03, 278297, 0.186299, -1.09681]
----
-Label        : 1
-Position     : [653.314, 1136.83]
-Measurements : [1675.46, 782722, -0.111543, -1.20664]
----
-Label        : 1
-Position     : [964.966, 1136.94]
-Measurements : [896.149, 238106, 0.953832, -0.326273]
----
-Label        : 0
-Position     : [132.735, 1137.13]
-Measurements : [872.972, 4561.19, -0.534553, -0.715854]
----
-Label        : 1
-Position     : [969.07, 1137.19]
-Measurements : [1169.75, 268077, 0.0518946, -1.35931]
----
-Label        : 1
-Position     : [756.638, 1137.43]
-Measurements : [1260.57, 167288, 0.543398, -0.0136713]
----
-Label        : 0
-Position     : [141.091, 1137.53]
-Measurements : [1042.07, 130453, 0.966673, -0.26523]
----
-Label        : 1
-Position     : [636.132, 1137.97]
-Measurements : [1670.41, 480113, -0.268542, -1.1685]
----
-Label        : 1
-Position     : [1042.9, 1138.02]
-Measurements : [1005.13, 312595, 0.562031, -1.28514]
----
-Label        : 1
-Position     : [289.4, 1138.26]
-Measurements : [1010.6, 192603, 0.756089, 0.267923]
----
-Label        : 1
-Position     : [634.692, 1138.36]
-Measurements : [1785.04, 378250, -0.29383, -1.0051]
----
-Label        : 1
-Position     : [637.73, 1138.36]
-Measurements : [1490.32, 572827, -0.012165, -1.43545]
----
-Label        : 1
-Position     : [767.328, 1138.98]
-Measurements : [714.19, 180572, 1.65842, 1.85807]
----
-Label        : 1
-Position     : [1087.85, 1139.65]
-Measurements : [1557.74, 150628, -0.833591, 0.385313]
----
-Label        : 1
-Position     : [1044.49, 1139.7]
-Measurements : [926.791, 294133, 0.952724, -0.73062]
----
-Label        : 1
-Position     : [286.235, 1139.74]
-Measurements : [1169.68, 114625, 0.984141, 1.90722]
----
-Label        : 1
-Position     : [1092.81, 1139.97]
-Measurements : [1459.3, 216384, -0.329166, -1.1956]
----
-Label        : 0
-Position     : [228.639, 1140.23]
-Measurements : [1232.22, 46859.2, 0.371178, -1.35799]
----
-Label        : 1
-Position     : [1017.97, 1140.42]
-Measurements : [1381.77, 200423, -0.277902, -0.420345]
----
-Label        : 1
-Position     : [651.697, 1140.42]
-Measurements : [1749.46, 814711, -0.220851, -1.42414]
----
-Label        : 0
-Position     : [156.826, 1140.82]
-Measurements : [1283.51, 161811, 0.675848, -0.56946]
----
-Label        : 1
-Position     : [1013.54, 1141.32]
-Measurements : [1565.07, 120026, -0.53445, 1.17169]
----
-Label        : 1
-Position     : [647.501, 1141.55]
-Measurements : [1495.26, 867369, 0.101414, -1.50972]
----
-Label        : 1
-Position     : [1014.54, 1141.7]
-Measurements : [1576.32, 107979, -0.135096, 0.499446]
----
-Label        : 1
-Position     : [721.202, 1141.72]
-Measurements : [956.677, 196307, 0.142456, -0.763618]
----
-Label        : 1
-Position     : [964.79, 1141.74]
-Measurements : [625.868, 172911, 2.54853, 5.27219]
----
-Label        : 0
-Position     : [169.854, 1141.85]
-Measurements : [1308.13, 58658.9, 0.526328, -0.868855]
----
-Label        : 0
-Position     : [171.863, 1141.92]
-Measurements : [1435.59, 59089.7, 0.149777, -1.40351]
----
-Label        : 1
-Position     : [1088.57, 1142.41]
-Measurements : [1621.93, 137380, -0.648513, -0.0471067]
----
-Label        : 0
-Position     : [129.945, 1142.46]
-Measurements : [919.733, 933.24, -0.472886, 0.434218]
----
-Label        : 1
-Position     : [1009.14, 1143.37]
-Measurements : [1468.03, 216957, -0.476265, -0.181204]
----
-Label        : 0
-Position     : [240.962, 1143.41]
-Measurements : [843.451, 43046.5, -0.0668802, -1.1608]
----
-Label        : 1
-Position     : [1088.97, 1143.47]
-Measurements : [1593.35, 153600, -0.526202, -0.464171]
----
-Label        : 1
-Position     : [1012.99, 1144.63]
-Measurements : [1660.72, 121411, -0.0882883, -0.218307]
----
-Label        : 0
-Position     : [126.5, 1144.64]
-Measurements : [918.687, 3970.85, -0.876945, 3.51086]
----
-Label        : 1
-Position     : [6.632, 1144.7]
-Measurements : [2221.2, 349450, -0.814199, 0.21863]
----
-Label        : 1
-Position     : [720.51, 1144.93]
-Measurements : [1024.62, 192598, -0.0422643, -0.732742]
----
-Label        : 1
-Position     : [1038.29, 1145.39]
-Measurements : [1146.85, 292515, 0.493896, -0.273585]
----
-Label        : 0
-Position     : [136.404, 1145.43]
-Measurements : [905.554, 1004.83, 0.788542, -0.0894318]
----
-Label        : 1
-Position     : [1010.03, 1145.8]
-Measurements : [1591.95, 179658, -0.444554, 0.0879009]
----
-Label        : 1
-Position     : [1085.4, 1145.8]
-Measurements : [1588.85, 150307, -0.56307, -0.154259]
----
-Label        : 1
-Position     : [722.799, 1146]
-Measurements : [1136.63, 106376, 0.292177, 0.284196]
----
-Label        : 1
-Position     : [287.199, 1146.22]
-Measurements : [1101.02, 247833, 0.400411, -1.08682]
----
-Label        : 1
-Position     : [1088.31, 1146.43]
-Measurements : [1467.95, 222410, -0.324458, -1.12877]
----
-Label        : 1
-Position     : [1041.03, 1146.46]
-Measurements : [1114.59, 438922, 0.88341, -0.170194]
----
-Label        : 0
-Position     : [165.737, 1146.89]
-Measurements : [1149.03, 11686.3, 0.378348, -0.73669]
----
-Label        : 1
-Position     : [3.14686, 1147.61]
-Measurements : [2315.14, 211255, -0.643725, 0.380212]
----
-Label        : 1
-Position     : [1006.06, 1147.66]
-Measurements : [1407.08, 273096, -0.286826, -0.823738]
----
-Label        : 1
-Position     : [5.76968, 1147.75]
-Measurements : [2361.71, 192047, -0.574013, 0.0944329]
----
-Label        : 0
-Position     : [95.8535, 1148.89]
-Measurements : [1043.14, 4039.13, 0.34265, -0.976442]
----
-Label        : 1
-Position     : [286.84, 1149.01]
-Measurements : [1117.53, 249389, 0.324471, -1.20021]
----
-Label        : 1
-Position     : [1086.57, 1149.1]
-Measurements : [1433.75, 258862, -0.295462, -1.1583]
----
-Label        : 1
-Position     : [314.043, 1149.17]
-Measurements : [826.213, 111604, 2.41388, 5.83775]
----
-Label        : 0
-Position     : [192.486, 1149.6]
-Measurements : [1209.73, 54018, 0.352959, -1.42971]
----
-Label        : 1
-Position     : [1003.13, 1149.7]
-Measurements : [1219.37, 389379, 0.0325397, -1.45289]
----
-Label        : 1
-Position     : [1034.21, 1149.78]
-Measurements : [1454.99, 245800, 0.853194, 0.595]
----
-Label        : 1
-Position     : [1035.42, 1149.89]
-Measurements : [1502.71, 269280, 0.806998, 0.273687]
----
-Label        : 1
-Position     : [309.224, 1150.05]
-Measurements : [953.735, 197743, 1.02165, 0.178332]
----
-Label        : 0
-Position     : [230.115, 1150.06]
-Measurements : [1163.99, 13498.4, 0.267976, 0.623753]
----
-Label        : 1
-Position     : [1007.35, 1150.61]
-Measurements : [1595.08, 253254, -0.341438, -0.521532]
----
-Label        : 1
-Position     : [1084.17, 1150.71]
-Measurements : [1475.29, 253947, -0.285451, -1.11393]
----
-Label        : 0
-Position     : [220.38, 1150.72]
-Measurements : [1406.21, 45677.3, -0.887135, -0.654873]
----
-Label        : 1
-Position     : [6.64686, 1150.84]
-Measurements : [2067.21, 313072, -0.488555, -0.721966]
----
-Label        : 1
-Position     : [774.755, 1151.02]
-Measurements : [905.172, 304152, 0.737353, -0.883288]
----
-Label        : 0
-Position     : [91.127, 1151.09]
-Measurements : [1173.03, 21051.2, 1.37188, 2.70561]
----
-Label        : 1
-Position     : [6.12, 1151.35]
-Measurements : [1990.35, 281745, -0.410493, -0.84822]
----
-Label        : 1
-Position     : [1037.28, 1151.55]
-Measurements : [1595.3, 336847, 0.242418, -0.754099]
----
-Label        : 0
-Position     : [227.787, 1151.76]
-Measurements : [1181.88, 21940.6, 0.713167, 0.331678]
----
-Label        : 1
-Position     : [666.065, 1151.78]
-Measurements : [1255.1, 705566, 0.311059, -1.2594]
----
-Label        : 1
-Position     : [1080.88, 1152.84]
-Measurements : [1460.67, 278986, -0.15895, -0.692329]
----
-Label        : 1
-Position     : [1110.92, 1152.98]
-Measurements : [1654.6, 296910, 0.40103, -1.11604]
----
-Label        : 1
-Position     : [1007.16, 1153.17]
-Measurements : [1409.85, 367620, 0.140601, -1.3886]
----
-Label        : 0
-Position     : [229.56, 1153.27]
-Measurements : [1206.73, 15553.6, -0.114988, 1.07142]
----
-Label        : 1
-Position     : [1037.59, 1153.44]
-Measurements : [1598.85, 354198, 0.19774, -0.92183]
----
-Label        : 1
-Position     : [288.516, 1153.69]
-Measurements : [772.077, 259186, 1.52119, 0.813144]
----
-Label        : 1
-Position     : [776.225, 1153.75]
-Measurements : [1026.53, 339644, 0.545387, -1.15853]
----
-Label        : 1
-Position     : [2.78325, 1153.99]
-Measurements : [1864.55, 216033, -0.0864642, -1.06612]
----
-Label        : 1
-Position     : [1087.3, 1154.25]
-Measurements : [1103.6, 225363, 0.64597, -0.747493]
----
-Label        : 1
-Position     : [1110.26, 1154.52]
-Measurements : [1739.89, 238706, 0.335358, -0.886881]
----
-Label        : 0
-Position     : [174.137, 1154.67]
-Measurements : [1427.73, 47665.8, -0.630245, 0.509506]
----
-Label        : 0
-Position     : [145.05, 1154.7]
-Measurements : [1221.8, 217789, 0.157037, -1.34233]
----
-Label        : 1
-Position     : [308.506, 1154.71]
-Measurements : [940.75, 113844, 0.931214, 0.922325]
----
-Label        : 0
-Position     : [146.191, 1154.85]
-Measurements : [1310.59, 242056, -0.125762, -1.39595]
----
-Label        : 0
-Position     : [102.193, 1155.2]
-Measurements : [1118.24, 13183, 2.62639, 11.1511]
----
-Label        : 1
-Position     : [666.852, 1155.58]
-Measurements : [1504.53, 639924, 0.0798386, -1.17231]
----
-Label        : 1
-Position     : [1034.2, 1155.63]
-Measurements : [1637.8, 254615, 0.313633, -0.432779]
----
-Label        : 1
-Position     : [45.6109, 1155.75]
-Measurements : [950.641, 388082, 0.550202, -1.27312]
----
-Label        : 1
-Position     : [1037.82, 1155.83]
-Measurements : [1584.5, 376728, 0.0635747, -0.84991]
----
-Label        : 1
-Position     : [46.8161, 1156.08]
-Measurements : [1136.68, 416802, 0.115468, -1.46727]
----
-Label        : 1
-Position     : [1032.58, 1157.1]
-Measurements : [1525.62, 196565, -0.348416, -0.261578]
----
-Label        : 1
-Position     : [10.4649, 1157.13]
-Measurements : [1282.26, 370987, 0.432619, -0.768665]
----
-Label        : 1
-Position     : [775.569, 1157.18]
-Measurements : [1327.56, 259850, -0.136, -1.26029]
----
-Label        : 1
-Position     : [1081.8, 1157.22]
-Measurements : [1610.31, 315715, 0.163968, -0.849958]
----
-Label        : 1
-Position     : [774.257, 1157.31]
-Measurements : [1382.79, 219603, -0.214492, -1.06328]
----
-Label        : 1
-Position     : [1105, 1157.62]
-Measurements : [1425.5, 190806, 0.0835614, -0.512457]
----
-Label        : 1
-Position     : [1080.89, 1157.67]
-Measurements : [1666.01, 289439, 0.0934961, -0.818089]
----
-Label        : 0
-Position     : [171.875, 1157.77]
-Measurements : [1355.3, 47895.1, -0.920909, 0.891197]
----
-Label        : 1
-Position     : [1111.32, 1157.98]
-Measurements : [1760.22, 302281, -0.161825, -0.755027]
----
-Label        : 0
-Position     : [115.068, 1158.51]
-Measurements : [994.761, 21197.4, -1.6234, 1.83583]
----
-Label        : 1
-Position     : [7.656, 1159.03]
-Measurements : [1305.08, 295855, -0.0831315, -1.50138]
----
-Label        : 1
-Position     : [774.586, 1159.08]
-Measurements : [1431.5, 203821, -0.396619, -0.917594]
----
-Label        : 1
-Position     : [769.236, 1159.26]
-Measurements : [1335.92, 164932, 0.319891, -1.04671]
----
-Label        : 1
-Position     : [1034.28, 1159.48]
-Measurements : [1450.07, 277183, -0.222387, -1.00844]
----
-Label        : 1
-Position     : [44.52, 1159.54]
-Measurements : [1239.65, 490685, -0.0903567, -1.46974]
----
-Label        : 0
-Position     : [179.332, 1159.58]
-Measurements : [1205.49, 43796.6, -0.0434319, -0.203013]
----
-Label        : 1
-Position     : [1037.62, 1159.82]
-Measurements : [1319.67, 355350, 0.0921585, -1.41574]
----
-Label        : 1
-Position     : [671.115, 1160.14]
-Measurements : [855.894, 444276, 1.88032, 2.42662]
----
-Label        : 1
-Position     : [1106.98, 1160.26]
-Measurements : [1417.53, 144462, 0.596014, 0.463787]
----
-Label        : 1
-Position     : [305.64, 1160.29]
-Measurements : [914.347, 122039, 0.866925, 0.920378]
----
-Label        : 1
-Position     : [1032.97, 1160.95]
-Measurements : [1314, 325452, -0.0550434, -1.31711]
----
-Label        : 1
-Position     : [50.5872, 1160.97]
-Measurements : [1673.48, 106613, -0.250052, 0.330115]
----
-Label        : 0
-Position     : [118.672, 1161.44]
-Measurements : [943.731, 18417.6, -1.08217, -0.117994]
----
-Label        : 1
-Position     : [1081.16, 1161.54]
-Measurements : [1778.86, 359125, 0.0385953, -0.998229]
----
-Label        : 1
-Position     : [306.024, 1161.67]
-Measurements : [957.765, 98584.5, 1.28924, 1.91503]
----
-Label        : 1
-Position     : [48.798, 1161.95]
-Measurements : [1687.78, 173141, -0.453277, 1.15164]
----
-Label        : 1
-Position     : [306.365, 1162.03]
-Measurements : [967.185, 101075, 1.47147, 2.27644]
----
-Label        : 0
-Position     : [93.0062, 1162.4]
-Measurements : [1360.46, 232997, 0.935395, -0.174343]
----
-Label        : 1
-Position     : [12.2981, 1162.52]
-Measurements : [894.349, 254483, 1.09828, -0.34333]
----
-Label        : 1
-Position     : [679.14, 1162.95]
-Measurements : [1225.94, 277101, 0.162187, -0.65047]
----
-Label        : 1
-Position     : [1078.84, 1163]
-Measurements : [1769.8, 333630, -0.0293483, -0.710707]
----
-Label        : 1
-Position     : [282.684, 1163.14]
-Measurements : [1146.41, 459797, 0.384399, -1.49957]
----
-Label        : 1
-Position     : [281.166, 1163.16]
-Measurements : [1227.07, 403801, 0.23897, -1.44882]
----
-Label        : 1
-Position     : [775.34, 1163.24]
-Measurements : [1368.95, 322228, -0.187189, -1.3608]
----
-Label        : 1
-Position     : [774.177, 1163.99]
-Measurements : [1458.28, 268717, -0.362289, -1.03724]
----
-Label        : 1
-Position     : [678.286, 1164.26]
-Measurements : [1244.35, 241009, -0.0883215, -0.634315]
----
-Label        : 1
-Position     : [280.552, 1164.38]
-Measurements : [1255.74, 352484, 0.247431, -1.28641]
----
-Label        : 1
-Position     : [770.095, 1164.39]
-Measurements : [1449.94, 272127, -0.241911, -0.944929]
----
-Label        : 1
-Position     : [1082.31, 1164.49]
-Measurements : [1629.05, 450304, 0.211624, -1.18485]
----
-Label        : 1
-Position     : [682.569, 1164.63]
-Measurements : [1591.97, 263869, 0.0242676, -0.852369]
----
-Label        : 1
-Position     : [53.736, 1164.66]
-Measurements : [1796.13, 157909, 0.450942, -0.454492]
----
-Label        : 1
-Position     : [707.639, 1165.03]
-Measurements : [1271.67, 634350, 0.194827, -1.31768]
----
-Label        : 1
-Position     : [1107.74, 1165.1]
-Measurements : [1294.07, 183733, -0.123783, -0.809899]
----
-Label        : 1
-Position     : [1080.77, 1165.63]
-Measurements : [1773.51, 357820, -0.043212, -0.953411]
----
-Label        : 1
-Position     : [776.707, 1165.82]
-Measurements : [1175.26, 343226, 0.274219, -1.43895]
----
-Label        : 1
-Position     : [1103.3, 1165.99]
-Measurements : [1388.72, 111477, 0.094887, -0.0160851]
----
-Label        : 0
-Position     : [178.895, 1166.25]
-Measurements : [1201.14, 27570.1, 1.00641, 1.99209]
----
-Label        : 1
-Position     : [302.207, 1166.63]
-Measurements : [1052.22, 283675, 0.725463, -0.484432]
----
-Label        : 1
-Position     : [686.513, 1166.64]
-Measurements : [1588.11, 374684, -0.160246, -1.22808]
----
-Label        : 1
-Position     : [61.2249, 1166.72]
-Measurements : [1381.32, 483799, 0.404876, -1.14896]
----
-Label        : 1
-Position     : [1100.73, 1166.73]
-Measurements : [1330.61, 135362, 0.478571, 0.565417]
----
-Label        : 1
-Position     : [1078.02, 1167.1]
-Measurements : [1667.27, 358577, 0.223234, -0.891751]
----
-Label        : 1
-Position     : [689.403, 1167.11]
-Measurements : [1324.63, 501103, 0.433018, -1.4523]
----
-Label        : 1
-Position     : [771.719, 1167.27]
-Measurements : [1276.21, 392712, 0.0712801, -1.50023]
----
-Label        : 1
-Position     : [1073.6, 1167.6]
-Measurements : [1424.16, 411550, -0.282248, -1.18686]
----
-Label        : 1
-Position     : [708.044, 1168]
-Measurements : [1499.85, 524059, -0.165003, -0.937737]
----
-Label        : 1
-Position     : [709.86, 1168.28]
-Measurements : [1627.81, 372373, -0.135262, -0.359293]
----
-Label        : 1
-Position     : [304.408, 1168.35]
-Measurements : [1142.16, 211147, 1.00798, 0.0174553]
----
-Label        : 1
-Position     : [302.568, 1168.99]
-Measurements : [1102.22, 259636, 0.694823, -0.419347]
----
-Label        : 1
-Position     : [689.815, 1169.03]
-Measurements : [1196.13, 470720, 0.763316, -0.956375]
----
-Label        : 1
-Position     : [60.904, 1169.27]
-Measurements : [1368.07, 562764, 0.498212, -1.17687]
----
-Label        : 1
-Position     : [1097.62, 1169.43]
-Measurements : [1213.18, 201338, 0.523949, 0.112324]
----
-Label        : 0
-Position     : [166.876, 1169.93]
-Measurements : [1096.64, 6676.84, 1.02148, 1.16828]
----
-Label        : 1
-Position     : [1104.49, 1170]
-Measurements : [1626.49, 183840, -0.02518, -0.151867]
----
-Label        : 1
-Position     : [806.033, 1170.33]
-Measurements : [1158.68, 355309, 0.0438268, -1.25804]
----
-Label        : 1
-Position     : [278.397, 1170.37]
-Measurements : [1205.98, 347297, 0.444187, -1.05963]
----
-Label        : 1
-Position     : [1100.84, 1170.5]
-Measurements : [1525.53, 171933, 0.236063, 0.244859]
----
-Label        : 0
-Position     : [139.794, 1170.86]
-Measurements : [930.684, 4478.8, 0.844888, -0.191425]
----
-Label        : 1
-Position     : [4.93162, 1171.5]
-Measurements : [1118.23, 221427, 0.238215, -1.23187]
----
-Label        : 1
-Position     : [771.066, 1171.65]
-Measurements : [830.07, 360156, 1.38665, 0.414918]
----
-Label        : 1
-Position     : [808.583, 1171.77]
-Measurements : [1239.92, 313375, -0.109397, -1.03812]
----
-Label        : 0
-Position     : [118.333, 1171.89]
-Measurements : [1020.45, 12099.2, -0.818138, 1.12655]
----
-Label        : 1
-Position     : [55.9968, 1172.8]
-Measurements : [1544.15, 681175, 0.189277, -1.53925]
----
-Label        : 1
-Position     : [8.68, 1172.86]
-Measurements : [1303.49, 426137, 0.651849, -0.78275]
----
-Label        : 1
-Position     : [1076.35, 1172.94]
-Measurements : [1655.4, 363428, -0.100214, -1.25256]
----
-Label        : 1
-Position     : [1099.97, 1173.19]
-Measurements : [1568.65, 202352, -0.171849, -0.172079]
----
-Label        : 1
-Position     : [5.95018, 1173.32]
-Measurements : [1141.07, 267697, 0.616905, -0.542866]
----
-Label        : 1
-Position     : [272.168, 1173.36]
-Measurements : [1493.27, 200158, 0.957997, -0.386417]
----
-Label        : 1
-Position     : [1074.75, 1173.65]
-Measurements : [1720.63, 332586, -0.233922, -1.15701]
----
-Label        : 1
-Position     : [809.513, 1174.98]
-Measurements : [1475.58, 172448, -0.12461, -0.319519]
----
-Label        : 1
-Position     : [274.92, 1175.14]
-Measurements : [1414.44, 313497, 0.292329, -0.810036]
----
-Label        : 1
-Position     : [1103.28, 1175.18]
-Measurements : [1840.97, 145460, -0.709086, 0.577184]
----
-Label        : 0
-Position     : [147.316, 1175.59]
-Measurements : [1016.22, 5487.3, -0.104575, 1.26667]
----
-Label        : 1
-Position     : [807.354, 1175.87]
-Measurements : [1582.88, 137255, -0.126631, -0.136175]
----
-Label        : 1
-Position     : [808.479, 1175.91]
-Measurements : [1557.25, 146285, 0.00798069, -0.47452]
----
-Label        : 1
-Position     : [804.68, 1176.08]
-Measurements : [1436.92, 254438, -0.571786, -0.327179]
----
-Label        : 0
-Position     : [173.258, 1176.28]
-Measurements : [1160.75, 9792.88, -0.58472, 0.246237]
----
-Label        : 1
-Position     : [69.4278, 1176.54]
-Measurements : [1811.43, 412728, -0.200677, -0.851505]
----
-Label        : 1
-Position     : [1102.07, 1177.05]
-Measurements : [1789.93, 141051, -0.503698, 0.21021]
----
-Label        : 1
-Position     : [772.021, 1177.11]
-Measurements : [765.338, 332384, 1.60682, 0.936659]
----
-Label        : 1
-Position     : [770.353, 1177.7]
-Measurements : [870.617, 395075, 1.062, -0.561307]
----
-Label        : 1
-Position     : [65, 1177.98]
-Measurements : [1710.7, 431309, -0.195393, -0.948929]
----
-Label        : 1
-Position     : [1150.42, 1178.15]
-Measurements : [951.68, 212839, 0.349942, -0.967092]
----
-Label        : 1
-Position     : [1074.22, 1178.51]
-Measurements : [1714.99, 309998, -0.321104, -0.952352]
----
-Label        : 1
-Position     : [821.954, 1178.58]
-Measurements : [897.679, 150305, 0.42116, -0.794245]
----
-Label        : 1
-Position     : [1150.02, 1179.53]
-Measurements : [996.775, 237733, 0.377424, -0.815537]
----
-Label        : 1
-Position     : [90.1359, 1180.11]
-Measurements : [1068.05, 45901.2, 1.80289, 5.12569]
----
-Label        : 1
-Position     : [804.078, 1180.38]
-Measurements : [1258.64, 277823, 0.00212332, -1.18351]
----
-Label        : 1
-Position     : [1104.13, 1180.45]
-Measurements : [1603.25, 292510, -0.584487, -1.05308]
----
-Label        : 1
-Position     : [1076.57, 1180.46]
-Measurements : [1433.87, 379487, 0.199152, -1.22763]
----
-Label        : 1
-Position     : [1073.93, 1180.61]
-Measurements : [1447.55, 408477, -0.0256431, -1.23079]
----
-Label        : 1
-Position     : [769.262, 1181.19]
-Measurements : [1289.29, 436584, 0.0565775, -1.55561]
----
-Label        : 1
-Position     : [6.12, 1181.56]
-Measurements : [1267.28, 375035, 0.517701, -0.664949]
----
-Label        : 1
-Position     : [803.898, 1181.71]
-Measurements : [1236.23, 307134, 0.0525878, -1.33434]
----
-Label        : 1
-Position     : [75.335, 1181.87]
-Measurements : [1552.96, 800826, 0.402943, -1.29492]
----
-Label        : 1
-Position     : [1074.32, 1181.9]
-Measurements : [1342.13, 373976, 0.146331, -1.28879]
----
-Label        : 1
-Position     : [1153.68, 1181.97]
-Measurements : [1207.04, 246005, 0.0483445, -1.05673]
----
-Label        : 1
-Position     : [762.975, 1181.97]
-Measurements : [1231.07, 278627, 0.389004, -1.07186]
----
-Label        : 1
-Position     : [11.102, 1181.99]
-Measurements : [1413.08, 486277, 0.211868, -1.29281]
----
-Label        : 1
-Position     : [73.192, 1182.07]
-Measurements : [1802.21, 810669, 0.037417, -1.50906]
----
-Label        : 1
-Position     : [66.443, 1182.3]
-Measurements : [2019.14, 590751, -0.524916, -0.643552]
----
-Label        : 1
-Position     : [1097.15, 1182.38]
-Measurements : [1527.3, 221353, -0.175875, -1.04613]
----
-Label        : 1
-Position     : [825.786, 1182.42]
-Measurements : [1182.26, 286006, -0.0928366, -1.23431]
----
-Label        : 1
-Position     : [4.09723, 1182.5]
-Measurements : [1179.43, 295213, 0.545959, -0.490188]
----
-Label        : 1
-Position     : [1151, 1182.52]
-Measurements : [1252.11, 257518, 0.0621691, -0.767241]
----
-Label        : 1
-Position     : [1102.21, 1182.96]
-Measurements : [1655.51, 252755, -0.665866, -0.796063]
----
-Label        : 1
-Position     : [73.1307, 1182.99]
-Measurements : [1802.21, 810669, 0.037417, -1.50906]
----
-Label        : 1
-Position     : [825.112, 1183.15]
-Measurements : [1271.38, 244428, -0.315896, -0.939105]
----
-Label        : 1
-Position     : [1097.56, 1183.19]
-Measurements : [1487.83, 213545, 0.0659557, -1.1985]
----
-Label        : 1
-Position     : [1154.09, 1183.6]
-Measurements : [1396.51, 230610, 0.187407, -0.703307]
----
-Label        : 1
-Position     : [766.394, 1183.65]
-Measurements : [1588.02, 251511, -0.507433, -0.756907]
----
-Label        : 0
-Position     : [127.434, 1183.75]
-Measurements : [948.533, 20332.5, -0.523438, -0.341544]
----
-Label        : 0
-Position     : [232.217, 1183.76]
-Measurements : [1189.62, 27441.2, 0.0170941, -0.820611]
----
-Label        : 0
-Position     : [185.352, 1183.84]
-Measurements : [1177.2, 5451.08, -0.058732, -0.683641]
----
-Label        : 1
-Position     : [87.528, 1184.12]
-Measurements : [958.423, 119859, 0.322424, 0.165602]
----
-Label        : 1
-Position     : [91.2962, 1184.46]
-Measurements : [1033.72, 33959.5, -0.458446, 1.763]
----
-Label        : 1
-Position     : [1100.25, 1184.95]
-Measurements : [1531.14, 249588, -0.248127, -1.10074]
----
-Label        : 1
-Position     : [1099.03, 1184.95]
-Measurements : [1530.41, 219911, -0.141532, -1.06876]
----
-Label        : 1
-Position     : [1153.44, 1185.01]
-Measurements : [1598.93, 257100, -0.155389, -1.01089]
----
-Label        : 1
-Position     : [762.156, 1185.34]
-Measurements : [1296.5, 340204, 0.0615162, -1.40969]
----
-Label        : 1
-Position     : [803.97, 1185.35]
-Measurements : [1256.88, 326282, 0.10677, -1.45978]
----
-Label        : 1
-Position     : [1092.13, 1185.7]
-Measurements : [1008.44, 171793, 0.79629, -0.0759009]
----
-Label        : 1
-Position     : [1093.23, 1186.01]
-Measurements : [1033.28, 198643, 0.819167, 0.00458842]
----
-Label        : 1
-Position     : [799.162, 1186.11]
-Measurements : [1355, 291078, -0.416914, -1.17096]
----
-Label        : 1
-Position     : [824.558, 1186.11]
-Measurements : [1522.09, 153982, -0.232506, -0.131787]
----
-Label        : 1
-Position     : [1096.06, 1186.86]
-Measurements : [1291.83, 210552, 0.428369, -0.748787]
----
-Label        : 1
-Position     : [798.694, 1186.94]
-Measurements : [1289.91, 322788, -0.271621, -1.37939]
----
-Label        : 1
-Position     : [819.753, 1187.13]
-Measurements : [1269.05, 226137, 0.0833932, -1.1808]
----
-Label        : 1
-Position     : [1097.74, 1187.34]
-Measurements : [1269.99, 226143, 0.560891, -0.55951]
----
-Label        : 0
-Position     : [107.795, 1187.46]
-Measurements : [974.298, 18497, -0.1773, -0.0338076]
----
-Label        : 1
-Position     : [1095.11, 1187.7]
-Measurements : [1131.48, 221926, 0.653684, -0.257936]
----
-Label        : 1
-Position     : [1095.52, 1187.7]
-Measurements : [1131.48, 221926, 0.653684, -0.257936]
----
-Label        : 1
-Position     : [1156.24, 1188.51]
-Measurements : [1640.19, 261126, -0.23606, -1.13799]
----
-Label        : 1
-Position     : [826.156, 1188.61]
-Measurements : [1394.35, 282487, -0.236088, -0.982104]
----
-Label        : 1
-Position     : [9.192, 1188.73]
-Measurements : [1795.61, 156376, 0.41132, -0.33843]
----
-Label        : 1
-Position     : [766.394, 1189.39]
-Measurements : [1274.08, 326507, 0.286603, -1.30143]
----
-Label        : 1
-Position     : [802.198, 1189.39]
-Measurements : [1440.98, 246023, -0.415642, -1.16846]
----
-Label        : 1
-Position     : [768.045, 1189.66]
-Measurements : [1195.73, 362902, 0.465562, -1.33141]
----
-Label        : 1
-Position     : [1091.93, 1189.68]
-Measurements : [711.534, 82232.5, 0.94323, 0.64927]
----
-Label        : 1
-Position     : [798.879, 1190]
-Measurements : [1584.3, 188729, -1.05308, 0.550662]
----
-Label        : 1
-Position     : [1152.48, 1190.3]
-Measurements : [1672.47, 364311, -0.511787, -1.1885]
----
-Label        : 1
-Position     : [820.502, 1190.42]
-Measurements : [1295, 269247, 0.1181, -1.21844]
----
-Label        : 1
-Position     : [1152.86, 1190.57]
-Measurements : [1672.47, 364311, -0.511787, -1.1885]
----
-Label        : 1
-Position     : [13.8267, 1190.64]
-Measurements : [1710.02, 199292, -0.326539, -0.647723]
----
-Label        : 1
-Position     : [821.69, 1191.02]
-Measurements : [1331.21, 266615, 0.0752261, -1.15059]
----
-Label        : 1
-Position     : [1153.84, 1191.06]
-Measurements : [1622.26, 391575, -0.391323, -1.31254]
----
-Label        : 1
-Position     : [1149.59, 1191.23]
-Measurements : [1375.61, 524379, 0.0222752, -1.71337]
----
-Label        : 1
-Position     : [825.051, 1191.3]
-Measurements : [1306.23, 295348, 0.0187257, -1.17552]
----
-Label        : 1
-Position     : [859.374, 1191.84]
-Measurements : [1304.06, 396412, 0.130115, -1.16986]
----
-Label        : 1
-Position     : [5.81273, 1191.94]
-Measurements : [1492.18, 147510, 0.0304225, -0.833112]
----
-Label        : 0
-Position     : [196.511, 1192.22]
-Measurements : [1607.13, 44011.5, 0.123893, -1.41548]
----
-Label        : 1
-Position     : [761.952, 1192.6]
-Measurements : [1265.09, 402702, 0.0570166, -1.51692]
----
-Label        : 1
-Position     : [1152.86, 1192.62]
-Measurements : [1521.03, 511762, -0.23247, -1.65025]
----
-Label        : 1
-Position     : [75.5997, 1192.84]
-Measurements : [749.381, 215968, 1.15818, 0.410867]
----
-Label        : 1
-Position     : [857.466, 1193.25]
-Measurements : [1407.08, 322798, -0.0847183, -0.998472]
----
-Label        : 1
-Position     : [864.373, 1193.35]
-Measurements : [1257.72, 212586, 0.994952, 0.534599]
----
-Label        : 1
-Position     : [799.162, 1193.48]
-Measurements : [1620.7, 154920, -0.801872, -0.115901]
----
-Label        : 1
-Position     : [795.008, 1193.6]
-Measurements : [1386.23, 330501, -0.58523, -0.985151]
----
-Label        : 1
-Position     : [798.663, 1193.86]
-Measurements : [1609.82, 167327, -0.937791, 0.320673]
----
-Label        : 1
-Position     : [768.778, 1194.21]
-Measurements : [932.05, 300184, 1.09552, -0.281007]
----
-Label        : 1
-Position     : [792.253, 1195.43]
-Measurements : [1055.97, 354882, 0.22741, -1.40818]
----
-Label        : 0
-Position     : [161.728, 1195.56]
-Measurements : [1050.87, 5899.31, -0.303962, -0.044112]
----
-Label        : 1
-Position     : [798.343, 1195.94]
-Measurements : [1594.06, 172516, -0.800125, -0.0638567]
----
-Label        : 1
-Position     : [761.07, 1196.35]
-Measurements : [1432.35, 364425, -0.190549, -1.39131]
----
-Label        : 1
-Position     : [857.326, 1196.35]
-Measurements : [1250.1, 385819, 0.267622, -1.1927]
----
-Label        : 1
-Position     : [79.336, 1196.41]
-Measurements : [1180.75, 443880, 0.317155, -1.13477]
----
-Label        : 1
-Position     : [765.898, 1197.04]
-Measurements : [1071.85, 359810, 0.723553, -1.05485]
----
-Label        : 1
-Position     : [801.746, 1197.09]
-Measurements : [1369.86, 230534, 0.126528, -1.48602]
----
-Label        : 1
-Position     : [294.771, 1197.31]
-Measurements : [924.689, 354266, 0.825889, -0.750758]
----
-Label        : 1
-Position     : [853.573, 1197.33]
-Measurements : [971.671, 333839, 0.739649, -0.695533]
----
-Label        : 1
-Position     : [877.806, 1198.4]
-Measurements : [711.088, 104285, 1.4406, 1.44004]
----
-Label        : 1
-Position     : [10.216, 1198.46]
-Measurements : [1827.32, 240774, 0.0304515, -0.774381]
----
-Label        : 1
-Position     : [818.237, 1198.82]
-Measurements : [1047, 371466, 0.87564, -0.519433]
----
-Label        : 1
-Position     : [289.835, 1199.1]
-Measurements : [718.394, 255371, 1.38507, 0.540872]
----
-Label        : 1
-Position     : [294.376, 1199.2]
-Measurements : [1001.89, 306094, 0.757925, -0.666724]
----
-Label        : 1
-Position     : [795.476, 1199.22]
-Measurements : [1185.12, 365745, 0.0183278, -1.53179]
----
-Label        : 1
-Position     : [757.378, 1199.59]
-Measurements : [1315.24, 408113, 0.0787407, -1.49655]
----
-Label        : 1
-Position     : [80.1549, 1199.7]
-Measurements : [1244.74, 405225, 0.41905, -1.17794]
----
-Label        : 0
-Position     : [132.888, 1200.69]
-Measurements : [1081.44, 27934, 0.356593, 4.06093]
----
-Label        : 1
-Position     : [856.943, 1200.87]
-Measurements : [1099.61, 348047, 0.500254, -1.09179]
----
-Label        : 1
-Position     : [798.717, 1200.99]
-Measurements : [1171.85, 313919, 0.174347, -1.44847]
----
-Label        : 1
-Position     : [8.26564, 1201.04]
-Measurements : [1593.37, 238480, -0.0750373, -0.905243]
----
-Label        : 1
-Position     : [14.6304, 1201.25]
-Measurements : [1989.93, 375142, -0.568585, -0.623087]
----
-Label        : 1
-Position     : [11.872, 1201.47]
-Measurements : [1878.07, 283262, -0.108716, -0.884632]
----
-Label        : 1
-Position     : [757.383, 1201.67]
-Measurements : [1203.89, 346874, 0.377234, -1.15645]
----
-Label        : 1
-Position     : [753.746, 1202.28]
-Measurements : [1018.77, 206945, 0.724485, -0.404962]
----
-Label        : 1
-Position     : [874.79, 1202.42]
-Measurements : [823.945, 180336, 1.15259, 0.370505]
----
-Label        : 1
-Position     : [816.775, 1202.49]
-Measurements : [1277.91, 407298, 0.225137, -1.16466]
----
-Label        : 1
-Position     : [12.264, 1202.55]
-Measurements : [1975.23, 295764, -0.320646, -0.838866]
----
-Label        : 0
-Position     : [186.377, 1202.61]
-Measurements : [1372.58, 147226, -0.363546, -1.33675]
----
-Label        : 1
-Position     : [270.087, 1202.61]
-Measurements : [731.651, 228259, 1.58597, 1.25361]
----
-Label        : 1
-Position     : [878.836, 1203.11]
-Measurements : [848.244, 242834, 1.07867, -0.18974]
----
-Label        : 1
-Position     : [265.192, 1203.3]
-Measurements : [1165.77, 273250, 0.505811, -0.885315]
----
-Label        : 0
-Position     : [162.979, 1204.42]
-Measurements : [812.26, 45876.6, 0.0554185, -1.4658]
----
-Label        : 1
-Position     : [855.278, 1204.54]
-Measurements : [922.078, 166029, 0.900278, -0.257132]
----
-Label        : 0
-Position     : [160.943, 1204.57]
-Measurements : [808.898, 44084.3, 0.00983514, -1.36082]
----
-Label        : 1
-Position     : [811.336, 1204.86]
-Measurements : [1218.67, 233231, 0.778767, -0.254009]
----
-Label        : 1
-Position     : [872.931, 1205.06]
-Measurements : [880.312, 221325, 0.954574, -0.190436]
----
-Label        : 1
-Position     : [8.02011, 1205.07]
-Measurements : [1608.5, 230530, -0.220706, -0.820422]
----
-Label        : 1
-Position     : [818.772, 1205.09]
-Measurements : [1470.3, 357246, -0.0182837, -1.11492]
----
-Label        : 1
-Position     : [813.839, 1205.21]
-Measurements : [1405.77, 289029, 0.283281, -0.859455]
----
-Label        : 1
-Position     : [859.546, 1205.65]
-Measurements : [890.991, 108297, 1.24734, 1.57051]
----
-Label        : 1
-Position     : [11.1202, 1205.67]
-Measurements : [1982.09, 188002, 0.0591524, -0.617607]
----
-Label        : 0
-Position     : [172.906, 1205.7]
-Measurements : [701.565, 6990.93, 2.07489, 5.58847]
----
-Label        : 1
-Position     : [1146.87, 1206.73]
-Measurements : [916.242, 277081, 0.410514, -1.41405]
----
-Label        : 1
-Position     : [79.1713, 1206.84]
-Measurements : [911.106, 310157, 1.20421, 0.573365]
----
-Label        : 1
-Position     : [757.383, 1207]
-Measurements : [1287.94, 379562, 0.422226, -0.753552]
----
-Label        : 1
-Position     : [874.529, 1207.41]
-Measurements : [883.549, 250160, 0.901673, -0.566962]
----
-Label        : 1
-Position     : [266.636, 1207.49]
-Measurements : [973.078, 346547, 0.909499, -0.593301]
----
-Label        : 1
-Position     : [814.727, 1207.82]
-Measurements : [1486.97, 307317, 0.101435, -0.940271]
----
-Label        : 1
-Position     : [1151.88, 1207.93]
-Measurements : [856.073, 274754, 0.639899, -1.25517]
----
-Label        : 1
-Position     : [854.621, 1208.13]
-Measurements : [1060.52, 172373, 0.739862, -0.671865]
----
-Label        : 1
-Position     : [14.824, 1208.7]
-Measurements : [2171.92, 155829, 0.227236, -0.919945]
----
-Label        : 1
-Position     : [758.404, 1208.73]
-Measurements : [1359.35, 521184, 0.589396, -0.784245]
----
-Label        : 1
-Position     : [1146.5, 1208.96]
-Measurements : [1080.61, 235520, -0.0865575, -1.38126]
----
-Label        : 1
-Position     : [1147.94, 1209]
-Measurements : [1084.39, 240852, -0.113844, -1.41867]
----
-Label        : 1
-Position     : [848.343, 1209.1]
-Measurements : [825.078, 217935, 0.86336, -0.354854]
----
-Label        : 1
-Position     : [1147.54, 1209.41]
-Measurements : [1165.1, 205559, -0.350789, -1.13496]
----
-Label        : 1
-Position     : [1146.95, 1209.71]
-Measurements : [1166.03, 199265, -0.338016, -1.08855]
----
-Label        : 1
-Position     : [82.408, 1209.72]
-Measurements : [1303.49, 380234, 0.222019, -0.862375]
----
-Label        : 1
-Position     : [791.848, 1210.35]
-Measurements : [1033.7, 405911, 0.534803, -1.01415]
----
-Label        : 1
-Position     : [759.246, 1210.7]
-Measurements : [1427.21, 542382, 0.482749, -1.06428]
----
-Label        : 1
-Position     : [871.913, 1211.07]
-Measurements : [1151.41, 386125, 0.459999, -1.05337]
----
-Label        : 1
-Position     : [869.578, 1211.09]
-Measurements : [1068.34, 302377, 0.751652, -0.373732]
----
-Label        : 1
-Position     : [847.912, 1211.42]
-Measurements : [742.205, 183218, 1.13478, 0.276318]
----
-Label        : 1
-Position     : [15.8737, 1211.89]
-Measurements : [2343.75, 165428, 0.0743857, -1.45722]
----
-Label        : 1
-Position     : [755.745, 1211.91]
-Measurements : [1817.41, 357409, -0.036646, -0.721701]
----
-Label        : 1
-Position     : [751.627, 1211.99]
-Measurements : [1516.84, 466227, 0.366788, -0.83318]
----
-Label        : 1
-Position     : [871.766, 1212.2]
-Measurements : [1215.53, 441193, 0.350756, -1.28659]
----
-Label        : 1
-Position     : [814.318, 1212.73]
-Measurements : [1191.83, 406019, 0.391043, -1.12124]
----
-Label        : 1
-Position     : [852.001, 1212.73]
-Measurements : [958.28, 155298, 0.944017, 0.0482365]
----
-Label        : 1
-Position     : [909.531, 1212.96]
-Measurements : [884.748, 342927, 0.886771, -0.582627]
----
-Label        : 1
-Position     : [260.584, 1213.02]
-Measurements : [1077.25, 312499, 0.623861, -0.982408]
----
-Label        : 1
-Position     : [284.136, 1213.02]
-Measurements : [1371.41, 329253, -0.091794, -1.14797]
----
-Label        : 1
-Position     : [86.8254, 1213.03]
-Measurements : [1458.97, 325044, 0.0850041, -1.01114]
----
-Label        : 1
-Position     : [9.87187, 1213.4]
-Measurements : [1711.85, 417815, 0.0331565, -0.88982]
----
-Label        : 1
-Position     : [792.199, 1213.55]
-Measurements : [1462.62, 450200, 0.148354, -0.833265]
----
-Label        : 1
-Position     : [871.662, 1213.55]
-Measurements : [1271.39, 476000, 0.308982, -1.25782]
----
-Label        : 1
-Position     : [82.5704, 1213.6]
-Measurements : [1698.48, 184574, 0.0132581, -0.401171]
----
-Label        : 1
-Position     : [282.796, 1213.68]
-Measurements : [1230.26, 412366, 0.164402, -1.39135]
----
-Label        : 1
-Position     : [793.948, 1213.96]
-Measurements : [1421.52, 469665, 0.21813, -0.831042]
----
-Label        : 1
-Position     : [1143.74, 1214.11]
-Measurements : [1133.24, 213930, -0.226796, -1.28842]
----
-Label        : 1
-Position     : [905.413, 1214.14]
-Measurements : [1207.88, 461935, 0.0915895, -1.5239]
----
-Label        : 0
-Position     : [178.36, 1214.28]
-Measurements : [766.149, 4079.33, 1.56613, 1.86491]
----
-Label        : 1
-Position     : [15.336, 1214.33]
-Measurements : [2423.45, 183125, 0.0486293, -1.10514]
----
-Label        : 0
-Position     : [131.742, 1214.34]
-Measurements : [936.518, 20172.8, -0.304679, 1.13836]
----
-Label        : 1
-Position     : [756.203, 1214.35]
-Measurements : [1799.29, 481028, -0.197371, -0.988624]
----
-Label        : 1
-Position     : [1142.67, 1214.61]
-Measurements : [1034.69, 228523, 0.0839063, -1.38911]
----
-Label        : 1
-Position     : [909.78, 1214.87]
-Measurements : [1117.69, 418789, 0.380851, -1.31459]
----
-Label        : 1
-Position     : [258.906, 1214.98]
-Measurements : [1078.44, 277833, 0.53751, -0.890986]
----
-Label        : 1
-Position     : [280.156, 1215.14]
-Measurements : [1027.23, 379387, 0.612957, -1.09361]
----
-Label        : 0
-Position     : [119.654, 1215.16]
-Measurements : [973.622, 44681.7, 0.4596, 0.253037]
----
-Label        : 0
-Position     : [128.804, 1215.37]
-Measurements : [926.183, 28247.1, 0.260325, 2.06074]
----
-Label        : 1
-Position     : [755.335, 1215.6]
-Measurements : [1837.2, 445531, -0.274624, -0.802054]
----
-Label        : 1
-Position     : [759.726, 1215.7]
-Measurements : [1359.43, 705840, 0.650318, -1.11076]
----
-Label        : 1
-Position     : [746.562, 1216.14]
-Measurements : [1225.45, 224906, 0.503518, -0.982275]
----
-Label        : 1
-Position     : [811.113, 1216.19]
-Measurements : [730.386, 246836, 1.74971, 1.85232]
----
-Label        : 1
-Position     : [756.649, 1216.32]
-Measurements : [1703.19, 588354, -0.048937, -1.34199]
----
-Label        : 0
-Position     : [131.871, 1216.33]
-Measurements : [909.844, 13797, -0.984392, 1.27645]
----
-Label        : 1
-Position     : [253.915, 1216.33]
-Measurements : [1080.04, 179154, 0.369279, -0.0178993]
----
-Label        : 1
-Position     : [1146.31, 1216.37]
-Measurements : [1190.47, 158488, -0.554648, -1.05723]
----
-Label        : 1
-Position     : [791.38, 1216.42]
-Measurements : [1755.74, 313424, -0.00816374, -0.518683]
----
-Label        : 1
-Position     : [851.948, 1216.73]
-Measurements : [1177.64, 293207, 0.408663, -1.03527]
----
-Label        : 1
-Position     : [914.089, 1216.85]
-Measurements : [972.153, 207751, 0.844733, 0.167141]
----
-Label        : 1
-Position     : [285.672, 1217.12]
-Measurements : [1415.82, 249102, -0.0727781, -0.674173]
----
-Label        : 1
-Position     : [288.55, 1217.19]
-Measurements : [1322.11, 280795, 0.148007, -0.88388]
----
-Label        : 1
-Position     : [788.228, 1217.69]
-Measurements : [1601.6, 462082, -0.261452, -0.710461]
----
-Label        : 1
-Position     : [812.188, 1217.72]
-Measurements : [701.541, 237729, 1.99031, 2.78772]
----
-Label        : 1
-Position     : [907.322, 1217.74]
-Measurements : [1682.85, 390793, -0.0135373, -0.575758]
----
-Label        : 1
-Position     : [909.516, 1217.75]
-Measurements : [1541, 482589, 0.239899, -0.923021]
----
-Label        : 1
-Position     : [80.36, 1217.91]
-Measurements : [1679.26, 171675, -0.130206, -0.141252]
----
-Label        : 1
-Position     : [259.674, 1217.92]
-Measurements : [758.745, 248822, 1.68135, 1.685]
----
-Label        : 1
-Position     : [17.5562, 1218.03]
-Measurements : [2678.93, 191799, -1.42829, 3.37401]
----
-Label        : 1
-Position     : [793.29, 1218.25]
-Measurements : [1656.77, 333908, 0.463085, -0.929399]
----
-Label        : 1
-Position     : [747.371, 1218.3]
-Measurements : [1298.58, 254042, 0.325729, -1.26416]
----
-Label        : 1
-Position     : [249.182, 1218.5]
-Measurements : [1069.04, 101005, -0.607746, -0.712342]
----
-Label        : 1
-Position     : [1162.5, 1218.76]
-Measurements : [1505.7, 491152, 0.805507, -0.674457]
----
-Label        : 1
-Position     : [871.252, 1218.88]
-Measurements : [1798.52, 387780, -0.338564, -0.862378]
----
-Label        : 1
-Position     : [904.748, 1218.97]
-Measurements : [1768.93, 440880, -0.231233, -0.696289]
----
-Label        : 1
-Position     : [843.182, 1219.1]
-Measurements : [1122.98, 588369, 0.693368, -0.763251]
----
-Label        : 1
-Position     : [11.4749, 1219.13]
-Measurements : [2197.52, 364364, -0.729895, -0.229045]
----
-Label        : 1
-Position     : [287.453, 1219.31]
-Measurements : [1207.18, 282762, 0.341719, -0.770938]
----
-Label        : 1
-Position     : [794.615, 1219.42]
-Measurements : [1572.63, 372173, 0.618228, -0.934499]
----
-Label        : 1
-Position     : [234.885, 1219.54]
-Measurements : [1162.35, 104704, 0.371147, 1.63789]
----
-Label        : 1
-Position     : [846.17, 1219.78]
-Measurements : [1373.06, 541971, 0.217375, -1.04107]
----
-Label        : 1
-Position     : [868.473, 1219.85]
-Measurements : [1724.47, 490118, -0.230996, -1.06146]
----
-Label        : 1
-Position     : [750.83, 1220.11]
-Measurements : [1540.65, 326390, 0.246965, -0.853089]
----
-Label        : 1
-Position     : [290.28, 1220.19]
-Measurements : [967.021, 301911, 0.893497, -0.0993775]
----
-Label        : 1
-Position     : [287.753, 1220.38]
-Measurements : [1118.73, 295328, 0.530871, -0.626394]
----
-Label        : 1
-Position     : [847.905, 1220.52]
-Measurements : [1516.89, 553376, 0.133567, -1.15221]
----
-Label        : 1
-Position     : [866.581, 1220.55]
-Measurements : [1526.49, 467194, 0.12961, -1.24029]
----
-Label        : 1
-Position     : [249.832, 1220.7]
-Measurements : [952.769, 145228, -0.0548567, -1.53415]
----
-Label        : 1
-Position     : [754.386, 1220.73]
-Measurements : [1505.02, 452253, 0.229136, -0.981314]
----
-Label        : 1
-Position     : [790.151, 1220.93]
-Measurements : [1785.59, 310558, -0.0502628, -0.763834]
----
-Label        : 1
-Position     : [807.622, 1221.32]
-Measurements : [878.987, 168161, 0.666003, -0.491093]
----
-Label        : 1
-Position     : [786.966, 1221.57]
-Measurements : [1433.63, 479609, -0.15224, -1.17562]
----
-Label        : 1
-Position     : [78.3397, 1221.58]
-Measurements : [1571.64, 202256, -0.481934, -0.0621826]
----
-Label        : 1
-Position     : [930.767, 1221.62]
-Measurements : [1282.96, 459300, 0.00763679, -1.48934]
----
-Label        : 1
-Position     : [864.789, 1221.62]
-Measurements : [1328.81, 360256, 0.487199, -1.06278]
----
-Label        : 1
-Position     : [867.829, 1221.71]
-Measurements : [1688.18, 461851, -0.229008, -1.0514]
----
-Label        : 1
-Position     : [926.704, 1221.78]
-Measurements : [1113.68, 341650, 0.448803, -1.0555]
----
-Label        : 1
-Position     : [906.094, 1221.84]
-Measurements : [1920.02, 277201, -0.0198953, -0.571137]
----
-Label        : 1
-Position     : [15.336, 1222.01]
-Measurements : [2516.24, 202144, -0.148118, -0.0875051]
----
-Label        : 1
-Position     : [1172.23, 1222.03]
-Measurements : [1599.01, 391892, 0.691466, 0.345097]
----
-Label        : 1
-Position     : [809.838, 1222.25]
-Measurements : [938.059, 224223, 0.483807, -0.898122]
----
-Label        : 1
-Position     : [804.888, 1222.39]
-Measurements : [970.848, 133092, 0.634874, 0.195407]
----
-Label        : 1
-Position     : [238.52, 1222.49]
-Measurements : [1310.99, 195029, 0.0953162, -0.732769]
----
-Label        : 0
-Position     : [140.699, 1222.6]
-Measurements : [967.235, 2961.46, 0.860597, 0.738803]
----
-Label        : 1
-Position     : [931.316, 1222.81]
-Measurements : [1369.78, 434520, -0.191234, -1.43647]
----
-Label        : 1
-Position     : [901.789, 1222.87]
-Measurements : [1458.44, 600982, -0.0139851, -1.27951]
----
-Label        : 1
-Position     : [928.444, 1222.91]
-Measurements : [1346.44, 365050, -0.0697131, -1.29736]
----
-Label        : 1
-Position     : [875.049, 1223]
-Measurements : [1197.35, 653274, 0.837206, -0.80181]
----
-Label        : 1
-Position     : [82.9643, 1223.24]
-Measurements : [1803.34, 134873, 0.1435, -0.49312]
----
-Label        : 1
-Position     : [1164.74, 1223.74]
-Measurements : [2229.77, 575814, -0.292431, -1.11282]
----
-Label        : 1
-Position     : [1170.06, 1223.74]
-Measurements : [1868.77, 549650, 0.385324, -0.908998]
----
-Label        : 1
-Position     : [239.592, 1223.78]
-Measurements : [1251.76, 245777, 0.0664219, -1.06259]
----
-Label        : 1
-Position     : [846.676, 1223.79]
-Measurements : [1905.05, 360387, -0.429257, -0.684733]
----
-Label        : 1
-Position     : [80.872, 1224.06]
-Measurements : [1744.35, 155098, -0.0915156, -0.578833]
----
-Label        : 1
-Position     : [1162.13, 1224.16]
-Measurements : [2096.91, 692154, -0.115876, -1.49859]
----
-Label        : 1
-Position     : [870.023, 1224.2]
-Measurements : [1763.44, 413281, -0.237713, -0.871015]
----
-Label        : 1
-Position     : [863.664, 1224.27]
-Measurements : [1290.95, 276000, 0.48197, -1.03283]
----
-Label        : 1
-Position     : [906.844, 1224.58]
-Measurements : [1845.35, 340240, -0.0395007, -0.766385]
----
-Label        : 1
-Position     : [751.674, 1224.7]
-Measurements : [1371.12, 288650, 0.0519448, -1.0595]
----
-Label        : 1
-Position     : [785.941, 1224.92]
-Measurements : [1133.53, 464075, 0.493464, -1.10058]
----
-Label        : 1
-Position     : [294.499, 1225.02]
-Measurements : [650.489, 96289.7, 1.36371, 1.16223]
----
-Label        : 1
-Position     : [787.284, 1225.02]
-Measurements : [1233.36, 422995, 0.487997, -0.952479]
----
-Label        : 1
-Position     : [843.835, 1225.13]
-Measurements : [1869.01, 452044, -0.751668, -0.379219]
----
-Label        : 1
-Position     : [17.3172, 1225.28]
-Measurements : [2492.97, 143042, 0.321103, -0.0593158]
----
-Label        : 1
-Position     : [844.595, 1225.63]
-Measurements : [1959.6, 360340, -0.785183, 0.0399021]
----
-Label        : 1
-Position     : [296.669, 1225.88]
-Measurements : [742.942, 130932, 0.859113, -0.313118]
----
-Label        : 1
-Position     : [745.869, 1225.97]
-Measurements : [1151.33, 226392, 0.580858, -0.701615]
----
-Label        : 1
-Position     : [1177.05, 1225.98]
-Measurements : [1585.6, 189304, 0.0633345, -0.444408]
----
-Label        : 1
-Position     : [1176.21, 1226.2]
-Measurements : [1633.13, 178764, 0.153143, -0.785366]
----
-Label        : 1
-Position     : [865.927, 1226.25]
-Measurements : [1501.94, 324477, 0.166657, -0.889444]
----
-Label        : 0
-Position     : [150.771, 1226.62]
-Measurements : [945.835, 2810.44, -1.40093, 3.20244]
----
-Label        : 1
-Position     : [904.865, 1226.75]
-Measurements : [1784.36, 410944, -0.0403627, -0.759294]
----
-Label        : 1
-Position     : [748.782, 1226.83]
-Measurements : [1227.29, 257607, 0.375343, -0.911056]
----
-Label        : 1
-Position     : [844.218, 1227.48]
-Measurements : [1991.9, 331418, -0.790508, 0.0393777]
----
-Label        : 1
-Position     : [808.609, 1227.57]
-Measurements : [1098.06, 209074, 0.144377, -1.00202]
----
-Label        : 1
-Position     : [928.31, 1227.76]
-Measurements : [1639.48, 235764, -0.482709, -0.606112]
----
-Label        : 1
-Position     : [747.578, 1227.98]
-Measurements : [1102.9, 237964, 0.540202, -0.77443]
----
-Label        : 1
-Position     : [83.1913, 1228.3]
-Measurements : [1725.95, 168715, -0.143545, -0.522532]
----
-Label        : 1
-Position     : [926.96, 1228.37]
-Measurements : [1537.55, 226853, -0.255072, -0.693078]
----
-Label        : 1
-Position     : [302.761, 1228.43]
-Measurements : [1143.77, 133976, 0.450963, 1.17834]
----
-Label        : 0
-Position     : [156.879, 1228.46]
-Measurements : [946.406, 18109.5, -0.191883, 0.487]
----
-Label        : 1
-Position     : [743.704, 1228.51]
-Measurements : [960.514, 213048, 0.993258, 0.113225]
----
-Label        : 1
-Position     : [1172.41, 1228.64]
-Measurements : [1880.01, 537214, 0.460628, -0.437212]
----
-Label        : 1
-Position     : [905.202, 1228.65]
-Measurements : [1658.58, 325013, 0.0669244, -0.69995]
----
-Label        : 1
-Position     : [845.157, 1228.7]
-Measurements : [1973.87, 354655, -0.675772, -0.538657]
----
-Label        : 1
-Position     : [902.611, 1228.71]
-Measurements : [1599.41, 362335, -0.285628, -0.409707]
----
-Label        : 1
-Position     : [1183.99, 1229.07]
-Measurements : [1416.03, 104399, 0.989837, 1.2258]
----
-Label        : 1
-Position     : [300.52, 1229.41]
-Measurements : [1179.08, 265119, 0.927807, 0.811799]
----
-Label        : 1
-Position     : [1184.65, 1229.41]
-Measurements : [1411.18, 125542, 0.739785, 1.45012]
----
-Label        : 1
-Position     : [904.496, 1229.55]
-Measurements : [1655.59, 291582, -0.126127, -0.620944]
----
-Label        : 1
-Position     : [928.939, 1229.76]
-Measurements : [1552, 222588, -0.27606, -0.609991]
----
-Label        : 1
-Position     : [813.407, 1229.8]
-Measurements : [845.924, 211077, 1.00438, -0.36928]
----
-Label        : 1
-Position     : [805.472, 1229.82]
-Measurements : [874.327, 213249, 0.71872, -0.841291]
----
-Label        : 1
-Position     : [785.645, 1229.82]
-Measurements : [998.748, 287450, 0.755282, -0.432779]
----
-Label        : 1
-Position     : [1172.12, 1230]
-Measurements : [1829.53, 606080, 0.376467, -0.610032]
----
-Label        : 1
-Position     : [1179.78, 1230.02]
-Measurements : [1552.48, 144827, 0.708302, -0.33234]
----
-Label        : 1
-Position     : [294.209, 1230.04]
-Measurements : [1231.29, 558679, 0.475679, -1.1597]
----
-Label        : 0
-Position     : [135.652, 1230.22]
-Measurements : [1132.88, 24218.5, 1.04485, 0.947635]
----
-Label        : 1
-Position     : [871.499, 1230.59]
-Measurements : [1271.54, 387666, 0.228329, -1.38369]
----
-Label        : 1
-Position     : [897.3, 1230.81]
-Measurements : [1107.45, 483480, 0.443123, -1.11515]
----
-Label        : 1
-Position     : [788.412, 1230.85]
-Measurements : [1006.32, 225117, 0.956939, 0.236453]
----
-Label        : 0
-Position     : [172.006, 1231.09]
-Measurements : [764.245, 6700.82, 1.10045, 2.44211]
----
-Label        : 1
-Position     : [925.442, 1231.45]
-Measurements : [1457.06, 201568, -0.0827904, -0.449099]
----
-Label        : 1
-Position     : [901.588, 1231.67]
-Measurements : [1649.82, 432288, -0.393316, -0.599881]
----
-Label        : 1
-Position     : [837.017, 1231.98]
-Measurements : [1234.63, 569450, 0.154681, -1.56023]
----
-Label        : 1
-Position     : [784.852, 1232.08]
-Measurements : [1106.64, 287540, 0.669004, -0.199733]
----
-Label        : 1
-Position     : [840.967, 1232.08]
-Measurements : [1762.09, 384542, -0.961169, -0.191973]
----
-Label        : 1
-Position     : [867.182, 1232.49]
-Measurements : [1359.8, 289117, 0.286787, -0.967843]
----
-Label        : 1
-Position     : [927.035, 1232.5]
-Measurements : [1456.32, 265473, -0.20073, -0.921721]
----
-Label        : 1
-Position     : [215.016, 1232.61]
-Measurements : [1668.05, 361488, -0.212671, -0.527731]
----
-Label        : 1
-Position     : [786.979, 1233.6]
-Measurements : [1154.52, 278076, 0.705189, -0.117734]
----
-Label        : 1
-Position     : [215.742, 1234.14]
-Measurements : [1805.04, 245802, -0.257069, 0.147681]
----
-Label        : 1
-Position     : [863.242, 1234.26]
-Measurements : [1038.03, 202727, 0.760403, -0.245087]
----
-Label        : 1
-Position     : [214.635, 1234.37]
-Measurements : [1854.5, 185586, 0.0271868, 0.552599]
----
-Label        : 1
-Position     : [786.343, 1234.37]
-Measurements : [1197.42, 250329, 0.709552, 0.0957804]
----
-Label        : 1
-Position     : [923.953, 1234.44]
-Measurements : [1447.6, 208263, -0.041822, -0.701972]
----
-Label        : 1
-Position     : [17.896, 1234.66]
-Measurements : [2239.97, 878718, -0.500571, -1.11511]
----
-Label        : 1
-Position     : [16.6519, 1234.82]
-Measurements : [2245.42, 844234, -0.440372, -1.03476]
----
-Label        : 1
-Position     : [900.359, 1234.94]
-Measurements : [1416.86, 551278, 0.11982, -1.18663]
----
-Label        : 1
-Position     : [297.448, 1235.04]
-Measurements : [1814.39, 448896, -0.119873, -1.35972]
----
-Label        : 1
-Position     : [800.13, 1235.18]
-Measurements : [915.996, 184923, 0.49921, -0.877147]
----
-Label        : 1
-Position     : [1184.07, 1235.45]
-Measurements : [1703.55, 224413, 1.11423, 0.171697]
----
-Label        : 1
-Position     : [840.304, 1235.55]
-Measurements : [1828.01, 310526, -1.04268, 0.33815]
----
-Label        : 1
-Position     : [839.32, 1235.63]
-Measurements : [1739.61, 394281, -0.905096, -0.232115]
----
-Label        : 1
-Position     : [863.561, 1235.71]
-Measurements : [1011.11, 195394, 0.886399, 0.0760186]
----
-Label        : 1
-Position     : [898.668, 1235.95]
-Measurements : [1169.53, 518051, 0.545714, -1.00207]
----
-Label        : 1
-Position     : [922.985, 1235.95]
-Measurements : [1329.86, 269506, 0.0793324, -0.969957]
----
-Label        : 1
-Position     : [79.3361, 1236.06]
-Measurements : [1297.88, 329390, 0.257138, -0.939452]
----
-Label        : 1
-Position     : [16.3183, 1236.08]
-Measurements : [1942.73, 1.2736e+06, -0.0682841, -1.64411]
----
-Label        : 1
-Position     : [865.543, 1236.17]
-Measurements : [1090.45, 243359, 0.778857, -0.384085]
----
-Label        : 1
-Position     : [83.944, 1236.19]
-Measurements : [1426.26, 322624, 0.0424581, -1.08061]
----
-Label        : 1
-Position     : [780.375, 1236.46]
-Measurements : [879.165, 325633, 1.00037, 0.109566]
----
-Label        : 1
-Position     : [872.181, 1236.47]
-Measurements : [822.466, 279109, 1.52797, 0.988733]
----
-Label        : 1
-Position     : [79.1963, 1236.51]
-Measurements : [1297.88, 329390, 0.257138, -0.939452]
----
-Label        : 1
-Position     : [746.35, 1236.58]
-Measurements : [1067.85, 313847, 0.780247, -0.470879]
----
-Label        : 1
-Position     : [784.442, 1236.58]
-Measurements : [1171.59, 285270, 0.586534, -0.316596]
----
-Label        : 1
-Position     : [1187.42, 1236.63]
-Measurements : [2030.98, 282792, 0.0142445, -1.23582]
----
-Label        : 1
-Position     : [1188.89, 1236.87]
-Measurements : [2093.61, 240983, -0.0320629, -1.21898]
----
-Label        : 1
-Position     : [213.48, 1237.22]
-Measurements : [1859.73, 217907, -0.13619, 0.0246956]
----
-Label        : 1
-Position     : [212.732, 1237.23]
-Measurements : [1814.92, 211519, -0.129132, -0.14362]
----
-Label        : 0
-Position     : [171.098, 1237.92]
-Measurements : [881.646, 10935, 0.0708465, -1.03185]
----
-Label        : 1
-Position     : [294.482, 1238.02]
-Measurements : [1698.97, 609698, -0.128204, -1.50719]
----
-Label        : 1
-Position     : [841.377, 1238.22]
-Measurements : [1880.89, 254191, -0.636922, -0.557618]
----
-Label        : 1
-Position     : [211.392, 1238.84]
-Measurements : [1747.73, 190447, -0.0580938, -0.171229]
----
-Label        : 1
-Position     : [919.333, 1238.92]
-Measurements : [923.99, 208645, 0.773501, -0.68262]
----
-Label        : 1
-Position     : [802.465, 1239.04]
-Measurements : [1185.7, 306360, 0.16626, -1.08458]
----
-Label        : 1
-Position     : [781.429, 1239.41]
-Measurements : [1023.85, 345005, 0.6991, -0.393158]
----
-Label        : 1
-Position     : [746.759, 1239.49]
-Measurements : [1163.49, 299606, 0.599099, -0.744458]
----
-Label        : 1
-Position     : [213.229, 1239.83]
-Measurements : [1824.79, 233312, -0.0712011, -0.0846081]
----
-Label        : 1
-Position     : [742.467, 1239.94]
-Measurements : [1096.43, 288625, 0.714364, -0.380117]
----
-Label        : 1
-Position     : [901.974, 1240.12]
-Measurements : [1125, 397928, 0.914923, -0.0284579]
----
-Label        : 1
-Position     : [292.84, 1240.67]
-Measurements : [1346.63, 724605, 0.476662, -1.43048]
----
-Label        : 1
-Position     : [743.892, 1240.68]
-Measurements : [1170.87, 291753, 0.547246, -0.677062]
----
-Label        : 1
-Position     : [747.71, 1240.9]
-Measurements : [1118.82, 303959, 0.741731, -0.599327]
----
-Label        : 1
-Position     : [1198.72, 1240.97]
-Measurements : [2259.05, 347432, -0.0445919, -1.06256]
----
-Label        : 1
-Position     : [1196.13, 1241.16]
-Measurements : [2348.43, 326410, -0.205738, -0.877876]
----
-Label        : 1
-Position     : [742.604, 1241.47]
-Measurements : [1123.63, 294928, 0.580539, -0.597594]
----
-Label        : 1
-Position     : [896.742, 1241.99]
-Measurements : [1150.34, 484377, 0.670076, -0.664179]
----
-Label        : 1
-Position     : [806.138, 1242.01]
-Measurements : [1069.13, 337481, 0.676933, -0.867978]
----
-Label        : 1
-Position     : [783.194, 1242.19]
-Measurements : [1060.78, 232843, 0.78743, 0.361256]
----
-Label        : 1
-Position     : [296.008, 1242.3]
-Measurements : [1188.2, 516637, 1.09348, -0.0784587]
----
-Label        : 1
-Position     : [863.905, 1242.32]
-Measurements : [1017.85, 226619, 0.604561, -0.764185]
----
-Label        : 1
-Position     : [216.04, 1242.34]
-Measurements : [1737.25, 425200, -0.407536, -1.10453]
----
-Label        : 1
-Position     : [969.394, 1242.5]
-Measurements : [1244.53, 475935, 0.0207841, -1.55861]
----
-Label        : 0
-Position     : [131.564, 1242.59]
-Measurements : [931.007, 23518.6, -0.398983, -0.302945]
----
-Label        : 1
-Position     : [1223, 1242.7]
-Measurements : [1580.05, 303862, 0.235173, -0.588387]
----
-Label        : 1
-Position     : [801.236, 1242.73]
-Measurements : [1436.53, 186326, -0.0495089, -0.33619]
----
-Label        : 1
-Position     : [898.721, 1242.73]
-Measurements : [1297.07, 548093, 0.576645, -0.684907]
----
-Label        : 1
-Position     : [841.892, 1242.88]
-Measurements : [1765.02, 276807, -0.16917, -1.11542]
----
-Label        : 1
-Position     : [860.555, 1243.01]
-Measurements : [1137.74, 320185, 0.46322, -1.00322]
----
-Label        : 1
-Position     : [1204.87, 1243.02]
-Measurements : [2382.69, 269984, -0.332389, -1.1192]
----
-Label        : 1
-Position     : [861.824, 1243.37]
-Measurements : [1119, 293150, 0.472796, -0.918419]
----
-Label        : 1
-Position     : [1199.67, 1243.59]
-Measurements : [2396.51, 406919, -0.646015, -0.766349]
----
-Label        : 1
-Position     : [915.992, 1243.62]
-Measurements : [908.361, 145896, 0.969562, 0.714171]
----
-Label        : 1
-Position     : [969.679, 1243.74]
-Measurements : [1263.38, 450661, 0.0245447, -1.52338]
----
-Label        : 0
-Position     : [134.449, 1243.89]
-Measurements : [936.617, 24021.8, -0.364755, -0.597952]
----
-Label        : 1
-Position     : [779.527, 1243.95]
-Measurements : [1065.56, 249369, 0.131148, -1.2332]
----
-Label        : 1
-Position     : [1222.44, 1243.99]
-Measurements : [1644.93, 282358, 0.00611915, -0.867025]
----
-Label        : 1
-Position     : [915.266, 1244.21]
-Measurements : [974.785, 182502, 0.897241, 0.38456]
----
-Label        : 1
-Position     : [1214.09, 1244.56]
-Measurements : [2159.01, 165035, 0.208915, -0.211125]
----
-Label        : 1
-Position     : [1207.06, 1244.65]
-Measurements : [2438.12, 240250, -0.469927, -0.684881]
----
-Label        : 1
-Position     : [898.311, 1244.77]
-Measurements : [1520.01, 497180, 0.256235, -0.887349]
----
-Label        : 1
-Position     : [19.432, 1244.9]
-Measurements : [1152.88, 435171, 0.743054, -0.855253]
----
-Label        : 1
-Position     : [863.482, 1244.97]
-Measurements : [1060.45, 262489, 0.596244, -0.994629]
----
-Label        : 1
-Position     : [1211.42, 1245.06]
-Measurements : [2318.13, 238176, -0.118575, -0.564816]
----
-Label        : 1
-Position     : [863.467, 1245.12]
-Measurements : [1110.82, 289337, 0.466025, -1.14926]
----
-Label        : 1
-Position     : [212.377, 1245.14]
-Measurements : [1902.8, 241339, -0.620028, -0.379369]
----
-Label        : 1
-Position     : [898.864, 1245.17]
-Measurements : [1618.2, 435098, 0.190588, -0.806567]
----
-Label        : 0
-Position     : [168.186, 1245.19]
-Measurements : [1064.65, 7322.56, 0.328272, 0.563073]
----
-Label        : 1
-Position     : [291.038, 1245.22]
-Measurements : [984.714, 324931, 1.08294, -0.143452]
----
-Label        : 1
-Position     : [20.5982, 1245.26]
-Measurements : [1322.32, 579161, 0.409905, -1.32241]
----
-Label        : 1
-Position     : [1221.66, 1245.47]
-Measurements : [1699, 251977, -0.222801, -0.634156]
----
-Label        : 1
-Position     : [18.0231, 1245.57]
-Measurements : [1285.78, 541081, 0.506737, -1.17024]
----
-Label        : 1
-Position     : [838.919, 1245.59]
-Measurements : [1833.08, 177023, -0.208719, -0.387439]
----
-Label        : 1
-Position     : [210.799, 1245.61]
-Measurements : [1781, 231927, -0.446551, -0.568587]
----
-Label        : 1
-Position     : [896.627, 1245.69]
-Measurements : [1667.21, 434272, -0.0512293, -0.715904]
----
-Label        : 1
-Position     : [891.224, 1246.27]
-Measurements : [1233.78, 592214, 0.220704, -1.53333]
----
-Label        : 1
-Position     : [776.355, 1246.29]
-Measurements : [1303.16, 248183, -0.365057, -0.864135]
----
-Label        : 1
-Position     : [799.913, 1246.43]
-Measurements : [1366.77, 296133, 0.16384, -0.815227]
----
-Label        : 0
-Position     : [122.155, 1246.45]
-Measurements : [1202.03, 43292.8, -0.825552, 0.087116]
----
-Label        : 1
-Position     : [896.16, 1246.54]
-Measurements : [1767.4, 382927, -0.165061, -0.543131]
----
-Label        : 1
-Position     : [282.127, 1246.67]
-Measurements : [957.635, 257902, 0.414426, -1.20054]
----
-Label        : 1
-Position     : [1209.15, 1246.75]
-Measurements : [2401.75, 303733, -0.453457, -0.588507]
----
-Label        : 1
-Position     : [967.486, 1246.95]
-Measurements : [1160.41, 438712, 0.388608, -1.42383]
----
-Label        : 1
-Position     : [220.081, 1247.15]
-Measurements : [1118.06, 571152, 0.868769, -0.823116]
----
-Label        : 1
-Position     : [288.463, 1247.23]
-Measurements : [1111.55, 288619, 0.522288, -0.920139]
----
-Label        : 1
-Position     : [805.873, 1247.38]
-Measurements : [1109.86, 402200, 0.783666, -0.839501]
----
-Label        : 1
-Position     : [285.672, 1247.46]
-Measurements : [1176.35, 287250, 0.246708, -1.05309]
----
-Label        : 1
-Position     : [834.215, 1247.54]
-Measurements : [1731.9, 256776, -0.627676, 0.146996]
----
-Label        : 1
-Position     : [859.809, 1247.64]
-Measurements : [1383.61, 328618, -0.187224, -1.30354]
----
-Label        : 1
-Position     : [842.102, 1247.76]
-Measurements : [1409.2, 183754, 0.568346, -0.607575]
----
-Label        : 1
-Position     : [742.35, 1248.15]
-Measurements : [1287.64, 318864, -0.0125858, -1.46992]
----
-Label        : 1
-Position     : [919.708, 1248.24]
-Measurements : [1483.8, 322515, -0.102679, -0.438587]
----
-Label        : 1
-Position     : [1228.82, 1248.27]
-Measurements : [2091.18, 397670, -0.606103, -0.961399]
----
-Label        : 1
-Position     : [741.025, 1248.46]
-Measurements : [1323.79, 311335, -0.153769, -1.37594]
----
-Label        : 1
-Position     : [778.298, 1248.46]
-Measurements : [1579.87, 161782, 0.090404, -0.214226]
----
-Label        : 1
-Position     : [998.672, 1248.46]
-Measurements : [684.731, 360047, 2.21223, 3.46351]
----
-Label        : 1
-Position     : [1215.93, 1248.51]
-Measurements : [2010.97, 450985, 0.0196436, -0.435956]
----
-Label        : 1
-Position     : [836.871, 1248.87]
-Measurements : [1821.98, 192820, -0.44287, -0.172729]
----
-Label        : 1
-Position     : [24.9721, 1248.94]
-Measurements : [1711.89, 944472, -0.00861559, -1.56485]
----
-Label        : 1
-Position     : [771.471, 1248.98]
-Measurements : [940.486, 461815, 0.614761, -1.26091]
----
-Label        : 1
-Position     : [213.992, 1248.99]
-Measurements : [1884.12, 234227, -0.706126, 0.348482]
----
-Label        : 1
-Position     : [836.845, 1249.27]
-Measurements : [1823.32, 175264, -0.429781, -0.116832]
----
-Label        : 1
-Position     : [798.778, 1249.28]
-Measurements : [1161.2, 313868, 0.622282, -0.629611]
----
-Label        : 1
-Position     : [964.289, 1249.31]
-Measurements : [1014.56, 301887, 0.484466, -1.17381]
----
-Label        : 0
-Position     : [126.196, 1249.45]
-Measurements : [1154.42, 43557.8, -0.491892, -0.90433]
----
-Label        : 1
-Position     : [1231.46, 1249.66]
-Measurements : [2185.08, 300673, -0.760805, -0.561286]
----
-Label        : 1
-Position     : [774.339, 1249.8]
-Measurements : [1341.07, 479289, -0.206209, -1.28169]
----
-Label        : 1
-Position     : [835.149, 1249.82]
-Measurements : [1842.2, 146143, -0.229768, -0.0816093]
----
-Label        : 1
-Position     : [895.854, 1250.1]
-Measurements : [2043.17, 327401, -0.760018, 0.243777]
----
-Label        : 1
-Position     : [1227.8, 1250.39]
-Measurements : [2035.41, 455928, -0.464992, -1.28888]
----
-Label        : 1
-Position     : [284.829, 1250.43]
-Measurements : [1338.11, 234083, -0.189229, -0.730715]
----
-Label        : 1
-Position     : [795.306, 1250.79]
-Measurements : [1001.59, 182792, 0.542941, -0.786473]
----
-Label        : 1
-Position     : [280.41, 1251.08]
-Measurements : [1279.93, 289634, -0.283567, -1.04502]
----
-Label        : 1
-Position     : [889.134, 1251.5]
-Measurements : [1403.17, 689504, 0.0846717, -1.49233]
----
-Label        : 1
-Position     : [213.231, 1251.51]
-Measurements : [1898.26, 227479, -0.818888, 0.673467]
----
-Label        : 0
-Position     : [131.08, 1251.59]
-Measurements : [1068.91, 54518.2, -0.125231, -1.21105]
----
-Label        : 1
-Position     : [1255.21, 1251.62]
-Measurements : [809.48, 216319, 1.37975, 0.787938]
----
-Label        : 1
-Position     : [741.171, 1251.74]
-Measurements : [1498.39, 164459, -0.205465, -0.77866]
----
-Label        : 1
-Position     : [994.255, 1251.93]
-Measurements : [1353.6, 769906, 0.203548, -1.54386]
----
-Label        : 1
-Position     : [1247.06, 1252.03]
-Measurements : [1352.12, 470873, 0.42204, -1.19798]
----
-Label        : 1
-Position     : [858.17, 1252.15]
-Measurements : [1239.63, 361798, 0.137347, -1.48773]
----
-Label        : 1
-Position     : [739.716, 1252.19]
-Measurements : [1419.02, 171493, 0.0461638, -0.749297]
----
-Label        : 1
-Position     : [20.968, 1252.58]
-Measurements : [2323.47, 397117, -0.570539, -0.34185]
----
-Label        : 1
-Position     : [282.088, 1252.58]
-Measurements : [1425.74, 250745, 0.0803986, -0.622793]
----
-Label        : 1
-Position     : [1245.1, 1252.62]
-Measurements : [1564.4, 393715, -0.0302333, -1.18573]
----
-Label        : 1
-Position     : [776.25, 1252.97]
-Measurements : [1415.54, 343092, 0.00101286, -1.12996]
----
-Label        : 1
-Position     : [796.754, 1253.13]
-Measurements : [1099.52, 346600, 0.669797, -0.738685]
----
-Label        : 1
-Position     : [919.298, 1253.16]
-Measurements : [1740.04, 272901, -0.244013, -0.188017]
----
-Label        : 1
-Position     : [964.764, 1253.16]
-Measurements : [1164.82, 196364, -0.221582, -1.12304]
----
-Label        : 1
-Position     : [800.747, 1253.32]
-Measurements : [1167.87, 386391, 0.685791, -0.814127]
----
-Label        : 1
-Position     : [834.004, 1253.38]
-Measurements : [1808.95, 254158, -0.475557, -0.350112]
----
-Label        : 1
-Position     : [284.78, 1253.45]
-Measurements : [1418.34, 297475, 0.377753, -0.491705]
----
-Label        : 1
-Position     : [212.456, 1253.6]
-Measurements : [1871.4, 149892, -0.658298, 0.660001]
----
-Label        : 1
-Position     : [993.956, 1253.99]
-Measurements : [1546.86, 560871, -0.0527651, -1.22589]
----
-Label        : 1
-Position     : [893.396, 1254.19]
-Measurements : [1960.99, 295063, -0.904191, 0.359902]
----
-Label        : 1
-Position     : [967.939, 1254.24]
-Measurements : [1039.92, 203228, 0.276857, -1.13304]
----
-Label        : 1
-Position     : [855.455, 1254.29]
-Measurements : [1065.32, 284217, 0.395776, -1.15303]
----
-Label        : 1
-Position     : [17.6999, 1254.29]
-Measurements : [2124.75, 311027, -0.0198567, -0.888139]
----
-Label        : 1
-Position     : [963.952, 1254.34]
-Measurements : [1306.4, 168288, -0.21038, -0.309538]
----
-Label        : 1
-Position     : [1397.09, 1254.5]
-Measurements : [1978.58, 475627, 0.527454, -0.552366]
----
-Label        : 1
-Position     : [1253.25, 1254.53]
-Measurements : [873.655, 271370, 1.1682, 0.100972]
----
-Label        : 1
-Position     : [741.025, 1254.6]
-Measurements : [1370.28, 136539, 0.535164, -0.577723]
----
-Label        : 1
-Position     : [894.181, 1254.72]
-Measurements : [1959.17, 293305, -0.815807, -0.0205787]
----
-Label        : 1
-Position     : [994.717, 1254.97]
-Measurements : [1589.52, 539948, -0.0692888, -1.27923]
----
-Label        : 1
-Position     : [280.04, 1255.14]
-Measurements : [1682.6, 238647, -0.393966, 0.256378]
----
-Label        : 1
-Position     : [210.648, 1255.19]
-Measurements : [1632.35, 236906, -0.626587, -0.657645]
----
-Label        : 1
-Position     : [1258.11, 1255.3]
-Measurements : [1033.28, 283631, 0.526914, -0.785717]
----
-Label        : 1
-Position     : [796.73, 1255.42]
-Measurements : [1028.65, 347205, 0.882684, -0.458077]
----
-Label        : 1
-Position     : [215.983, 1255.56]
-Measurements : [1635.83, 315763, -0.599883, -0.900548]
----
-Label        : 1
-Position     : [889.5, 1255.63]
-Measurements : [1567.75, 597446, -0.241598, -1.30015]
----
-Label        : 1
-Position     : [285.139, 1255.73]
-Measurements : [1351.31, 301722, 0.529562, -0.337382]
----
-Label        : 1
-Position     : [861.634, 1255.74]
-Measurements : [865.982, 264823, 1.15112, -0.097197]
----
-Label        : 1
-Position     : [832.775, 1255.83]
-Measurements : [1465.58, 523468, -0.11953, -1.45124]
----
-Label        : 1
-Position     : [1248.58, 1255.88]
-Measurements : [1093.55, 523795, 1.05032, -0.464598]
----
-Label        : 1
-Position     : [834.79, 1255.9]
-Measurements : [1568.81, 441889, -0.295195, -1.21334]
----
-Label        : 1
-Position     : [914.679, 1256.1]
-Measurements : [1550.43, 256988, 0.0884644, -0.328219]
----
-Label        : 1
-Position     : [836.937, 1256.11]
-Measurements : [1464.72, 485482, 0.0467023, -1.49397]
----
-Label        : 1
-Position     : [920.038, 1256.6]
-Measurements : [1415.53, 358529, 0.116888, -0.869241]
----
-Label        : 1
-Position     : [859.898, 1256.64]
-Measurements : [950.642, 273064, 0.700891, -1.03008]
----
-Label        : 1
-Position     : [83.844, 1256.91]
-Measurements : [1098.37, 678677, 0.587056, -1.24661]
----
-Label        : 1
-Position     : [834.932, 1257.2]
-Measurements : [1358.13, 509395, 0.241541, -1.41618]
----
-Label        : 1
-Position     : [916.022, 1257.25]
-Measurements : [1577.41, 261326, -0.104453, -0.318685]
----
-Label        : 1
-Position     : [909.325, 1257.4]
-Measurements : [1132.17, 169953, 0.697982, -0.296762]
----
-Label        : 1
-Position     : [801.6, 1257.46]
-Measurements : [901.677, 294916, 1.53917, 1.18786]
----
-Label        : 1
-Position     : [28.304, 1257.56]
-Measurements : [1911.88, 1.06338e+06, -0.0284124, -1.69962]
----
-Label        : 1
-Position     : [920.38, 1257.56]
-Measurements : [1400.48, 395022, 0.0962397, -1.07264]
----
-Label        : 1
-Position     : [211.47, 1257.56]
-Measurements : [1739.01, 246583, -0.455685, -0.510702]
----
-Label        : 1
-Position     : [778.193, 1257.82]
-Measurements : [1205.55, 300699, 0.847396, -0.256126]
----
-Label        : 1
-Position     : [910.534, 1257.97]
-Measurements : [1227.3, 220119, 0.523979, -0.567578]
----
-Label        : 1
-Position     : [963.535, 1258.07]
-Measurements : [1405.6, 195275, 0.400352, -0.38213]
----
-Label        : 1
-Position     : [1236.49, 1258.13]
-Measurements : [2336.81, 692175, -0.529384, -0.758764]
----
-Label        : 1
-Position     : [85.2091, 1258.16]
-Measurements : [1513.75, 682946, -0.195229, -1.50802]
----
-Label        : 1
-Position     : [916.107, 1258.22]
-Measurements : [1581.97, 261065, -0.121111, -0.336849]
----
-Label        : 1
-Position     : [1272.41, 1258.46]
-Measurements : [1451.77, 342337, 0.413854, -0.932567]
----
-Label        : 1
-Position     : [737.402, 1258.5]
-Measurements : [1069.23, 25067.2, 2.09175, 5.49735]
----
-Label        : 1
-Position     : [831.051, 1258.51]
-Measurements : [1173.1, 472178, 0.526862, -1.06173]
----
-Label        : 1
-Position     : [1392.5, 1258.63]
-Measurements : [2228.93, 326304, -0.0816162, -1.40713]
----
-Label        : 1
-Position     : [890.529, 1258.7]
-Measurements : [1567.02, 604066, -0.162801, -1.3794]
----
-Label        : 1
-Position     : [990.159, 1258.89]
-Measurements : [1689.43, 227558, 0.210985, -0.182801]
----
-Label        : 1
-Position     : [87.528, 1259.23]
-Measurements : [1741.37, 558693, -0.657493, -0.935365]
----
-Label        : 1
-Position     : [212.968, 1259.23]
-Measurements : [1827.59, 242623, -0.094315, -0.435854]
----
-Label        : 1
-Position     : [774.202, 1259.52]
-Measurements : [1064.08, 182308, 0.759521, 0.732401]
----
-Label        : 1
-Position     : [831.235, 1259.84]
-Measurements : [1144.36, 430027, 0.581452, -0.885287]
----
-Label        : 1
-Position     : [770.459, 1259.88]
-Measurements : [948.922, 177271, 0.150379, -0.978193]
----
-Label        : 1
-Position     : [855.713, 1259.93]
-Measurements : [1089.67, 243019, 0.050132, -1.38737]
----
-Label        : 1
-Position     : [961.46, 1259.93]
-Measurements : [1488.74, 245611, 0.335207, -0.882394]
----
-Label        : 1
-Position     : [1277.75, 1259.95]
-Measurements : [1462.48, 212929, 0.561237, -0.302647]
----
-Label        : 1
-Position     : [777.782, 1259.98]
-Measurements : [1052.17, 173258, 1.03168, 1.08609]
----
-Label        : 0
-Position     : [141.864, 1260.11]
-Measurements : [1161.23, 14197.5, -0.856282, 0.146767]
----
-Label        : 1
-Position     : [891.858, 1260.53]
-Measurements : [1371.03, 571419, 0.068168, -1.55675]
----
-Label        : 1
-Position     : [988.008, 1260.63]
-Measurements : [1698.91, 161983, 0.0458537, -0.200945]
----
-Label        : 1
-Position     : [968.25, 1260.74]
-Measurements : [1026.67, 104432, 0.823349, 0.608202]
----
-Label        : 1
-Position     : [24.552, 1260.77]
-Measurements : [1878.79, 902667, -0.0910636, -1.56025]
----
-Label        : 1
-Position     : [1389.15, 1260.93]
-Measurements : [2280.33, 312004, -0.255748, -1.20516]
----
-Label        : 1
-Position     : [776.543, 1260.97]
-Measurements : [1019.25, 122517, 0.488638, -0.334487]
----
-Label        : 1
-Position     : [1262.19, 1261.26]
-Measurements : [1470.99, 306118, 0.474048, -0.398873]
----
-Label        : 1
-Position     : [1233.54, 1261.45]
-Measurements : [2478.92, 755106, -0.435004, -0.86253]
----
-Label        : 0
-Position     : [162.204, 1261.46]
-Measurements : [1024.62, 8851.47, -0.999245, 1.00363]
----
-Label        : 1
-Position     : [962.306, 1261.76]
-Measurements : [1402.54, 251502, 0.618139, -0.659768]
----
-Label        : 1
-Position     : [913.154, 1262.17]
-Measurements : [1471.81, 204942, 0.467327, 0.333337]
----
-Label        : 1
-Position     : [277.992, 1262.3]
-Measurements : [1786.09, 274001, -0.495025, -0.336688]
----
-Label        : 1
-Position     : [276.954, 1262.42]
-Measurements : [1723.27, 321413, -0.710078, -0.23199]
----
-Label        : 1
-Position     : [858.017, 1262.64]
-Measurements : [966.708, 250361, 0.555003, -1.2046]
----
-Label        : 1
-Position     : [1380.62, 1262.73]
-Measurements : [2367.41, 208529, -0.250931, -0.146135]
----
-Label        : 1
-Position     : [279.011, 1262.75]
-Measurements : [1799.52, 301108, -0.466854, -0.633814]
----
-Label        : 1
-Position     : [855.162, 1262.77]
-Measurements : [1215.53, 195811, -0.28758, -1.0922]
----
-Label        : 1
-Position     : [851.069, 1262.93]
-Measurements : [1289.93, 135313, -0.328325, -0.593033]
----
-Label        : 1
-Position     : [961.328, 1263.05]
-Measurements : [1442.31, 229359, 0.425861, -0.617068]
----
-Label        : 1
-Position     : [1261.39, 1263.09]
-Measurements : [1538.63, 348359, 0.114679, -0.898842]
----
-Label        : 1
-Position     : [1276.14, 1263.09]
-Measurements : [1463.62, 225533, 0.491045, -0.586498]
----
-Label        : 1
-Position     : [853.255, 1263.21]
-Measurements : [1320.13, 154674, -0.552602, -0.596894]
----
-Label        : 1
-Position     : [990.159, 1263.4]
-Measurements : [1870.1, 236787, -0.295546, -0.301379]
----
-Label        : 1
-Position     : [22.5714, 1263.57]
-Measurements : [1545.46, 740838, 0.522742, -1.02236]
----
-Label        : 1
-Position     : [1355.8, 1263.8]
-Measurements : [797.289, 65883.1, 0.258388, -1.07459]
----
-Label        : 1
-Position     : [1232.42, 1263.89]
-Measurements : [2440.02, 718967, -0.320991, -0.893494]
----
-Label        : 1
-Position     : [19.8285, 1264.15]
-Measurements : [1283.39, 460026, 0.786823, -0.271953]
----
-Label        : 1
-Position     : [1263.39, 1264.22]
-Measurements : [1746.48, 399371, -0.0778575, -0.905062]
----
-Label        : 1
-Position     : [957.556, 1264.33]
-Measurements : [1537.36, 233231, -0.280746, -0.0402842]
----
-Label        : 1
-Position     : [831.956, 1264.43]
-Measurements : [1095.41, 217123, 0.113882, -1.11371]
----
-Label        : 1
-Position     : [794.669, 1264.59]
-Measurements : [852.248, 248790, 1.14469, -0.174633]
----
-Label        : 1
-Position     : [1358.51, 1264.77]
-Measurements : [927.305, 51318.3, -0.117746, -0.782376]
----
-Label        : 1
-Position     : [770.926, 1264.84]
-Measurements : [1140.39, 125648, -0.177019, 0.274811]
----
-Label        : 1
-Position     : [215.528, 1264.86]
-Measurements : [1940.97, 284119, -0.253913, -0.144384]
----
-Label        : 1
-Position     : [836.597, 1265.02]
-Measurements : [981.066, 140089, 0.629907, -0.361248]
----
-Label        : 1
-Position     : [1372.02, 1265.18]
-Measurements : [1255.18, 275730, 0.221153, -1.24464]
----
-Label        : 1
-Position     : [1374.9, 1265.41]
-Measurements : [1407.62, 410678, 0.292982, -1.04976]
----
-Label        : 1
-Position     : [1267.13, 1265.54]
-Measurements : [1797.68, 347339, -0.0682253, -0.648295]
----
-Label        : 1
-Position     : [909.892, 1265.66]
-Measurements : [1262.16, 190904, -0.236929, -0.991898]
----
-Label        : 1
-Position     : [1356.12, 1265.76]
-Measurements : [828.752, 64321.5, 0.126462, -1.15868]
----
-Label        : 1
-Position     : [848.874, 1265.89]
-Measurements : [1281.12, 148392, -0.17597, -0.815121]
----
-Label        : 1
-Position     : [87.2103, 1266.14]
-Measurements : [1816.03, 371552, -0.583664, -0.689621]
----
-Label        : 1
-Position     : [211.147, 1266.16]
-Measurements : [1463.62, 447437, 0.0565107, -1.24945]
----
-Label        : 1
-Position     : [1371, 1266.57]
-Measurements : [1125.29, 237328, 0.411838, -1.31055]
----
-Label        : 1
-Position     : [911.516, 1266.67]
-Measurements : [1438.42, 170534, -0.275625, -0.264899]
----
-Label        : 1
-Position     : [1384.73, 1266.8]
-Measurements : [2255.6, 452318, -0.187656, -1.04375]
----
-Label        : 1
-Position     : [1326.89, 1266.96]
-Measurements : [1422.6, 356425, 0.90661, 0.245215]
----
-Label        : 1
-Position     : [988.032, 1267.02]
-Measurements : [1720.89, 294120, -0.213187, -0.818371]
----
-Label        : 0
-Position     : [143.171, 1267.03]
-Measurements : [1126.34, 5577.71, 0.00119126, 0.066821]
----
-Label        : 1
-Position     : [276.633, 1267.24]
-Measurements : [1697.35, 293153, -0.316405, -0.794437]
----
-Label        : 1
-Position     : [989.911, 1267.25]
-Measurements : [1739.56, 333620, -0.227823, -0.951713]
----
-Label        : 1
-Position     : [792.634, 1267.3]
-Measurements : [993.373, 277716, 0.672034, -1.04451]
----
-Label        : 1
-Position     : [956.782, 1267.39]
-Measurements : [1493.11, 185979, -0.553917, 0.497812]
----
-Label        : 1
-Position     : [88.04, 1267.42]
-Measurements : [1767.38, 342539, -0.683385, -0.662016]
----
-Label        : 1
-Position     : [276.968, 1267.42]
-Measurements : [1697.35, 293153, -0.316405, -0.794437]
----
-Label        : 1
-Position     : [218.741, 1267.62]
-Measurements : [1396.54, 642949, 0.314594, -1.38164]
----
-Label        : 1
-Position     : [852.026, 1267.71]
-Measurements : [1427.76, 232056, -0.322138, -0.29812]
----
-Label        : 1
-Position     : [1375.94, 1267.72]
-Measurements : [1520.37, 421227, 0.245601, -0.843611]
----
-Label        : 1
-Position     : [851.033, 1267.74]
-Measurements : [1478.78, 203214, -0.30586, -0.020615]
----
-Label        : 1
-Position     : [1264.87, 1267.85]
-Measurements : [1902.4, 311784, -0.272121, -0.387927]
----
-Label        : 1
-Position     : [1337.96, 1267.87]
-Measurements : [1371.52, 495454, 0.828779, -0.641853]
----
-Label        : 1
-Position     : [959.439, 1267.9]
-Measurements : [1518.89, 144257, -0.116293, 0.122405]
----
-Label        : 1
-Position     : [20.968, 1267.94]
-Measurements : [1305.88, 421491, 0.425273, -1.34135]
----
-Label        : 1
-Position     : [770.269, 1268.25]
-Measurements : [1154.15, 61894.7, 0.79354, 3.19206]
----
-Label        : 1
-Position     : [87.3082, 1268.27]
-Measurements : [1643.83, 371150, -0.583751, -0.957718]
----
-Label        : 1
-Position     : [985.029, 1268.52]
-Measurements : [1510.67, 231324, -0.040573, -0.65032]
----
-Label        : 1
-Position     : [831.137, 1268.53]
-Measurements : [1289.83, 128331, -0.0455321, -0.354233]
----
-Label        : 1
-Position     : [829.7, 1268.6]
-Measurements : [1309.19, 144735, -0.394333, -0.229632]
----
-Label        : 1
-Position     : [1318.33, 1268.66]
-Measurements : [1489.87, 430070, 0.558454, -0.690285]
----
-Label        : 1
-Position     : [215.349, 1269.55]
-Measurements : [1348.37, 436328, 0.158105, -1.3495]
----
-Label        : 1
-Position     : [276.067, 1269.73]
-Measurements : [1634.96, 259204, -0.250051, -1.31033]
----
-Label        : 1
-Position     : [913.98, 1269.74]
-Measurements : [1590.94, 303890, 0.268524, -0.436501]
----
-Label        : 1
-Position     : [916.012, 1269.89]
-Measurements : [1322.41, 455273, 0.481862, -0.874612]
----
-Label        : 1
-Position     : [830.664, 1269.9]
-Measurements : [1300.54, 128599, -0.0110866, -0.485615]
----
-Label        : 1
-Position     : [984.425, 1269.95]
-Measurements : [1354.8, 267468, 0.051039, -0.875478]
----
-Label        : 1
-Position     : [274.408, 1269.98]
-Measurements : [1710.64, 220996, -0.607287, -0.680576]
----
-Label        : 1
-Position     : [790.909, 1270.03]
-Measurements : [1009.64, 228475, 0.790661, -0.702848]
----
-Label        : 1
-Position     : [829.089, 1270.17]
-Measurements : [1260.05, 157168, -0.221084, -0.576477]
----
-Label        : 1
-Position     : [1266.47, 1270.31]
-Measurements : [1528.04, 463861, 0.0818214, -0.944515]
----
-Label        : 1
-Position     : [216.552, 1270.5]
-Measurements : [1292.89, 435018, 0.341703, -1.29119]
----
-Label        : 1
-Position     : [980.25, 1270.53]
-Measurements : [971.972, 183987, 0.463825, -0.904142]
----
-Label        : 1
-Position     : [850.388, 1270.58]
-Measurements : [1791.48, 305852, 0.236115, -0.435699]
----
-Label        : 1
-Position     : [272.602, 1270.59]
-Measurements : [1709.99, 221587, -0.83505, 0.0882693]
----
-Label        : 1
-Position     : [1341.51, 1270.61]
-Measurements : [1636.54, 876339, 0.406497, -1.34153]
----
-Label        : 1
-Position     : [1339.22, 1270.87]
-Measurements : [1672.11, 821933, 0.411704, -1.28192]
----
-Label        : 1
-Position     : [882.049, 1270.97]
-Measurements : [730.39, 291352, 1.49659, 0.77032]
----
-Label        : 1
-Position     : [915.274, 1271.38]
-Measurements : [1415.48, 483783, 0.322776, -1.11401]
----
-Label        : 1
-Position     : [1330.2, 1271.69]
-Measurements : [1883.21, 734004, 0.20238, -1.38058]
----
-Label        : 1
-Position     : [87.8088, 1271.74]
-Measurements : [1409.39, 485721, -0.0731958, -1.42397]
----
-Label        : 1
-Position     : [849.929, 1271.89]
-Measurements : [1864.68, 346751, 0.145787, -0.555148]
----
-Label        : 1
-Position     : [843.19, 1271.93]
-Measurements : [1304.97, 427993, 1.18084, 0.251304]
----
-Label        : 1
-Position     : [912.335, 1272]
-Measurements : [1676.71, 318031, 0.0110329, -0.679424]
----
-Label        : 1
-Position     : [833.846, 1272.01]
-Measurements : [1154.08, 111580, 0.451155, 0.0667646]
----
-Label        : 1
-Position     : [217.268, 1272.16]
-Measurements : [1273.29, 497893, 0.610457, -1.01856]
----
-Label        : 1
-Position     : [20.1124, 1272.48]
-Measurements : [1518.92, 434892, -0.0169752, -1.60539]
----
-Label        : 1
-Position     : [824.266, 1272.59]
-Measurements : [843.047, 220276, 0.856368, -0.413498]
----
-Label        : 0
-Position     : [155.044, 1272.63]
-Measurements : [998.884, 9513.87, -0.615159, -1.08871]
----
-Label        : 1
-Position     : [87.7067, 1272.71]
-Measurements : [1258.22, 481950, 0.229136, -1.36867]
----
-Label        : 1
-Position     : [1321.6, 1272.92]
-Measurements : [1535.69, 372124, 0.323465, -0.853967]
----
-Label        : 1
-Position     : [271.795, 1272.92]
-Measurements : [1717.79, 191248, -0.775414, -0.0244705]
----
-Label        : 1
-Position     : [1319.38, 1273.82]
-Measurements : [1733.55, 579491, 0.254928, -1.03958]
----
-Label        : 1
-Position     : [272.18, 1273.97]
-Measurements : [1688.14, 207070, -0.614185, -0.601518]
----
-Label        : 1
-Position     : [956.982, 1274.05]
-Measurements : [1401.2, 322769, -0.458076, -1.20576]
----
-Label        : 1
-Position     : [888.481, 1274.08]
-Measurements : [938.682, 279865, 0.983311, -0.0747808]
----
-Label        : 1
-Position     : [1031.94, 1274.46]
-Measurements : [1513.22, 286206, -0.609127, -0.540951]
----
-Label        : 1
-Position     : [1334.49, 1274.66]
-Measurements : [1957.52, 880910, -0.112217, -1.50568]
----
-Label        : 1
-Position     : [847.111, 1275.08]
-Measurements : [1983.82, 444925, -0.334283, -0.835614]
----
-Label        : 1
-Position     : [884.385, 1275.08]
-Measurements : [1246.37, 323448, 0.0199728, -1.2167]
----
-Label        : 1
-Position     : [91.112, 1275.1]
-Measurements : [1171.22, 397123, 0.631661, -0.986173]
----
-Label        : 1
-Position     : [855.084, 1275.5]
-Measurements : [1314.45, 718846, 0.560956, -1.25662]
----
-Label        : 1
-Position     : [958.968, 1276.2]
-Measurements : [1262.02, 393797, -0.0187911, -1.60684]
----
-Label        : 1
-Position     : [846.588, 1276.28]
-Measurements : [1896.2, 528793, -0.199987, -1.21472]
----
-Label        : 1
-Position     : [1030.64, 1276.46]
-Measurements : [1598.17, 156800, -0.109607, -0.760337]
----
-Label        : 0
-Position     : [128.04, 1276.49]
-Measurements : [991.299, 7790.14, 0.064431, -0.870962]
----
-Label        : 1
-Position     : [270.312, 1276.64]
-Measurements : [1593.83, 167078, -0.457771, -0.818316]
----
-Label        : 1
-Position     : [908.649, 1276.91]
-Measurements : [1711.3, 353313, -0.0488718, -0.944461]
----
-Label        : 1
-Position     : [887.404, 1277.37]
-Measurements : [1249.65, 262145, 0.185639, -0.900697]
----
-Label        : 0
-Position     : [129.743, 1277.84]
-Measurements : [1003.63, 7396.67, -0.209893, -1.03153]
----
-Label        : 1
-Position     : [1030.17, 1277.91]
-Measurements : [1580.75, 146128, 0.0477945, -0.799761]
----
-Label        : 1
-Position     : [274.75, 1277.93]
-Measurements : [1297.25, 250047, 0.484192, -1.08746]
----
-Label        : 1
-Position     : [957.019, 1278.06]
-Measurements : [1040.58, 459401, 0.576061, -1.43294]
----
-Label        : 1
-Position     : [1035.07, 1278.09]
-Measurements : [1308.67, 237155, 0.492969, -0.964064]
----
-Label        : 1
-Position     : [216.04, 1278.18]
-Measurements : [1466.14, 301373, 0.242406, -0.86261]
----
-Label        : 1
-Position     : [845.997, 1278.49]
-Measurements : [1694.7, 656378, 0.0389483, -1.39865]
----
-Label        : 0
-Position     : [147.283, 1278.52]
-Measurements : [1004.62, 10409.4, -0.395005, -0.081651]
----
-Label        : 1
-Position     : [1028.66, 1278.55]
-Measurements : [1501.99, 134401, -0.113138, 0.0213176]
----
-Label        : 1
-Position     : [1312.18, 1278.65]
-Measurements : [2170.1, 460425, 0.00151945, -1.37389]
----
-Label        : 1
-Position     : [220.876, 1279.07]
-Measurements : [1343.88, 464903, 0.384356, -1.15198]
----
-Label        : 1
-Position     : [887.442, 1279.07]
-Measurements : [1373.82, 278442, 0.461498, -0.587649]
----
-Label        : 1
-Position     : [885.585, 1279.15]
-Measurements : [1500.34, 254637, 0.156553, -0.71584]
----
-Label        : 1
-Position     : [268.394, 1279.16]
-Measurements : [1546.53, 177055, -0.0186647, -0.696369]
----
-Label        : 1
-Position     : [211.056, 1279.61]
-Measurements : [1261.95, 131954, 0.423172, -0.969613]
----
-Label        : 1
-Position     : [903.99, 1279.7]
-Measurements : [1184.96, 251650, 0.422302, -0.378776]
----
-Label        : 1
-Position     : [1028.73, 1279.84]
-Measurements : [1498.25, 107090, 0.112483, -0.219468]
----
-Label        : 1
-Position     : [821.212, 1279.97]
-Measurements : [584.705, 75054.7, 2.47731, 5.77632]
----
-Label        : 1
-Position     : [884.794, 1280]
-Measurements : [1551.68, 227235, 0.0728988, -0.574533]
----
-Label        : 1
-Position     : [1027.8, 1280.05]
-Measurements : [1496.35, 79258, -0.183097, 0.0157085]
----
-Label        : 1
-Position     : [1052.41, 1280.26]
-Measurements : [692.831, 123755, 0.87654, -0.506265]
----
-Label        : 1
-Position     : [847.111, 1280.41]
-Measurements : [1675.81, 718393, 0.0118482, -1.38391]
----
-Label        : 1
-Position     : [31.5608, 1280.81]
-Measurements : [1074.84, 519498, 1.13997, -0.281376]
----
-Label        : 1
-Position     : [30.86, 1280.87]
-Measurements : [1158.96, 534948, 0.9088, -0.781694]
----
-Label        : 1
-Position     : [1311.38, 1280.97]
-Measurements : [2190.12, 534243, -0.0713197, -1.45898]
----
-Label        : 1
-Position     : [904.631, 1281.38]
-Measurements : [1110.87, 311620, 0.560807, -0.429911]
----
-Label        : 1
-Position     : [265.704, 1281.76]
-Measurements : [1605.43, 290249, -0.197736, -0.743859]
----
-Label        : 1
-Position     : [980.738, 1281.83]
-Measurements : [1217.45, 301303, -0.0627685, -1.23875]
----
-Label        : 1
-Position     : [263.58, 1281.92]
-Measurements : [1562.99, 354345, -0.324655, -0.787033]
----
-Label        : 1
-Position     : [905.633, 1281.98]
-Measurements : [1198.26, 347487, 0.538262, -0.35413]
----
-Label        : 0
-Position     : [138.748, 1282]
-Measurements : [1078.39, 4122.25, -1.31527, 2.95209]
----
-Label        : 1
-Position     : [845.776, 1282.08]
-Measurements : [1226.5, 593189, 0.744271, -0.893227]
----
-Label        : 1
-Position     : [1053.11, 1282.15]
-Measurements : [883.654, 208383, 0.55272, -0.935005]
----
-Label        : 1
-Position     : [983.482, 1282.32]
-Measurements : [1189.96, 385567, 0.354785, -1.20446]
----
-Label        : 1
-Position     : [905.782, 1282.65]
-Measurements : [1088.53, 308535, 0.641278, -0.167966]
----
-Label        : 1
-Position     : [267.892, 1282.85]
-Measurements : [1587.21, 295656, 0.321701, -0.924107]
----
-Label        : 1
-Position     : [882.746, 1282.87]
-Measurements : [1620.12, 270193, -0.00614568, -0.732935]
----
-Label        : 1
-Position     : [880.472, 1283.03]
-Measurements : [1629.69, 382163, -0.283007, -0.797636]
----
-Label        : 1
-Position     : [979.726, 1283.3]
-Measurements : [1552.01, 289379, -0.0322378, -0.50485]
----
-Label        : 1
-Position     : [1316.15, 1283.34]
-Measurements : [2019.45, 652099, -0.119188, -1.3273]
----
-Label        : 1
-Position     : [1027.43, 1283.88]
-Measurements : [1588.91, 142617, 0.0784781, 0.0895234]
----
-Label        : 1
-Position     : [1052.3, 1284.23]
-Measurements : [1116.56, 250040, 0.359402, -0.953017]
----
-Label        : 1
-Position     : [28.648, 1284.32]
-Measurements : [1369.61, 504197, 0.496128, -1.29258]
----
-Label        : 1
-Position     : [975.996, 1284.45]
-Measurements : [1456.06, 226183, 0.106559, -0.349473]
----
-Label        : 1
-Position     : [824.993, 1284.5]
-Measurements : [777.24, 101012, 0.645523, -0.0665529]
----
-Label        : 1
-Position     : [1051.27, 1284.83]
-Measurements : [1097.76, 250196, 0.450734, -0.915886]
----
-Label        : 1
-Position     : [263.144, 1284.83]
-Measurements : [1797.54, 346579, 0.00165704, -0.597132]
----
-Label        : 1
-Position     : [821.972, 1285.1]
-Measurements : [803.352, 86063, 0.527319, 0.176368]
----
-Label        : 1
-Position     : [849.633, 1285.16]
-Measurements : [969.021, 412674, 1.30352, 0.523496]
----
-Label        : 0
-Position     : [149.084, 1285.89]
-Measurements : [937.225, 14747.5, 0.690499, -0.914493]
----
-Label        : 1
-Position     : [902.142, 1286.4]
-Measurements : [764.617, 134051, 0.805115, -0.849881]
----
-Label        : 1
-Position     : [979.775, 1286.55]
-Measurements : [1692.08, 202153, -0.222333, 0.223186]
----
-Label        : 1
-Position     : [1051.77, 1286.75]
-Measurements : [1197.8, 211037, 0.23475, -0.806127]
----
-Label        : 1
-Position     : [842.606, 1286.96]
-Measurements : [763.475, 108156, 1.50014, 2.19371]
----
-Label        : 1
-Position     : [258.976, 1287.05]
-Measurements : [1336.58, 616761, 0.448759, -1.17947]
----
-Label        : 1
-Position     : [881.824, 1287.12]
-Measurements : [1554.23, 492880, -0.103141, -1.32353]
----
-Label        : 1
-Position     : [1055.29, 1287.86]
-Measurements : [1206.71, 259315, 0.257619, -0.948606]
----
-Label        : 1
-Position     : [979.22, 1288.14]
-Measurements : [1734.56, 221384, -0.481802, 0.104913]
----
-Label        : 1
-Position     : [1052.3, 1288.29]
-Measurements : [1371.44, 218768, 0.402421, -0.376686]
----
-Label        : 1
-Position     : [1029.72, 1288.3]
-Measurements : [1321.65, 313501, 0.272091, -0.930014]
----
-Label        : 1
-Position     : [879.47, 1288.6]
-Measurements : [1362.79, 616098, 0.193422, -1.50539]
----
-Label        : 1
-Position     : [1030.22, 1288.62]
-Measurements : [1263.72, 288958, 0.481594, -0.715563]
----
-Label        : 1
-Position     : [245.326, 1288.87]
-Measurements : [919.186, 242214, 0.262161, -1.57769]
----
-Label        : 1
-Position     : [847.105, 1289.01]
-Measurements : [618.814, 67529.9, 2.39973, 5.69829]
----
-Label        : 1
-Position     : [1026.2, 1289.2]
-Measurements : [1307.15, 419216, 0.134594, -1.27735]
----
-Label        : 1
-Position     : [257.613, 1289.41]
-Measurements : [1213.13, 514020, 0.530758, -1.20613]
----
-Label        : 1
-Position     : [262.12, 1289.44]
-Measurements : [1504.81, 631578, 0.177676, -1.35678]
----
-Label        : 1
-Position     : [1029.37, 1289.65]
-Measurements : [1239.88, 342466, 0.452851, -0.882981]
----
-Label        : 1
-Position     : [883.894, 1291.42]
-Measurements : [1113.42, 481308, 0.955155, -0.43973]
----
-Label        : 1
-Position     : [1050.66, 1291.57]
-Measurements : [1452.92, 269077, -0.0365557, -0.611046]
----
-Label        : 1
-Position     : [1048, 1291.74]
-Measurements : [1332.31, 239550, 0.0927713, -0.789175]
----
-Label        : 1
-Position     : [947.826, 1291.87]
-Measurements : [1284.8, 442684, -0.045098, -1.29949]
----
-Label        : 1
-Position     : [247.784, 1292.51]
-Measurements : [1189.18, 147835, -0.331024, -0.800488]
----
-Label        : 1
-Position     : [234.432, 1292.69]
-Measurements : [784.546, 174269, 0.863796, -0.492083]
----
-Label        : 1
-Position     : [976.908, 1292.69]
-Measurements : [1814.38, 105590, -0.0835875, 0.619116]
----
-Label        : 1
-Position     : [972.332, 1292.73]
-Measurements : [1521.5, 219603, -0.555199, -0.674268]
----
-Label        : 0
-Position     : [129.859, 1292.76]
-Measurements : [1101.52, 4788.56, -0.57896, 2.62287]
----
-Label        : 1
-Position     : [243.619, 1293.22]
-Measurements : [1205.13, 114724, -0.496095, -0.772061]
----
-Label        : 1
-Position     : [952.219, 1293.29]
-Measurements : [1203.54, 372327, 0.325149, -1.04675]
----
-Label        : 1
-Position     : [266.455, 1293.42]
-Measurements : [1091.52, 342609, 1.79936, 3.39022]
----
-Label        : 1
-Position     : [899.823, 1293.5]
-Measurements : [1230.89, 273047, 0.189006, -0.938034]
----
-Label        : 1
-Position     : [981.806, 1293.51]
-Measurements : [1493.08, 358657, -0.161643, -1.11082]
----
-Label        : 1
-Position     : [241.128, 1293.54]
-Measurements : [1189.55, 127694, -0.330533, -0.951602]
----
-Label        : 1
-Position     : [251.88, 1293.54]
-Measurements : [1161.08, 224081, 0.321028, -1.06579]
----
-Label        : 1
-Position     : [904.409, 1293.92]
-Measurements : [1270.29, 332790, 0.0623967, -1.29094]
----
-Label        : 1
-Position     : [1046.2, 1294.07]
-Measurements : [1401.63, 352376, 0.289789, -0.802118]
----
-Label        : 1
-Position     : [231.646, 1294.63]
-Measurements : [625.734, 84893.5, 1.40675, 0.786302]
----
-Label        : 1
-Position     : [242.785, 1295.22]
-Measurements : [1201.73, 114580, -0.222575, -1.07302]
----
-Label        : 1
-Position     : [944.165, 1295.72]
-Measurements : [1274.46, 297008, 0.135623, -0.748177]
----
-Label        : 1
-Position     : [235.496, 1296.1]
-Measurements : [914.635, 160515, 0.579154, -0.723332]
----
-Label        : 1
-Position     : [1052.76, 1296.35]
-Measurements : [1481.06, 484212, 0.189049, -1.26211]
----
-Label        : 1
-Position     : [1020.76, 1296.49]
-Measurements : [1123.55, 275943, 0.0951406, -1.25244]
----
-Label        : 1
-Position     : [1017.42, 1296.52]
-Measurements : [1112.06, 306191, 0.105569, -1.32919]
----
-Label        : 1
-Position     : [1278.33, 1296.57]
-Measurements : [1080.19, 323320, 0.213425, -1.06319]
----
-Label        : 1
-Position     : [943.056, 1296.81]
-Measurements : [1169.21, 294729, 0.372983, -0.743316]
----
-Label        : 1
-Position     : [903.626, 1296.95]
-Measurements : [1500.36, 247677, -0.23278, -0.886629]
----
-Label        : 1
-Position     : [900.722, 1297.2]
-Measurements : [1605.72, 253697, -0.164983, -0.436129]
----
-Label        : 1
-Position     : [1109.2, 1297.33]
-Measurements : [664.282, 220213, 1.26221, 0.033141]
----
-Label        : 1
-Position     : [948.646, 1297.61]
-Measurements : [1424.45, 228712, 0.262428, -0.431817]
----
-Label        : 1
-Position     : [1048.2, 1297.71]
-Measurements : [1635.77, 363263, 0.00734187, -1.0482]
----
-Label        : 1
-Position     : [1024.04, 1297.85]
-Measurements : [942.811, 231741, 0.602363, -1.05447]
----
-Label        : 1
-Position     : [902.728, 1297.86]
-Measurements : [1574.79, 288975, -0.16999, -0.733606]
----
-Label        : 1
-Position     : [980.837, 1298.09]
-Measurements : [1512.38, 290944, -0.262152, -1.09098]
----
-Label        : 1
-Position     : [254.458, 1298.11]
-Measurements : [1016.3, 150699, 1.47541, 1.93021]
----
-Label        : 1
-Position     : [241.451, 1298.22]
-Measurements : [1106.94, 92663.9, 0.389068, -0.54831]
----
-Label        : 1
-Position     : [943.898, 1298.38]
-Measurements : [1312.01, 404374, 0.671227, -0.272285]
----
-Label        : 1
-Position     : [249.409, 1298.41]
-Measurements : [1055.93, 119827, 1.20531, 1.66093]
----
-Label        : 1
-Position     : [876.193, 1298.43]
-Measurements : [1111.02, 375501, 0.251819, -1.26465]
----
-Label        : 1
-Position     : [1095.77, 1298.56]
-Measurements : [868.841, 522024, 1.18092, -0.100358]
----
-Label        : 1
-Position     : [977.318, 1299.25]
-Measurements : [1659.96, 167972, -0.402616, 0.00383845]
----
-Label        : 1
-Position     : [1279, 1299.54]
-Measurements : [1197.4, 312665, 0.201561, -1.01274]
----
-Label        : 1
-Position     : [1016.34, 1299.64]
-Measurements : [1289.29, 259736, -0.126745, -0.912542]
----
-Label        : 1
-Position     : [1107.46, 1299.67]
-Measurements : [973.579, 389147, 0.366617, -1.37815]
----
-Label        : 1
-Position     : [1017.76, 1299.76]
-Measurements : [1340.19, 226188, -0.159394, -0.784173]
----
-Label        : 1
-Position     : [975.329, 1299.96]
-Measurements : [1644.75, 117759, -0.0282118, -0.109477]
----
-Label        : 1
-Position     : [899.731, 1300.02]
-Measurements : [1759.81, 252505, 0.264865, -0.246757]
----
-Label        : 1
-Position     : [876.954, 1300.08]
-Measurements : [1400.31, 402736, -0.0257444, -0.864611]
----
-Label        : 1
-Position     : [1278.17, 1300.19]
-Measurements : [1151.09, 352506, 0.229328, -1.16205]
----
-Label        : 1
-Position     : [1303.35, 1300.31]
-Measurements : [1247.42, 364716, 0.749556, -0.406762]
----
-Label        : 1
-Position     : [1303.03, 1300.68]
-Measurements : [1247.42, 364716, 0.749556, -0.406762]
----
-Label        : 1
-Position     : [873.989, 1300.86]
-Measurements : [1393.78, 402490, -0.0772356, -0.855223]
----
-Label        : 1
-Position     : [872.429, 1301.3]
-Measurements : [1463.42, 392224, -0.185586, -0.916678]
----
-Label        : 1
-Position     : [1106.36, 1301.81]
-Measurements : [1176.02, 329423, -0.0908292, -1.18279]
----
-Label        : 1
-Position     : [1090.74, 1302.65]
-Measurements : [1602.41, 383050, -0.500256, -0.769327]
----
-Label        : 1
-Position     : [978.946, 1302.68]
-Measurements : [1461.16, 276998, -0.0681581, -0.901551]
----
-Label        : 1
-Position     : [1092.44, 1303.04]
-Measurements : [1698.65, 358681, -0.764296, -0.361357]
----
-Label        : 1
-Position     : [901.658, 1303.49]
-Measurements : [1625.82, 458929, -0.151398, -1.01566]
----
-Label        : 1
-Position     : [1287.62, 1303.63]
-Measurements : [1594.12, 405681, -0.0167183, -1.14954]
----
-Label        : 1
-Position     : [1021.17, 1303.73]
-Measurements : [1293.88, 184891, 0.35287, -0.836941]
----
-Label        : 1
-Position     : [1020.76, 1303.86]
-Measurements : [1359.71, 214893, 0.371214, -0.818615]
----
-Label        : 1
-Position     : [64.5144, 1303.97]
-Measurements : [1963.91, 250748, -0.758677, 0.0597732]
----
-Label        : 1
-Position     : [897.036, 1304.16]
-Measurements : [1770.24, 215962, 0.413377, 0.0899878]
----
-Label        : 1
-Position     : [1296.11, 1304.27]
-Measurements : [1932.16, 281025, -0.504242, -0.651714]
----
-Label        : 1
-Position     : [975.679, 1304.57]
-Measurements : [1385.1, 153055, -0.225421, -0.351467]
----
-Label        : 1
-Position     : [1016.08, 1304.8]
-Measurements : [1387.8, 255431, 0.100429, -0.956067]
----
-Label        : 1
-Position     : [876.146, 1304.98]
-Measurements : [1843.93, 315213, 0.0379573, -0.771951]
----
-Label        : 1
-Position     : [69.173, 1305.07]
-Measurements : [2000.06, 395692, -0.428954, -0.505336]
----
-Label        : 1
-Position     : [222.84, 1305.14]
-Measurements : [1075.16, 146844, 0.0414129, -0.744638]
----
-Label        : 1
-Position     : [1307.68, 1305.28]
-Measurements : [938.427, 121598, 0.816699, -0.150508]
----
-Label        : 1
-Position     : [1089.63, 1305.57]
-Measurements : [1678.54, 410824, -0.545004, -0.940127]
----
-Label        : 1
-Position     : [1048.54, 1305.7]
-Measurements : [1792.35, 686658, -0.0542441, -1.33292]
----
-Label        : 1
-Position     : [203.531, 1305.81]
-Measurements : [1279.7, 191392, 0.829117, 0.359532]
----
-Label        : 1
-Position     : [1046.56, 1305.91]
-Measurements : [1773.79, 639600, 0.0380616, -1.24927]
----
-Label        : 1
-Position     : [1287.42, 1306.03]
-Measurements : [1612.31, 414251, 0.00757947, -1.15186]
----
-Label        : 1
-Position     : [898.521, 1306.13]
-Measurements : [1711.11, 311933, -0.0518588, -0.231079]
----
-Label        : 1
-Position     : [1046.17, 1306.74]
-Measurements : [1753.3, 651650, 0.0661669, -1.23661]
----
-Label        : 1
-Position     : [1045.45, 1307.01]
-Measurements : [1700.51, 625055, 0.0962782, -1.19543]
----
-Label        : 1
-Position     : [942.911, 1307.03]
-Measurements : [1821.26, 457168, -0.167818, -1.26576]
----
-Label        : 1
-Position     : [891.46, 1307.07]
-Measurements : [1356.31, 180761, 0.0181037, -1.12644]
----
-Label        : 1
-Position     : [1115.72, 1307.13]
-Measurements : [877.471, 221693, 0.31113, -1.49547]
----
-Label        : 1
-Position     : [1287.2, 1307.32]
-Measurements : [1616.54, 417166, 0.00516001, -1.16522]
----
-Label        : 1
-Position     : [1297.44, 1307.32]
-Measurements : [1844.23, 459064, -0.448991, -1.13823]
----
-Label        : 1
-Position     : [1119.08, 1307.41]
-Measurements : [572.121, 122755, 1.76644, 1.57128]
----
-Label        : 1
-Position     : [968.716, 1307.44]
-Measurements : [1122.78, 243379, -0.082707, -1.55788]
----
-Label        : 1
-Position     : [71.144, 1307.87]
-Measurements : [1874.11, 478684, -0.0578206, -1.00147]
----
-Label        : 1
-Position     : [1019.94, 1307.95]
-Measurements : [1437.86, 287350, 0.344329, -1.03668]
----
-Label        : 1
-Position     : [893.499, 1308.17]
-Measurements : [1601.11, 224758, -0.0473255, -0.164566]
----
-Label        : 1
-Position     : [874.918, 1308.26]
-Measurements : [2001.01, 269378, -0.462906, -0.385251]
----
-Label        : 1
-Position     : [895.398, 1308.26]
-Measurements : [1702.74, 217549, -0.0173452, -0.193424]
----
-Label        : 1
-Position     : [63.464, 1308.38]
-Measurements : [2091.74, 177450, -0.605216, -0.167407]
----
-Label        : 1
-Position     : [52.9436, 1308.58]
-Measurements : [2396.48, 243525, -0.655844, -0.187843]
----
-Label        : 1
-Position     : [977.276, 1308.87]
-Measurements : [947.372, 199620, 0.656709, -1.18114]
----
-Label        : 1
-Position     : [204.776, 1308.9]
-Measurements : [1268.92, 287573, 0.5939, -0.569668]
----
-Label        : 1
-Position     : [205.458, 1309.39]
-Measurements : [1178.51, 355079, 0.601239, -0.811588]
----
-Label        : 1
-Position     : [1300.06, 1309.61]
-Measurements : [1547.19, 606793, 0.180677, -1.66337]
----
-Label        : 1
-Position     : [880.849, 1309.69]
-Measurements : [1446.04, 301160, 1.12097, 0.0218886]
----
-Label        : 1
-Position     : [899.513, 1309.78]
-Measurements : [1554.62, 436688, -0.0295516, -1.01249]
----
-Label        : 1
-Position     : [971.311, 1309.91]
-Measurements : [1020.75, 258859, 0.25137, -1.58033]
----
-Label        : 1
-Position     : [52.712, 1309.92]
-Measurements : [2489.45, 219399, -0.697646, -0.117475]
----
-Label        : 1
-Position     : [221.16, 1309.92]
-Measurements : [1231.95, 319143, 0.184855, -0.929334]
----
-Label        : 1
-Position     : [1092.03, 1310]
-Measurements : [1830.11, 182334, -0.727102, 0.373403]
----
-Label        : 1
-Position     : [944.084, 1310.26]
-Measurements : [1611.3, 361606, 0.112868, -0.98271]
----
-Label        : 1
-Position     : [37.1531, 1310.74]
-Measurements : [1818.07, 347091, -0.0132461, -1.35249]
----
-Label        : 1
-Position     : [944.37, 1311.09]
-Measurements : [1468.89, 326165, 0.26123, -0.97454]
----
-Label        : 1
-Position     : [871.231, 1311.12]
-Measurements : [1917.48, 296230, -0.537008, 0.0507425]
----
-Label        : 1
-Position     : [876.025, 1311.28]
-Measurements : [1741.13, 411771, 0.108182, -1.38274]
----
-Label        : 1
-Position     : [71.9168, 1311.3]
-Measurements : [1754.99, 444855, 0.343359, -0.740937]
----
-Label        : 1
-Position     : [970.319, 1311.52]
-Measurements : [834.653, 246444, 0.989766, -0.631592]
----
-Label        : 1
-Position     : [38.7906, 1311.54]
-Measurements : [1930.26, 331406, -0.187449, -1.26945]
----
-Label        : 1
-Position     : [939.61, 1311.54]
-Measurements : [1132.66, 349886, 0.744953, -0.275352]
----
-Label        : 1
-Position     : [1041.65, 1311.64]
-Measurements : [1359.79, 309708, 0.199126, -0.684238]
----
-Label        : 1
-Position     : [1013.51, 1311.84]
-Measurements : [1400.59, 554639, 0.06974, -1.41732]
----
-Label        : 1
-Position     : [1016.46, 1311.9]
-Measurements : [1577.26, 407891, -0.0390692, -1.13643]
----
-Label        : 1
-Position     : [1116.6, 1312.05]
-Measurements : [1258.37, 364290, 0.0737243, -0.960195]
----
-Label        : 1
-Position     : [1091.4, 1312.26]
-Measurements : [1807.8, 192872, -0.583877, -0.0512258]
----
-Label        : 1
-Position     : [219.056, 1312.27]
-Measurements : [1432.78, 404600, -0.143565, -1.06002]
----
-Label        : 1
-Position     : [870.611, 1312.33]
-Measurements : [1814.56, 390739, -0.452088, -0.499928]
----
-Label        : 1
-Position     : [893.759, 1312.35]
-Measurements : [1780.37, 197400, -0.0722917, 0.448701]
----
-Label        : 1
-Position     : [877.092, 1312.56]
-Measurements : [1562.26, 413992, 0.588014, -1.01357]
----
-Label        : 1
-Position     : [224.568, 1312.62]
-Measurements : [1348.31, 227152, 0.51743, -0.564394]
----
-Label        : 1
-Position     : [60.9692, 1312.65]
-Measurements : [2092.48, 268651, -0.18664, -0.315039]
----
-Label        : 1
-Position     : [1015.43, 1312.87]
-Measurements : [1481.93, 489326, 0.0581409, -1.31392]
----
-Label        : 1
-Position     : [47.6352, 1313.1]
-Measurements : [2422.46, 310526, -1.00005, 0.241473]
----
-Label        : 1
-Position     : [220.108, 1313.97]
-Measurements : [1521.66, 352754, -0.0880711, -0.960449]
----
-Label        : 1
-Position     : [52.4728, 1314.26]
-Measurements : [2257.54, 555768, -0.656299, -0.82843]
----
-Label        : 1
-Position     : [873.182, 1314.51]
-Measurements : [1635.64, 347752, -0.0966372, -1.25582]
----
-Label        : 1
-Position     : [1090.8, 1314.51]
-Measurements : [1759.43, 230099, -0.601054, -0.174954]
----
-Label        : 1
-Position     : [44.52, 1314.53]
-Measurements : [2294.61, 290795, -0.731813, -0.0650435]
----
-Label        : 1
-Position     : [875.18, 1314.79]
-Measurements : [1564.48, 364534, 0.178236, -1.3786]
----
-Label        : 1
-Position     : [941.682, 1314.81]
-Measurements : [981.848, 178299, 0.344346, -1.13886]
----
-Label        : 1
-Position     : [1089.79, 1314.94]
-Measurements : [1709.32, 233326, -0.579034, -0.312489]
----
-Label        : 1
-Position     : [37.352, 1315.04]
-Measurements : [1717.94, 356852, 0.294923, -1.27952]
----
-Label        : 1
-Position     : [220.136, 1315.04]
-Measurements : [1596.44, 320048, -0.0372491, -1.14698]
----
-Label        : 1
-Position     : [892.448, 1315.17]
-Measurements : [1693.19, 281184, -0.209503, -0.33508]
----
-Label        : 1
-Position     : [44.5377, 1315.27]
-Measurements : [2193.27, 419334, -0.689739, -0.504618]
----
-Label        : 1
-Position     : [890.586, 1315.32]
-Measurements : [1556, 302679, -0.00125402, -0.758852]
----
-Label        : 1
-Position     : [1036.08, 1315.38]
-Measurements : [1274.77, 330210, 0.294655, -1.02092]
----
-Label        : 1
-Position     : [870.822, 1315.63]
-Measurements : [1511.51, 445933, -0.225569, -1.3706]
----
-Label        : 1
-Position     : [946.35, 1316]
-Measurements : [914.94, 139810, 0.637199, -0.743085]
----
-Label        : 1
-Position     : [1090.58, 1316.25]
-Measurements : [1717.1, 188884, -0.713842, 0.0164106]
----
-Label        : 1
-Position     : [1042.99, 1316.36]
-Measurements : [1589.96, 257704, -0.350439, -0.670034]
----
-Label        : 1
-Position     : [215.102, 1317.07]
-Measurements : [1697.26, 456729, -0.453818, -0.429782]
----
-Label        : 1
-Position     : [1110.03, 1317.51]
-Measurements : [1078.43, 231753, 0.526966, -0.899589]
----
-Label        : 1
-Position     : [214.016, 1317.56]
-Measurements : [1622, 506725, -0.301859, -0.772521]
----
-Label        : 1
-Position     : [891.302, 1317.68]
-Measurements : [1559.72, 365709, 0.0457323, -0.988123]
----
-Label        : 1
-Position     : [1086.98, 1317.8]
-Measurements : [1552.81, 266504, -0.531659, -0.428131]
----
-Label        : 1
-Position     : [887.466, 1318.56]
-Measurements : [1208.13, 216550, 0.710414, -0.443342]
----
-Label        : 1
-Position     : [1039.6, 1318.6]
-Measurements : [1651.32, 248948, -0.404652, -0.645923]
----
-Label        : 1
-Position     : [941.802, 1318.71]
-Measurements : [913.476, 193404, 0.511469, -1.267]
----
-Label        : 1
-Position     : [941.932, 1319.08]
-Measurements : [924.102, 220751, 0.724954, -0.684596]
----
-Label        : 1
-Position     : [217.576, 1319.65]
-Measurements : [1823.71, 417133, 0.127804, -0.86612]
----
-Label        : 1
-Position     : [869.549, 1319.83]
-Measurements : [1080.1, 369406, 0.874968, -0.571578]
----
-Label        : 1
-Position     : [1087.52, 1320.24]
-Measurements : [1698.86, 201962, -0.15985, -0.337135]
----
-Label        : 1
-Position     : [1043.74, 1320.38]
-Measurements : [1497.44, 401010, -0.21268, -1.3805]
----
-Label        : 1
-Position     : [1114.14, 1321.06]
-Measurements : [1350.95, 181017, -0.14243, -1.10173]
----
-Label        : 1
-Position     : [212.968, 1321.7]
-Measurements : [1776.1, 616859, -0.309671, -0.945149]
----
-Label        : 1
-Position     : [1085.11, 1322.19]
-Measurements : [1645.56, 314442, -0.450896, -0.564527]
----
-Label        : 1
-Position     : [937.586, 1322.59]
-Measurements : [1119.32, 256289, 0.264803, -1.19099]
----
-Label        : 1
-Position     : [220.624, 1322.68]
-Measurements : [1333.74, 331630, 1.023, -0.422394]
----
-Label        : 1
-Position     : [1113.23, 1322.78]
-Measurements : [1356.74, 187156, -0.277567, -1.1924]
----
-Label        : 1
-Position     : [1084.08, 1323.55]
-Measurements : [1543.34, 396985, -0.24635, -1.02168]
----
-Label        : 1
-Position     : [1034.64, 1323.62]
-Measurements : [1247.68, 232300, 0.158599, -0.886861]
----
-Label        : 1
-Position     : [1040.78, 1324.01]
-Measurements : [1646.53, 275005, -0.254766, -0.755246]
----
-Label        : 1
-Position     : [962.501, 1324.12]
-Measurements : [1188.32, 418831, 0.295935, -0.90213]
----
-Label        : 1
-Position     : [885.503, 1324.22]
-Measurements : [1339.04, 335668, 0.646289, -1.07745]
----
-Label        : 1
-Position     : [1036.66, 1324.26]
-Measurements : [1521.52, 249289, 0.155506, -0.6279]
----
-Label        : 1
-Position     : [1038.78, 1324.34]
-Measurements : [1648.71, 228938, 0.0062626, -0.786374]
----
-Label        : 1
-Position     : [1085.06, 1324.34]
-Measurements : [1577.87, 336021, -0.145536, -0.915619]
----
-Label        : 1
-Position     : [1108.77, 1324.37]
-Measurements : [1188.77, 195140, 0.0129395, -1.20501]
----
-Label        : 1
-Position     : [212.055, 1324.41]
-Measurements : [1869.87, 502797, -0.228788, -0.763631]
----
-Label        : 1
-Position     : [1109.74, 1324.93]
-Measurements : [1241.67, 204417, -0.089655, -1.11295]
----
-Label        : 1
-Position     : [959.621, 1325.05]
-Measurements : [1160.3, 227966, -0.113435, -1.1584]
----
-Label        : 1
-Position     : [1109.23, 1325.16]
-Measurements : [1253, 197803, -0.122267, -1.04868]
----
-Label        : 1
-Position     : [212.572, 1325.19]
-Measurements : [1867.71, 479306, -0.119474, -0.837442]
----
-Label        : 1
-Position     : [1082.65, 1325.2]
-Measurements : [1355.99, 379338, 0.252832, -0.797388]
----
-Label        : 1
-Position     : [962.572, 1325.46]
-Measurements : [1301.02, 382402, 0.0394973, -0.819866]
----
-Label        : 1
-Position     : [888.025, 1326.28]
-Measurements : [1691.27, 420564, 0.235849, -0.969007]
----
-Label        : 1
-Position     : [1041.87, 1326.64]
-Measurements : [1583.87, 375788, -0.235487, -1.00124]
----
-Label        : 1
-Position     : [1005.87, 1326.64]
-Measurements : [767.13, 196445, 0.773894, -0.989564]
----
-Label        : 1
-Position     : [890.448, 1327.09]
-Measurements : [1776.79, 420014, 0.15671, -1.06311]
----
-Label        : 1
-Position     : [1010.11, 1328.02]
-Measurements : [1034.87, 208061, -0.161357, -1.38112]
----
-Label        : 1
-Position     : [962.021, 1328.41]
-Measurements : [1687.99, 234360, 0.0141727, -0.411767]
----
-Label        : 1
-Position     : [1036.73, 1328.43]
-Measurements : [1750.04, 259453, 0.0946967, -0.883668]
----
-Label        : 1
-Position     : [203.632, 1328.66]
-Measurements : [1066.95, 434547, 0.302328, -1.57838]
----
-Label        : 1
-Position     : [1005.66, 1328.82]
-Measurements : [927.061, 251058, 0.274468, -1.52142]
----
-Label        : 1
-Position     : [1083.83, 1328.84]
-Measurements : [1453.46, 235202, 0.428073, -0.185369]
----
-Label        : 1
-Position     : [1083.83, 1329.25]
-Measurements : [1472.37, 186843, 0.336424, -0.325738]
----
-Label        : 1
-Position     : [202.951, 1329.32]
-Measurements : [1031.45, 417980, 0.38989, -1.47656]
----
-Label        : 1
-Position     : [210.92, 1329.38]
-Measurements : [1682.02, 403155, 0.0554528, -0.913074]
----
-Label        : 1
-Position     : [205.732, 1329.62]
-Measurements : [1392.06, 421998, -0.342022, -1.27645]
----
-Label        : 1
-Position     : [936.019, 1329.95]
-Measurements : [1037.7, 216098, 0.598226, -0.73039]
----
-Label        : 1
-Position     : [200.546, 1330.55]
-Measurements : [916.041, 389195, 0.73859, -1.00794]
----
-Label        : 1
-Position     : [930.207, 1331.09]
-Measurements : [833.478, 137570, 0.680452, -0.65201]
----
-Label        : 1
-Position     : [961.343, 1331.6]
-Measurements : [1615.36, 216538, 0.267333, -0.630965]
----
-Label        : 1
-Position     : [208.36, 1331.94]
-Measurements : [1533.87, 383342, 0.0817045, -0.981815]
----
-Label        : 1
-Position     : [211.104, 1332]
-Measurements : [1434.25, 382381, 0.528883, -0.908814]
----
-Label        : 1
-Position     : [1107.18, 1332.12]
-Measurements : [1488.82, 182643, -0.128261, -0.592243]
----
-Label        : 1
-Position     : [1082.76, 1332.38]
-Measurements : [1311.58, 166648, -0.0332113, 0.0124142]
----
-Label        : 1
-Position     : [1086.17, 1332.4]
-Measurements : [1306.43, 134188, 0.327458, -0.299825]
----
-Label        : 1
-Position     : [935.129, 1332.42]
-Measurements : [963.229, 116310, 0.44043, -0.954927]
----
-Label        : 1
-Position     : [1088.2, 1332.79]
-Measurements : [1232.9, 107412, 0.599771, 0.0705997]
----
-Label        : 1
-Position     : [1031.61, 1332.82]
-Measurements : [1411.46, 394940, 0.349675, -0.597819]
----
-Label        : 1
-Position     : [204.776, 1332.96]
-Measurements : [1415.48, 312966, -0.393476, -1.11989]
----
-Label        : 1
-Position     : [1081.38, 1333.35]
-Measurements : [1218.72, 202133, -0.297212, -0.809967]
----
-Label        : 1
-Position     : [1086.57, 1333.55]
-Measurements : [1252.11, 148525, 0.174646, -0.431307]
----
-Label        : 1
-Position     : [1010.11, 1333.76]
-Measurements : [1338.37, 142730, -0.37403, -0.740992]
----
-Label        : 1
-Position     : [1035.91, 1333.76]
-Measurements : [1895.88, 379316, 0.0541412, -0.369077]
----
-Label        : 1
-Position     : [1011.92, 1333.77]
-Measurements : [1294.03, 144761, -0.183736, -0.896126]
----
-Label        : 1
-Position     : [1007.17, 1334.09]
-Measurements : [1414.44, 174034, -0.602613, -0.24203]
----
-Label        : 1
-Position     : [1014.34, 1334.09]
-Measurements : [1101.03, 96307.8, 0.189611, -0.766939]
----
-Label        : 1
-Position     : [1082.31, 1334.24]
-Measurements : [1155.18, 199033, -0.324596, -1.3479]
----
-Label        : 1
-Position     : [198.004, 1335.02]
-Measurements : [1176.41, 398729, 0.00739016, -1.51755]
----
-Label        : 1
-Position     : [205.008, 1335.25]
-Measurements : [1347.55, 267229, 0.160481, -1.42401]
----
-Label        : 1
-Position     : [964.443, 1335.33]
-Measurements : [1415.62, 326990, 0.053222, -0.967151]
----
-Label        : 1
-Position     : [954.461, 1335.52]
-Measurements : [1050.63, 98191.3, 0.288471, -0.468764]
----
-Label        : 1
-Position     : [200.68, 1335.52]
-Measurements : [1305.33, 339941, -0.236251, -1.28093]
----
-Label        : 1
-Position     : [1080.43, 1335.71]
-Measurements : [1075.66, 243875, -0.121086, -1.62054]
----
-Label        : 1
-Position     : [202.606, 1335.85]
-Measurements : [1387.93, 284884, -0.262247, -1.21935]
----
-Label        : 1
-Position     : [1010.68, 1336.06]
-Measurements : [1327.47, 167515, -0.237885, -0.913615]
----
-Label        : 1
-Position     : [1104.71, 1336.29]
-Measurements : [1392.99, 213359, -0.331121, -0.548384]
----
-Label        : 1
-Position     : [1037.82, 1336.4]
-Measurements : [1842.17, 531701, -0.167324, -0.914085]
----
-Label        : 1
-Position     : [1111.1, 1336.5]
-Measurements : [1260.47, 387608, 0.214244, -1.4822]
----
-Label        : 1
-Position     : [934.956, 1336.65]
-Measurements : [1130.51, 135065, 0.379975, -0.239017]
----
-Label        : 1
-Position     : [201.317, 1337.28]
-Measurements : [1403.75, 285657, -0.101102, -1.19929]
----
-Label        : 1
-Position     : [1106.36, 1338.26]
-Measurements : [1493.63, 187347, -0.197667, -0.594758]
----
-Label        : 1
-Position     : [198.12, 1338.59]
-Measurements : [1371.62, 364326, -0.196164, -1.18324]
----
-Label        : 1
-Position     : [1007.24, 1338.67]
-Measurements : [1467.74, 159950, -0.324834, -0.785349]
----
-Label        : 1
-Position     : [958.066, 1338.98]
-Measurements : [1468.65, 156102, 0.261484, -0.727416]
----
-Label        : 1
-Position     : [1005.61, 1339.2]
-Measurements : [1522.85, 165111, -0.490292, -0.491183]
----
-Label        : 1
-Position     : [934.31, 1339.39]
-Measurements : [1134.29, 167900, 0.335453, -0.820453]
----
-Label        : 1
-Position     : [1027.08, 1339.54]
-Measurements : [1254.46, 204678, 0.49336, -0.469979]
----
-Label        : 1
-Position     : [961.115, 1339.65]
-Measurements : [1454.56, 179069, -0.115474, -0.587089]
----
-Label        : 1
-Position     : [1030.59, 1339.9]
-Measurements : [1500.28, 282772, 0.373387, -0.581496]
----
-Label        : 1
-Position     : [1076.42, 1340.93]
-Measurements : [1086.82, 424972, 0.495136, -1.06757]
----
-Label        : 1
-Position     : [1101.75, 1341.08]
-Measurements : [1186.92, 234980, 0.0104893, -1.29114]
----
-Label        : 1
-Position     : [1006.9, 1341.49]
-Measurements : [1531.96, 184549, -0.439923, -0.819245]
----
-Label        : 1
-Position     : [1105.19, 1341.53]
-Measurements : [1417.8, 206917, -0.333818, -0.868903]
----
-Label        : 1
-Position     : [196.908, 1341.56]
-Measurements : [1391.56, 379297, -0.315684, -1.1364]
----
-Label        : 1
-Position     : [928.389, 1341.71]
-Measurements : [966.719, 160637, 0.114591, -1.08712]
----
-Label        : 1
-Position     : [931.876, 1341.75]
-Measurements : [1082.87, 152359, 0.0190296, -0.952794]
----
-Label        : 1
-Position     : [956.528, 1341.84]
-Measurements : [1475.74, 214437, -0.0808765, -0.790369]
----
-Label        : 1
-Position     : [958.066, 1341.84]
-Measurements : [1554.55, 200191, -0.203989, -0.838431]
----
-Label        : 1
-Position     : [1104.72, 1342.77]
-Measurements : [1312.89, 258570, -0.215759, -1.22044]
----
-Label        : 1
-Position     : [1003.96, 1343.18]
-Measurements : [1711.76, 219450, -0.653427, 0.101185]
----
-Label        : 1
-Position     : [195.56, 1343.2]
-Measurements : [1430.41, 420351, -0.175269, -1.10667]
----
-Label        : 1
-Position     : [199.066, 1343.26]
-Measurements : [1308.5, 307133, 0.410709, -1.15532]
----
-Label        : 1
-Position     : [1077.28, 1343.59]
-Measurements : [1413.36, 410465, -0.18025, -1.10319]
----
-Label        : 1
-Position     : [1027.78, 1343.75]
-Measurements : [1474.19, 381456, 0.320688, -0.865835]
----
-Label        : 1
-Position     : [931.852, 1344.3]
-Measurements : [1180.13, 86288, 0.300817, -0.455208]
----
-Label        : 1
-Position     : [1029.77, 1344.41]
-Measurements : [1672.23, 368575, 0.10691, -0.97739]
----
-Label        : 1
-Position     : [187.798, 1344.84]
-Measurements : [766.17, 380279, 1.33126, 0.25942]
----
-Label        : 1
-Position     : [1005.35, 1346.01]
-Measurements : [1753.23, 319899, -0.373227, -0.853522]
----
-Label        : 1
-Position     : [1103.55, 1346.15]
-Measurements : [927.715, 322546, 0.700054, -1.08091]
----
-Label        : 1
-Position     : [1030.78, 1346.28]
-Measurements : [1642.54, 377454, 0.153002, -0.963774]
----
-Label        : 1
-Position     : [955.199, 1346.35]
-Measurements : [1677.91, 209809, -0.144251, -0.655183]
----
-Label        : 1
-Position     : [193.757, 1346.38]
-Measurements : [1524.22, 433222, -0.289101, -1.08446]
----
-Label        : 1
-Position     : [194.45, 1346.41]
-Measurements : [1513.46, 423640, -0.172241, -1.20138]
----
-Label        : 1
-Position     : [1079.75, 1346.63]
-Measurements : [1599, 250273, -0.337679, -0.25206]
----
-Label        : 1
-Position     : [962.652, 1346.66]
-Measurements : [1301.35, 487098, 0.25086, -1.44225]
----
-Label        : 1
-Position     : [1026.74, 1346.72]
-Measurements : [1430.11, 284626, 0.481911, -0.219725]
----
-Label        : 1
-Position     : [191.903, 1346.89]
-Measurements : [1414.96, 511919, -0.193563, -1.28437]
----
-Label        : 1
-Position     : [1103.97, 1347.07]
-Measurements : [837.351, 314036, 1.04937, -0.48434]
----
-Label        : 1
-Position     : [953.134, 1347.5]
-Measurements : [1562.99, 234177, -0.184157, -0.84746]
----
-Label        : 1
-Position     : [951.017, 1347.61]
-Measurements : [1334.72, 270887, 0.12313, -1.07814]
----
-Label        : 1
-Position     : [930.032, 1347.76]
-Measurements : [1179.15, 62709, 0.787222, 0.379866]
----
-Label        : 1
-Position     : [1075.06, 1347.83]
-Measurements : [1500.15, 178217, -0.185162, -0.0376738]
----
-Label        : 1
-Position     : [1076.46, 1348.91]
-Measurements : [1552.56, 190178, 0.0781478, -0.0661939]
----
-Label        : 1
-Position     : [998.434, 1349.05]
-Measurements : [1597.79, 478159, -0.318914, -1.16057]
----
-Label        : 1
-Position     : [190.764, 1349.28]
-Measurements : [1468.86, 358433, -0.13488, -0.7986]
----
-Label        : 1
-Position     : [1002.32, 1349.32]
-Measurements : [1964.24, 214191, -0.630874, -0.318155]
----
-Label        : 1
-Position     : [195.151, 1349.72]
-Measurements : [1386.04, 372566, 0.406746, -1.24631]
----
-Label        : 1
-Position     : [1007.11, 1350.31]
-Measurements : [1655.7, 426894, 0.0381281, -1.40369]
----
-Label        : 1
-Position     : [954.79, 1351.26]
-Measurements : [1398.96, 381571, -0.0266855, -1.26696]
----
-Label        : 1
-Position     : [1026.9, 1352.19]
-Measurements : [1502.91, 233766, 0.246975, -0.0219934]
----
-Label        : 1
-Position     : [1022.5, 1352.22]
-Measurements : [1294.98, 184964, 0.0286022, -0.521713]
----
-Label        : 1
-Position     : [1003.58, 1352.48]
-Measurements : [1881.56, 318137, -0.2688, -1.22873]
----
-Label        : 1
-Position     : [188.39, 1352.6]
-Measurements : [1393.1, 310796, 0.168832, -0.630014]
----
-Label        : 1
-Position     : [1000.69, 1352.6]
-Measurements : [1815.09, 350378, -0.300662, -0.902512]
----
-Label        : 1
-Position     : [959.379, 1353]
-Measurements : [1067.63, 408215, 0.761021, -0.893085]
----
-Label        : 1
-Position     : [1072.81, 1353.02]
-Measurements : [1366.2, 189996, -0.764581, -0.391958]
----
-Label        : 1
-Position     : [956.435, 1353.16]
-Measurements : [1196.01, 397855, 0.382504, -1.24667]
----
-Label        : 1
-Position     : [1185.12, 1353.31]
-Measurements : [753.949, 186336, 0.593775, -1.14592]
----
-Label        : 1
-Position     : [1073.18, 1353.42]
-Measurements : [1411.63, 158037, -0.850258, -0.0751179]
----
-Label        : 1
-Position     : [1024.81, 1353.75]
-Measurements : [1455.4, 176964, -0.0422201, -0.470655]
----
-Label        : 1
-Position     : [1149.31, 1354.14]
-Measurements : [821.773, 187973, 0.612616, -0.710248]
----
-Label        : 1
-Position     : [1184.19, 1355.01]
-Measurements : [953.618, 234215, 0.290703, -0.954065]
----
-Label        : 1
-Position     : [182.124, 1355.23]
-Measurements : [842.557, 225318, 0.535452, -1.19607]
----
-Label        : 1
-Position     : [1184.71, 1355.23]
-Measurements : [953.618, 234215, 0.290703, -0.954065]
----
-Label        : 1
-Position     : [1024.92, 1355.93]
-Measurements : [1467.53, 167820, 0.0242755, -0.542963]
----
-Label        : 1
-Position     : [1150.25, 1356.21]
-Measurements : [977.626, 172943, 0.101855, -0.931218]
----
-Label        : 1
-Position     : [184.21, 1356.24]
-Measurements : [968.651, 188089, 0.249335, -0.922126]
----
-Label        : 1
-Position     : [1151.83, 1356.29]
-Measurements : [973.282, 180168, 0.0667811, -0.998109]
----
-Label        : 1
-Position     : [1024.03, 1357.11]
-Measurements : [1484.26, 172589, 0.155084, -0.827578]
----
-Label        : 1
-Position     : [1100.34, 1357.4]
-Measurements : [1106.35, 299674, -0.0810147, -1.52512]
----
-Label        : 1
-Position     : [1097.35, 1357.93]
-Measurements : [1131.1, 260119, -0.198241, -1.29917]
----
-Label        : 1
-Position     : [1075.61, 1357.95]
-Measurements : [1394.87, 236344, -0.254585, -1.133]
----
-Label        : 1
-Position     : [1076.57, 1358.09]
-Measurements : [1297.11, 289487, 0.013206, -1.44407]
----
-Label        : 1
-Position     : [1025.8, 1358.2]
-Measurements : [1494.99, 181646, 0.10445, -0.839606]
----
-Label        : 1
-Position     : [1075.55, 1358.32]
-Measurements : [1331.63, 282864, -0.132641, -1.38113]
----
-Label        : 1
-Position     : [1100.97, 1358.59]
-Measurements : [1208.42, 279292, -0.244758, -1.35779]
----
-Label        : 1
-Position     : [1001.79, 1358.93]
-Measurements : [1690.19, 297700, 0.117575, -0.952567]
----
-Label        : 1
-Position     : [1022.94, 1358.99]
-Measurements : [1385.21, 178032, 0.304549, -0.562026]
----
-Label        : 1
-Position     : [993.733, 1359.47]
-Measurements : [971.489, 414647, 0.842298, -0.664308]
----
-Label        : 1
-Position     : [999.866, 1359.56]
-Measurements : [1631.14, 380547, -0.196531, -0.879983]
----
-Label        : 1
-Position     : [1070.94, 1359.89]
-Measurements : [1100.93, 380884, 0.278185, -1.50769]
----
-Label        : 1
-Position     : [1153.2, 1360.6]
-Measurements : [1205.67, 164683, -0.0187007, -0.817942]
----
-Label        : 1
-Position     : [998.862, 1360.93]
-Measurements : [1607.86, 416249, -0.247642, -0.935206]
----
-Label        : 1
-Position     : [1153.37, 1361.04]
-Measurements : [1277.85, 165326, -0.117376, -0.889717]
----
-Label        : 1
-Position     : [1072.78, 1361.2]
-Measurements : [1088.75, 337198, 0.428055, -1.32598]
----
-Label        : 1
-Position     : [1184.46, 1361.65]
-Measurements : [1803.66, 424299, 0.249264, -0.85302]
----
-Label        : 1
-Position     : [1099.1, 1361.77]
-Measurements : [1505.52, 176025, -0.338427, -0.529592]
----
-Label        : 1
-Position     : [1025.24, 1362.2]
-Measurements : [1418.88, 222432, 0.268715, -0.958194]
----
-Label        : 1
-Position     : [1095.71, 1362.43]
-Measurements : [1481.55, 200900, -0.406638, -0.424187]
----
-Label        : 1
-Position     : [1021.98, 1362.8]
-Measurements : [1327.14, 210877, 0.462766, -0.537684]
----
-Label        : 1
-Position     : [1181.32, 1364.02]
-Measurements : [1878.69, 345188, 0.0477768, -0.566984]
----
-Label        : 1
-Position     : [996.59, 1364.07]
-Measurements : [1720.79, 341476, -0.68393, -0.265323]
----
-Label        : 1
-Position     : [1016.23, 1364.75]
-Measurements : [1096.47, 176590, 0.787439, 0.0655558]
----
-Label        : 1
-Position     : [1302.98, 1364.84]
-Measurements : [867.585, 284755, 1.08671, 0.299825]
----
-Label        : 1
-Position     : [184.644, 1365.19]
-Measurements : [936.212, 120838, 1.53389, 1.92177]
----
-Label        : 1
-Position     : [180.114, 1365.25]
-Measurements : [1142.42, 296578, 0.766775, -0.0976057]
----
-Label        : 1
-Position     : [1149.78, 1365.25]
-Measurements : [1571.08, 192387, -0.0894727, -0.575235]
----
-Label        : 1
-Position     : [177.998, 1365.36]
-Measurements : [1160.89, 370657, 0.354042, -0.803761]
----
-Label        : 1
-Position     : [1017.56, 1365.38]
-Measurements : [1225.36, 226767, 0.314942, -0.853632]
----
-Label        : 1
-Position     : [1307.82, 1365.39]
-Measurements : [822.402, 232789, 1.56415, 1.74868]
----
-Label        : 1
-Position     : [1073.67, 1365.49]
-Measurements : [946.061, 260971, 0.993882, -0.29622]
----
-Label        : 1
-Position     : [1092.71, 1365.8]
-Measurements : [1536.53, 293731, 0.0273829, -0.65317]
----
-Label        : 1
-Position     : [1088.52, 1365.93]
-Measurements : [1219.66, 266961, 0.722213, -0.0842241]
----
-Label        : 1
-Position     : [1020.76, 1366.48]
-Measurements : [1430.08, 214155, -0.117515, -0.672]
----
-Label        : 1
-Position     : [1174, 1366.72]
-Measurements : [1375.9, 345637, 0.113011, -1.06138]
----
-Label        : 1
-Position     : [1067.24, 1366.73]
-Measurements : [965.522, 260123, 0.343479, -1.47959]
----
-Label        : 1
-Position     : [1183.54, 1366.8]
-Measurements : [1910.46, 492821, -0.409365, -0.855105]
----
-Label        : 1
-Position     : [1088.67, 1367.19]
-Measurements : [1173.67, 298480, 0.720606, -0.295204]
----
-Label        : 1
-Position     : [1153.35, 1367.19]
-Measurements : [1595.63, 419111, -0.0411243, -1.09396]
----
-Label        : 1
-Position     : [1092.03, 1367.3]
-Measurements : [1477.61, 355314, 0.013439, -0.95761]
----
-Label        : 1
-Position     : [1176.72, 1367.76]
-Measurements : [1700, 335349, -0.390805, -0.730935]
----
-Label        : 1
-Position     : [1298.04, 1368.25]
-Measurements : [682.765, 268536, 1.87527, 2.5242]
----
-Label        : 1
-Position     : [998.743, 1368.45]
-Measurements : [1856.1, 239627, -0.54793, -0.789999]
----
-Label        : 1
-Position     : [177.657, 1368.53]
-Measurements : [1355.55, 278715, 0.19252, -0.600856]
----
-Label        : 1
-Position     : [995.77, 1368.53]
-Measurements : [1867.98, 236956, -1.04351, 0.794239]
----
-Label        : 1
-Position     : [1069.5, 1368.53]
-Measurements : [1059.71, 255647, 0.160926, -1.54322]
----
-Label        : 1
-Position     : [992.358, 1368.77]
-Measurements : [1571.75, 418141, -0.5873, -0.947838]
----
-Label        : 1
-Position     : [177.235, 1369.09]
-Measurements : [1375.14, 251553, 0.306837, -0.487]
----
-Label        : 1
-Position     : [179.391, 1369.16]
-Measurements : [1292.91, 245143, 0.803953, -0.316779]
----
-Label        : 1
-Position     : [179.593, 1369.62]
-Measurements : [1292.91, 245143, 0.803953, -0.316779]
----
-Label        : 1
-Position     : [1069.21, 1369.67]
-Measurements : [1150.15, 265769, 0.109308, -1.24753]
----
-Label        : 1
-Position     : [1178.87, 1369.76]
-Measurements : [1935.54, 314627, -0.416534, -0.717754]
----
-Label        : 1
-Position     : [155.11, 1370.43]
-Measurements : [898.497, 83665.5, 0.809224, 1.13075]
----
-Label        : 1
-Position     : [173.97, 1370.58]
-Measurements : [1146.17, 388341, 0.421906, -0.915549]
----
-Label        : 1
-Position     : [1148.96, 1370.58]
-Measurements : [1864.5, 251316, -0.37612, 0.161728]
----
-Label        : 1
-Position     : [1062.24, 1371.33]
-Measurements : [1182.58, 326935, -0.0871565, -1.26764]
----
-Label        : 1
-Position     : [1018.3, 1371.4]
-Measurements : [1652.24, 124859, -0.716329, 0.307692]
----
-Label        : 1
-Position     : [1022.01, 1371.63]
-Measurements : [1560.68, 225751, -0.707548, -0.415069]
----
-Label        : 1
-Position     : [993.255, 1371.68]
-Measurements : [1887.18, 233264, -0.873702, 0.621119]
----
-Label        : 1
-Position     : [1092.45, 1372.39]
-Measurements : [1397.61, 433966, 0.199129, -1.22151]
----
-Label        : 1
-Position     : [998.701, 1372.75]
-Measurements : [1694.68, 326766, -0.139148, -1.31076]
----
-Label        : 1
-Position     : [178.51, 1372.92]
-Measurements : [1251.96, 241711, 1.0048, 0.00686376]
----
-Label        : 1
-Position     : [1066.63, 1373.04]
-Measurements : [1534.44, 199772, -0.348793, 0.0111119]
----
-Label        : 1
-Position     : [995.662, 1373.35]
-Measurements : [1861.08, 269298, -0.733931, -0.33968]
----
-Label        : 1
-Position     : [1147.15, 1373.51]
-Measurements : [1943.46, 207606, -0.554311, 0.345599]
----
-Label        : 1
-Position     : [1016.76, 1373.71]
-Measurements : [1636.35, 174565, -0.847295, 0.210384]
----
-Label        : 1
-Position     : [154.31, 1374.26]
-Measurements : [851.446, 102360, 0.760562, 0.493657]
----
-Label        : 1
-Position     : [993.722, 1374.26]
-Measurements : [1884.84, 266969, -0.844671, 0.18332]
----
-Label        : 1
-Position     : [1017.94, 1374.4]
-Measurements : [1738.95, 127092, -0.490263, 0.0571056]
----
-Label        : 1
-Position     : [1088.77, 1374.71]
-Measurements : [1251.6, 331486, 0.559561, -0.490234]
----
-Label        : 1
-Position     : [991.037, 1374.89]
-Measurements : [1820.27, 310665, -0.883694, 0.196792]
----
-Label        : 1
-Position     : [1176, 1375.49]
-Measurements : [2045.03, 230201, -0.497997, 0.0569878]
----
-Label        : 1
-Position     : [1147.73, 1375.9]
-Measurements : [1950.53, 206992, -0.553765, 0.299728]
----
-Label        : 1
-Position     : [161.571, 1375.94]
-Measurements : [766.396, 324712, 1.67905, 2.02554]
----
-Label        : 1
-Position     : [1151.55, 1376.26]
-Measurements : [1900.42, 361863, -0.530857, -0.904881]
----
-Label        : 1
-Position     : [1089.98, 1376.31]
-Measurements : [1311.23, 275586, 0.425736, -0.400587]
----
-Label        : 1
-Position     : [1144.68, 1376.63]
-Measurements : [1704.26, 264833, -0.418202, -0.472335]
----
-Label        : 1
-Position     : [1015.84, 1376.72]
-Measurements : [1532.33, 208836, -0.348124, -0.61448]
----
-Label        : 1
-Position     : [1013.24, 1377.12]
-Measurements : [1358.12, 195154, -0.199751, -0.913695]
----
-Label        : 1
-Position     : [1178.47, 1377.19]
-Measurements : [1959.73, 449950, -0.621468, -0.687523]
----
-Label        : 1
-Position     : [1141.49, 1377.97]
-Measurements : [1333.61, 328045, -0.20812, -1.1193]
----
-Label        : 1
-Position     : [153.198, 1378.61]
-Measurements : [656.227, 64945.2, 0.759967, -0.903768]
----
-Label        : 1
-Position     : [991.265, 1378.77]
-Measurements : [1794.4, 276768, -0.338358, -0.845714]
----
-Label        : 1
-Position     : [1062.94, 1378.77]
-Measurements : [1398.69, 432334, 0.0389976, -1.26124]
----
-Label        : 1
-Position     : [991.969, 1379.05]
-Measurements : [1705.55, 317140, -0.145849, -1.05466]
----
-Label        : 1
-Position     : [1179.28, 1379.54]
-Measurements : [1734.93, 608911, -0.139491, -1.38664]
----
-Label        : 1
-Position     : [989.916, 1379.6]
-Measurements : [1698, 305147, -0.386229, -0.827094]
----
-Label        : 1
-Position     : [1173.95, 1380]
-Measurements : [1726.45, 375725, -0.438284, -0.500703]
----
-Label        : 1
-Position     : [1090.42, 1380.25]
-Measurements : [1371.35, 265996, 0.378799, -0.57978]
----
-Label        : 1
-Position     : [162.092, 1380.41]
-Measurements : [1132.17, 434529, 0.627327, -0.659126]
----
-Label        : 1
-Position     : [166.188, 1380.82]
-Measurements : [1172.68, 358293, 0.883996, -0.207957]
----
-Label        : 1
-Position     : [170.85, 1380.84]
-Measurements : [964.773, 282651, 1.98103, 2.99222]
----
-Label        : 1
-Position     : [1170.51, 1381.17]
-Measurements : [1235.98, 464100, 0.0746034, -1.71099]
----
-Label        : 1
-Position     : [1087.11, 1381.23]
-Measurements : [1236.34, 215612, 0.658555, 0.216557]
----
-Label        : 1
-Position     : [159.308, 1381.58]
-Measurements : [877.895, 292959, 0.844727, -0.480249]
----
-Label        : 1
-Position     : [1063.62, 1381.62]
-Measurements : [1205.71, 492456, 0.448215, -1.263]
----
-Label        : 1
-Position     : [1144.86, 1381.64]
-Measurements : [1889.67, 218673, -1.00638, 0.631386]
----
-Label        : 1
-Position     : [1063.67, 1381.69]
-Measurements : [1205.71, 492456, 0.448215, -1.263]
----
-Label        : 1
-Position     : [1173.72, 1382.07]
-Measurements : [1350.14, 457072, -0.0540226, -1.6479]
----
-Label        : 1
-Position     : [993.497, 1382.12]
-Measurements : [1363.32, 271723, 0.570036, -0.815521]
----
-Label        : 1
-Position     : [164.967, 1382.53]
-Measurements : [1255.64, 327034, 0.712949, -0.294942]
----
-Label        : 1
-Position     : [1013.38, 1383.28]
-Measurements : [1136.54, 306071, 0.279356, -1.30131]
----
-Label        : 1
-Position     : [988.807, 1384.1]
-Measurements : [1391.93, 242040, 0.735717, -0.738857]
----
-Label        : 1
-Position     : [158.379, 1384.11]
-Measurements : [809.824, 244179, 0.914108, -0.243215]
----
-Label        : 1
-Position     : [1138.24, 1384.59]
-Measurements : [1401.05, 546060, -0.0265815, -1.46583]
----
-Label        : 1
-Position     : [159.225, 1384.91]
-Measurements : [878.321, 267152, 0.787482, -0.430444]
----
-Label        : 1
-Position     : [1010, 1384.95]
-Measurements : [909.582, 225923, 0.749187, -0.903175]
----
-Label        : 1
-Position     : [169.118, 1385.32]
-Measurements : [936.153, 208541, 2.61297, 6.13453]
----
-Label        : 1
-Position     : [1011.11, 1385.77]
-Measurements : [871.412, 247884, 0.929244, -0.632586]
----
-Label        : 1
-Position     : [1147.86, 1385.85]
-Measurements : [1804.06, 369755, -0.634474, -0.839687]
----
-Label        : 1
-Position     : [1083.74, 1385.86]
-Measurements : [1039.81, 114759, -0.16334, -1.03408]
----
-Label        : 1
-Position     : [1089.75, 1386.58]
-Measurements : [1153.2, 123729, -0.131298, -0.974438]
----
-Label        : 1
-Position     : [1137.8, 1387.08]
-Measurements : [1129, 528683, 0.620096, -1.1659]
----
-Label        : 1
-Position     : [1088.97, 1387.48]
-Measurements : [1192.95, 126224, -0.0182112, -0.73282]
----
-Label        : 1
-Position     : [1173.41, 1387.8]
-Measurements : [1093.9, 308364, 0.441249, -1.20178]
----
-Label        : 1
-Position     : [1086.7, 1388.19]
-Measurements : [1255.24, 130257, 0.343242, -0.020842]
----
-Label        : 1
-Position     : [1142, 1388.19]
-Measurements : [1561.03, 613464, -0.202352, -1.61665]
----
-Label        : 1
-Position     : [1169.04, 1390.65]
-Measurements : [1192.66, 242162, 0.122252, -0.982615]
----
-Label        : 1
-Position     : [1088.41, 1390.81]
-Measurements : [1258.22, 162981, 0.174248, -0.3389]
----
-Label        : 1
-Position     : [137.839, 1390.99]
-Measurements : [1023.5, 190082, 0.947116, 0.347867]
----
-Label        : 1
-Position     : [1058.01, 1391.07]
-Measurements : [1080.69, 368579, 0.101656, -1.49106]
----
-Label        : 1
-Position     : [135.893, 1391.39]
-Measurements : [1064.06, 166593, 1.02346, 0.679916]
----
-Label        : 1
-Position     : [1089.22, 1391.41]
-Measurements : [1201.15, 206593, 0.199094, -0.71187]
----
-Label        : 1
-Position     : [1085.06, 1391.47]
-Measurements : [1411.72, 149262, -0.205306, -0.163591]
----
-Label        : 1
-Position     : [1173.37, 1391.51]
-Measurements : [1094.93, 221983, 0.31752, -1.22651]
----
-Label        : 1
-Position     : [136.697, 1391.88]
-Measurements : [1031.84, 182707, 1.0036, 0.463269]
----
-Label        : 1
-Position     : [1059.67, 1391.88]
-Measurements : [1063.22, 371497, 0.161157, -1.50979]
----
-Label        : 1
-Position     : [155.129, 1392.29]
-Measurements : [941.025, 259222, 0.453849, -1.27346]
----
-Label        : 1
-Position     : [148.844, 1392.64]
-Measurements : [873.434, 304059, 0.582619, -1.26325]
----
-Label        : 1
-Position     : [157.979, 1394.63]
-Measurements : [893.001, 169323, 0.741747, -0.732229]
----
-Label        : 1
-Position     : [1167.46, 1394.77]
-Measurements : [1595.33, 204390, -0.260359, -0.802122]
----
-Label        : 1
-Position     : [153.867, 1395.69]
-Measurements : [1155.01, 220069, 0.0415576, -1.0836]
----
-Label        : 1
-Position     : [151.852, 1395.97]
-Measurements : [1233.48, 261589, -0.161204, -0.906199]
----
-Label        : 1
-Position     : [1056.69, 1396.66]
-Measurements : [1538.99, 186069, -0.567154, -0.290382]
----
-Label        : 1
-Position     : [1164.94, 1397.2]
-Measurements : [1549.25, 162773, 0.153652, -0.686134]
----
-Label        : 1
-Position     : [153.418, 1397.74]
-Measurements : [1189.11, 169365, 0.221753, -0.832834]
----
-Label        : 1
-Position     : [1160.03, 1399.1]
-Measurements : [1212.64, 210005, 0.552384, -0.419835]
----
-Label        : 1
-Position     : [1056.39, 1399.25]
-Measurements : [1558.89, 218940, -0.683988, -0.441213]
diff --git a/Data/Baseline/OTB/Files/TvDescriptorsSVMModelCreation.svm b/Data/Baseline/OTB/Files/TvDescriptorsSVMModelCreation.svm
deleted file mode 100644
index b557bcfbe569174f8d48c93d4d7926275540d020..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/TvDescriptorsSVMModelCreation.svm
+++ /dev/null
@@ -1,232 +0,0 @@
-svm_type c_svc
-kernel_type linear
-nr_class 2
-total_sv 224
-rho -0.898435
-label 1 0
-nr_sv 111 113
-SV
-1 1:0.69109237 2:-0.20162838 3:-0.65376578 4:-0.43547766 
-1 1:0.46324437 2:-0.079541522 3:-0.72899212 4:-0.45271813 
-1 1:0.75094097 2:-0.19616619 3:-0.33190814 4:-0.30877904 
-1 1:0.70365619 2:0.01759753 3:-0.6909989 4:-0.41240323 
-1 1:-0.97853178 2:-0.42895003 3:0.48181126 4:-0.26463967 
-1 1:0.372286 2:0.014274367 3:-1.1031219 4:-0.43038233 
-1 1:-0.49667527 2:-0.14551467 3:0.02117055 4:-0.4017121 
-1 1:-0.88133649 2:-0.035018372 3:1.7800309 4:0.74981121 
-1 1:-0.84875076 2:-0.33219283 3:0.13992409 4:-0.41925118 
-1 1:0.55389122 2:-0.022533338 3:-0.40316594 4:-0.45013169 
-1 1:0.49940573 2:-0.23194414 3:-1.4055887 4:-0.323277 
-1 1:-0.11959717 2:-0.071099793 3:-0.68969274 4:-0.53344103 
-1 1:-0.78710927 2:-0.21299915 3:0.62594993 4:-0.22865958 
-1 1:0.17328549 2:-0.026583638 3:-0.95232954 4:-0.48307589 
-1 1:-0.60848895 2:-0.07361427 3:1.1913011 4:0.17146374 
-1 1:-0.82937399 2:-0.11821296 3:1.6883694 4:0.6160756 
-1 1:-0.22614497 2:-0.035118228 3:0.095960618 4:-0.39662361 
-1 1:0.35976138 2:-0.26508256 3:-0.79837598 4:-0.44047181 
-1 1:1.4136505 2:-0.22623662 3:-0.80293519 4:-0.37971557 
-1 1:-0.057883661 2:-0.074718622 3:-0.22316161 4:-0.45417397 
-1 1:0.34142508 2:-0.16644706 3:-0.89833509 4:-0.43656116 
-1 1:0.20811258 2:-0.17127593 3:-0.80754391 4:-0.43693097 
-1 1:0.56352464 2:-0.078147148 3:-0.73359259 4:-0.43729587 
-1 1:-0.068562106 2:-0.068225633 3:-0.28849653 4:-0.38850409 
-1 1:-0.86171966 2:-0.10027429 3:1.219222 4:0.19381764 
-1 1:-0.77921774 2:-0.10009336 3:1.1271584 4:0.20730184 
-1 1:0.33212738 2:0.009098241 3:0.98020011 4:0.13148285 
-1 1:1.512446 2:-0.18200812 3:-0.88196447 4:-0.38624303 
-1 1:0.48918021 2:-0.0012251123 3:-0.97430606 4:-0.46020262 
-1 1:2.0860009 2:-0.0063752669 3:-0.68361571 4:-0.42379254 
-1 1:-0.87208013 2:-0.4150814 3:0.50629156 4:-0.1761484 
-1 1:1.7266081 2:-0.03750803 3:-0.85200042 4:-0.40133951 
-1 1:1.9339253 2:0.016708231 3:-0.75966763 4:-0.41751742 
-1 1:0.56523315 2:-0.1044057 3:0.65940812 4:0.20014864 
-1 1:-0.92273872 2:-0.39317803 3:0.50638368 4:-0.20743168 
-1 1:-0.92370021 2:-0.44687694 3:0.86164992 4:0.029039189 
-1 1:1.5727291 2:0.092365881 3:-0.97327116 4:-0.36244619 
-1 1:0.13733606 2:-0.073301928 3:-0.44568539 4:-0.42804072 
-1 1:-0.032415082 2:-0.37652828 3:-0.52366102 4:-0.42556547 
-1 1:1.1851067 2:-0.047089841 3:-0.92608619 4:-0.45080471 
-1 1:2.2866981 2:-0.34545889 3:-0.12254126 4:-0.15527653 
-1 1:1.8973903 2:-0.280334 3:-1.3076557 4:-0.28408126 
-1 1:0.16879578 2:-0.06757977 3:-0.48014022 4:-0.44416969 
-1 1:-0.2215064 2:-0.24241052 3:-0.58856 4:-0.45861151 
-1 1:-0.032415082 2:-0.37652828 3:-0.52366102 4:-0.42556547 
-1 1:1.5295631 2:0.062467254 3:-1.2455611 4:-0.31239908 
-1 1:1.3467356 2:-0.075583702 3:-0.57949293 4:-0.29200399 
-1 1:-0.77288794 2:-0.10532933 3:0.43846003 4:-0.2389637 
-1 1:0.056304597 2:-0.094894655 3:0.23959198 4:-0.28954645 
-1 1:1.7621595 2:0.097137499 3:-0.7358019 4:-0.35727314 
-1 1:1.9913826 2:-0.21983291 3:-0.87068772 4:-0.27983657 
-1 1:2.101546 2:-0.21067344 3:-0.93514116 4:-0.14310347 
-1 1:1.3565879 2:-0.28580341 3:-0.77616578 4:-0.39223145 
-1 1:1.4539944 2:-0.17492955 3:-1.0562497 4:-0.3780657 
-1 1:1.0409292 2:-0.10301682 3:0.04371679 4:-0.38037114 
-1 1:1.286188 2:-0.15582611 3:-0.79700877 4:-0.48019886 
-1 1:0.90751355 2:-0.2106515 3:-0.84041874 4:-0.45697936 
-1 1:2.668085 2:0.094488919 3:-0.48645964 4:-0.41309118 
-1 1:-0.021307331 2:-0.056257295 3:-0.16943256 4:-0.40388938 
-1 1:0.74359 2:-0.27485327 3:0.13326728 4:-0.11390012 
-1 1:1.4549764 2:-0.32147401 3:-0.85853111 4:-0.38362505 
-1 1:1.2986204 2:-0.2546904 3:-0.76302084 4:-0.43112508 
-1 1:1.0353747 2:-0.10637342 3:-0.71608318 4:-0.43852742 
-1 1:1.2953587 2:-0.093156666 3:-0.41319252 4:-0.43514228 
-1 1:1.3127638 2:-0.024176066 3:-0.4492193 4:-0.45765616 
-1 1:0.86088155 2:-0.13058913 3:0.39216167 4:-0.2669108 
-1 1:1.1979613 2:0.067102152 3:-0.55743443 4:-0.45871979 
-1 1:1.4008246 2:-0.21219721 3:-0.7547644 4:-0.46573774 
-1 1:1.5851317 2:0.095144665 3:0.16600064 4:-0.16255216 
-1 1:0.38117004 2:-0.063339724 3:0.31259805 4:-0.22152706 
-1 1:0.53653398 2:-0.042885446 3:0.10098396 4:-0.068918142 
-1 1:1.5732366 2:-0.01661684 3:-0.99798455 4:-0.36599303 
-1 1:0.82059321 2:-0.23681127 3:-0.75534324 4:-0.45190902 
-1 1:1.0234628 2:-0.2309679 3:-0.82208803 4:-0.45548031 
-1 1:1.5116328 2:-0.031742743 3:0.055790594 4:-0.17368776 
-1 1:1.6078525 2:-0.079505937 3:0.13048795 4:-0.17886508 
-1 1:2.1981257 2:-0.053697485 3:0.12310795 4:-0.15823516 
-1 1:2.4741225 2:-0.062043755 3:0.30332224 4:-0.28796509 
-1 1:-0.8317382 2:-0.25498416 3:1.4472377 4:0.43160469 
-1 1:-0.87909265 2:-0.095235953 3:1.1700185 4:0.12621143 
-1 1:0.46456664 2:-0.092642951 3:-0.97513248 4:-0.41183384 
-1 1:3.4447302 2:0.10728527 3:-1.0337478 4:-0.27979557 
-1 1:3.376198 2:0.28636335 3:-1.514457 4:-0.19848459 
-1 1:-0.61527688 2:-0.23027023 3:0.73808236 4:-0.078835402 
-1 1:0.91841614 2:-0.42982468 3:-1.4218277 4:-0.10252584 
-1 1:0.77797033 2:-0.33225323 3:-0.79382982 4:-0.24158934 
-1 1:1.418123 2:-0.052881491 3:-0.3952341 4:-0.28615214 
-1 1:0.36637428 2:-0.025712765 3:0.11964145 4:-0.35096155 
-1 1:-0.24582847 2:-0.14703666 3:-0.19214692 4:-0.40034545 
-1 1:0.39742377 2:-0.15935885 3:-0.51431281 4:-0.32850083 
-1 1:1.6873039 2:0.087223584 3:-0.19831611 4:-0.38294477 
-1 1:-0.77759166 2:-0.24478352 3:1.1078669 4:0.26451484 
-1 1:-0.37974709 2:-0.1697171 3:-0.48055168 4:-0.46475615 
-1 1:-0.8369749 2:-0.28360645 3:0.77113861 4:-0.12923923 
-1 1:-0.67565832 2:-0.17790374 3:0.30715305 4:-0.25359594 
-0.8863690227343468 1:2.319659 2:0.1835753 3:-0.81275531 4:-0.33161499 
-1 1:0.57472058 2:-0.351176 3:-0.97077936 4:-0.17494202 
-1 1:0.66835373 2:-0.26328208 3:0.74398001 4:0.19273866 
-1 1:2.7039442 2:0.1760433 3:-0.68652624 4:-0.30001531 
-1 1:0.28447999 2:-0.22341078 3:-0.7124288 4:-0.45325616 
-1 1:0.67158288 2:-0.41662505 3:0.96301587 4:0.23337737 
-1 1:0.90320409 2:-0.14556563 3:-0.021405682 4:-0.018686568 
-1 1:-0.64995648 2:-0.048705093 3:1.255384 4:0.26387963 
-1 1:-0.55692325 2:-0.10408914 3:1.1965585 4:0.2553477 
-1 1:1.8365334 2:-0.017767553 3:-0.76198391 4:-0.36599264 
-1 1:0.015677252 2:-0.12770387 3:-0.52724684 4:-0.49440128 
-1 1:-0.070136805 2:-0.11621001 3:-0.42720804 4:-0.48520764 
-1 1:0.97404423 2:0.03397514 3:-0.39503505 4:-0.4174832 
-1 1:-0.45488195 2:-0.12311357 3:-0.046863915 4:-0.46652937 
-1 1:0.20590504 2:0.014672613 3:-0.0095125754 4:-0.24407214 
-1 1:0.97137365 2:-0.13957271 3:-0.026196808 4:-0.3261752 
--1 1:0.67905954 2:-0.32198607 3:-0.10361163 4:-0.26307534 
--1 1:0.40977245 2:-0.24329323 3:-1.1700738 4:-0.45960816 
--1 1:0.20237853 2:-0.30559202 3:-0.54458161 4:-0.56373692 
--1 1:0.063805304 2:-0.48046644 3:-0.26975819 4:-0.4274501 
--1 1:0.84341609 2:-0.26485617 3:-1.1488738 4:-0.16304561 
--1 1:1.0009787 2:-0.28952698 3:-0.060632821 4:-0.38263647 
--1 1:0.38612517 2:-0.41797433 3:-0.43981481 4:-0.53603847 
--1 1:0.22236172 2:-0.36681128 3:-0.74264232 4:-0.54649243 
--1 1:0.40591592 2:-0.13843111 3:-1.0256277 4:-0.48199669 
--1 1:-0.028194286 2:-0.45655737 3:-0.67568004 4:-0.45637164 
--1 1:0.086757566 2:-0.44096704 3:-1.4310455 4:-0.35315115 
--1 1:0.96341375 2:-0.24809227 3:0.72880266 4:0.045645918 
--1 1:0.5246276 2:-0.089883916 3:0.070256213 4:-0.30750328 
--1 1:0.36915589 2:-0.22653022 3:-0.62629283 4:-0.44174838 
--1 1:0.40565836 2:-0.3815908 3:-1.2144396 4:-0.32684519 
--1 1:0.57637087 2:-0.34075732 3:1.0465222 4:0.38072802 
--1 1:0.62383165 2:-0.022326182 3:-0.17094881 4:-0.26699698 
--1 1:0.49647867 2:-0.34652513 3:-1.5867846 4:-0.29243194 
--1 1:0.6412277 2:-0.090061224 3:0.27456083 4:0.047593754 
--1 1:0.85440682 2:-0.35026828 3:1.4090375 4:0.81042355 
--1 1:0.15985446 2:-0.35801858 3:-0.47844024 4:-0.4587022 
--1 1:0.75002174 2:-0.43089801 3:0.59142388 4:-0.14180762 
--1 1:-0.053832104 2:-0.35684063 3:-0.56691524 4:-0.48508529 
--1 1:1.107728 2:-0.35826441 3:-0.24832036 4:-0.4491882 
--1 1:0.53064122 2:0.089574585 3:1.79279 4:0.76032869 
--1 1:0.32847691 2:-0.20085814 3:1.1787359 4:0.34540129 
--1 1:0.77755258 2:0.30043325 3:0.75576467 4:-0.0019102279 
--1 1:1.2735135 2:-0.030869051 3:-0.22330967 4:-0.44458663 
--1 1:0.13599429 2:0.36237528 3:-0.10859952 4:-0.42109448 
--1 1:0.74681935 2:0.26293238 3:0.76392239 4:-0.087439117 
--1 1:0.59492399 2:-0.2158359 3:0.86146666 4:0.12649503 
--1 1:-0.089461801 2:-0.45549616 3:-0.72593266 4:-0.30518351 
--1 1:0.8184493 2:0.23290742 3:0.84804676 4:0.062307258 
--1 1:0.92511845 2:0.14706418 3:1.0348556 4:0.39331142 
--1 1:0.7281503 2:-0.41664704 3:-0.024347992 4:-0.37974868 
--1 1:1.6609121 2:0.17963063 3:1.2427246 4:0.303052 
--1 1:-0.076010771 2:-0.31201704 3:0.76220674 4:0.45782572 
--1 1:0.69879267 2:0.62585375 3:0.70186956 4:-0.072852815 
--0.127906883094633 1:0.17675613 2:-0.45930231 3:0.1313935 4:-0.075258066 
--1 1:1.0989463 2:-0.39513995 3:-0.61316319 4:-0.49446711 
--1 1:-0.10816998 2:-0.47443976 3:-0.79639366 4:-0.51077326 
--1 1:0.79214127 2:0.17098995 3:1.2664871 4:0.48574072 
--1 1:0.14827523 2:-0.094726896 3:0.47203635 4:0.0013064268 
--1 1:1.2431048 2:-0.043847913 3:-0.24449396 4:-0.42600401 
--1 1:0.22462991 2:-0.39176543 3:1.7181466 4:0.67122043 
--1 1:0.43074908 2:-0.29091281 3:0.23671211 4:-0.024399796 
--1 1:0.16798276 2:-0.37313523 3:0.1820774 4:0.034538256 
--1 1:0.94235843 2:-0.29938736 3:-0.71633522 4:-0.45122958 
--1 1:-0.12051732 2:-0.32739602 3:-0.64349613 4:-0.38607614 
--1 1:0.36424492 2:-0.19876865 3:2.0557255 4:1.0987078 
--1 1:0.12511024 2:-0.2850475 3:-0.81436075 4:-0.4777417 
--1 1:0.5102292 2:-0.20064496 3:0.21188252 4:-0.11019956 
--1 1:-0.40001266 2:-0.44883638 3:0.25831088 4:-0.16642447 
--1 1:0.56333716 2:-0.23080413 3:0.18054123 4:-0.06591376 
--1 1:0.61769663 2:-0.43835494 3:-0.25921368 4:-0.36702427 
--1 1:0.27469223 2:-0.18248259 3:0.90116534 4:0.17224712 
--1 1:0.25631333 2:-0.19409265 3:1.7638615 4:0.86122914 
--0.3451287109572377 1:-0.21107832 2:-0.49353693 3:-1.0471541 4:-0.40473992 
--1 1:0.96032043 2:-0.34357237 3:-0.29004457 4:-0.42554627 
--1 1:0.58743595 2:-0.24557672 3:0.10999064 4:-0.33849341 
--1 1:-0.03708779 2:-0.14113016 3:-0.70068839 4:-0.53246066 
--1 1:0.50197341 2:-0.35708826 3:0.14271648 4:-0.3238136 
--1 1:0.32478169 2:-0.40850575 3:-1.7684244 4:-0.1281177 
--1 1:0.055769624 2:-0.28429312 3:-0.6738572 4:-0.49463315 
--1 1:2.6557568 2:-0.19778546 3:-1.1322828 4:-0.40811028 
--1 1:1.8314785 2:0.18826773 3:-0.22258378 4:-0.4976845 
--1 1:0.28778834 2:-0.24565165 3:-0.53932509 4:-0.37536204 
--1 1:0.56630351 2:-0.27310961 3:-1.5259696 4:-0.2810355 
--1 1:1.7688056 2:-0.15710732 3:-0.2632662 4:-0.48774699 
--1 1:1.0465847 2:-0.38005255 3:-1.2094317 4:-0.451302 
--1 1:-0.18938881 2:-0.096969262 3:-0.41679385 4:-0.52956321 
--1 1:1.3109916 2:0.56040034 3:-0.60909088 4:-0.50444415 
--1 1:1.2183418 2:0.22683989 3:0.26285983 4:-0.27844331 
--1 1:1.2839872 2:-0.077736632 3:-0.16254052 4:-0.45129981 
--1 1:1.1161328 2:-0.25623105 3:-0.34168012 4:-0.51619477 
--1 1:0.59750888 2:0.35904153 3:0.10987952 4:-0.3967108 
--1 1:0.068990155 2:-0.33918935 3:-0.51638461 4:-0.4230581 
--1 1:1.2612796 2:0.20760424 3:0.22700797 4:-0.28788431 
--1 1:0.19645885 2:-0.10587959 3:-0.95303352 4:-0.48941085 
--1 1:1.6708124 2:-0.16621109 3:-0.50956753 4:-0.52117133 
--1 1:1.2560159 2:0.58984576 3:-0.11065066 4:-0.42997574 
--1 1:0.6365864 2:-0.3159853 3:-0.43575745 4:-0.24918789 
--1 1:-0.27554846 2:-0.38153805 3:-0.65796797 4:-0.51900905 
--1 1:-0.19232176 2:-0.27815867 3:-0.60753037 4:-0.52076717 
--1 1:0.015804563 2:-0.19853049 3:-0.79780762 4:-0.55885602 
--1 1:1.3231804 2:-0.16938208 3:-0.22403075 4:-0.4627119 
--1 1:0.0026969903 2:-0.41855948 3:-0.87497128 4:-0.40635496 
--1 1:0.43957179 2:-0.16440573 3:-0.38929989 4:-0.49034286 
--1 1:-0.2690738 2:-0.27153781 3:-0.66845649 4:-0.52137948 
--1 1:0.28141871 2:-0.3932208 3:-0.42573926 4:-0.14238624 
--1 1:1.6493723 2:-0.25029374 3:-1.1010529 4:-0.31200023 
--1 1:2.138692 2:-0.27719065 3:-0.52919492 4:-0.52248088 
--1 1:-0.02930289 2:-0.26346287 3:-0.58111883 4:-0.5279823 
--1 1:0.41080693 2:-0.27225805 3:-0.2746303 4:-0.3400428 
--1 1:1.0547766 2:-0.20354031 3:-0.35549573 4:-0.52403621 
--1 1:-0.038473041 2:-0.27665462 3:-0.61568444 4:-0.51650441 
--1 1:1.4659046 2:1.113788 3:0.086161524 4:-0.3867731 
--1 1:1.0877119 2:1.0018544 3:-0.50406188 4:-0.5144821 
--1 1:1.0313572 2:-0.39820351 3:0.14001203 4:-0.14989309 
--1 1:1.3298706 2:1.1804648 3:-0.71850716 4:-0.52034533 
--1 1:1.5906871 2:-0.26492985 3:-1.2958511 4:-0.43931484 
--1 1:0.99994562 2:-0.39915208 3:-0.61018 4:-0.4574368 
--1 1:1.0432105 2:-0.27877234 3:-0.65607653 4:-0.38990796 
--1 1:0.84517848 2:-0.42287191 3:0.16916266 4:-0.26409466 
--1 1:0.3423789 2:-0.45147406 3:-1.020062 4:-0.40505505 
--1 1:1.4989444 2:0.48249017 3:-0.89881716 4:-0.51387248 
--0.4133334286824741 1:0.70487226 2:-0.39552501 3:-0.35274026 4:0.076316467 
--1 1:1.4518186 2:-0.24860617 3:-1.3214617 4:-0.27026562 
--1 1:0.90394036 2:-0.28053002 3:-0.99614087 4:-0.46659073 
--1 1:1.0337892 2:-0.28248027 3:-1.2491535 4:-0.35818484 
--1 1:0.29457572 2:-0.42802317 3:-0.92568876 4:-0.40083456 
--1 1:0.30987783 2:-0.4243198 3:-0.89973376 4:-0.433091 
--1 1:0.67069754 2:-0.19985884 3:-0.71810461 4:-0.50012774 
diff --git a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.dbf b/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.dbf
deleted file mode 100644
index c2df5113bb5e7daca9989707ac56662bf674c99d..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0998367ed4a1fea79be1a27a82f0d76d5dcba84214aa63678b660f1bc6245120
-size 365538
diff --git a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shp b/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shp
deleted file mode 100644
index faedfa80a00e469dc0335ebf155879adb2577d5d..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2ead83092b50a373b6a026a6553bfdd1d5f3c5f3fde4e7a88b6a8f76c696e707
-size 126436
diff --git a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shx b/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shx
deleted file mode 100644
index 3f9ded68080230718f13932438adbb2909f07d44..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fe4b9505e67c0b6c3e673e27fe9ff518641795a00339addc53de6af47aefb2dc
-size 36196
diff --git a/Data/Baseline/OTB/Files/TvObjectDetectionClassifierOutput.txt b/Data/Baseline/OTB/Files/TvObjectDetectionClassifierOutput.txt
deleted file mode 100644
index ebbdaef1e82f329c4a9bfcdeff19f822b2cdd682..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/TvObjectDetectionClassifierOutput.txt
+++ /dev/null
@@ -1,790 +0,0 @@
-[16.5, 0.5]
-[18.5, 0.5]
-[20.5, 0.5]
-[22.5, 0.5]
-[16.5, 2.5]
-[18.5, 2.5]
-[20.5, 2.5]
-[22.5, 2.5]
-[24.5, 2.5]
-[28.5, 2.5]
-[22.5, 4.5]
-[24.5, 4.5]
-[26.5, 4.5]
-[28.5, 4.5]
-[30.5, 4.5]
-[26.5, 6.5]
-[28.5, 6.5]
-[30.5, 6.5]
-[86.5, 6.5]
-[26.5, 8.5]
-[28.5, 8.5]
-[30.5, 8.5]
-[84.5, 8.5]
-[86.5, 8.5]
-[22.5, 10.5]
-[24.5, 10.5]
-[26.5, 10.5]
-[28.5, 10.5]
-[30.5, 10.5]
-[50.5, 10.5]
-[14.5, 12.5]
-[16.5, 12.5]
-[18.5, 12.5]
-[20.5, 12.5]
-[22.5, 12.5]
-[24.5, 12.5]
-[26.5, 12.5]
-[28.5, 12.5]
-[30.5, 12.5]
-[42.5, 12.5]
-[44.5, 12.5]
-[48.5, 12.5]
-[50.5, 12.5]
-[10.5, 14.5]
-[12.5, 14.5]
-[14.5, 14.5]
-[16.5, 14.5]
-[18.5, 14.5]
-[20.5, 14.5]
-[22.5, 14.5]
-[24.5, 14.5]
-[26.5, 14.5]
-[28.5, 14.5]
-[30.5, 14.5]
-[32.5, 14.5]
-[42.5, 14.5]
-[44.5, 14.5]
-[46.5, 14.5]
-[48.5, 14.5]
-[50.5, 14.5]
-[60.5, 14.5]
-[10.5, 16.5]
-[12.5, 16.5]
-[14.5, 16.5]
-[16.5, 16.5]
-[18.5, 16.5]
-[20.5, 16.5]
-[22.5, 16.5]
-[24.5, 16.5]
-[26.5, 16.5]
-[28.5, 16.5]
-[30.5, 16.5]
-[42.5, 16.5]
-[44.5, 16.5]
-[48.5, 16.5]
-[60.5, 16.5]
-[88.5, 16.5]
-[90.5, 16.5]
-[10.5, 18.5]
-[12.5, 18.5]
-[14.5, 18.5]
-[16.5, 18.5]
-[18.5, 18.5]
-[20.5, 18.5]
-[22.5, 18.5]
-[24.5, 18.5]
-[26.5, 18.5]
-[28.5, 18.5]
-[30.5, 18.5]
-[32.5, 18.5]
-[34.5, 18.5]
-[88.5, 18.5]
-[90.5, 18.5]
-[10.5, 20.5]
-[12.5, 20.5]
-[14.5, 20.5]
-[16.5, 20.5]
-[18.5, 20.5]
-[20.5, 20.5]
-[22.5, 20.5]
-[24.5, 20.5]
-[26.5, 20.5]
-[28.5, 20.5]
-[30.5, 20.5]
-[32.5, 20.5]
-[34.5, 20.5]
-[88.5, 20.5]
-[110.5, 20.5]
-[112.5, 20.5]
-[10.5, 22.5]
-[12.5, 22.5]
-[14.5, 22.5]
-[16.5, 22.5]
-[18.5, 22.5]
-[20.5, 22.5]
-[22.5, 22.5]
-[24.5, 22.5]
-[26.5, 22.5]
-[28.5, 22.5]
-[30.5, 22.5]
-[32.5, 22.5]
-[34.5, 22.5]
-[110.5, 22.5]
-[112.5, 22.5]
-[10.5, 24.5]
-[12.5, 24.5]
-[14.5, 24.5]
-[16.5, 24.5]
-[18.5, 24.5]
-[20.5, 24.5]
-[22.5, 24.5]
-[24.5, 24.5]
-[26.5, 24.5]
-[28.5, 24.5]
-[30.5, 24.5]
-[32.5, 24.5]
-[34.5, 24.5]
-[10.5, 26.5]
-[12.5, 26.5]
-[14.5, 26.5]
-[16.5, 26.5]
-[18.5, 26.5]
-[20.5, 26.5]
-[22.5, 26.5]
-[24.5, 26.5]
-[26.5, 26.5]
-[28.5, 26.5]
-[30.5, 26.5]
-[32.5, 26.5]
-[34.5, 26.5]
-[36.5, 26.5]
-[18.5, 28.5]
-[20.5, 28.5]
-[22.5, 28.5]
-[24.5, 28.5]
-[26.5, 28.5]
-[28.5, 28.5]
-[30.5, 28.5]
-[32.5, 28.5]
-[34.5, 28.5]
-[36.5, 28.5]
-[20.5, 30.5]
-[22.5, 30.5]
-[24.5, 30.5]
-[26.5, 30.5]
-[28.5, 30.5]
-[30.5, 30.5]
-[32.5, 30.5]
-[34.5, 30.5]
-[36.5, 30.5]
-[38.5, 30.5]
-[20.5, 32.5]
-[22.5, 32.5]
-[24.5, 32.5]
-[26.5, 32.5]
-[28.5, 32.5]
-[30.5, 32.5]
-[32.5, 32.5]
-[34.5, 32.5]
-[36.5, 32.5]
-[38.5, 32.5]
-[40.5, 32.5]
-[34.5, 34.5]
-[36.5, 34.5]
-[38.5, 34.5]
-[40.5, 34.5]
-[34.5, 36.5]
-[36.5, 36.5]
-[38.5, 36.5]
-[28.5, 38.5]
-[30.5, 38.5]
-[32.5, 38.5]
-[34.5, 38.5]
-[36.5, 38.5]
-[38.5, 38.5]
-[40.5, 38.5]
-[120.5, 38.5]
-[20.5, 40.5]
-[22.5, 40.5]
-[24.5, 40.5]
-[26.5, 40.5]
-[28.5, 40.5]
-[30.5, 40.5]
-[32.5, 40.5]
-[34.5, 40.5]
-[36.5, 40.5]
-[38.5, 40.5]
-[40.5, 40.5]
-[18.5, 42.5]
-[20.5, 42.5]
-[22.5, 42.5]
-[24.5, 42.5]
-[26.5, 42.5]
-[28.5, 42.5]
-[30.5, 42.5]
-[32.5, 42.5]
-[34.5, 42.5]
-[36.5, 42.5]
-[38.5, 42.5]
-[40.5, 42.5]
-[16.5, 44.5]
-[18.5, 44.5]
-[20.5, 44.5]
-[22.5, 44.5]
-[24.5, 44.5]
-[26.5, 44.5]
-[28.5, 44.5]
-[30.5, 44.5]
-[32.5, 44.5]
-[34.5, 44.5]
-[36.5, 44.5]
-[38.5, 44.5]
-[40.5, 44.5]
-[16.5, 46.5]
-[18.5, 46.5]
-[20.5, 46.5]
-[22.5, 46.5]
-[24.5, 46.5]
-[26.5, 46.5]
-[28.5, 46.5]
-[30.5, 46.5]
-[32.5, 46.5]
-[34.5, 46.5]
-[36.5, 46.5]
-[38.5, 46.5]
-[40.5, 46.5]
-[48.5, 46.5]
-[50.5, 46.5]
-[16.5, 48.5]
-[18.5, 48.5]
-[20.5, 48.5]
-[22.5, 48.5]
-[24.5, 48.5]
-[26.5, 48.5]
-[28.5, 48.5]
-[30.5, 48.5]
-[32.5, 48.5]
-[34.5, 48.5]
-[36.5, 48.5]
-[38.5, 48.5]
-[40.5, 48.5]
-[48.5, 48.5]
-[50.5, 48.5]
-[52.5, 48.5]
-[16.5, 50.5]
-[18.5, 50.5]
-[20.5, 50.5]
-[22.5, 50.5]
-[24.5, 50.5]
-[26.5, 50.5]
-[28.5, 50.5]
-[30.5, 50.5]
-[32.5, 50.5]
-[34.5, 50.5]
-[36.5, 50.5]
-[38.5, 50.5]
-[40.5, 50.5]
-[42.5, 50.5]
-[48.5, 50.5]
-[50.5, 50.5]
-[52.5, 50.5]
-[18.5, 52.5]
-[20.5, 52.5]
-[22.5, 52.5]
-[24.5, 52.5]
-[26.5, 52.5]
-[28.5, 52.5]
-[30.5, 52.5]
-[32.5, 52.5]
-[34.5, 52.5]
-[36.5, 52.5]
-[38.5, 52.5]
-[40.5, 52.5]
-[42.5, 52.5]
-[44.5, 52.5]
-[48.5, 52.5]
-[60.5, 52.5]
-[62.5, 52.5]
-[20.5, 54.5]
-[22.5, 54.5]
-[24.5, 54.5]
-[26.5, 54.5]
-[28.5, 54.5]
-[30.5, 54.5]
-[32.5, 54.5]
-[34.5, 54.5]
-[36.5, 54.5]
-[38.5, 54.5]
-[40.5, 54.5]
-[42.5, 54.5]
-[60.5, 54.5]
-[62.5, 54.5]
-[122.5, 54.5]
-[38.5, 56.5]
-[40.5, 56.5]
-[42.5, 56.5]
-[60.5, 56.5]
-[62.5, 56.5]
-[122.5, 56.5]
-[38.5, 58.5]
-[40.5, 58.5]
-[42.5, 58.5]
-[60.5, 58.5]
-[62.5, 58.5]
-[122.5, 58.5]
-[36.5, 60.5]
-[38.5, 60.5]
-[40.5, 60.5]
-[42.5, 60.5]
-[60.5, 60.5]
-[62.5, 60.5]
-[120.5, 60.5]
-[122.5, 60.5]
-[0.5, 62.5]
-[2.5, 62.5]
-[4.5, 62.5]
-[6.5, 62.5]
-[36.5, 62.5]
-[38.5, 62.5]
-[40.5, 62.5]
-[42.5, 62.5]
-[62.5, 62.5]
-[120.5, 62.5]
-[122.5, 62.5]
-[0.5, 64.5]
-[2.5, 64.5]
-[4.5, 64.5]
-[6.5, 64.5]
-[8.5, 64.5]
-[36.5, 64.5]
-[38.5, 64.5]
-[40.5, 64.5]
-[42.5, 64.5]
-[62.5, 64.5]
-[64.5, 64.5]
-[0.5, 66.5]
-[2.5, 66.5]
-[4.5, 66.5]
-[6.5, 66.5]
-[8.5, 66.5]
-[26.5, 66.5]
-[28.5, 66.5]
-[30.5, 66.5]
-[32.5, 66.5]
-[34.5, 66.5]
-[36.5, 66.5]
-[38.5, 66.5]
-[40.5, 66.5]
-[42.5, 66.5]
-[0.5, 68.5]
-[2.5, 68.5]
-[4.5, 68.5]
-[6.5, 68.5]
-[8.5, 68.5]
-[22.5, 68.5]
-[24.5, 68.5]
-[26.5, 68.5]
-[28.5, 68.5]
-[30.5, 68.5]
-[32.5, 68.5]
-[34.5, 68.5]
-[36.5, 68.5]
-[38.5, 68.5]
-[40.5, 68.5]
-[42.5, 68.5]
-[44.5, 68.5]
-[0.5, 70.5]
-[2.5, 70.5]
-[4.5, 70.5]
-[6.5, 70.5]
-[8.5, 70.5]
-[22.5, 70.5]
-[24.5, 70.5]
-[26.5, 70.5]
-[28.5, 70.5]
-[30.5, 70.5]
-[32.5, 70.5]
-[34.5, 70.5]
-[36.5, 70.5]
-[38.5, 70.5]
-[40.5, 70.5]
-[42.5, 70.5]
-[44.5, 70.5]
-[0.5, 72.5]
-[2.5, 72.5]
-[4.5, 72.5]
-[6.5, 72.5]
-[8.5, 72.5]
-[22.5, 72.5]
-[24.5, 72.5]
-[26.5, 72.5]
-[28.5, 72.5]
-[30.5, 72.5]
-[32.5, 72.5]
-[34.5, 72.5]
-[36.5, 72.5]
-[38.5, 72.5]
-[40.5, 72.5]
-[42.5, 72.5]
-[44.5, 72.5]
-[0.5, 74.5]
-[2.5, 74.5]
-[4.5, 74.5]
-[6.5, 74.5]
-[8.5, 74.5]
-[22.5, 74.5]
-[24.5, 74.5]
-[26.5, 74.5]
-[28.5, 74.5]
-[30.5, 74.5]
-[32.5, 74.5]
-[34.5, 74.5]
-[36.5, 74.5]
-[38.5, 74.5]
-[40.5, 74.5]
-[42.5, 74.5]
-[44.5, 74.5]
-[46.5, 74.5]
-[0.5, 76.5]
-[2.5, 76.5]
-[4.5, 76.5]
-[6.5, 76.5]
-[22.5, 76.5]
-[24.5, 76.5]
-[26.5, 76.5]
-[28.5, 76.5]
-[30.5, 76.5]
-[32.5, 76.5]
-[34.5, 76.5]
-[36.5, 76.5]
-[38.5, 76.5]
-[40.5, 76.5]
-[42.5, 76.5]
-[44.5, 76.5]
-[46.5, 76.5]
-[22.5, 78.5]
-[24.5, 78.5]
-[26.5, 78.5]
-[28.5, 78.5]
-[30.5, 78.5]
-[32.5, 78.5]
-[34.5, 78.5]
-[36.5, 78.5]
-[38.5, 78.5]
-[40.5, 78.5]
-[42.5, 78.5]
-[44.5, 78.5]
-[46.5, 78.5]
-[48.5, 78.5]
-[24.5, 80.5]
-[26.5, 80.5]
-[28.5, 80.5]
-[30.5, 80.5]
-[32.5, 80.5]
-[34.5, 80.5]
-[36.5, 80.5]
-[38.5, 80.5]
-[40.5, 80.5]
-[42.5, 80.5]
-[44.5, 80.5]
-[46.5, 80.5]
-[48.5, 80.5]
-[50.5, 80.5]
-[106.5, 80.5]
-[42.5, 82.5]
-[44.5, 82.5]
-[46.5, 82.5]
-[48.5, 82.5]
-[50.5, 82.5]
-[106.5, 82.5]
-[46.5, 84.5]
-[48.5, 84.5]
-[50.5, 84.5]
-[106.5, 84.5]
-[46.5, 86.5]
-[48.5, 86.5]
-[50.5, 86.5]
-[98.5, 86.5]
-[48.5, 88.5]
-[88.5, 88.5]
-[98.5, 88.5]
-[100.5, 88.5]
-[86.5, 90.5]
-[88.5, 90.5]
-[98.5, 90.5]
-[86.5, 92.5]
-[88.5, 92.5]
-[98.5, 92.5]
-[100.5, 92.5]
-[124.5, 92.5]
-[126.5, 92.5]
-[56.5, 94.5]
-[58.5, 94.5]
-[60.5, 94.5]
-[62.5, 94.5]
-[64.5, 94.5]
-[88.5, 94.5]
-[98.5, 94.5]
-[100.5, 94.5]
-[118.5, 94.5]
-[120.5, 94.5]
-[122.5, 94.5]
-[124.5, 94.5]
-[126.5, 94.5]
-[56.5, 96.5]
-[58.5, 96.5]
-[60.5, 96.5]
-[62.5, 96.5]
-[64.5, 96.5]
-[100.5, 96.5]
-[118.5, 96.5]
-[120.5, 96.5]
-[122.5, 96.5]
-[124.5, 96.5]
-[126.5, 96.5]
-[48.5, 98.5]
-[50.5, 98.5]
-[56.5, 98.5]
-[58.5, 98.5]
-[60.5, 98.5]
-[62.5, 98.5]
-[64.5, 98.5]
-[100.5, 98.5]
-[102.5, 98.5]
-[118.5, 98.5]
-[120.5, 98.5]
-[122.5, 98.5]
-[124.5, 98.5]
-[126.5, 98.5]
-[48.5, 100.5]
-[50.5, 100.5]
-[54.5, 100.5]
-[56.5, 100.5]
-[58.5, 100.5]
-[60.5, 100.5]
-[62.5, 100.5]
-[64.5, 100.5]
-[102.5, 100.5]
-[118.5, 100.5]
-[120.5, 100.5]
-[122.5, 100.5]
-[124.5, 100.5]
-[126.5, 100.5]
-[0.5, 102.5]
-[2.5, 102.5]
-[4.5, 102.5]
-[48.5, 102.5]
-[50.5, 102.5]
-[54.5, 102.5]
-[56.5, 102.5]
-[58.5, 102.5]
-[60.5, 102.5]
-[62.5, 102.5]
-[64.5, 102.5]
-[92.5, 102.5]
-[102.5, 102.5]
-[120.5, 102.5]
-[122.5, 102.5]
-[0.5, 104.5]
-[2.5, 104.5]
-[4.5, 104.5]
-[6.5, 104.5]
-[48.5, 104.5]
-[50.5, 104.5]
-[54.5, 104.5]
-[56.5, 104.5]
-[58.5, 104.5]
-[60.5, 104.5]
-[62.5, 104.5]
-[64.5, 104.5]
-[90.5, 104.5]
-[92.5, 104.5]
-[0.5, 106.5]
-[2.5, 106.5]
-[4.5, 106.5]
-[6.5, 106.5]
-[48.5, 106.5]
-[50.5, 106.5]
-[52.5, 106.5]
-[58.5, 106.5]
-[60.5, 106.5]
-[62.5, 106.5]
-[64.5, 106.5]
-[90.5, 106.5]
-[92.5, 106.5]
-[94.5, 106.5]
-[104.5, 106.5]
-[0.5, 108.5]
-[2.5, 108.5]
-[4.5, 108.5]
-[6.5, 108.5]
-[48.5, 108.5]
-[50.5, 108.5]
-[52.5, 108.5]
-[54.5, 108.5]
-[56.5, 108.5]
-[58.5, 108.5]
-[60.5, 108.5]
-[62.5, 108.5]
-[64.5, 108.5]
-[66.5, 108.5]
-[92.5, 108.5]
-[94.5, 108.5]
-[102.5, 108.5]
-[104.5, 108.5]
-[118.5, 108.5]
-[120.5, 108.5]
-[122.5, 108.5]
-[124.5, 108.5]
-[0.5, 110.5]
-[2.5, 110.5]
-[4.5, 110.5]
-[6.5, 110.5]
-[48.5, 110.5]
-[50.5, 110.5]
-[52.5, 110.5]
-[54.5, 110.5]
-[56.5, 110.5]
-[58.5, 110.5]
-[60.5, 110.5]
-[62.5, 110.5]
-[64.5, 110.5]
-[66.5, 110.5]
-[92.5, 110.5]
-[94.5, 110.5]
-[102.5, 110.5]
-[104.5, 110.5]
-[114.5, 110.5]
-[116.5, 110.5]
-[118.5, 110.5]
-[120.5, 110.5]
-[122.5, 110.5]
-[124.5, 110.5]
-[126.5, 110.5]
-[0.5, 112.5]
-[2.5, 112.5]
-[4.5, 112.5]
-[6.5, 112.5]
-[48.5, 112.5]
-[50.5, 112.5]
-[52.5, 112.5]
-[54.5, 112.5]
-[58.5, 112.5]
-[60.5, 112.5]
-[62.5, 112.5]
-[64.5, 112.5]
-[66.5, 112.5]
-[94.5, 112.5]
-[102.5, 112.5]
-[104.5, 112.5]
-[106.5, 112.5]
-[112.5, 112.5]
-[114.5, 112.5]
-[116.5, 112.5]
-[118.5, 112.5]
-[120.5, 112.5]
-[122.5, 112.5]
-[124.5, 112.5]
-[126.5, 112.5]
-[48.5, 114.5]
-[50.5, 114.5]
-[52.5, 114.5]
-[54.5, 114.5]
-[58.5, 114.5]
-[60.5, 114.5]
-[62.5, 114.5]
-[64.5, 114.5]
-[66.5, 114.5]
-[94.5, 114.5]
-[102.5, 114.5]
-[104.5, 114.5]
-[106.5, 114.5]
-[112.5, 114.5]
-[114.5, 114.5]
-[116.5, 114.5]
-[118.5, 114.5]
-[42.5, 116.5]
-[44.5, 116.5]
-[46.5, 116.5]
-[48.5, 116.5]
-[50.5, 116.5]
-[52.5, 116.5]
-[54.5, 116.5]
-[58.5, 116.5]
-[60.5, 116.5]
-[62.5, 116.5]
-[64.5, 116.5]
-[66.5, 116.5]
-[102.5, 116.5]
-[104.5, 116.5]
-[106.5, 116.5]
-[112.5, 116.5]
-[114.5, 116.5]
-[116.5, 116.5]
-[38.5, 118.5]
-[40.5, 118.5]
-[42.5, 118.5]
-[44.5, 118.5]
-[46.5, 118.5]
-[48.5, 118.5]
-[50.5, 118.5]
-[52.5, 118.5]
-[54.5, 118.5]
-[104.5, 118.5]
-[106.5, 118.5]
-[112.5, 118.5]
-[114.5, 118.5]
-[116.5, 118.5]
-[36.5, 120.5]
-[38.5, 120.5]
-[40.5, 120.5]
-[42.5, 120.5]
-[44.5, 120.5]
-[46.5, 120.5]
-[48.5, 120.5]
-[50.5, 120.5]
-[52.5, 120.5]
-[54.5, 120.5]
-[104.5, 120.5]
-[106.5, 120.5]
-[112.5, 120.5]
-[114.5, 120.5]
-[116.5, 120.5]
-[0.5, 122.5]
-[2.5, 122.5]
-[4.5, 122.5]
-[36.5, 122.5]
-[38.5, 122.5]
-[40.5, 122.5]
-[42.5, 122.5]
-[44.5, 122.5]
-[46.5, 122.5]
-[48.5, 122.5]
-[50.5, 122.5]
-[52.5, 122.5]
-[54.5, 122.5]
-[56.5, 122.5]
-[106.5, 122.5]
-[114.5, 122.5]
-[0.5, 124.5]
-[2.5, 124.5]
-[4.5, 124.5]
-[36.5, 124.5]
-[38.5, 124.5]
-[40.5, 124.5]
-[42.5, 124.5]
-[44.5, 124.5]
-[46.5, 124.5]
-[48.5, 124.5]
-[50.5, 124.5]
-[52.5, 124.5]
-[54.5, 124.5]
-[56.5, 124.5]
-[106.5, 124.5]
-[108.5, 124.5]
-[0.5, 126.5]
-[2.5, 126.5]
-[4.5, 126.5]
-[6.5, 126.5]
-[36.5, 126.5]
-[38.5, 126.5]
-[40.5, 126.5]
-[42.5, 126.5]
-[44.5, 126.5]
-[46.5, 126.5]
-[48.5, 126.5]
-[50.5, 126.5]
-[52.5, 126.5]
-[54.5, 126.5]
-[56.5, 126.5]
diff --git a/Data/Baseline/OTB/Files/bfBoundingRegionCalculatorOutput.txt b/Data/Baseline/OTB/Files/bfBoundingRegionCalculatorOutput.txt
deleted file mode 100644
index 607b28d732cbd88ed00155282488e63c212b0ace..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfBoundingRegionCalculatorOutput.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-Test results from otbBinaryImageBoundingRegionCalculator test.
-[8, 48]	[81, 39]
-[7, 7]	[83, 41]
-[7, 9]	[45, 36]
-[25, 11]	[47, 30]
-
-Testing the pad option
-
-[7, 47]	[83, 41]
-[6, 6]	[85, 43]
-[6, 8]	[47, 38]
-[24, 10]	[49, 32]
diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.dbf b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.dbf
deleted file mode 100644
index e514113af135119bc8425acf01f592628df9b0ee..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9a91a7b2a449168136030deb765d660dc0851638543eced30eb006db94bc2123
-size 6583
diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shp b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shp
deleted file mode 100644
index 0e5a1e7088d245322c2dea9711dc61f0d147bbc4..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2ca53f866c1773b1ea1329e910073eb8c2c25513dca65b8e5ab21a047d31e333
-size 12860
diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shx b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shx
deleted file mode 100644
index e4f82fd5c32949defffebc072ec21aab04dd54d3..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cd9270880008ed009e4e0e08ea105d91f40eb911f7c27e773348dfc74857bec2
-size 668
diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.dbf b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.dbf
deleted file mode 100644
index 5c2e63d063ed9d1cb3951b1af6ae1f47ad6bdf14..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:539f3f381fe619efbf813b1f6a407f236ca577cd2f62f0d35cf8a717c30f3210
-size 6583
diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp
deleted file mode 100644
index d5ff96b9922859ed04a1f8c4479c89507f6c4daa..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d0b6e77ff1d3acae9432b63b929050ed0089e9aace8a831c817b07ac02b04063
-size 18388
diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shx b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shx
deleted file mode 100644
index 72bda750b8f93dbb743c133f9cdcb57e5d489314..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8e3f91df5a62beb63ba9b17a952d2673a732aa428b20861dce0c6dd986e588db
-size 668
diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.dbf b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.dbf
deleted file mode 100644
index 7c908dfa514d47a20b9e25bfb6e6d9b379d01ef6..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5e03911f8e9f9eecd908084083cbed86b2084a1a8ec469a0bf58296ba9ca93f4
-size 6583
diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp
deleted file mode 100644
index b3adb3d3bb2ccb2ae5bfefd4abb19bd64970103a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ff01566163097422211e31b35823cc6ede15efa3965bcc72f2e89f8b95fc2b30
-size 12860
diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shx b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shx
deleted file mode 100644
index 8eb95e8e60e8cf4597630573a9dcfa4c795487fc..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b033aa81a9212511ecb13bf36bb9b92d26a2272e8fd2e7106fd938f623084664
-size 668
diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.dbf b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.dbf
deleted file mode 100644
index 6cf192268251981989263ef6d65b1d2c3490290f..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2a314fb6c853dd6ed9864eb50da057c96bad6802b1d35e1c27e63f7c54ac5e6c
-size 1517
diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp
deleted file mode 100644
index 4df7fd5f11a76ae2d527a9be87e52e380efe6edd..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a02afbec1aac0b3b812282d4877310d5ce035b9fce9aa4d2427244a0c4404840
-size 3228
diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shx b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shx
deleted file mode 100644
index e8977f2d43cf2cc9b3b6dc1bd080b67d024f7573..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ce4dc76a26a8fafad2f5e083c3aea4f5494319c7a46cfa7a339a0fd48161aa1d
-size 252
diff --git a/Data/Baseline/OTB/Files/bfTvPersistentVectorizationImageFilterOutput.txt b/Data/Baseline/OTB/Files/bfTvPersistentVectorizationImageFilterOutput.txt
index be8d26528fdb6e53c48a6a5b67c58eb5dd40d5cb..9f0a2569d3082b2e1322feed4a06fdfc469748bd 100644
--- a/Data/Baseline/OTB/Files/bfTvPersistentVectorizationImageFilterOutput.txt
+++ b/Data/Baseline/OTB/Files/bfTvPersistentVectorizationImageFilterOutput.txt
@@ -1,4 +1,3 @@
-[ 55.5, 123.5] [ 57, 123.5] [ 58, 123.5] [ 59, 123.5] [ 60, 123.5] [ 61, 123.5] [ 62, 123.5] [ 63, 123.5] [ 64, 123.5] [ 65, 123.5] [ 66, 123.5] [ 67.5, 123.5] [ 68, 124.5] [ 69, 124.5] [ 70, 124.5] [ 71.5, 124.5] [ 72, 125.5] [ 73.5, 125.5] [ 74, 126.5] [ 75, 126.5] [ 76.5, 126.5] [ 77, 127.5] [ 78.5, 127.5] [ 79.5, 128.5] [ 80, 129.5] [ 81.5, 129.5] [ 82.5, 130.5] [ 83.5, 131.5] [ 84.5, 132.5] [ 85.5, 133.5] [ 86.5, 134.5] [ 87.5, 135.5] [ 88.5, 136.5] [ 89.5, 137.5] [ 90.5, 138.5] [ 91.5, 139.5] [ 91.5, 141] [ 92.5, 141.5] [ 93.5, 142.5] [ 93.5, 144] [ 94.5, 144.5] [ 94.5, 146] [ 95.5, 146.5] [ 95.5, 148] [ 96.5, 148.5] [ 96.5, 150] [ 96.5, 151] [ 97.5, 151.5] [ 97.5, 153] [ 97.5, 154] [ 98.5, 154.5] [ 98.5, 156] [ 98.5, 157] [ 99.5, 157.5] [ 99.5, 159] [ 99.5, 160] [ 99.5, 161] [ 99.5, 162] [ 99.5, 163] [ 100.5, 163.5] [ 100.5, 165] [ 100.5, 166] [ 100.5, 167] [ 100.5, 168] [ 100.5, 169] [ 100.5, 170] [ 100.5, 171] [ 100.5, 172] [ 100.5, 173] [ 100.5, 174] [ 100.5, 175] [ 100.5, 176] [ 100.5, 177] [ 100.5, 178.5] [ 99.5, 179] [ 99.5, 180] [ 99.5, 181] [ 99.5, 182] [ 99.5, 183] [ 99.5, 184.5] [ 98.5, 185] [ 98.5, 186] [ 98.5, 187.5] [ 97.5, 188] [ 97.5, 189] [ 97.5, 190.5] [ 96.5, 191] [ 96.5, 192] [ 96.5, 193.5] [ 95.5, 194] [ 95.5, 195.5] [ 94.5, 196] [ 94.5, 197.5] [ 93.5, 198] [ 93.5, 199.5] [ 92.5, 200.5] [ 91.5, 201] [ 91.5, 202.5] [ 90.5, 203.5] [ 89.5, 204.5] [ 88.5, 205.5] [ 87.5, 206.5] [ 86.5, 207.5] [ 85.5, 208.5] [ 84.5, 209.5] [ 83.5, 210.5] [ 82.5, 211.5] [ 81.5, 212.5] [ 80, 212.5] [ 79.5, 213.5] [ 78.5, 214.5] [ 77, 214.5] [ 76.5, 215.5] [ 75, 215.5] [ 74, 215.5] [ 73.5, 216.5] [ 72, 216.5] [ 71.5, 217.5] [ 70, 217.5] [ 69, 217.5] [ 68, 217.5] [ 67.5, 218.5] [ 66, 218.5] [ 65, 218.5] [ 64, 218.5] [ 63, 218.5] [ 62, 218.5] [ 61, 218.5] [ 60, 218.5] [ 59, 218.5] [ 58, 218.5] [ 57, 218.5] [ 55.5, 218.5] [ 55, 217.5] [ 54, 217.5] [ 53, 217.5] [ 51.5, 217.5] [ 51, 216.5] [ 49.5, 216.5] [ 49, 215.5] [ 48, 215.5] [ 46.5, 215.5] [ 46, 214.5] [ 44.5, 214.5] [ 43.5, 213.5] [ 43, 212.5] [ 41.5, 212.5] [ 40.5, 211.5] [ 39.5, 210.5] [ 38.5, 209.5] [ 37.5, 208.5] [ 36.5, 207.5] [ 35.5, 206.5] [ 34.5, 205.5] [ 33.5, 204.5] [ 32.5, 203.5] [ 31.5, 202.5] [ 31.5, 201] [ 30.5, 200.5] [ 29.5, 199.5] [ 29.5, 198] [ 28.5, 197.5] [ 28.5, 196] [ 27.5, 195.5] [ 27.5, 194] [ 26.5, 193.5] [ 26.5, 192] [ 26.5, 191] [ 25.5, 190.5] [ 25.5, 189] [ 25.5, 188] [ 24.5, 187.5] [ 24.5, 186] [ 24.5, 185] [ 23.5, 184.5] [ 23.5, 183] [ 23.5, 182] [ 23.5, 181] [ 23.5, 180] [ 23.5, 179] [ 22.5, 178.5] [ 22.5, 177] [ 22.5, 176] [ 22.5, 175] [ 22.5, 174] [ 22.5, 173] [ 22.5, 172] [ 22.5, 171] [ 22.5, 170] [ 22.5, 169] [ 22.5, 168] [ 22.5, 167] [ 22.5, 166] [ 22.5, 165] [ 22.5, 163.5] [ 23.5, 163] [ 23.5, 162] [ 23.5, 161] [ 23.5, 160] [ 23.5, 159] [ 23.5, 157.5] [ 24.5, 157] [ 24.5, 156] [ 24.5, 154.5] [ 25.5, 154] [ 25.5, 153] [ 25.5, 151.5] [ 26.5, 151] [ 26.5, 150] [ 26.5, 148.5] [ 27.5, 148] [ 27.5, 146.5] [ 28.5, 146] [ 28.5, 144.5] [ 29.5, 144] [ 29.5, 142.5] [ 30.5, 141.5] [ 31.5, 141] [ 31.5, 139.5] [ 32.5, 138.5] [ 33.5, 137.5] [ 34.5, 136.5] [ 35.5, 135.5] [ 36.5, 134.5] [ 37.5, 133.5] [ 38.5, 132.5] [ 39.5, 131.5] [ 40.5, 130.5] [ 41.5, 129.5] [ 43, 129.5] [ 43.5, 128.5] [ 44.5, 127.5] [ 46, 127.5] [ 46.5, 126.5] [ 48, 126.5] [ 49, 126.5] [ 49.5, 125.5] [ 51, 125.5] [ 51.5, 124.5] [ 53, 124.5] [ 54, 124.5] [ 55, 124.5] 
-[ 187.5, 31.5] [ 189, 31.5] [ 190, 31.5] [ 191, 31.5] [ 192, 31.5] [ 193, 31.5] [ 194, 31.5] [ 195, 31.5] [ 196, 31.5] [ 197, 31.5] [ 198, 31.5] [ 199, 31.5] [ 200, 31.5] [ 201, 31.5] [ 202, 31.5] [ 203, 31.5] [ 204, 31.5] [ 205, 31.5] [ 206, 31.5] [ 207, 31.5] [ 208, 31.5] [ 209, 31.5] [ 210, 31.5] [ 211, 31.5] [ 212, 31.5] [ 213, 31.5] [ 214, 31.5] [ 215, 31.5] [ 216, 31.5] [ 217, 31.5] [ 218, 31.5] [ 219, 31.5] [ 220, 31.5] [ 221.5, 31.5] [ 221.5, 33] [ 221.5, 34] [ 221.5, 35] [ 221.5, 36] [ 221.5, 37] [ 221.5, 38] [ 221.5, 39] [ 221.5, 40] [ 221.5, 41] [ 221.5, 42] [ 221.5, 43] [ 221.5, 44] [ 221.5, 45] [ 221.5, 46] [ 221.5, 47] [ 221.5, 48] [ 221.5, 49] [ 221.5, 50] [ 221.5, 51] [ 221.5, 52] [ 221.5, 53] [ 221.5, 54] [ 221.5, 55] [ 221.5, 56] [ 221.5, 57] [ 221.5, 58] [ 221.5, 59] [ 221.5, 60] [ 221.5, 61] [ 221.5, 62] [ 221.5, 63] [ 221.5, 64] [ 221.5, 65] [ 221.5, 66] [ 221.5, 67] [ 221.5, 68] [ 221.5, 69] [ 221.5, 70] [ 221.5, 71] [ 221.5, 72] [ 221.5, 73] [ 221.5, 74] [ 221.5, 75] [ 221.5, 76] [ 221.5, 77] [ 221.5, 78] [ 221.5, 79] [ 221.5, 80] [ 221.5, 81] [ 221.5, 82] [ 221.5, 83] [ 221.5, 84] [ 221.5, 85] [ 221.5, 86] [ 221.5, 87] [ 221.5, 88] [ 221.5, 89] [ 221.5, 90] [ 221.5, 91] [ 221.5, 92] [ 221.5, 93] [ 221.5, 94] [ 221.5, 95] [ 221.5, 96] [ 221.5, 97] [ 221.5, 98] [ 221.5, 99] [ 221.5, 100] [ 221.5, 101] [ 221.5, 102] [ 221.5, 103] [ 221.5, 104] [ 221.5, 105] [ 221.5, 106] [ 221.5, 107] [ 221.5, 108] [ 221.5, 109] [ 221.5, 110] [ 221.5, 111] [ 221.5, 112] [ 221.5, 113] [ 221.5, 114] [ 221.5, 115] [ 221.5, 116] [ 221.5, 117] [ 221.5, 118] [ 221.5, 119] [ 221.5, 120] [ 221.5, 121] [ 221.5, 122] [ 221.5, 123] [ 221.5, 124] [ 221.5, 125] [ 221.5, 126] [ 221.5, 127] [ 221.5, 128] [ 221.5, 129] [ 221.5, 130] [ 221.5, 131] [ 221.5, 132] [ 221.5, 133] [ 221.5, 134] [ 221.5, 135] [ 221.5, 136] [ 221.5, 137] [ 221.5, 138] [ 221.5, 139] [ 221.5, 140] [ 221.5, 141] [ 221.5, 142] [ 221.5, 143] [ 221.5, 144] [ 221.5, 145] [ 221.5, 146] [ 221.5, 147] [ 221.5, 148] [ 221.5, 149] [ 221.5, 150] [ 221.5, 151] [ 221.5, 152] [ 221.5, 153] [ 221.5, 154] [ 221.5, 155] [ 221.5, 156] [ 221.5, 157] [ 221.5, 158] [ 221.5, 159] [ 221.5, 160] [ 221.5, 161] [ 221.5, 162] [ 221.5, 163] [ 221.5, 164] [ 221.5, 165] [ 221.5, 166] [ 221.5, 167] [ 221.5, 168] [ 221.5, 169] [ 221.5, 170] [ 221.5, 171] [ 221.5, 172] [ 221.5, 173] [ 221.5, 174] [ 221.5, 175] [ 221.5, 176] [ 221.5, 177] [ 221.5, 178] [ 221.5, 179] [ 221.5, 180] [ 221.5, 181] [ 221.5, 182] [ 221.5, 183] [ 221.5, 184] [ 221.5, 185] [ 221.5, 186] [ 221.5, 187] [ 221.5, 188] [ 221.5, 189] [ 221.5, 190] [ 221.5, 191] [ 221.5, 192] [ 221.5, 193] [ 221.5, 194] [ 221.5, 195] [ 221.5, 196] [ 221.5, 197] [ 221.5, 198] [ 221.5, 199] [ 221.5, 200] [ 221.5, 201] [ 221.5, 202.5] [ 220, 202.5] [ 219, 202.5] [ 218, 202.5] [ 217, 202.5] [ 216, 202.5] [ 215, 202.5] [ 214, 202.5] [ 213, 202.5] [ 212, 202.5] [ 211, 202.5] [ 210, 202.5] [ 209, 202.5] [ 208, 202.5] [ 207, 202.5] [ 206, 202.5] [ 205, 202.5] [ 204, 202.5] [ 203, 202.5] [ 202, 202.5] [ 201, 202.5] [ 200, 202.5] [ 199, 202.5] [ 198, 202.5] [ 197, 202.5] [ 196, 202.5] [ 195, 202.5] [ 194, 202.5] [ 193, 202.5] [ 192, 202.5] [ 191, 202.5] [ 190, 202.5] [ 189, 202.5] [ 187.5, 202.5] [ 187.5, 201] [ 187.5, 200] [ 187.5, 199] [ 187.5, 198] [ 187.5, 197] [ 187.5, 196] [ 187.5, 195] [ 187.5, 194] [ 187.5, 193] [ 187.5, 192] [ 187.5, 191] [ 187.5, 190] [ 187.5, 189] [ 187.5, 188] [ 187.5, 187] [ 187.5, 186] [ 187.5, 185] [ 187.5, 184] [ 187.5, 183] [ 187.5, 182] [ 187.5, 181] [ 187.5, 180] [ 187.5, 179] [ 187.5, 178] [ 187.5, 177] [ 187.5, 176] [ 187.5, 175] [ 187.5, 174] [ 187.5, 173] [ 187.5, 172] [ 187.5, 171] [ 187.5, 170] [ 187.5, 169] [ 187.5, 168] [ 187.5, 167] [ 187.5, 166] [ 187.5, 165] [ 187.5, 164] [ 187.5, 163] [ 187.5, 162] [ 187.5, 161] [ 187.5, 160] [ 187.5, 159] [ 187.5, 158] [ 187.5, 157] [ 187.5, 156] [ 187.5, 155] [ 187.5, 154] [ 187.5, 153] [ 187.5, 152] [ 187.5, 151] [ 187.5, 150] [ 187.5, 149] [ 187.5, 148] [ 187.5, 147] [ 187.5, 146] [ 187.5, 145] [ 187.5, 144] [ 187.5, 143] [ 187.5, 142] [ 187.5, 141] [ 187.5, 140] [ 187.5, 139] [ 187.5, 138] [ 187.5, 137] [ 187.5, 136] [ 187.5, 135] [ 187.5, 134] [ 187.5, 133] [ 187.5, 132] [ 187.5, 131] [ 187.5, 130] [ 187.5, 129] [ 187.5, 128] [ 187.5, 127] [ 187.5, 126] [ 187.5, 125] [ 187.5, 124] [ 187.5, 123] [ 187.5, 122] [ 187.5, 121] [ 187.5, 120] [ 187.5, 119] [ 187.5, 118] [ 187.5, 117] [ 187.5, 116] [ 187.5, 115] [ 187.5, 114] [ 187.5, 113] [ 187.5, 112] [ 187.5, 111] [ 187.5, 110] [ 187.5, 109] [ 187.5, 108] [ 187.5, 107] [ 187.5, 106] [ 187.5, 105] [ 187.5, 104] [ 187.5, 103] [ 187.5, 102] [ 187.5, 101] [ 187.5, 100] [ 187.5, 99] [ 187.5, 98] [ 187.5, 97] [ 187.5, 96] [ 187.5, 95] [ 187.5, 94] [ 187.5, 93] [ 187.5, 92] [ 187.5, 91] [ 187.5, 90] [ 187.5, 89] [ 187.5, 88] [ 187.5, 87] [ 187.5, 86] [ 187.5, 85] [ 187.5, 84] [ 187.5, 83] [ 187.5, 82] [ 187.5, 81] [ 187.5, 80] [ 187.5, 79] [ 187.5, 78] [ 187.5, 77] [ 187.5, 76] [ 187.5, 75] [ 187.5, 74] [ 187.5, 73] [ 187.5, 72] [ 187.5, 71] [ 187.5, 70] [ 187.5, 69] [ 187.5, 68] [ 187.5, 67] [ 187.5, 66] [ 187.5, 65] [ 187.5, 64] [ 187.5, 63] [ 187.5, 62] [ 187.5, 61] [ 187.5, 60] [ 187.5, 59] [ 187.5, 58] [ 187.5, 57] [ 187.5, 56] [ 187.5, 55] [ 187.5, 54] [ 187.5, 53] [ 187.5, 52] [ 187.5, 51] [ 187.5, 50] [ 187.5, 49] [ 187.5, 48] [ 187.5, 47] [ 187.5, 46] [ 187.5, 45] [ 187.5, 44] [ 187.5, 43] [ 187.5, 42] [ 187.5, 41] [ 187.5, 40] [ 187.5, 39] [ 187.5, 38] [ 187.5, 37] [ 187.5, 36] [ 187.5, 35] [ 187.5, 34] [ 187.5, 33] 
-[ 134.5, 38.5] [ 136, 38.5] [ 137.5, 38.5] [ 138, 39.5] [ 139.5, 39.5] [ 140.5, 40.5] [ 141.5, 41.5] [ 141.5, 43] [ 142.5, 43.5] [ 142.5, 45] [ 143.5, 45.5] [ 143.5, 47] [ 144.5, 47.5] [ 144.5, 49] [ 145.5, 49.5] [ 145.5, 51] [ 145.5, 52] [ 146.5, 52.5] [ 146.5, 54] [ 146.5, 55] [ 146.5, 56] [ 147.5, 56.5] [ 147.5, 58] [ 147.5, 59] [ 147.5, 60] [ 148.5, 60.5] [ 148.5, 62] [ 148.5, 63] [ 148.5, 64] [ 149.5, 64.5] [ 149.5, 66] [ 149.5, 67] [ 149.5, 68] [ 149.5, 69] [ 150.5, 69.5] [ 150.5, 71] [ 150.5, 72] [ 150.5, 73] [ 150.5, 74] [ 150.5, 75] [ 151.5, 75.5] [ 151.5, 77] [ 151.5, 78] [ 151.5, 79] [ 151.5, 80] [ 151.5, 81] [ 151.5, 82] [ 151.5, 83] [ 152.5, 83.5] [ 152.5, 85] [ 152.5, 86] [ 152.5, 87] [ 152.5, 88] [ 152.5, 89] [ 152.5, 90] [ 152.5, 91] [ 152.5, 92] [ 153.5, 92.5] [ 153.5, 94] [ 153.5, 95] [ 153.5, 96] [ 153.5, 97] [ 153.5, 98] [ 153.5, 99] [ 153.5, 100] [ 153.5, 101] [ 153.5, 102] [ 153.5, 103] [ 153.5, 104] [ 153.5, 105] [ 153.5, 106] [ 153.5, 107] [ 154.5, 107.5] [ 154.5, 109] [ 154.5, 110] [ 154.5, 111] [ 154.5, 112] [ 154.5, 113] [ 154.5, 114] [ 154.5, 115] [ 154.5, 116] [ 154.5, 117] [ 154.5, 118] [ 154.5, 119] [ 154.5, 120] [ 154.5, 121] [ 154.5, 122] [ 154.5, 123] [ 154.5, 124] [ 154.5, 125] [ 154.5, 126] [ 154.5, 127] [ 154.5, 128] [ 154.5, 129] [ 154.5, 130] [ 154.5, 131] [ 154.5, 132] [ 154.5, 133] [ 154.5, 134] [ 154.5, 135] [ 154.5, 136] [ 154.5, 137] [ 154.5, 138] [ 154.5, 139] [ 154.5, 140] [ 154.5, 141] [ 154.5, 142] [ 154.5, 143] [ 154.5, 144] [ 154.5, 145] [ 154.5, 146] [ 154.5, 147] [ 154.5, 148] [ 154.5, 149.5] [ 153.5, 150] [ 153.5, 151] [ 153.5, 152] [ 153.5, 153] [ 153.5, 154] [ 153.5, 155] [ 153.5, 156] [ 153.5, 157] [ 153.5, 158] [ 153.5, 159] [ 153.5, 160] [ 153.5, 161] [ 153.5, 162] [ 153.5, 163] [ 153.5, 164.5] [ 152.5, 165] [ 152.5, 166] [ 152.5, 167] [ 152.5, 168] [ 152.5, 169] [ 152.5, 170] [ 152.5, 171] [ 152.5, 172] [ 152.5, 173.5] [ 151.5, 174] [ 151.5, 175] [ 151.5, 176] [ 151.5, 177] [ 151.5, 178] [ 151.5, 179] [ 151.5, 180] [ 151.5, 181.5] [ 150.5, 182] [ 150.5, 183] [ 150.5, 184] [ 150.5, 185] [ 150.5, 186] [ 150.5, 187.5] [ 149.5, 188] [ 149.5, 189] [ 149.5, 190] [ 149.5, 191] [ 149.5, 192.5] [ 148.5, 193] [ 148.5, 194] [ 148.5, 195] [ 148.5, 196.5] [ 147.5, 197] [ 147.5, 198] [ 147.5, 199] [ 147.5, 200.5] [ 146.5, 201] [ 146.5, 202] [ 146.5, 203] [ 146.5, 204.5] [ 145.5, 205] [ 145.5, 206] [ 145.5, 207.5] [ 144.5, 208] [ 144.5, 209.5] [ 143.5, 210] [ 143.5, 211.5] [ 142.5, 212] [ 142.5, 213.5] [ 141.5, 214] [ 141.5, 215.5] [ 140.5, 216.5] [ 139.5, 217.5] [ 138, 217.5] [ 137.5, 218.5] [ 136, 218.5] [ 134.5, 218.5] [ 134, 217.5] [ 132.5, 217.5] [ 131.5, 216.5] [ 130.5, 215.5] [ 130.5, 214] [ 129.5, 213.5] [ 129.5, 212] [ 128.5, 211.5] [ 128.5, 210] [ 127.5, 209.5] [ 127.5, 208] [ 126.5, 207.5] [ 126.5, 206] [ 126.5, 205] [ 125.5, 204.5] [ 125.5, 203] [ 125.5, 202] [ 125.5, 201] [ 124.5, 200.5] [ 124.5, 199] [ 124.5, 198] [ 124.5, 197] [ 123.5, 196.5] [ 123.5, 195] [ 123.5, 194] [ 123.5, 193] [ 122.5, 192.5] [ 122.5, 191] [ 122.5, 190] [ 122.5, 189] [ 122.5, 188] [ 121.5, 187.5] [ 121.5, 186] [ 121.5, 185] [ 121.5, 184] [ 121.5, 183] [ 121.5, 182] [ 120.5, 181.5] [ 120.5, 180] [ 120.5, 179] [ 120.5, 178] [ 120.5, 177] [ 120.5, 176] [ 120.5, 175] [ 120.5, 174] [ 119.5, 173.5] [ 119.5, 172] [ 119.5, 171] [ 119.5, 170] [ 119.5, 169] [ 119.5, 168] [ 119.5, 167] [ 119.5, 166] [ 119.5, 165] [ 118.5, 164.5] [ 118.5, 163] [ 118.5, 162] [ 118.5, 161] [ 118.5, 160] [ 118.5, 159] [ 118.5, 158] [ 118.5, 157] [ 118.5, 156] [ 118.5, 155] [ 118.5, 154] [ 118.5, 153] [ 118.5, 152] [ 118.5, 151] [ 118.5, 150] [ 117.5, 149.5] [ 117.5, 148] [ 117.5, 147] [ 117.5, 146] [ 117.5, 145] [ 117.5, 144] [ 117.5, 143] [ 117.5, 142] [ 117.5, 141] [ 117.5, 140] [ 117.5, 139] [ 117.5, 138] [ 117.5, 137] [ 117.5, 136] [ 117.5, 135] [ 117.5, 134] [ 117.5, 133] [ 117.5, 132] [ 117.5, 131] [ 117.5, 130] [ 117.5, 129] [ 117.5, 128] [ 117.5, 127] [ 117.5, 126] [ 117.5, 125] [ 117.5, 124] [ 117.5, 123] [ 117.5, 122] [ 117.5, 121] [ 117.5, 120] [ 117.5, 119] [ 117.5, 118] [ 117.5, 117] [ 117.5, 116] [ 117.5, 115] [ 117.5, 114] [ 117.5, 113] [ 117.5, 112] [ 117.5, 111] [ 117.5, 110] [ 117.5, 109] [ 117.5, 107.5] [ 118.5, 107] [ 118.5, 106] [ 118.5, 105] [ 118.5, 104] [ 118.5, 103] [ 118.5, 102] [ 118.5, 101] [ 118.5, 100] [ 118.5, 99] [ 118.5, 98] [ 118.5, 97] [ 118.5, 96] [ 118.5, 95] [ 118.5, 94] [ 118.5, 92.5] [ 119.5, 92] [ 119.5, 91] [ 119.5, 90] [ 119.5, 89] [ 119.5, 88] [ 119.5, 87] [ 119.5, 86] [ 119.5, 85] [ 119.5, 83.5] [ 120.5, 83] [ 120.5, 82] [ 120.5, 81] [ 120.5, 80] [ 120.5, 79] [ 120.5, 78] [ 120.5, 77] [ 120.5, 75.5] [ 121.5, 75] [ 121.5, 74] [ 121.5, 73] [ 121.5, 72] [ 121.5, 71] [ 121.5, 69.5] [ 122.5, 69] [ 122.5, 68] [ 122.5, 67] [ 122.5, 66] [ 122.5, 64.5] [ 123.5, 64] [ 123.5, 63] [ 123.5, 62] [ 123.5, 60.5] [ 124.5, 60] [ 124.5, 59] [ 124.5, 58] [ 124.5, 56.5] [ 125.5, 56] [ 125.5, 55] [ 125.5, 54] [ 125.5, 52.5] [ 126.5, 52] [ 126.5, 51] [ 126.5, 49.5] [ 127.5, 49] [ 127.5, 47.5] [ 128.5, 47] [ 128.5, 45.5] [ 129.5, 45] [ 129.5, 43.5] [ 130.5, 43] [ 130.5, 41.5] [ 131.5, 40.5] [ 132.5, 39.5] [ 134, 39.5] 
-[ 19.5, 30.5] [ 21, 30.5] [ 22, 30.5] [ 23, 30.5] [ 24, 30.5] [ 25, 30.5] [ 26, 30.5] [ 27, 30.5] [ 28, 30.5] [ 29, 30.5] [ 30, 30.5] [ 31, 30.5] [ 32, 30.5] [ 33, 30.5] [ 34, 30.5] [ 35, 30.5] [ 36, 30.5] [ 37, 30.5] [ 38, 30.5] [ 39, 30.5] [ 40, 30.5] [ 41, 30.5] [ 42, 30.5] [ 43, 30.5] [ 44, 30.5] [ 45, 30.5] [ 46, 30.5] [ 47, 30.5] [ 48, 30.5] [ 49, 30.5] [ 50, 30.5] [ 51, 30.5] [ 52, 30.5] [ 53, 30.5] [ 54, 30.5] [ 55, 30.5] [ 56, 30.5] [ 57, 30.5] [ 58, 30.5] [ 59, 30.5] [ 60, 30.5] [ 61, 30.5] [ 62, 30.5] [ 63, 30.5] [ 64, 30.5] [ 65, 30.5] [ 66, 30.5] [ 67, 30.5] [ 68, 30.5] [ 69, 30.5] [ 70, 30.5] [ 71, 30.5] [ 72, 30.5] [ 73, 30.5] [ 74, 30.5] [ 75, 30.5] [ 76, 30.5] [ 77, 30.5] [ 78, 30.5] [ 79, 30.5] [ 80, 30.5] [ 81, 30.5] [ 82, 30.5] [ 83, 30.5] [ 84.5, 30.5] [ 84.5, 32] [ 84.5, 33] [ 84.5, 34] [ 84.5, 35] [ 84.5, 36] [ 84.5, 37] [ 84.5, 38] [ 84.5, 39] [ 84.5, 40] [ 84.5, 41] [ 84.5, 42] [ 84.5, 43] [ 84.5, 44] [ 84.5, 45] [ 84.5, 46] [ 84.5, 47] [ 84.5, 48] [ 84.5, 49] [ 84.5, 50] [ 84.5, 51] [ 84.5, 52] [ 84.5, 53] [ 84.5, 54] [ 84.5, 55] [ 84.5, 56] [ 84.5, 57] [ 84.5, 58] [ 84.5, 59] [ 84.5, 60] [ 84.5, 61] [ 84.5, 62] [ 84.5, 63] [ 84.5, 64] [ 84.5, 65] [ 84.5, 66] [ 84.5, 67] [ 84.5, 68] [ 84.5, 69] [ 84.5, 70] [ 84.5, 71] [ 84.5, 72] [ 84.5, 73] [ 84.5, 74] [ 84.5, 75] [ 84.5, 76] [ 84.5, 77] [ 84.5, 78] [ 84.5, 79] [ 84.5, 80] [ 84.5, 81] [ 84.5, 82] [ 84.5, 83] [ 84.5, 84] [ 84.5, 85] [ 84.5, 86] [ 84.5, 87] [ 84.5, 88] [ 84.5, 89] [ 84.5, 90] [ 84.5, 91] [ 84.5, 92] [ 84.5, 93] [ 84.5, 94.5] [ 83, 94.5] [ 82, 94.5] [ 81, 94.5] [ 80, 94.5] [ 79, 94.5] [ 78, 94.5] [ 77, 94.5] [ 76, 94.5] [ 75, 94.5] [ 74, 94.5] [ 73, 94.5] [ 72, 94.5] [ 71, 94.5] [ 70, 94.5] [ 69, 94.5] [ 68, 94.5] [ 67, 94.5] [ 66, 94.5] [ 65, 94.5] [ 64, 94.5] [ 63, 94.5] [ 62, 94.5] [ 61, 94.5] [ 60, 94.5] [ 59, 94.5] [ 58, 94.5] [ 57, 94.5] [ 56, 94.5] [ 55, 94.5] [ 54, 94.5] [ 53, 94.5] [ 52, 94.5] [ 51, 94.5] [ 50, 94.5] [ 49, 94.5] [ 48, 94.5] [ 47, 94.5] [ 46, 94.5] [ 45, 94.5] [ 44, 94.5] [ 43, 94.5] [ 42, 94.5] [ 41, 94.5] [ 40, 94.5] [ 39, 94.5] [ 38, 94.5] [ 37, 94.5] [ 36, 94.5] [ 35, 94.5] [ 34, 94.5] [ 33, 94.5] [ 32, 94.5] [ 31, 94.5] [ 30, 94.5] [ 29, 94.5] [ 28, 94.5] [ 27, 94.5] [ 26, 94.5] [ 25, 94.5] [ 24, 94.5] [ 23, 94.5] [ 22, 94.5] [ 21, 94.5] [ 19.5, 94.5] [ 19.5, 93] [ 19.5, 92] [ 19.5, 91] [ 19.5, 90] [ 19.5, 89] [ 19.5, 88] [ 19.5, 87] [ 19.5, 86] [ 19.5, 85] [ 19.5, 84] [ 19.5, 83] [ 19.5, 82] [ 19.5, 81] [ 19.5, 80] [ 19.5, 79] [ 19.5, 78] [ 19.5, 77] [ 19.5, 76] [ 19.5, 75] [ 19.5, 74] [ 19.5, 73] [ 19.5, 72] [ 19.5, 71] [ 19.5, 70] [ 19.5, 69] [ 19.5, 68] [ 19.5, 67] [ 19.5, 66] [ 19.5, 65] [ 19.5, 64] [ 19.5, 63] [ 19.5, 62] [ 19.5, 61] [ 19.5, 60] [ 19.5, 59] [ 19.5, 58] [ 19.5, 57] [ 19.5, 56] [ 19.5, 55] [ 19.5, 54] [ 19.5, 53] [ 19.5, 52] [ 19.5, 51] [ 19.5, 50] [ 19.5, 49] [ 19.5, 48] [ 19.5, 47] [ 19.5, 46] [ 19.5, 45] [ 19.5, 44] [ 19.5, 43] [ 19.5, 42] [ 19.5, 41] [ 19.5, 40] [ 19.5, 39] [ 19.5, 38] [ 19.5, 37] [ 19.5, 36] [ 19.5, 35] [ 19.5, 34] [ 19.5, 33] [ 19.5, 32] 
+[ 2.5, -0.5] [ 4, -0.5] [ 5, -0.5] [ 6, -0.5] [ 7, -0.5] [ 8, -0.5] [ 9, -0.5] [ 10, -0.5] [ 11, -0.5] [ 12, -0.5] [ 13, -0.5] [ 14, -0.5] [ 15, -0.5] [ 16, -0.5] [ 17.5, -0.5] [ 17.5, 1] [ 17.5, 2.5] [ 16, 2.5] [ 15, 2.5] [ 14, 2.5] [ 13.5, 3] [ 13.5, 4] [ 13.5, 5.5] [ 12, 5.5] [ 11, 5.5] [ 10, 5.5] [ 9, 5.5] [ 8, 5.5] [ 6.5, 5.5] [ 6.5, 4] [ 6.5, 3] [ 6, 2.5] [ 5, 2.5] [ 4, 2.5] [ 2.5, 2.5] [ 2.5, 1] 
+[ 17.5, -0.5] [ 19.5, -0.5] [ 19.5, 1] [ 19.5, 2] [ 19.5, 3] [ 19.5, 4] [ 19.5, 5] [ 19.5, 6] [ 19.5, 7] [ 19.5, 8] [ 19.5, 9] [ 19.5, 10] [ 19.5, 11] [ 19.5, 12.5] [ 18, 12.5] [ 17, 12.5] [ 16, 12.5] [ 15, 12.5] [ 13.5, 12.5] [ 13.5, 11] [ 13.5, 10] [ 13.5, 9] [ 13.5, 8] [ 13.5, 7] [ 13.5, 6] [ 13.5, 5] [ 13.5, 4] [ 13.5, 2.5] [ 15, 2.5] [ 16, 2.5] [ 17, 2.5] [ 17.5, 2] [ 17.5, 1] 
+[ 6.5, 5.5] [ 8, 5.5] [ 9, 5.5] [ 10, 5.5] [ 11, 5.5] [ 12, 5.5] [ 13.5, 5.5] [ 13.5, 7] [ 13.5, 8] [ 13.5, 9] [ 13.5, 10] [ 13.5, 11] [ 13.5, 12.5] [ 12, 12.5] [ 11, 12.5] [ 10, 12.5] [ 9, 12.5] [ 8, 12.5] [ 7, 12.5] [ 6, 12.5] [ 5, 12.5] [ 4, 12.5] [ 3, 12.5] [ 2, 12.5] [ 1, 12.5] [ -0.5, 12.5] [ -0.5, 11] [ -0.5, 10] [ -0.5, 8.5] [ 1, 8.5] [ 2, 8.5] [ 3, 8.5] [ 4, 8.5] [ 5, 8.5] [ 6, 8.5] [ 6.5, 8] [ 6.5, 7] 
diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.dbf b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.dbf
deleted file mode 100644
index 0a2e444943b3e3b835f318120bccbb4c58d4a4fb..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:881459241d920b7b0b0f04690ca4b64da9b40043e9761e8089867688fd8c868c
-size 6583
diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp
deleted file mode 100644
index b3adb3d3bb2ccb2ae5bfefd4abb19bd64970103a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ff01566163097422211e31b35823cc6ede15efa3965bcc72f2e89f8b95fc2b30
-size 12860
diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shx b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shx
deleted file mode 100644
index 8eb95e8e60e8cf4597630573a9dcfa4c795487fc..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b033aa81a9212511ecb13bf36bb9b92d26a2272e8fd2e7106fd938f623084664
-size 668
diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.dbf b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.dbf
deleted file mode 100644
index 7f7a14e7e93b6ae0e262ae25f9c8735b61407051..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0f0a24f1a9e719f6b7f9cea9e8dbb89d90436b8837178c1f7e2155f555cd274c
-size 1517
diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp
deleted file mode 100644
index 4df7fd5f11a76ae2d527a9be87e52e380efe6edd..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a02afbec1aac0b3b812282d4877310d5ce035b9fce9aa4d2427244a0c4404840
-size 3228
diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shx b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shx
deleted file mode 100644
index e8977f2d43cf2cc9b3b6dc1bd080b67d024f7573..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ce4dc76a26a8fafad2f5e083c3aea4f5494319c7a46cfa7a339a0fd48161aa1d
-size 252
diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.dbf b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.dbf
deleted file mode 100644
index 1fd9789d1f9e5997ac7ecf8151b5501981153bdd..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:abe817af5f07dd14805d6a14fe5a75fb988340ca1ffcc8e81d8e7adee531a42b
-size 6583
diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp
deleted file mode 100644
index b3adb3d3bb2ccb2ae5bfefd4abb19bd64970103a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ff01566163097422211e31b35823cc6ede15efa3965bcc72f2e89f8b95fc2b30
-size 12860
diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shx b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shx
deleted file mode 100644
index 8eb95e8e60e8cf4597630573a9dcfa4c795487fc..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b033aa81a9212511ecb13bf36bb9b92d26a2272e8fd2e7106fd938f623084664
-size 668
diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.dbf b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.dbf
deleted file mode 100644
index a84548112ba0945d770a527ac2d727f420a5e731..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4b5fc99954f197ed6d0bcfc9ecf4178eb77f5893ba17b32a0906555a5c16fb63
-size 1517
diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp
deleted file mode 100644
index 4df7fd5f11a76ae2d527a9be87e52e380efe6edd..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a02afbec1aac0b3b812282d4877310d5ce035b9fce9aa4d2427244a0c4404840
-size 3228
diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shx b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shx
deleted file mode 100644
index e8977f2d43cf2cc9b3b6dc1bd080b67d024f7573..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ce4dc76a26a8fafad2f5e083c3aea4f5494319c7a46cfa7a339a0fd48161aa1d
-size 252
diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.dbf b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.dbf
deleted file mode 100644
index a2d1962a67cfe76b01ba616264e3b432995b312b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e675961d8adb260fa0e564558e79e158c2511d7a1cbd464667b2cf7927f702fd
-size 785
diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shp b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shp
deleted file mode 100644
index 8ac2142c3235efbf2e8cf2803f9aeff3bba4649d..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4e720cbe159c9438355353a79261f74beba401408778cd8669afc74ec9301b26
-size 15684
diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shx b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shx
deleted file mode 100644
index ecb34a6fd196a31064ce103077a3e80a450e6181..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7af082714c0e2d805f31e4f713599b7dda549f6ff99d81fb33efe41e160ff384
-size 580
diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.dbf b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.dbf
index a2d1962a67cfe76b01ba616264e3b432995b312b..9ed672feb1457ec0eef8027c7e3b062082623cd7 100644
--- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.dbf
+++ b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.dbf
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:e675961d8adb260fa0e564558e79e158c2511d7a1cbd464667b2cf7927f702fd
-size 785
+oid sha256:039b117e408a00a939a7eb4268f1ef488e08a793645a9df2617a999008aab0b2
+size 2466
diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.prj b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.prj
similarity index 100%
rename from Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.prj
rename to Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.prj
diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shp b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shp
index 199475acddb250a1349fbf18a06fd729b5283ba0..5521bb667bc0b70f5523f27a3ddd12a988143272 100644
--- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shp
+++ b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shp
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:d51f57a1463023f790db62d41cfea1ea1364d0703fde4b0a179a409536fd4990
-size 22756
+oid sha256:ac714bc9b3d7f861e18549af2ee9df1264cfdb3595a27d43fd621ee3ee854263
+size 50020
diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shx b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shx
index 21af605da762cae678e5f94bbbb443f172c2984c..375bc0d40fca7103f87b18f4c088c0d474b294d1 100644
--- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shx
+++ b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shx
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:a3cced39b706cd73f652e67d5a3e752aadff2a4ba95ce4a24714c0bd73b350e4
-size 580
+oid sha256:db653974b1e2e7b5c5c878f0cef7871fb75a8d7d48739723e26f281e04d32555
+size 1700
diff --git a/Data/Baseline/OTB/Files/feAlign.txt b/Data/Baseline/OTB/Files/feAlign.txt
deleted file mode 100644
index 9803d3b15840ab23977df19847fd69b6f705bdc2..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/feAlign.txt
+++ /dev/null
@@ -1,759 +0,0 @@
-Nb Segment: 758
- 260.335    4.536
- 262.335    4.536
- 270.335    4.536
- 281.331    4.667
- 281.333    4.601
- 282.331    4.667
- 281.335    4.536
- 283.333    4.601
- 282.335    4.536
- 283.335    4.536
- 285.333    4.601
- 285.335    4.536
- 287.333    4.601
- 286.335    4.536
- 287.335    4.536
- 288.335    4.536
- 290.333    4.601
- 289.335    4.536
- 290.335    4.536
- 294.329    4.732
- 291.335    4.536
- 294.331    4.667
- 294.333    4.601
- 294.335    4.536
- 304.344    4.274
- 304.348    4.144
- 350.389   51.394
- 350.408   51.199
- 346.504   50.223
- 346.523   50.028
- 344.581   49.443
- 339.677   48.468
- 340.677   48.468
- 339.716   48.077
- 336.792   47.297
- 328.119   43.981
- 341.888   46.322
- 337.985   45.346
- 338.004   45.151
- 338.023   44.956
- 338.042   44.761
- 337.081   44.371
- 338.061   44.566
- 343.965   45.541
- 337.100   44.176
- 343.985   45.346
- 316.542   39.689
- 324.673   43.758
- 326.639   44.017
- 334.401   45.829
- 332.503   45.052
- 370.378   53.593
- 324.048   40.911
- 328.878   42.205
- 324.082   40.652
- 327.980   41.429
- 328.946   41.688
- 328.014   41.170
- 335.776   42.982
- 337.776   42.982
- 333.495   41.930
- 351.805   46.109
- 390.104   20.072
- 367.315  131.143
- 368.315  131.143
- 367.391  130.760
- 347.105  168.454
- 347.209  168.012
- 366.974  130.417
- 371.562  132.187
- 365.284  129.091
- 365.387  128.648
- 296.949  169.500
- 297.949  169.500
- 297.083  169.000
- 323.805  177.500
- 323.939  177.000
- 294.772  166.727
-  54.788  141.714
-  51.789  101.502
-  49.692   80.905
-  48.742   71.097
-  43.817   16.173
-  43.841   11.269
-  42.500   -0.500
-  72.923  344.523
-  55.601  152.183
-  56.515  159.123
-  56.687  145.242
-  51.683   99.636
-  48.506   67.910
-  46.504   45.106
-  44.372   21.312
-  42.500   -0.500
-  43.500   -0.500
-  43.631    0.491
- 294.713  418.881
- 329.666  388.146
- 333.713  418.881
- 339.277  407.975
- 499.546   30.235
-  43.500   -0.500
-  44.565    0.498
-  46.416   13.470
-  47.135   24.446
-  52.190   86.314
-  55.218  117.247
-  57.918  143.192
-  60.095  161.153
- 143.670  444.545
- 159.787  141.196
- 159.853  142.194
- 255.904  417.603
- 275.969  418.601
- 252.639   47.397
- 261.574   46.399
- 268.546   15.466
- 293.923  402.635
- 295.446  410.618
- 271.855   35.423
- 333.969  418.601
- 333.904  417.603
- 444.808   19.457
- 449.209   71.346
- 469.023    7.483
- 498.500   -0.500
-  21.500  320.500
-  22.500  419.500
-  44.500   -0.500
-  45.500   13.500
-  46.500   20.500
-  47.500   27.500
-  48.500   15.500
-  56.500  133.500
-  57.500  142.500
-  58.500  153.500
-  59.500  161.500
- 143.500  444.500
- 144.500  461.500
- 160.500  143.500
- 160.500  142.500
- 196.500  417.500
- 216.500  421.500
- 236.500  421.500
- 236.500  418.500
- 253.500    9.500
- 253.500   22.500
- 255.500  412.500
- 256.500  419.500
- 265.500   12.500
- 269.500   72.500
- 273.500   11.500
- 295.500  412.500
- 296.500   20.500
- 441.500    4.500
- 442.500   48.500
- 445.500   15.500
- 445.500    2.500
- 453.500    8.500
- 468.500   72.500
- 472.500   44.500
- 499.500    9.500
- 499.500   10.500
-  22.442  427.581
-  22.330  444.545
-  60.185  172.130
- 143.976  480.468
- 144.303  475.479
- 197.161  416.605
- 197.227  415.607
- 216.704  423.590
- 254.603   28.438
- 268.584   13.470
- 268.519   14.468
- 273.323   17.461
- 274.781   10.476
- 262.309  322.806
- 287.584   13.470
- 291.072   82.322
- 296.781   10.476
- 297.715   11.474
- 283.069  448.537
- 418.352   93.299
- 145.847  475.394
- 197.418  417.890
- 197.287  418.881
- 295.365   46.098
- 296.887   42.132
- 301.058   78.816
- 304.407   60.970
- 313.064   10.406
- 297.696   38.731
- 397.832  465.373
- 404.100  438.892
- 412.513  401.622
- 417.610  381.025
- 423.682  355.525
- 419.513  401.622
- 428.512  361.410
- 344.607  234.220
- 346.901  229.390
- 352.642  230.356
- 357.007  217.799
- 232.533  240.967
- 252.926  192.674
- 231.747  258.012
- 347.712  228.657
- 348.033  227.710
- 355.033  227.710
- 201.301  309.000
- 211.485  286.827
- 213.634  284.055
- 240.656  221.231
- 239.508  224.003
- 253.519  192.591
- 254.136  193.515
- 182.809  368.128
- 192.994  345.955
- 209.684  308.076
- 217.955  290.522
- 234.645  252.643
- 232.731  257.262
- 347.064  232.318
- 255.293  190.534
- 255.850  191.431
- 250.985  201.296
- 248.004  209.368
- 244.139  219.234
- 233.197  243.449
- 232.755  244.346
- 224.025  264.077
- 213.968  286.499
- 206.122  304.437
- 188.988  341.209
- 196.103  343.002
- 181.181  375.290
-  85.500  292.217
- 229.000  253.245
- 308.500  117.279
- 214.000  286.154
- 165.337  394.590
- 229.122  359.682
- 314.598  112.276
- 444.645    1.719
- 446.637    1.588
- 482.500   -0.500
- 482.502   -0.435
- 482.504   -0.369
- 484.502   -0.435
- 484.504   -0.369
- 486.502   -0.435
- 488.500   -0.500
- 488.502   -0.435
- 488.504   -0.369
- 425.866  350.358
- 425.349  353.290
- 423.278  362.017
- 423.019  363.983
- 421.466  370.778
- 423.278  364.017
- 421.466  371.778
- 418.102  384.336
- 419.396  380.506
- 417.066  390.199
- 416.031  395.063
- 414.478  401.858
- 414.478  402.858
- 411.113  416.416
- 407.490  430.938
- 425.349  364.290
- 403.867  445.461
- 419.396  388.506
- 401.020  458.087
- 399.984  462.950
- 399.467  465.882
- 399.984  464.950
- 408.266  435.041
- 403.461  455.828
- 470.252  292.115
- 470.499  294.366
- 230.937  358.280
- 234.021  356.979
- 224.122  367.878
- 213.786  256.177
- 216.160  256.172
- 212.002  259.950
- 210.855  260.500
- 206.460  264.436
- 122.154  335.011
- 202.848  266.934
- 196.119  270.218
- 115.630  338.540
- 188.802  273.490
- 184.879  288.270
- 118.186  419.536
- 392.518  211.033
- 181.340  275.835
- 176.383  290.487
- 108.965  341.363
- 117.888  420.188
- 116.896  420.319
- 305.271  458.519
- 102.376  227.250
- 171.228  277.737
- 167.237  292.999
- 170.230  292.802
- 127.322  419.615
- 143.288  419.568
- 189.189  442.560
- 193.181  443.298
- 194.179  443.233
- 279.995  443.608
- 293.965  443.692
- 306.937  443.842
- 305.939  443.908
- 325.896  443.600
- 331.883  444.207
- 311.926  460.515
- 326.894  460.534
- 491.500   -0.500
- 327.500    3.500
- 376.500  189.500
- 377.500  189.500
- 437.500  213.500
- 163.500  266.500
- 164.500  278.500
- 165.500  278.500
- 161.500  293.500
- 158.500  295.500
-  72.500  326.500
-  73.500  326.500
- 253.500  417.500
- 138.500  419.500
- 137.500  419.500
- 139.500  420.500
- 137.500  421.500
- 193.500  442.500
- 332.500  443.500
- 333.500  443.500
- 334.500  444.500
- 333.500  444.500
- 344.500  460.500
- 343.500  460.500
- 340.500  461.500
- 340.500  462.500
- 346.500  471.500
- 165.500  476.500
- 288.500  499.500
- 378.783  185.867
- 406.723  192.698
- 165.241  266.871
- 159.254  278.478
- 100.380  328.619
- 233.095  417.318
- 332.881  443.858
- 333.879  443.924
- 326.894  444.466
- 325.896  444.400
- 310.928  444.419
- 309.930  444.354
- 294.962  444.373
- 295.960  444.438
- 273.010  443.934
- 205.155  443.487
- 204.157  443.421
- 189.189  443.440
- 340.864  461.381
- 340.864  462.381
- 320.907  462.073
- 275.005  462.065
- 228.106  471.991
- 166.239  476.936
- 387.561  129.315
- 375.663  186.748
- 361.783  189.921
- 360.792  189.791
- 166.469  262.207
- 150.606  279.119
- 333.031  462.136
- 369.267  186.407
- 358.478  190.261
- 420.268  222.552
- 372.209  212.992
- 390.844  217.699
- 335.920  254.774
- 147.609  279.317
- 136.821  278.171
- 490.884  356.598
- 505.596  359.525
- 367.543  179.195
- 378.168  216.042
- 297.996  198.560
- 363.679  263.160
- 136.687  278.337
- 126.062  276.490
- 101.913  383.020
- 364.673  178.998
- 365.620  179.320
- 121.312  275.388
- 379.557  137.926
- 337.554  186.941
- 335.169  198.964
- 462.382  215.302
- 432.309  266.928
- 453.360  287.390
- 465.245  220.245
- 454.639  209.639
- 210.687  195.687
- 211.394  196.394
- 351.051  144.868
- 351.500  147.104
- 351.000  147.238
- 349.507  148.038
- 509.214  489.712
- 508.893  489.765
- 509.465  491.636
- 509.206  491.670
- 508.688  490.739
- 423.490   41.070
- 420.173   26.396
- 420.173   30.396
- 384.885  492.383
- 368.078  499.443
- 367.284  498.558
- 448.100  482.194
- 449.203  481.751
- 150.096  311.096
- 159.323  323.292
- 158.345  321.036
- 158.441  324.062
- 158.832  323.269
- 158.006  320.889
- 157.386  321.756
-  51.673  496.620
-  84.498  487.697
- 315.363  441.099
-  80.688  467.592
- 166.559  358.825
- 166.886  363.815
- 269.650  497.528
- 253.478  159.254
- 253.432  143.288
- 252.470  113.352
- 252.404  112.354
- 274.922  440.650
- 251.377   81.421
- 251.442   82.419
- 251.461   67.451
- 250.480   52.483
- 250.434   36.517
- 260.451  128.320
- 332.922  440.650
- 441.254  125.326
- 449.862  119.339
- 464.704   86.410
- 473.872   58.470
-  79.500  454.500
-  80.500  478.500
- 141.500  491.500
- 142.500  485.500
- 215.500  454.500
- 215.500  453.500
- 228.500  498.500
- 235.500  441.500
- 248.500  498.500
- 249.500   28.500
- 250.500   83.500
- 251.500  112.500
- 252.500  145.500
- 253.500  162.500
- 253.500  161.500
- 254.500  436.500
- 254.500  437.500
- 257.500  145.500
- 260.500  132.500
- 266.500  125.500
- 268.500  106.500
- 269.500  498.500
- 274.500  436.500
- 290.500  138.500
- 433.500  102.500
- 438.500   79.500
- 452.500   47.500
- 464.500  115.500
- 471.500   87.500
- 474.500   92.500
- 156.078  440.650
- 250.558   82.419
- 228.612  493.536
- 257.558   82.419
- 253.522  159.254
- 255.830  139.296
- 266.511   98.384
- 268.689   80.423
- 271.372  146.281
- 294.923  107.365
- 297.054  105.369
- 491.128   58.470
- 155.506  442.090
- 252.578  137.717
- 274.273  147.631
- 289.927  119.871
- 292.494  107.973
- 412.205  406.398
- 405.504  464.894
- 393.377  485.980
- 398.474  465.384
- 399.059  462.442
- 407.083  427.133
- 410.424  415.364
- 417.472  384.959
- 405.279  466.365
- 437.665  343.767
- 437.470  344.747
- 344.793  259.359
- 412.523  398.453
- 406.017  426.464
- 395.888  467.999
- 392.523  480.556
- 390.935  490.216
- 396.123  496.977
- 390.572  489.668
- 180.137  373.766
- 186.495  360.832
- 165.902  400.185
- 153.000  376.266
- 151.391  377.465
- 252.205  501.474
- 256.205  501.474
- 260.198  501.278
- 260.200  501.344
- 260.202  501.409
- 260.205  501.474
- 264.198  501.278
- 391.162  500.166
- 391.164  500.232
- 391.166  500.297
- 391.168  500.363
- 391.170  500.428
- 391.172  500.493
- 393.170  500.428
- 393.172  500.493
- 395.170  500.428
- 395.172  500.493
- 397.170  500.428
- 397.172  500.493
- 399.170  500.428
- 422.170  500.428
- 422.172  500.493
- 424.170  500.428
- 424.172  500.493
- 170.864  228.008
- 110.917  338.054
- 168.375  219.000
- 106.887  339.500
- 369.256  123.951
- 352.454  112.033
- 148.217  281.921
- 106.576  385.403
- 111.533  384.751
- 167.054  446.441
- 251.958    4.953
- 304.845    5.487
- 305.843    5.421
- 321.808  113.375
- 353.740  188.282
- 363.719  201.628
- 129.222  262.998
- 103.277  384.698
- 176.121  415.924
- 243.975  416.476
- 258.943  416.495
- 117.247  448.782
- 117.247  449.782
- 184.104  446.400
- 214.040  445.438
- 299.856  445.814
- 310.832  446.094
- 307.838  446.290
- 197.076  477.550
- 217.033  477.242
- 269.920  476.776
- 274.909  477.449
- 275.907  477.383
- 289.877  477.468
- 251.500    4.500
- 255.500    5.500
- 347.500  187.500
- 352.500  188.500
- 353.500  201.500
- 137.500  262.500
- 140.500  281.500
- 141.500  294.500
- 140.500  294.500
- 136.500  296.500
-  96.500  384.500
-  99.500  397.500
- 154.500  415.500
- 174.500  416.500
- 197.500  442.500
- 198.500  442.500
- 157.500  445.500
- 286.500  446.500
- 130.500  459.500
- 171.500  464.500
- 155.500  469.500
- 147.500  470.500
- 199.500  476.500
- 170.500  476.500
- 169.500  477.500
- 420.500  498.500
-  25.500  500.500
- 359.727  184.111
- 342.763  186.999
- 132.215  262.199
-  99.286  398.040
- 257.945  415.439
- 243.975  415.524
- 239.984  416.262
- 218.031  415.823
- 170.134  415.684
- 113.256  412.956
- 304.845  445.513
- 289.877  445.532
- 219.029  442.889
- 199.072  442.581
- 200.070  442.646
- 312.828  470.037
- 241.980  469.393
- 156.164  464.768
- 305.843  476.579
- 184.104  469.600
- 274.909  476.551
- 270.918  477.290
- 229.008  476.543
- 214.040  476.562
- 418.601  497.969
- 325.685   45.443
- 352.454  181.967
- 355.429  183.359
- 345.514  185.054
- 339.566  185.270
- 343.531  186.793
- 323.702  222.182
- 126.405  234.207
- 118.473  278.163
- 181.926  415.517
- 238.438  467.957
- 432.761  498.540
- 434.969  132.120
- 333.948  169.026
- 353.563  173.928
- 346.698  179.562
- 348.660  180.952
- 351.602  181.537
- 345.717  185.367
- 335.909  184.416
- 324.140  221.075
- 120.137  231.496
- 122.098  232.886
-  86.790  337.863
- 349.640  482.147
- 359.448  485.098
- 436.098  129.486
- 340.472  168.863
- 334.676  168.310
- 339.506  175.604
- 347.233  179.675
- 262.232  374.899
-  84.501  381.276
- 351.097  481.710
- 353.029  483.228
- 351.097  485.710
- 352.705  171.397
- 342.289  168.861
- 340.395  169.218
- 301.571  172.039
- 114.079  228.394
- 365.015  484.576
- 353.652  481.718
- 356.493  482.683
- 346.879  168.389
- 345.955  170.006
- 341.335  169.093
-  71.006  253.279
-  21.018  395.796
-  21.999  411.763
-  21.933  411.766
-  21.868  411.768
-  21.802  411.770
-  21.737  411.772
-  21.672  411.774
-  21.606  411.776
-  21.541  411.778
-  21.606  413.776
-  21.541  413.778
-  21.606  415.776
-  21.541  415.778
-  21.606  417.776
-  21.606  418.776
-  21.541  417.778
-  21.541  418.778
-  21.606  420.776
-  21.541  419.778
-  21.541  420.778
-  21.737  424.772
-  21.672  423.774
-  21.606  423.776
-  21.672  424.774
-  21.606  424.776
-  21.541  423.778
-  21.541  424.778
-  21.606  426.776
-  21.541  425.778
-  21.541  426.778
-  21.606  428.776
-  21.541  427.778
-  21.541  428.778
-  21.606  430.776
-  21.541  430.778
-  21.606  432.776
-  21.541  432.778
-  21.606  434.776
-  21.541  434.778
-  21.606  436.776
-  21.541  441.778
-  21.606  443.776
-  21.541  443.778
-  22.129  454.759
-  22.129  455.759
-  22.064  454.761
-  21.999  454.763
-  21.868  454.768
-  21.868  455.768
-  21.802  454.770
-  21.737  454.772
-  21.737  455.772
-  21.672  454.774
-  21.606  454.776
-  21.606  455.776
-  21.541  454.778
-  21.737  458.772
-  21.541  455.778
-  21.672  458.774
-  21.606  458.776
-  21.541  457.778
-  21.541  458.778
-  21.606  460.776
-  21.541  459.778
-  21.541  460.778
-  21.737  464.772
-  21.672  464.774
-  21.606  464.776
-  21.541  463.778
-  21.541  464.778
-  21.606  466.776
-  21.541  466.778
-  21.606  468.776
diff --git a/Data/Baseline/OTB/Files/feBreakAngularPathListOutput.txt b/Data/Baseline/OTB/Files/feBreakAngularPathListOutput.txt
deleted file mode 100644
index 0f5ea993520cabcf3ff996765f2e7c2173b782cb..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/feBreakAngularPathListOutput.txt
+++ /dev/null
@@ -1,171 +0,0 @@
---------------------------------------------------------------------------
-MAX ANGULAR :0.174533(10 deg.)
-INPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
-OUTPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 3: [11, 1], [21, 11]
-Path 4: [21, 11], [31, 11]
-Path 5: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 6: [11, 1], [21, 11]
-Path 7: [21, 11], [31, 11], [41, 11]
-Path 8: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 9: [11, 1], [21, 11]
-Path 10: [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 11: [1, 11], [5, 11], [7, 11], [11, 11]
-Path 12: [11, 11], [21, 1]
-Path 13: [21, 1], [31, 1], [41, 1]
-Path 14: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 15: [11, 1], [21, 11], [31, 21], [41, 31]
-Path 16: [1, 1], [5, 1]
-Path 17: [5, 1], [5, 11], [5, 21]
-Path 18: [1, 1], [31, 1], [41, 1]
---------------------------------------------------------------------------
-MAX ANGULAR :0.349066(20 deg.)
-INPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
-OUTPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 3: [11, 1], [21, 11]
-Path 4: [21, 11], [31, 11]
-Path 5: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 6: [11, 1], [21, 11]
-Path 7: [21, 11], [31, 11], [41, 11]
-Path 8: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 9: [11, 1], [21, 11]
-Path 10: [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 11: [1, 11], [5, 11], [7, 11], [11, 11]
-Path 12: [11, 11], [21, 1]
-Path 13: [21, 1], [31, 1], [41, 1]
-Path 14: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 15: [11, 1], [21, 11], [31, 21], [41, 31]
-Path 16: [1, 1], [5, 1]
-Path 17: [5, 1], [5, 11], [5, 21]
-Path 18: [1, 1], [31, 1], [41, 1]
---------------------------------------------------------------------------
-MAX ANGULAR :0.523599(30 deg.)
-INPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
-OUTPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 3: [11, 1], [21, 11]
-Path 4: [21, 11], [31, 11]
-Path 5: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 6: [11, 1], [21, 11]
-Path 7: [21, 11], [31, 11], [41, 11]
-Path 8: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 9: [11, 1], [21, 11]
-Path 10: [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 11: [1, 11], [5, 11], [7, 11], [11, 11]
-Path 12: [11, 11], [21, 1]
-Path 13: [21, 1], [31, 1], [41, 1]
-Path 14: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 15: [11, 1], [21, 11], [31, 21], [41, 31]
-Path 16: [1, 1], [5, 1]
-Path 17: [5, 1], [5, 11], [5, 21]
-Path 18: [1, 1], [31, 1], [41, 1]
---------------------------------------------------------------------------
-MAX ANGULAR :0.872665(50 deg.)
-INPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
-OUTPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1]
-Path 8: [5, 1], [5, 11], [5, 21]
-Path 9: [1, 1], [31, 1], [41, 1]
---------------------------------------------------------------------------
-MAX ANGULAR :1.5708(90 deg.)
-INPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
-OUTPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
---------------------------------------------------------------------------
-MAX ANGULAR :2.44346(140 deg.)
-INPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
-OUTPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
---------------------------------------------------------------------------
-MAX ANGULAR :3.14159(180 deg.)
-INPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
-OUTPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1]
-Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31]
-Path 7: [1, 1], [5, 1], [5, 11], [5, 21]
-Path 8: [1, 1], [31, 1], [41, 1]
diff --git a/Data/Baseline/OTB/Files/feTvLikelihoodPathOutput.txt b/Data/Baseline/OTB/Files/feTvLikelihoodPathOutput.txt
deleted file mode 100644
index 7e18b94533e5f25319caa19feb2f28bd5c96573a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/feTvLikelihoodPathOutput.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-INPUT list of Path : 
-Path 1: [157, 335], [204, 376]
-Path 2: [21, 305], [35, 308], [77, 354], [85, 358]
-Path 3: [73, 160], [126, 173]
-OUTPUT list of Path : 
-Path 1: [157, 335], [204, 376] Value: 4.68584e-07
-Path 2: [21, 305], [35, 308], [77, 354], [85, 358] Value: 1.87363e-07
-Path 3: [73, 160], [126, 173] Value: 9.76259e-08
diff --git a/Data/Baseline/OTB/Files/feTvLinkPathOutput.txt b/Data/Baseline/OTB/Files/feTvLinkPathOutput.txt
deleted file mode 100644
index 708fabe135918d33f8ab62d9af7bba6f1b48bf2d..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/feTvLinkPathOutput.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-Maximum distance threshold: 30 (30)
-Maximum angle threshold: 0.698132 (40)
-INPUT list of Path : 
-Path 1: [1, 1], [51, 1]
-Path 2: [61, 1], [91, 1]
-Path 3: [111, 11], [211, 11]
-Path 4: [1, 51], [51, 51]
-Path 5: [71, 71], [71, 91]
-Path 6: [71, 131], [71, 201]
-Path 7: [141, 111], [101, 111]
-Path 8: [151, 111], [191, 111]
-Path 9: [111, 71], [141, 71]
-Path 10: [181, 71], [151, 71]
-Path 11: [11, 131], [11, 101]
-Path 12: [11, 171], [11, 141]
-OUTPUT list of Path : 
-Path 1: [1, 51], [51, 51]
-Path 2: [71, 71], [71, 91]
-Path 3: [71, 131], [71, 201]
-Path 4: [211, 11], [111, 11], [91, 1], [61, 1], [51, 1], [1, 1]
-Path 5: [101, 111], [141, 111], [151, 111], [191, 111]
-Path 6: [111, 71], [141, 71], [151, 71], [181, 71]
-Path 7: [11, 101], [11, 131], [11, 141], [11, 171]
diff --git a/Data/Baseline/OTB/Files/feTvRemoveTortuousPathOutput.txt b/Data/Baseline/OTB/Files/feTvRemoveTortuousPathOutput.txt
deleted file mode 100644
index fffefd4d766972197ca2a3b918db2f8e303d2fc5..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/feTvRemoveTortuousPathOutput.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Minimum Mean Distance: 10 (10)
-INPUT list of Path : 
-Path 1: [1, 1], [1, 11]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1]
-Path 3: [1, 1], [7, 7], [21, 21], [31, 31], [41, 41]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-OUTPUT list of Path : 
-Path 1: [1, 1], [7, 7], [21, 21], [31, 31], [41, 41]
diff --git a/Data/Baseline/OTB/Files/feTvSimplifyPathOutput.txt b/Data/Baseline/OTB/Files/feTvSimplifyPathOutput.txt
deleted file mode 100644
index 1da7ddfb7e7e9e2d787dcd41ac9d007c39a44af7..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/feTvSimplifyPathOutput.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-TOLERANCE: 1(1)
-INPUT list of Path : 
-Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1]
-Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [5, 5], [7, 7], [11, 11], [21, 21], [31, 31], [41, 41]
-Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11]
-OUTPUT list of Path : 
-Path 1: [1, 1], [31, 1]
-Path 2: [1, 1], [11, 1], [21, 11], [31, 11]
-Path 3: [1, 1], [41, 41]
-Path 4: [1, 1], [11, 1], [21, 11], [70, 11]
diff --git a/Data/Baseline/OTB/Files/feTvVectorizationPathListOutput.txt b/Data/Baseline/OTB/Files/feTvVectorizationPathListOutput.txt
deleted file mode 100644
index 348001835a5c6b8f4c03b9562ef9b47f41688704..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/feTvVectorizationPathListOutput.txt
+++ /dev/null
@@ -1,385 +0,0 @@
-Path 0: [523, 4], [522, 4], [521.519, 5], [521, 5.47291], [520.558, 6], [520, 6.41957], [519.517, 7], [519, 7.20893], [519, 8]
-Path 1: [666, 0], [666, 0.755514], [666.534, 1], [667, 1.54937], [668, 2], [669, 2], [670, 3], [671, 4], [671, 5], [672, 5.56069], [673, 6.5845], [673, 8], [673.481, 9], [674, 9.47953], [674.36, 10], [675, 10.6091], [675.621, 12], [676.458, 13], [677, 13.577], [677, 15], [677, 16], [677.422, 17], [678, 17.4808], [678, 18], [678.364, 19], [679, 19], [680, 19.9039]
-Path 2: [595, 4.40433], [594, 5], [593, 6.39503], [592.184, 7], [592, 7.50127], [591, 8.36608], [590, 9.17569], [589, 10], [588, 11], [587, 11], [586.346, 12], [585, 12.5495], [584.553, 14], [584, 14.5519], [583.543, 16], [583, 16.5361], [582.445, 18], [581.502, 19], [581, 19.513], [580, 20.6132], [579.468, 22], [578.542, 23], [578, 23.4978], [577.545, 24], [577, 24.5768], [576.326, 26], [575.445, 27], [574.581, 28], [574, 28.6009], [573.411, 30], [572.445, 31], [571.434, 32], [570.481, 33], [570, 34], [569.454, 35], [568.566, 36], [568, 36.5643], [567.429, 38], [566.521, 39], [566, 39.6024], [565.476, 41], [565, 42], [564.421, 43], [563.547, 44], [563, 44.543], [562, 45.6124], [561.433, 47], [561, 48], [560.393, 49], [559.581, 50], [559, 50.5958], [558.48, 52], [557.499, 53], [556.523, 54], [556, 54.5515], [555.42, 56], [555, 57], [554.467, 58], [554, 59], [553.446, 60], [552.531, 61], [552, 61.5413], [551.499, 63], [551, 64], [550.571, 65], [550, 65.5952], [549.552, 67], [549, 67.5817], [548.426, 69], [547.443, 70], [546.491, 71], [545.546, 72], [545, 72.5362], [544.436, 74], [543.477, 75], [542.467, 76], [541.449, 77], [540.513, 78], [540, 78.5659], [539.511, 80], [539, 80.5386], [538.448, 82], [537.487, 83], [536.504, 84], [536, 84.5229], [535, 85.5753], [534.473, 87], [534, 88], [533.428, 89], [532.493, 90], [531.545, 91], [531, 91.5473], [530.471, 93], [530, 94], [529.487, 95], [529, 96], [528.47, 97], [527.53, 98], [527, 98.5852], [526, 99.6065], [525.437, 101], [525, 102], [524.431, 103], [523.519, 104], [523, 104.522], [522, 105.524], [521, 106.55], [520.409, 108], [519.539, 109], [519, 109.546], [518.488, 111], [517.542, 112], [517, 112.57], [516, 113.611], [515.494, 115], [515, 116], [514.478, 117], [513.597, 118], [513, 118.568], [512.418, 120], [511.505, 121], [511, 121.593], [510.533, 123], [510, 123.522], [509.532, 125], [509, 125.535], [508.383, 127], [507.457, 128], [507, 129], [506.463, 130], [506, 131], [505.428, 132], [504.472, 133], [503.459, 134], [502.495, 135], [502, 136], [501.424, 137], [500.563, 138], [500, 138.53], [499.495, 140], [498.496, 141], [497.439, 142], [496.45, 143], [495.552, 144], [495, 144.55], [494.521, 146], [494, 146.501], [493, 147.526], [492, 148.568], [491.361, 150], [490.486, 151], [490, 152], [489.467, 153], [488.591, 154], [488, 154.596], [487.456, 156], [486.519, 157], [486, 157.591], [485.464, 159], [485, 160], [484.43, 161], [483.513, 162], [483, 162.518], [482, 163.551], [481.416, 165], [480.575, 166], [480, 166.58], [479.525, 168], [479, 168.519], [478, 169.568], [477.474, 171], [476.517, 172], [476, 172.565], [475.521, 174], [475, 174.584], [474.497, 176], [473.556, 177], [473, 177.588], [472.442, 179], [471.477, 180], [471, 181], [470.439, 182], [469.575, 183], [469, 183.578], [468.403, 185], [467.437, 186], [466.523, 187], [466, 187.574], [465.462, 189], [464.603, 190], [464, 190.593], [463.477, 192], [462.486, 193], [461.511, 194], [461, 194.557], [460.416, 196], [459.538, 197], [459, 197.547], [458.44, 199], [457.462, 200], [456.52, 201], [456, 201.543], [455.547, 203], [455, 203.535], [454.528, 205], [454, 205.47], [453.565, 206], [453, 206.526], [452, 207.595], [451.469, 209], [451, 210], [451, 211], [450.469, 212], [450, 213], [449.523, 214], [449, 214.559], [448.479, 216], [447.504, 217], [447, 217.563], [446, 218.567], [445.393, 220], [444.451, 221], [443.514, 222], [443, 222.543], [442, 223.567], [441.486, 225], [441, 226], [441, 227], [440.418, 228], [439.526, 229], [439, 229.43], [438.533, 230], [438, 230.467], [437.442, 231], [437, 232], [436.371, 233], [435.447, 234], [434.549, 235], [434, 235.55], [433, 236.579], [432, 237.609], [431.519, 239], [431, 239.544], [431, 241], [430.444, 242], [429.476, 243], [428.475, 244], [427.544, 245], [427, 245.597], [426.566, 247], [426, 247.584], [425.563, 249], [425, 249.555], [424.444, 251], [423.481, 252], [422.539, 253], [422, 253.552], [421.45, 255], [420.594, 256], [420, 256.601], [419.427, 258], [418.42, 259], [417.461, 260], [417, 261], [416.444, 262], [416, 263], [415.454, 264], [414.528, 265], [414, 265.546], [413.399, 267], [412.495, 268], [412, 269], [411.465, 270], [410.462, 271], [409.469, 272], [409, 273], [408.304, 274], [407.434, 275], [407, 276], [406.494, 277], [405.591, 278], [405, 278.578], [404.425, 280], [403.43, 281], [402.406, 282], [401.475, 283], [401, 284], [400.479, 285], [400, 286], [399.457, 287], [399, 288], [398.428, 289], [398, 290], [397.497, 291], [397, 292], [396.462, 293], [396, 294], [395.466, 295], [394.555, 296], [394, 296.644], [393, 297.65], [392.38, 299], [391.44, 300], [390.475, 301], [389.473, 302], [388.48, 303], [387.489, 304], [386.566, 305], [386, 305.582], [385.494, 307], [384.592, 308], [384, 308.591], [383.529, 310], [383, 310.566], [382.427, 312], [381.467, 313], [380.554, 314], [380, 314.589], [379.458, 316], [378.554, 317], [378, 317.506], [377, 318.589], [376, 319.614], [375.478, 321], [375, 322], [374.534, 323], [374, 323.561], [373.463, 325], [372.553, 326], [372, 326.537], [371.373, 328], [370.462, 329], [370, 330], [369.412, 331], [369, 332], [368.457, 333], [367.533, 334], [367, 334.558], [366, 335.554], [365.494, 337], [364.544, 338], [364, 338.567], [363.391, 340], [362.452, 341], [361.563, 342], [361, 342.549], [360.517, 344], [360, 344.503], [359, 345.583], [358, 346.599], [357, 347.605], [356.373, 349], [355.508, 350], [355, 350.572], [354.501, 352], [354, 352.542], [353.458, 354], [352.436, 355], [351.452, 356], [351, 357], [350.524, 358], [350, 358.496], [350, 359], [349.571, 360], [349, 360.549], [348.421, 362], [347.536, 363], [347, 363.619], [346.47, 365], [345.614, 366], [345, 366.55], [344.512, 368], [344, 368.529], [343, 369.573], [342.391, 371], [341.481, 372], [341, 373], [340.48, 374], [339.607, 375], [339, 375.466], [339, 376], [338.458, 377], [337, 377.581], [337, 379], [336.5, 380], [336, 381], [336, 382], [335.493, 383], [334.49, 384], [333.407, 385], [333, 386], [332.134, 387], [331, 387.535], [330.501, 389], [330, 389.586], [329.436, 391], [328.529, 392], [328, 392.45], [327.54, 393], [327, 393.503], [326, 394.572], [326, 396], [325.479, 397], [324.556, 398], [324, 398.589], [323.392, 400], [322.481, 401], [322, 402], [321.554, 403], [321, 403.575], [320.463, 405], [319.458, 406], [318.473, 407], [317.524, 408], [317, 408.554], [316.469, 410], [316, 411], [315.436, 412], [314.472, 413], [313.462, 414], [312.48, 415], [312, 416], [311.431, 417], [311, 418], [310.453, 419], [309.523, 420], [309, 420.48], [308.528, 421], [308, 421.51], [307, 422.548], [306.423, 424], [306, 425], [305.497, 426], [305, 427], [304.43, 428], [303.449, 429], [302.441, 430], [301.467, 431], [301, 432], [300.465, 433], [300, 434], [299.455, 435], [298.516, 436], [298, 436.49], [297.529, 437], [297, 437.48], [296.553, 438], [296, 438.55], [295.396, 440], [294.494, 441], [294, 442], [293.419, 443], [292.443, 444], [291.41, 445], [290.513, 446], [290, 446.581], [289.587, 448], [289, 448.568], [288.524, 450], [288, 450.526], [287, 451.555], [286.407, 453], [285.593, 454], [285, 454.589], [285, 456], [284.404, 457], [283.516, 458], [283, 458.556], [282.393, 460], [281.446, 461], [280.553, 462], [280, 462.554], [279.474, 464], [278.545, 465], [278, 465.531], [277, 466.552], [276, 467.568], [275, 468.603], [274.559, 470], [274, 470.531], [273.55, 472], [273, 472.543], [272.454, 474], [271.475, 475], [270.514, 476], [270, 476.597], [269.438, 478], [268.567, 479], [268, 479.532], [267.463, 481], [266.514, 482], [266, 482.493], [265.461, 483], [264.554, 484], [264, 484.59], [263.485, 486], [262.545, 487], [262, 487.511], [261, 488.558], [260.422, 490], [259.551, 491], [259, 491.58], [258.548, 493], [258, 493.545], [257.503, 495], [257, 495.531], [256, 496.569], [255.387, 498], [254.484, 499], [254, 500], [253.459, 501], [252.538, 502], [252, 502.517], [251, 503.562], [250.414, 505], [249.492, 506], [249, 507], [248.47, 508], [248, 509], [247.463, 510], [246.551, 511], [246, 511.572], [245.403, 513], [244.533, 514], [244, 514.57], [244, 516], [243.423, 517], [242.605, 518], [242, 518.531], [241.505, 520], [241, 520.46], [240.531, 521], [240, 521.522], [239, 522.615], [239, 524], [238.422, 525], [238, 526], [237.507, 527], [237, 527.554], [236.404, 529], [235.501, 530], [235, 530.581], [234.443, 532], [234, 533], [233.533, 534], [233, 534.53], [232.516, 536], [232, 536.509], [231, 537.504], [230, 538.505], [229, 539.539], [228.501, 541], [228, 541.497], [228, 542], [228, 543], [227.53, 544], [227, 544.516], [226.494, 546], [226, 547], [225.482, 548], [225, 549], [225, 550], [225, 551], [224.515, 552], [224, 552.51], [224, 554], [223.497, 555], [223, 556], [222.403, 557], [222, 558], [221.393, 559], [221, 560], [221, 561], [220.486, 562], [220, 563], [219.529, 564], [219, 564.561], [218.415, 566], [217.494, 567], [217, 568], [217, 569], [216.436, 570], [216, 571], [216, 572], [215.508, 573], [215, 573.534], [214.446, 575], [213.51, 576], [213, 576.54], [212, 577.579], [212, 579], [212, 580], [211.465, 581], [211, 582], [210.588, 583], [210, 583.55], [209.525, 585], [209, 585.53], [208, 586.596], [207.517, 588], [207, 588.591], [207, 590], [207, 591], [206.529, 592], [206, 592.505], [206, 594], [205.529, 595], [205, 595.532], [204.459, 597], [203.562, 598], [203, 598.607], [203, 600], [202.435, 601], [202, 602], [202, 603], [202, 604], [201.468, 605], [201, 606], [200.487, 607], [199.574, 608], [199, 608.581], [198.535, 610], [198, 610.571], [198, 612], [197.572, 613], [197, 613.487], [197, 614], [197, 615], [197, 616], [196.481, 617], [196, 618], [195.47, 619], [195, 620], [194.416, 621], [194, 622], [193.433, 623], [193, 624], [193, 625], [192.462, 626], [192, 627], [192, 628], [191.488, 629], [191, 630], [190.421, 631], [190, 632], [189.449, 633], [189, 634], [188.409, 635], [188, 636], [188, 637], [188, 638], [187.532, 639], [187, 639.531], [187, 641], [186.451, 642], [185.494, 643], [184.545, 644], [184, 644.566], [183.51, 646], [183, 646.54], [183, 648], [183, 649], [182.451, 650], [182, 651], [182, 652], [181.528, 653], [181, 653.542], [180.47, 655], [179.537, 656], [179, 656.539], [178.536, 658], [178, 658.538], [178, 660], [178, 661], [178, 662], [178, 663], [178, 664], [177.539, 665], [177, 665.459], [177, 666], [176.523, 667], [176, 667.545], [175.479, 669], [175, 670], [175, 671], [175, 672], [174.442, 673], [174, 674], [173.462, 675], [173, 676], [173, 677], [172.565, 678], [172, 678.505], [171, 679.533], [170.305, 681], [170, 682], [169.403, 683], [169, 684], [168.544, 685], [168, 685.535], [168, 687], [168, 688], [168, 689]
-Path 3: [510, 10], [509, 11], [508, 11], [507.425, 11], [506.563, 12], [506, 13], [506, 14], [505.388, 15], [504.551, 16], [504, 16.5955], [504, 18], [503.431, 19], [503, 20], [503, 21], [502.437, 22], [502, 23], [502, 24], [502, 25], [502.553, 26], [503.494, 27], [504, 27.4621], [504.389, 28], [505, 28.501]
-Path 4: [642, 14], [641, 15], [640, 15.2508], [639, 16], [638, 16.4707], [637, 17.3218], [635.536, 18], [634.546, 19], [634, 19.53], [633, 20.442], [632, 21.2918], [631, 22.1775], [630, 23], [629, 23.4577], [628, 24.3779], [627, 25.2208], [626, 26], [625, 26], [624.439, 27], [623.425, 28], [622.424, 29], [621.435, 30], [620.43, 31], [619.411, 32], [618.39, 33], [617.41, 34], [616.434, 35], [615.42, 36], [614.338, 37], [613, 38]
-Path 5: [505, 34], [504, 34], [504, 35], [503.679, 36], [503, 36]
-Path 6: [503, 38], [503, 38.5973], [504, 39], [504.441, 40], [505, 40.3571], [505.446, 41], [506, 41.363], [506.175, 42], [507, 42]
-Path 7: [611, 39], [610, 40], [609, 40], [608, 40.3808], [607, 41.3086], [606, 42], [605, 42.4634], [604, 43], [603.373, 44], [602.219, 45], [601, 45.376], [600.395, 46], [599.282, 47], [598.196, 48], [597, 48.5944], [596, 49.6023], [595, 50.5688], [594, 51.4515], [593.484, 52], [592.412, 53]
-Path 8: [990, 45], [989, 46], [988, 46], [987, 46.4471], [986.513, 47], [986, 47.4302], [985.459, 48], [984.427, 49], [983.423, 50], [982.291, 51], [981.047, 52], [980, 53], [979, 53]
-Path 9: [489, 47], [490, 47.4408], [490.551, 48], [491.611, 49], [493, 49.6206], [494, 50.555], [495, 51.5412], [495.606, 53], [496.612, 54], [498, 54.4771], [498.539, 55], [500, 55.5574], [501, 56.4921], [501.44, 57], [502, 57.4964], [502.423, 58], [503, 58.4437], [503.516, 59], [505, 59]
-Path 10: [485, 49], [484, 49], [483.552, 50], [483, 50.5266], [483, 52], [483, 53], [483, 54], [483, 55], [483, 56], [483, 57], [483, 58], [483, 59], [483, 60]
-Path 11: [507, 49], [507, 50], [508, 50], [509, 50], [510, 50], [511, 50], [512, 50], [513, 50.5154], [514, 51.3798], [514.522, 52], [515.124, 53], [516, 53]
-Path 12: [971, 56], [970, 57], [969, 57], [968, 57.3194], [967.37, 58], [966.245, 59], [965, 60], [964, 60.1443], [963.192, 61], [962, 61.2191], [961.287, 62], [960, 63], [959, 63.3283], [958.336, 64], [957.294, 65], [956.276, 66], [955, 66.4461], [954.493, 67], [954, 68], [954, 69], [953.319, 70], [954, 70]
-Path 13: [591, 55], [591.973, 55], [592, 56], [592.486, 57], [593, 58], [593, 59.4884], [593.541, 60], [594, 60.5082], [595, 61], [595.504, 62], [596.449, 63], [597, 63.5539], [597.563, 65], [598.464, 66], [599, 66.5251], [600, 67.4701], [600.483, 68], [601, 68.4728], [601.406, 69], [602, 69.4996], [602, 70], [602, 71], [602.605, 72], [603.435, 73], [604, 73.567], [604.542, 75], [605.486, 76], [606, 76.5382], [606.574, 78], [607.479, 79], [608, 79.5383], [608.583, 81], [609.575, 82], [610.502, 83], [611, 84], [611.506, 85], [612.457, 86], [613, 86.5307], [614, 87.5216], [615, 88.5089], [616, 89.507], [617, 90.4573], [617, 91]
-Path 14: [484, 64], [483, 64], [482, 64], [482, 65], [482, 66], [482, 67], [482, 68], [482, 69], [482.527, 70], [483, 71], [483.541, 72], [484.516, 73], [485.507, 74], [486.533, 75], [488, 75.5525], [489, 76.4689], [489.521, 77], [490.59, 78], [491.613, 79], [492.547, 80], [493.536, 81], [494.53, 82], [495.385, 83], [496, 83]
-Path 15: [707, 64], [707, 65], [708, 65.4538], [708.63, 66], [709.52, 67], [710.404, 68], [711, 68.5743], [712, 69.5566], [713, 70.528], [713.449, 72], [714, 72.5332], [714, 74], [714, 75], [714.485, 76], [715, 76.5332], [715, 78], [715.576, 79], [716.481, 80], [717, 80.5386], [718, 81.489], [718.457, 82], [719, 82.4006], [719.455, 83], [720, 83.3214], [720.522, 84], [722, 84.6336], [723, 85.5792], [724, 86.5779], [724.535, 88], [725.46, 89], [726, 89.5325], [727, 90.6372], [727.604, 92], [728.528, 93], [729, 94], [729.483, 95], [730, 95.4749], [730, 96], [730.484, 97], [731, 97.4849], [731.498, 98], [732, 98.5137], [733, 99.5066], [734, 100.518], [734.407, 102], [735, 102.556], [735.435, 104], [736, 104.453], [736.498, 105], [737, 105.577], [738, 106.589], [739, 107.52], [740, 108.522], [740.438, 110], [741, 110.511], [741.57, 112], [742.587, 113], [743.583, 114], [744.496, 115], [745, 115.528], [745.467, 117], [746, 117.496], [746, 118], [746.441, 119], [747, 119.532], [747.652, 121], [748.625, 122], [749.519, 123], [750, 124], [750.408, 125], [751, 125.511], [751, 127], [751.467, 128], [752, 128.55], [752.644, 130], [753.575, 131], [754, 132], [754.581, 133], [755, 134], [755.436, 135], [756, 135.525], [756, 137], [756.512, 138], [757.381, 139], [758, 139.574], [759, 140], [760, 140.646], [760.638, 142], [761, 143], [761, 144], [761, 145], [761.488, 146], [762, 146.525], [762, 148], [762.465, 149], [763, 149.348], [763, 150], [763, 151]
-Path 16: [672, 46], [671, 46], [670.443, 46], [670, 47], [670, 48], [670, 48.5163], [669.361, 49], [668.504, 50], [667.518, 51], [667, 51.5256], [666.5, 52], [666, 53.2553], [665, 54.305], [664, 55.3581], [663, 56.3897], [662, 57.422], [661, 58.4103], [660, 59.3781], [659, 60.3729], [658, 61.3878], [657, 62.3898], [656, 63.3312], [655, 64.3194], [654, 65.2902], [653, 66], [652, 66.4119], [651, 67.39], [650, 68.3058], [649, 69.2107], [648, 70.1546], [647, 71], [646, 71.3576], [645, 72.3707], [644, 73.269], [643, 74.1505], [642, 75], [641, 75.2232], [640, 76], [639, 77], [638, 77.1274], [637, 78.0313], [636, 79], [635, 79], [634.364, 80], [633.338, 81], [632.279, 82], [631.214, 83]
-Path 17: [930, 80], [929, 80], [928.063, 81], [927, 81.119], [926.169, 82], [925, 83], [924, 83.1902], [923.234, 84], [922.116, 85], [921, 85.226], [920.294, 86], [919.179, 87], [918, 87.3218], [917.372, 88], [916.319, 89], [915, 90], [914, 90], [913, 91]
-Path 18: [629, 84], [628, 85], [627, 85.3951], [626, 86], [625.345, 87], [624.279, 88], [623.199, 89], [622, 89.395], [621.445, 90], [620.422, 91], [620, 92]
-Path 19: [495, 87], [496, 87], [496, 88], [496, 89], [496, 90], [496.395, 91], [497, 91.6102], [497.59, 93], [499, 93.5676], [500, 94.5229], [501, 95.4706], [501.464, 96], [502, 96.4806], [502, 97], [502.345, 98], [503, 98], [504, 99], [505, 100], [506, 100]
-Path 20: [515, 92], [514, 92.4075], [513, 93], [512.551, 94], [512, 94.5286], [512, 96], [511.522, 97], [511, 97.5398], [510, 98.509], [509, 99.3715], [509, 100]
-Path 21: [908, 93], [907, 94], [906, 94], [905, 95], [904, 95], [903, 96], [902, 96], [901, 97], [900, 97.182], [899.275, 98], [898, 98.259], [897.304, 99], [896, 100], [895, 101], [894, 101], [893, 102], [892, 102.095], [891.158, 103], [890, 103.1], [889.155, 104], [888, 105]
-Path 22: [501, 103], [500, 103], [500, 104], [500, 105], [499.516, 106], [499, 106]
-Path 23: [881, 108], [880, 108], [879, 109], [878, 110], [877, 110], [876, 110.124], [875.18, 111]
-Path 24: [870, 113], [869, 114], [868, 114], [867.166, 115], [866, 115.255], [865.318, 116], [864, 117]
-Path 25: [862, 118], [861, 119], [860, 119], [859, 119.386], [858.375, 120], [857.34, 121], [856.205, 122], [855, 122.31], [854.376, 123], [853.077, 124], [852, 125], [851, 125], [850, 126], [849, 126.026], [848.025, 127], [847, 127.198], [846.254, 128], [845, 129], [844, 129], [843, 130], [842, 130], [841, 131], [840, 131.148], [839.149, 132], [838, 133], [837, 133], [836, 134], [835, 134.129], [834.206, 135], [833, 135.452], [832.362, 136], [831.039, 137], [830, 137], [829, 138], [828, 138], [827, 139], [826, 139], [825, 140], [824, 141], [823, 141], [822, 141.324], [821.306, 142], [820, 143], [819, 143]
-Path 26: [493, 123], [492, 123], [492, 124], [492, 125], [491.451, 126], [490.622, 127], [490, 127]
-Path 27: [485, 131], [484, 131], [484, 132], [484, 133.354], [484.592, 134], [485, 135], [486, 135]
-Path 28: [484, 140], [483, 140], [482, 140], [482, 141], [481.633, 142], [481, 142.468], [481, 143], [481, 144], [480.416, 145], [479.413, 146], [478.418, 147], [477.43, 148], [476.417, 149], [475.415, 150], [474.409, 151], [473.313, 152], [472.096, 153], [471, 153.199], [470.254, 154], [469.136, 155], [468.389, 156], [468, 157], [467.447, 158], [466.29, 159], [465.367, 160], [465, 161], [464.515, 162], [464, 162.439], [464, 163]
-Path 29: [431, 141], [431, 142], [432, 142.364], [432.329, 143], [433, 143.417], [433, 144]
-Path 30: [815, 145], [814, 145], [813, 145], [812.496, 146], [811.509, 147], [811, 147.506], [810, 148.401], [809.403, 149], [808.313, 150], [807.226, 151], [806, 151.43], [805.417, 152], [804.295, 153], [803, 154], [802, 154], [801, 155], [800, 155], [799, 156], [798, 156.03], [797.05, 157], [796, 157.262], [795.398, 158], [794.207, 159]
-Path 31: [763, 164], [763.678, 164], [764, 165.394], [765, 166], [766.49, 166], [767, 166.51], [768, 167], [768.599, 168]
-Path 32: [463, 170], [461.567, 170], [461, 171], [461, 172], [461, 172.536], [460, 173], [459.575, 174], [459, 174.572], [458.589, 176], [458, 176.501], [457.601, 178], [457, 178.488], [456.55, 179], [456, 179.343], [456, 180]
-Path 33: [768, 174], [767, 174], [766, 174], [766, 175], [765.575, 176], [765, 176.545], [764.442, 178], [764, 179], [764, 180], [763.524, 181], [763, 181.458], [763, 182], [763, 183], [763, 184], [763, 185], [763, 186], [762.543, 187], [762, 187.434], [762, 188], [762, 189], [762, 190], [762, 191], [762, 192], [762, 193]
-Path 34: [452, 183], [451, 183], [450, 183], [449.408, 184], [449, 185], [448.201, 186], [447, 186]
-Path 35: [805, 171], [805, 171.509], [805.642, 172], [806, 173.407], [806.727, 174], [807, 175], [807, 175.538], [807.552, 176], [808, 177.412], [809, 178.473], [809.502, 179], [810.414, 180], [811, 181], [811.477, 182], [812, 183], [812.501, 184], [813, 185], [813.528, 186], [814, 187], [814.585, 188], [815.443, 189], [816, 189.567], [816.515, 191], [817, 192], [817.583, 193], [818.447, 194], [819, 194.574], [820, 195.609], [820.594, 197], [821.463, 198], [822, 198.576], [822.444, 200], [823, 200.592], [823.477, 202], [824, 202.494], [824.4, 203], [825, 203.53], [826, 204.566], [826.566, 206], [827.574, 207], [828.537, 208], [829.443, 209], [830, 209.566], [830.572, 211], [831.443, 212], [832, 212.572], [832.447, 214], [833, 214.562], [833.55, 216], [834, 217], [834.56, 218], [835.406, 219], [836, 219.6], [836.513, 221], [837, 222], [837.548, 223], [838.373, 224], [839, 224.577], [839.604, 226], [840.498, 227], [841, 227.597], [841.483, 229], [842, 229.539], [842.532, 231], [843.371, 232], [844, 232.615], [844.503, 234], [845, 235], [845.634, 236], [846.416, 237], [847, 237.604], [847.47, 239], [848, 239.529], [848.577, 241], [849.485, 242], [850, 242.558], [850.54, 244], [851, 245], [851.528, 246], [852.371, 247], [853, 247.604], [853.518, 249], [854.427, 250], [855, 250.555], [855.463, 252], [856, 252.56], [856.41, 254], [857, 254.658], [857.564, 256], [858.486, 257], [859, 257.553], [859.506, 259], [860, 260], [860.588, 261], [861.45, 262], [862, 262.538], [863, 263.627], [863.555, 265], [864.478, 266], [865, 266.543], [865.574, 268], [866.464, 269], [867, 269.56], [868, 270.61], [868.506, 272], [869, 273], [869.575, 274], [870.417, 275], [871, 275.566], [871.586, 277], [872.478, 278], [873, 278.533], [874, 279.593], [874.525, 281], [875.398, 282], [876, 282.596], [876.494, 284], [877, 284.513], [878, 285.573], [878.525, 287], [879.393, 288], [880, 288.587], [880.476, 290], [881, 290.575], [882, 291.606], [882.563, 293], [883.469, 294], [884, 294.56], [884.498, 296], [885, 296.524], [885.584, 298], [886.47, 299], [887, 299.543], [888, 300.578], [888.575, 302], [889, 303], [889.56, 304], [890, 305], [890.515, 306], [891.37, 307], [892, 307.532], [892.547, 309], [893.515, 310], [894, 311], [894.582, 312], [895.484, 313], [896, 313.544], [897, 314.587], [897.56, 316], [898.394, 317], [899, 317.596], [899.4, 319], [900, 319.592], [900.475, 321], [901, 321.531], [902, 322.57], [902.607, 324], [903.512, 325], [904.378, 326], [905, 326.586], [905.466, 328], [906, 328.548], [907, 329.588], [907.587, 331], [908.506, 332], [909.393, 333], [910, 333.623], [910.529, 335], [911.458, 336], [912, 336.552], [913, 337.621], [913.629, 339], [914.552, 340], [915, 341], [915.586, 342], [916.42, 343], [917, 343.559], [917.585, 345], [918.553, 346], [919.459, 347], [920, 347.557], [920.474, 349], [921, 349.565], [921.518, 351], [922.485, 352], [923, 352.472], [923.495, 353], [924, 353.51], [925, 354.546], [926, 355.578], [926.421, 357], [927, 357.582], [927.402, 359], [928, 359.61], [928.423, 361], [929, 361.572], [929.45, 363], [930, 363.543], [930.481, 365], [931, 365.522], [932, 366.566], [932.553, 368], [933.357, 369], [934, 369.6], [934.514, 371], [935.354, 372], [936, 372.592], [936.451, 374], [937, 374.593], [937.46, 376], [938, 376.587], [938.464, 378], [939, 378.564], [939.375, 380], [940, 380.563], [940.324, 382], [941, 382.489], [941, 383]
-Path 36: [445, 189], [445.505, 190], [446, 191], [446, 192], [446, 193], [446, 194], [446, 195], [446, 196]
-Path 37: [762, 198.366], [761, 199.436], [760.488, 200], [760, 201], [760, 202], [760, 203], [760, 203.549], [759.419, 204], [759, 205], [759, 206], [759, 207], [759, 208], [759, 209], [759, 210], [759, 211]
-Path 38: [422, 207], [422.631, 207], [423, 208], [424, 208.534], [424, 210], [424.03, 211], [425, 211]
-Path 39: [433, 218], [432, 218], [431, 218], [430.445, 219], [429.578, 220], [429, 220.279], [429, 221]
-Path 40: [759, 218], [759, 219], [759, 220], [759, 221], [759, 222], [759, 223], [758.518, 224], [758, 224.473], [758, 225], [757.523, 226], [757, 226.61], [756.528, 228], [756, 228.521], [756, 230], [755.437, 231], [755, 232], [755, 233], [755, 234], [754.48, 235], [754, 236], [754, 237], [754, 238], [754, 239], [754, 240], [754, 241], [754, 242], [753.537, 243], [753, 243.526], [753, 245], [753, 246], [753, 247], [753, 248], [753, 249], [753, 250], [752.51, 251], [752, 251.517], [752, 253], [751.561, 254], [751, 254.547], [751, 256], [751, 257], [750.55, 258], [750, 258.48], [750, 259], [750, 260], [749.339, 261], [749, 262], [749, 263], [749, 264], [749, 265], [748.446, 266], [748, 267], [748, 268], [748, 269], [748, 270], [748, 271], [748, 272], [748, 273], [748, 274], [748, 275], [747.515, 276], [747, 276.499], [747, 277], [747, 278], [746.456, 279], [746, 280], [746, 281], [746, 282], [746, 283], [746, 284], [746, 285], [745.44, 286], [744.374, 287]
-Path 41: [422, 230], [421, 230], [420, 230], [420, 231], [420, 232]
-Path 42: [413, 239], [412, 239], [411, 239], [410, 239], [410, 240]
-Path 43: [407, 246], [407.314, 247], [408, 247.209], [408.441, 248], [409, 248]
-Path 44: [404, 260], [403, 260], [402, 260], [401.447, 261], [400.519, 262], [400, 262.54], [399, 263.56], [398.5, 265], [398, 266], [398, 267], [397.47, 268], [397, 269], [396.504, 270], [396, 270.357], [395.631, 271], [395, 271]
-Path 45: [378, 290], [377, 290], [376.42, 291], [376, 292], [376, 293], [376, 294], [375.654, 295], [375, 295]
-Path 46: [745, 289], [744.016, 289], [744, 289.55], [743, 290], [743, 291], [743, 292], [743, 293], [743, 294], [743, 295], [743, 296], [743, 297], [743, 298], [743, 299], [743, 300], [743, 301], [743, 302]
-Path 47: [743, 308], [742, 308], [741.49, 309], [741, 310], [741, 311], [741, 312], [741, 313], [741, 314], [740.314, 315], [740, 316], [739.336, 317], [739, 318], [739, 319], [739, 320], [739, 321], [738.488, 322], [738, 323], [738, 324], [738, 325], [738, 326], [738, 327], [738, 328], [738, 329], [738, 330], [738, 331], [738, 332]
-Path 48: [358, 317], [358.472, 318], [359, 318.322], [359, 319]
-Path 49: [351, 334], [350, 334], [350, 335], [350, 336], [350.524, 337], [351, 338], [351, 339]
-Path 50: [738, 340], [738, 341], [737.457, 342], [737, 343], [737, 344], [736.58, 345], [736, 345.429], [736, 346], [736, 347], [735.491, 348], [735, 349], [734.454, 350], [734, 351], [734, 352], [734, 353], [734, 354], [734, 355], [734, 356], [734, 357], [734, 358], [734, 359], [734, 360], [734, 361], [734, 362], [734, 363], [734, 364], [734, 365], [734, 366]
-Path 51: [336, 352], [336.451, 352.764], [337, 353.078], [337, 354]
-Path 52: [997, 362], [996, 362], [995, 362], [994.324, 363], [993.131, 364], [992, 365], [991, 365.221], [990.217, 366], [989, 366.382], [988.373, 367], [987.25, 368], [986, 369], [985, 369], [984, 370], [983, 370.013], [982.023, 371], [981, 372], [980, 372], [979, 373], [978, 373], [977, 374], [976, 374.024], [975.039, 375], [974, 375.029], [973.052, 376], [972, 377], [971, 377], [970, 378], [969, 378.056], [968.064, 379], [967, 379.225], [966.276, 380], [965, 381], [964, 381], [963, 382], [962, 382.151], [961.183, 383], [960, 384], [959, 384], [958, 385], [957, 385.157], [956.214, 386], [955, 387], [954, 387], [953, 388], [952, 388], [951, 389], [950, 389.023], [949.032, 390], [948, 390.025], [947.059, 391]
-Path 53: [337, 362], [336, 362.058], [335, 363], [334, 363], [333.219, 364], [332.131, 365], [332, 366], [332, 367], [332, 368], [332.497, 369], [333, 369.346], [333, 370]
-Path 54: [734, 372], [734, 373], [733.51, 374], [733, 374.494], [733, 375], [733, 376], [733, 377], [732.499, 378], [732, 379], [732, 380], [732, 381], [732, 382], [732, 383], [732, 384], [731.481, 385], [731, 386], [731, 387], [731, 388], [731, 389], [730.539, 390], [730, 390.528], [730, 392], [730, 393], [730, 394], [730, 395], [729.524, 396], [729, 396.507], [729, 398], [729, 399], [729, 400], [729, 401], [729, 402], [729, 403], [728.47, 404], [728, 405], [728, 406], [728, 407]
-Path 55: [321, 381], [320, 381], [320, 382], [320, 383], [320.475, 384], [321, 384.516], [321, 386], [321, 387]
-Path 56: [945, 392], [944, 393], [943, 394.196], [942, 395], [941, 395.398], [940, 396.215], [939.244, 397], [939, 398], [938, 399], [937, 399], [936, 400], [935, 400.227], [934, 401], [933, 402], [932, 402], [931, 403], [930, 403.275], [929, 404.204], [928, 405], [927, 405], [926.371, 406], [925.109, 407], [924, 408], [923, 408.079], [922.104, 409], [921, 409.379], [920.374, 410], [919.299, 411], [918, 412]
-Path 57: [727, 409], [728, 409], [728, 410], [728, 411], [728, 412], [728, 413], [728.336, 414], [729, 414]
-Path 58: [297, 415], [297.468, 416], [298, 416.466], [298, 417], [298.467, 418], [299, 418.341], [299, 419], [299, 420], [299, 421]
-Path 59: [728, 419], [728, 420], [728, 421], [728, 422], [728, 423]
-Path 60: [916, 413], [915, 414], [914, 414.101], [913, 415], [912, 416], [911, 416.242], [910, 417], [909, 417.294], [908, 418.145], [907, 419], [906, 419.374], [905, 420.266], [904, 421], [903, 421], [902.379, 422], [901.239, 423], [900, 424], [899, 424.239], [898.265, 425], [897.177, 426], [896, 426.314], [895.351, 427], [894.105, 428], [893, 428.205], [892.261, 429], [891.015, 430], [890, 430.331], [889.331, 431], [888.284, 432], [887, 432.405], [886.399, 433], [885.299, 434], [884.133, 435], [883, 435.399], [882.383, 436], [881.336, 437], [880, 437.427], [879.392, 438], [878.308, 439], [877.219, 440], [876, 440.42], [875.446, 441], [874.411, 442], [873.326, 443], [872, 444], [871, 444], [870, 445], [869, 445.202], [868.22, 446], [867, 446.448], [866.376, 447], [865.288, 448], [864, 449], [863, 449.346], [862.338, 450], [861.332, 451], [860.266, 452], [859, 453], [858, 453.292], [857.327, 454], [856.173, 455], [855, 455.372], [854.359, 456], [853.256, 457], [852, 457.3], [851.339, 458], [850, 459], [849, 459.192], [848.227, 460], [847, 460.41], [846.416, 461], [845.328, 462], [844.105, 463], [843, 463.103], [842.183, 464], [841, 465], [840, 466], [839, 466.385], [838.321, 467], [837, 467.476], [836.455, 468], [835.378, 469], [834.288, 470], [833, 470.496], [832.431, 471], [831.369, 472], [830.239, 473], [829, 474], [828, 474.051], [827.069, 475], [826, 476], [825, 476], [824, 477], [823, 477], [822, 478]
-Path 61: [728, 429], [727, 429], [727, 430], [727, 431], [727, 432], [727, 433], [727, 434], [727, 435], [727, 436], [727, 437], [727, 438], [727, 439]
-Path 62: [997, 444], [996, 444], [995, 444], [994.422, 445], [993.411, 446], [992.38, 447], [991.3, 448], [990, 448.498], [989.491, 449], [988.457, 450], [987.425, 451], [986.415, 452], [985.444, 453], [984.535, 454], [984, 454.549], [983, 455.6], [982.455, 457], [981.499, 458], [980.512, 459], [980, 459.466], [979.587, 460], [979, 460.538], [978.521, 462], [978, 462.48], [977.491, 463], [976.436, 464], [976, 465], [975.24, 466], [974, 466.311], [973.335, 467], [972.266, 468], [971.232, 469], [970, 469.438], [969.436, 470], [968.465, 471], [967.427, 472], [966.387, 473], [965.449, 474], [964.433, 475], [963.302, 476], [962.072, 477], [961, 478], [960, 478], [959, 479], [958, 479.172], [957.206, 480], [956, 480.387], [955.363, 481], [954.342, 482], [953.295, 483], [952.278, 484], [951, 484.412], [950.455, 485], [949.403, 486], [948.38, 487], [947.341, 488], [946.256, 489], [945.182, 490], [944, 490.381], [943.336, 491], [942.31, 492], [941.251, 493], [940, 493.371], [939.41, 494], [938.409, 495], [937.393, 496], [936.36, 497], [935.291, 498], [934.246, 499], [933.183, 500], [932, 501], [931, 502], [930, 502.269], [929.229, 503], [928.176, 504], [927, 504.409], [926.43, 505], [925.399, 506], [924.36, 507], [923.338, 508], [922.354, 509], [921, 509.383], [920.374, 510], [920, 511], [919, 512], [918, 512.115], [917.119, 513], [916.117, 514], [915, 514.311], [914.351, 515], [913.29, 516], [912.303, 517], [911, 517.435], [910.461, 518], [909.437, 519], [908.322, 520], [907.239, 521], [906.204, 522], [905, 522.391], [904.427, 523], [903.338, 524], [902.286, 525], [901.064, 526], [900, 526.371], [899.311, 527], [898.317, 528], [897, 528.457], [897, 529], [896.228, 530], [895, 530.334], [894.406, 531], [893.277, 532], [892.17, 533], [891, 534], [890, 535], [889, 535.394], [888.365, 536], [887.325, 537], [886.318, 538], [885.107, 539], [884, 540], [883, 541], [882, 541], [881, 541.4], [880.418, 542], [879.368, 543], [878.332, 544], [877, 544.569], [876, 545.575], [875, 546.505], [874.248, 548], [873, 548.442], [872.481, 549], [871.416, 550], [870.375, 551], [869.406, 552], [868.423, 553], [867.416, 554], [866.399, 555], [865.362, 556], [864.31, 557], [863.295, 558], [862.151, 559], [861, 559.332], [860.337, 560], [859.314, 561], [858.31, 562], [857, 562.384], [856.385, 563], [855.381, 564], [854.397, 565], [853.343, 566], [852.307, 567], [851.29, 568], [850, 568.48], [849.467, 569], [848.44, 570], [847.394, 571], [846.383, 572], [845.32, 573], [844.277, 574], [843.253, 575], [842, 575.435], [841.421, 576], [840.415, 577], [839.404, 578], [838.374, 579], [837.356, 580], [836.345, 581], [835.273, 582], [834.204, 583], [833, 583.382], [832.35, 584], [831.328, 585], [830.296, 586], [829.215, 587], [828, 587.331], [827.327, 588], [826.253, 589], [825.121, 590], [824, 590.323], [823.338, 591], [822.272, 592], [821, 592.496], [820.52, 593], [820, 593.514], [819, 594.484], [818.437, 595], [817.336, 596], [816.282, 597], [815.21, 598], [814, 598.317], [813.397, 599], [812.264, 600], [811, 601], [810, 602], [809, 602]
-Path 63: [275, 455], [275, 456], [275, 457], [275, 458]
-Path 64: [728, 469], [728, 469.715], [729, 470], [729, 471], [729.565, 472], [730.454, 473], [731, 473.472], [731.429, 474], [732, 474.431], [732.438, 475], [733, 475.536], [734, 476.628], [734.507, 478], [735.313, 479], [736, 479.066], [736, 480]
-Path 65: [721, 473.455], [720.483, 474], [720, 475], [720, 476.399], [719.428, 477], [719, 478], [718, 478]
-Path 66: [729, 487], [729, 488], [730, 488], [731, 488], [732, 488]
-Path 67: [715, 497], [714, 497], [714, 498], [713.476, 499], [712.491, 500], [711, 500.568], [710, 502], [709.022, 503], [708, 503.506], [707.501, 505], [707, 505.488], [707, 506], [707, 507], [706.459, 508], [705.556, 509], [705, 509.449], [704.523, 510], [704, 510.605], [703.46, 512], [703, 513], [703, 514], [703, 515], [702.473, 516], [702, 517], [701.597, 518], [701, 518.401], [700.562, 519], [700, 519.532], [699.412, 521], [699, 522], [698.445, 523], [698, 524]
-Path 68: [241, 503], [240, 503.405], [239, 504], [239, 505], [239, 506], [239, 507], [239.124, 508], [240, 508]
-Path 69: [228, 509], [229, 509.504], [230, 510], [231, 510]
-Path 70: [613, 516], [613.679, 517], [614.353, 518], [615, 518.682], [615.448, 520], [616, 520.439], [616.364, 521], [617, 521.464], [617, 522]
-Path 71: [233, 516], [232, 516.213], [231, 517], [230, 517], [230, 518], [230, 519]
-Path 72: [635, 519], [636, 519.308], [636.157, 520], [637, 520], [638, 520]
-Path 73: [225, 528], [225, 529], [225.353, 530], [226, 530.391], [226, 531]
-Path 74: [214, 543], [214.456, 544], [215, 544.527], [216, 545.439], [216, 546], [216.497, 547], [217, 547.52], [217.224, 549], [218, 549.177], [218, 550]
-Path 75: [695, 539], [694, 539], [693.456, 539], [693, 540], [693, 541], [693, 542], [692.515, 543], [692, 544], [692, 545], [692, 546], [692, 547], [691.555, 548], [691, 548.506], [691, 550], [691, 551], [691, 552], [691, 553], [691.527, 554]
-Path 76: [559, 557], [559, 558], [559.487, 559], [560, 559.546], [560.113, 561], [561, 561]
-Path 77: [208, 565], [208.47, 566], [209, 566.389], [209, 567], [209, 568]
-Path 78: [784, 583], [785, 583], [786, 583], [787, 583.415], [788, 584.483], [789, 585.448], [790, 586], [791.477, 586], [792, 586.534], [793, 587], [794, 587], [795, 587], [796, 587], [797.469, 587], [798.475, 588], [799, 589], [799.567, 590], [800, 591], [800.572, 592], [801.448, 593], [802, 593.611], [802.541, 595], [803.463, 596], [804, 596.54], [805, 597.532], [806, 598.538]
-Path 79: [780, 585], [779.489, 585], [779, 586], [779, 587], [779, 588], [779, 589], [778.507, 590], [778, 591], [777.58, 592], [777, 592.634], [776.418, 594], [775.491, 595], [774.519, 596], [774, 596.562], [773, 597.566], [772, 598.514], [771, 599.482], [771, 600], [770.462, 601], [769.484, 602], [768.471, 603], [767.447, 604], [766.46, 605], [765.492, 606], [764.507, 607], [764, 607.562], [763, 608.59], [762, 609.569], [761, 610.527], [760.342, 612], [759, 612.42], [758.429, 613], [757.356, 614], [756.075, 615]
-Path 80: [542, 598], [541, 598], [540, 598], [539.421, 599], [538.344, 600], [537.223, 601], [537, 602]
-Path 81: [546, 593], [546.431, 594], [547, 595.301], [548, 596.374], [548.614, 597], [549, 597.526], [549.502, 598], [550.386, 599], [551, 600.419], [552, 601], [552.498, 602], [553, 602.476], [553.377, 603], [554, 603.599], [554, 605], [554.48, 606], [555, 606.475], [555, 607], [555.651, 608], [556.542, 609], [557.464, 610], [558, 610.537], [559, 611.568], [559.608, 613], [560, 614], [560.584, 615], [561.548, 616], [562.521, 617], [563.515, 618], [564.398, 619], [565, 619.653], [565.543, 621], [566.464, 622], [567, 622.555], [568, 623.593], [568.652, 625], [569.591, 626], [570.501, 627], [571.369, 628], [572, 628.53], [572.662, 630], [574, 630.673], [575, 631.644], [575.205, 633], [576, 633]
-Path 82: [797, 599], [797, 600], [797, 601], [797.485, 602], [798, 602.57], [798.402, 604], [799, 604.616], [799.431, 606], [800, 606.637], [800.417, 608], [801, 608.635], [801, 610], [801.597, 611], [802, 612], [802.501, 613], [803, 614], [803.428, 615], [804, 615.618], [804, 617], [804.648, 618], [805, 619]
-Path 83: [713, 598], [713.515, 598], [714, 598.573], [714.596, 599], [715.454, 600], [716.287, 601], [717, 602], [717, 602.628], [718, 603], [718.454, 604], [719, 604.489], [719, 605], [719.418, 606], [720, 606], [721, 606], [722, 607], [722.571, 608], [724, 608.455], [724.468, 609], [725, 609.437], [725.588, 610], [727, 610.601], [728, 611], [729, 611.545], [730, 612], [731, 612], [732, 612.477], [732.471, 613], [733, 613.435], [733.497, 614], [734, 614.458], [734, 615]
-Path 84: [809, 604], [809, 605], [809.609, 606], [810, 607], [810.512, 608], [811, 609], [811.482, 610], [812, 610.546], [812.457, 612], [813, 612.562], [813.432, 614], [814, 614.584], [814, 616], [814.526, 617], [815, 618], [815.506, 619], [816, 620], [816.488, 621], [817, 621.571], [817.46, 623], [818, 623.606], [818, 625], [818.574, 626], [819, 627], [819.553, 628], [820, 629], [820.521, 630], [821, 631], [821.491, 632], [822, 632.571], [822.461, 634], [823, 634.562], [823.459, 636], [824, 636.566], [824.433, 638], [825, 638.552], [825.446, 640], [826, 640.568], [826.422, 642], [827, 642.592], [827.397, 644], [828, 644.586], [828, 646], [828.538, 647], [829, 648], [829.523, 649], [830, 650], [830.554, 651], [831, 652], [831.531, 653], [832.402, 654], [833, 654.583], [833.451, 656], [834, 656.598], [834.415, 658], [835, 658.543], [835.495, 660], [836, 660.558], [836.477, 662], [837, 662.571], [837.442, 664], [838, 664.521], [838.487, 666], [839, 666.514], [840, 667.561], [840.484, 669], [841, 669.493], [841, 670], [841, 671]
-Path 85: [789, 604], [788, 604], [787, 605], [786, 605], [785, 606], [784, 606], [783, 607], [782, 607], [781, 608], [780, 608], [779, 609], [778, 609]
-Path 86: [775, 609], [774, 609], [773, 610], [773, 611], [774, 612]
-Path 87: [535, 603], [534.268, 603], [534, 604.011], [533, 605], [532, 605.013], [531, 606.147], [530, 607.244], [529, 608], [528, 608.374], [527, 609.348], [526, 610.33], [525, 611.279], [524, 612.219], [523, 613.134], [522, 614], [521, 614], [520.305, 615], [519.28, 616], [518.285, 617], [517.249, 618], [516.241, 619], [515, 619.267], [514.312, 620], [513.253, 621], [513, 622], [512, 623], [511, 623.142], [510.15, 624], [509, 624.329], [508.341, 625], [507.313, 626], [506.348, 627], [505.314, 628], [504.316, 629], [503.244, 630], [502, 630.239], [501.265, 631], [500.196, 632], [499.238, 633], [498.222, 634], [497, 634.32], [496.331, 635], [495.302, 636], [494.239, 637], [493.159, 638], [492.142, 639], [491, 639.296], [490.277, 640], [489.248, 641], [488.147, 642], [487, 642.245], [486.324, 643], [485.263, 644], [484.218, 645], [483.167, 646], [482, 646.24], [481.409, 647], [480.32, 648], [479.275, 649], [478.295, 650], [477.194, 651], [476.098, 652], [475, 652.251], [474.262, 653], [473.193, 654], [472.158, 655], [471, 655.302], [470.32, 656], [469.331, 657], [468.338, 658], [467.253, 659], [466.195, 660], [465.108, 661], [464, 661.266], [463.248, 662], [462.248, 663], [461.222, 664], [460.159, 665], [459.159, 666], [458, 666.16], [457.235, 667], [456.18, 668], [455, 668.32], [454.304, 669], [453.274, 670], [452.211, 671], [451.227, 672], [450.17, 673], [449, 673.272], [448.385, 674], [447.34, 675], [446.347, 676], [445.151, 677], [444.127, 678], [443.067, 679], [442, 680], [441, 680.104], [440.153, 681], [439.088, 682], [438.037, 683], [437, 683.269], [436.267, 684], [435.232, 685], [434.088, 686], [433, 686.277], [432.335, 687], [431.268, 688], [430.199, 689], [429.154, 690], [428, 690.2], [427.217, 691], [426.14, 692], [425, 692.307], [424.532, 693], [424, 693.253], [423.485, 694], [423, 695], [422, 696], [421.104, 697], [420, 697], [419, 698]
-Path 88: [775, 616], [776, 617], [776.409, 618], [777, 618.57], [777.258, 620], [778, 620.605], [778, 622], [778.479, 623], [779, 623.608], [779.436, 625], [780, 625.622], [780, 627], [780.551, 628], [781, 629], [781.491, 630], [782, 630.459], [782, 631]
-Path 89: [750, 617], [750, 617.915], [751, 618], [751.544, 619], [752.545, 620], [754, 620.586], [755, 621.459], [755.54, 622], [757, 622.494], [757.475, 623], [758, 623], [759, 623.518], [760, 624], [761, 624]
-Path 90: [767, 619], [767, 619.815], [767.662, 620], [768, 620.539], [769, 621], [769.475, 622], [770, 622], [771, 622], [772, 622.755], [772.643, 624], [773.364, 625], [774, 625.623]
-Path 91: [806.094, 622], [807, 623], [807, 624], [807.645, 625], [808, 626], [808.611, 627], [809, 628], [809.533, 629], [810, 630], [810.409, 631], [811, 631.609], [811, 633], [811.658, 634], [812, 635], [812.621, 636], [813, 637]
-Path 92: [542, 621], [542, 621.502], [542.586, 622], [543, 623], [543, 623.551], [543.598, 624], [544, 625], [545, 625.42], [545.543, 626], [546, 627], [547, 628], [547.417, 629], [548, 629.582], [548.53, 631], [549, 632], [549.635, 633]
-Path 93: [540, 623], [539, 623], [538, 623.294], [537, 624.256], [536, 625.15], [535, 626], [534, 627], [533, 628], [532, 628], [531, 628], [530.31, 629], [530, 630], [529, 631], [528, 631.189], [527.223, 632], [526.167, 633], [525.152, 634], [524, 634.287], [523.289, 635], [522.252, 636], [521.223, 637], [520, 637.351], [519.406, 638], [518.372, 639], [518, 640], [517.152, 641], [516, 641.233], [515.319, 642], [514.286, 643], [513.104, 644], [512.132, 645], [511, 645.198], [511, 646]
-Path 94: [773, 629], [773, 630], [773.582, 631], [774, 632], [774.508, 633], [775, 634], [775.458, 635], [776, 635.569], [776, 637], [776, 638], [776.51, 639], [777, 640], [777.463, 641], [778, 641.436], [778.545, 642], [779.535, 643], [780, 644], [780, 645], [780.581, 646], [781, 647], [781.541, 648], [782, 649], [782.496, 650], [783, 650.575], [783.465, 652], [784, 652.578], [784, 654], [784.487, 655], [785, 655.478], [785, 656], [785.335, 657], [786, 657.494], [786, 658], [786, 659], [786.513, 660], [787, 661], [788, 662], [788, 663]
-Path 95: [535, 614], [533.579, 615], [532.582, 616], [531.513, 617], [531, 617.582], [530, 618.433], [529, 619.233], [527.621, 620], [526.583, 621], [525.552, 622], [525, 622.564], [524, 623.45], [523, 624.331], [521.683, 625], [520.578, 626], [519.592, 627], [519, 628], [518, 629], [517, 629.405], [515.65, 630], [514.593, 631], [513.614, 632], [513, 633], [512, 633.555], [511, 634.201], [511, 635]
-Path 96: [581, 634], [580, 634], [579.3, 635], [578, 635.216], [577.488, 636], [576, 637]
-Path 97: [784, 635], [784, 636], [784.545, 637], [785, 638], [785.475, 639], [786, 639.538], [786.498, 641], [787, 641.542], [787.481, 643], [788, 643.594], [788, 645], [788.583, 646], [789, 647], [789.508, 648], [790, 649]
-Path 98: [168, 638], [169, 638.61], [169.393, 640], [170, 640.502], [170.203, 642], [171, 642]
-Path 99: [814, 639], [814.261, 640], [815, 640.42], [815, 641], [815, 642], [815.538, 643], [816, 644], [816.598, 645], [817, 646], [817.575, 647], [818, 648], [818.463, 649], [819, 649.574], [819.471, 651], [820, 651.573], [820.458, 653], [821, 653.613], [821.502, 655], [822, 656], [823, 657], [823, 658], [824, 659], [824, 660], [824.396, 661], [825, 661.622], [825.391, 663], [826, 663.659], [826.496, 665], [827, 665.57], [827.468, 667], [828, 667.575], [828.43, 669], [829, 669.594], [829.488, 671], [830, 671.569], [830.507, 673], [831, 674], [831.56, 675], [832, 676], [832.505, 677], [833, 678], [833, 679], [833.814, 680]
-Path 100: [573, 640], [572, 640], [571.504, 641], [571, 641.323], [570.498, 642], [569.466, 643], [568.475, 644], [567.432, 645], [567, 646], [566.26, 647], [565.174, 648], [564, 648.349], [563.322, 649], [562.208, 650], [561, 650.318], [560.332, 651], [559.208, 652], [558, 652.501], [557, 653.464], [556.5, 654], [556, 654.408], [555.445, 655], [554.407, 656], [553.353, 657], [552.174, 658], [551, 658.281], [550.287, 659], [549, 660], [548, 660.292], [547.292, 661], [546, 661.509], [545, 662.506], [544, 663.502], [543, 664.514], [542, 665.533], [541, 666.552], [540, 667.586], [539.478, 669], [539, 670], [538.462, 671], [538, 672], [537.428, 673], [536.577, 674], [536, 674]
-Path 101: [171, 651], [170, 651], [169, 651.415], [169, 652], [169, 653], [168.07, 654], [168.049, 654.951], [168, 656], [168, 657], [168, 658]
-Path 102: [546, 661], [545.49, 662], [544.494, 663], [543.497, 664], [542.5, 665]
-Path 103: [167, 662], [166, 662], [165.356, 662], [165, 663], [164.423, 663.423]
-Path 104: [785, 666], [784, 666], [783.51, 667], [783, 667.547], [782.519, 669], [782, 669.534], [781.504, 671], [781, 671.506], [780.521, 673], [780, 673.517], [780, 675]
-Path 105: [416, 668], [416, 668.59], [416.722, 669], [417, 670], [418, 670.624], [419, 671.537], [419.575, 673], [420.513, 674], [421.475, 675], [422, 675.606], [422.519, 677], [423, 678], [423.508, 679], [424, 680], [424, 681], [424, 682]
-Path 106: [842, 679], [842, 680], [842.544, 681], [843.103, 682], [844, 682.846]
-Path 107: [537, 681], [536, 681], [535.5, 682], [535, 682.511], [534.446, 684], [533, 684.541], [532, 685.423], [531.608, 686], [531, 686], [530, 687]
-Path 108: [780, 677], [780.427, 678], [781, 679], [781.49, 680], [782, 681], [782, 681.51], [783, 682], [783.492, 683], [784, 683.556], [785, 684.565], [786, 685.591], [786.504, 687], [787.402, 688], [788, 688.516], [788.455, 690], [789, 690.168], [789, 691]
-Path 109: [481, 681], [480, 681.353], [479, 682.245], [478, 683.144], [477, 684.082], [476, 685], [475, 685.397], [474, 686], [473.291, 687], [472.184, 688], [471.049, 689], [470, 689.278], [469.259, 690], [468.249, 691], [467.195, 692], [466.158, 693], [465, 693.372], [464.375, 694], [463, 694.642], [462.188, 696], [461.106, 697], [460.136, 698], [459, 698.265], [458.298, 699], [457.197, 700], [456.158, 701], [455.147, 702], [454, 702.335], [453.362, 703], [452.337, 704], [451.289, 705], [450.171, 706], [449.082, 707], [448, 707.266], [447.259, 708], [446.263, 709], [445.211, 710], [444, 710.232], [444, 711]
-Path 110: [407, 687], [407, 688], [408, 688.468], [408, 689], [408, 690], [408.246, 691], [409, 691]
-Path 111: [394, 692], [394, 693], [394.626, 694], [395, 695], [395.46, 696], [396, 696.299], [396, 697]
-Path 112: [848, 693], [847, 693.453], [846, 694.448], [845, 695], [844.387, 696], [843.366, 697], [842.307, 698], [841.203, 699], [840, 699.381], [839.397, 700], [838.368, 701], [837.345, 702], [836.28, 703], [835.336, 704], [834, 704.587], [833.081, 706], [832, 707], [831, 707.161], [830.19, 708], [829, 708.4], [828.402, 709], [827.418, 710], [826.469, 711], [825.345, 712], [824.134, 713], [823, 714], [822, 714.349], [821.456, 715], [821, 716]
-Path 113: [490, 688], [489, 689], [488, 689], [487, 689.481], [486, 690.444], [485, 691.361], [483.578, 692], [483, 693.297], [482, 694], [481.492, 694], [481, 694.553], [480.429, 695], [480, 695.502], [479, 696], [478.459, 697], [477.406, 698], [476.351, 699], [475.316, 700], [474, 700.466], [473.45, 701], [472.398, 702], [471.36, 703]
-Path 114: [520, 694.175], [519, 695], [518, 695], [517, 695.377], [516, 696], [515.275, 697]
-Path 115: [416, 700], [417, 700.621], [418, 701.587], [418.401, 703], [419, 703.518], [419.601, 705], [420.447, 706], [421, 706.609], [421.582, 708], [422.462, 709], [423, 709.538], [423.559, 711], [424.516, 712], [425.51, 713], [426.467, 714], [427, 714.544], [427.548, 716], [428, 717], [428.498, 718], [429, 718.482], [429, 719], [429, 720]
-Path 116: [801, 692], [801, 693], [802, 694], [803, 695], [803, 696], [804, 697], [804.418, 698], [805, 699.469], [805.514, 700], [806, 701], [806, 702], [806.58, 703], [807, 704], [807, 705], [807.466, 706], [808, 706.575], [808.558, 708], [809.555, 709], [810.489, 710], [811, 710.57], [811.533, 712], [812, 713], [812.474, 714], [813, 714.46], [813, 715], [813.486, 716], [814, 716.473], [814, 717], [814.574, 718], [815.502, 719], [816, 720], [816.62, 721], [817.5, 722], [818, 723], [818.549, 724], [819.434, 725], [820, 725.556], [820.531, 727], [821.487, 728], [822, 728.589], [822.564, 730], [823.502, 731], [824.482, 732], [825, 732.43], [825.556, 733], [827, 733.537], [828, 734.475], [828.447, 735], [829, 735.575], [829, 737], [829.582, 738], [830, 739], [830, 740], [830, 741], [830.587, 742], [831.437, 743], [832, 743.588], [833, 744.611], [833, 746], [833.482, 747], [834, 747.501], [834, 749], [834, 750], [834, 751], [834.598, 752], [835.562, 753], [836.554, 754], [837.533, 755], [838.452, 756], [839, 756.564], [839.451, 758], [840, 758.575], [840.486, 760], [841, 760.503], [842, 761.518], [843, 762.55], [843, 764], [843, 765], [843, 766], [843, 767], [843.578, 768], [844.413, 769], [845, 769.567], [845.444, 771], [846, 771.535], [846, 773], [846.498, 774], [847, 774.55], [847.525, 776], [848, 777], [848.587, 778], [849.463, 779], [850, 779.496], [850, 780], [850.556, 781], [851.528, 782], [852, 783], [852.577, 784], [853.418, 785], [854, 785.522], [854.493, 787], [855, 787.446], [855.395, 788], [856, 788.52], [856.44, 790], [857, 790.544], [857.472, 792], [858, 792.584], [858, 794], [858.586, 795], [859.546, 796], [860.386, 797], [861, 797.551], [862, 798.584], [863, 799.643], [863, 801], [863.448, 802], [864, 802], [865, 802]
-Path 117: [142, 710], [142.371, 711], [143, 711.598], [144, 712.525], [145, 713.373], [145, 714], [145.377, 715], [146, 715]
-Path 118: [347, 714], [348, 714], [348, 715], [348, 716], [348, 717]
-Path 119: [997, 714], [996, 714], [995, 714], [994.443, 715], [993.363, 716], [992, 716.605], [991, 717.583], [990, 718.514], [989, 719.453], [988.464, 720], [987.418, 721], [986.398, 722], [985.388, 723], [984, 723.58], [983, 724.544], [982, 725.525], [981, 726.51], [980, 727.458], [979.432, 728], [978.321, 729], [977, 729.486], [976.479, 730], [975.412, 731], [974.379, 732], [973, 732.644], [972, 733.614], [971, 734.559], [970, 735.523], [969, 736.503], [968, 737.487], [967.489, 738], [966.449, 739], [965, 739.631], [964, 740.587], [963, 741.554], [962, 742.546], [961, 743.515], [960, 744.473], [959.438, 745], [958.416, 746], [957.397, 747], [956.409, 748], [955.432, 749], [954.443, 750], [953.458, 751], [952.464, 752], [951.464, 753], [950.439, 754], [949.417, 755], [948.4, 756], [947, 756.622], [946, 757.576], [945, 758.537], [944, 759.493], [943.481, 760], [942.419, 761], [941, 761.616], [940, 762.639], [939, 763.628], [938, 764.595], [937, 765.558], [936, 766.534], [935, 767.536], [934, 768.516], [933, 769.471], [932.454, 770], [931.439, 771], [930.455, 772], [929.456, 773], [928.44, 774], [927.424, 775], [926.418, 776], [925.432, 777], [924.43, 778], [923.385, 779], [922, 779.598], [921, 780.578], [920, 781.549], [919, 782.485], [918.462, 783], [917.419, 784], [916.315, 785], [915, 785.536], [914, 786.5], [913, 787.488], [912.447, 788], [911.425, 789], [910, 789.577], [909, 790.524], [908, 791.461], [907.435, 792], [906.335, 793], [905.123, 794], [904, 794.418], [903.401, 795], [902.339, 796], [901, 796.507], [900, 797.417], [899.416, 798], [898.3, 799], [897.093, 800], [896, 800.239], [895.274, 801], [894, 802], [893, 802.329], [892.333, 803], [891.144, 804], [890, 804.251], [889.311, 805], [888, 806], [887, 806.057], [886.062, 807], [885, 808], [884, 808.17], [883.192, 809], [882, 809.294], [881.305, 810], [880, 811], [879, 811], [878, 812], [877, 812.053], [876.089, 813], [875, 813.012], [874.018, 814], [873, 815]
-Path 120: [146, 719], [145, 719], [144, 719], [143, 719], [142.512, 720], [142, 720.51], [142, 722], [141.451, 723], [140.619, 724], [140, 724.456], [139.606, 725], [139, 725.151], [139, 726]
-Path 121: [137, 726], [137, 727], [137.509, 728], [138, 729], [138.108, 730], [139, 730]
-Path 122: [483, 731], [483, 732], [483.513, 733], [484, 734], [484, 735], [484.448, 736], [485, 736.266], [485, 737]
-Path 123: [971, 727], [970, 728], [969, 729], [968, 730], [967, 731], [966, 732], [965, 732], [964.238, 733], [963.239, 734], [962.239, 735], [961.157, 736], [960.089, 737], [959, 738], [958, 739]
-Path 124: [423, 733], [422, 733.261], [421, 734.1], [420, 735], [419, 735.175], [418, 736.215], [417, 737], [416.206, 738], [415, 738.416], [414.4, 739], [413.301, 740], [412.055, 741], [411, 741.165], [410.212, 742], [409, 743], [408, 743.29], [407.312, 744], [406, 744.501], [405.426, 746], [404.458, 747], [403.499, 748], [402.454, 749], [401.404, 750], [400.357, 751], [399.303, 752], [398, 752.395], [397.425, 753], [396.444, 754], [395.448, 755], [394.455, 756], [394, 757], [394, 758]
-Path 125: [137, 739], [136.456, 739], [135.552, 740], [135, 740.72], [134.384, 741], [134, 742], [133.467, 743], [133, 744], [133, 745], [133, 746], [133.357, 747], [134, 747]
-Path 126: [993, 740], [992, 740.478], [991, 741.472], [989.519, 742], [989, 743], [988.363, 744], [987, 744.538], [986, 745.507], [985, 746.452], [984.439, 747], [983.361, 748], [982.218, 749], [981.08, 750], [980, 750.342], [979.368, 751], [978.295, 752], [977, 752.474], [976.455, 753], [975.455, 754], [974.436, 755], [973.394, 756], [972.181, 757], [971.086, 758], [970, 758.435], [969.448, 759], [968.49, 760], [967.517, 761], [967, 761.558], [966, 762.56], [965, 763.557], [964, 764.557], [963, 765.553], [962, 766.546], [961, 767.53], [960, 768.473], [959.506, 769], [959, 769.418], [958.446, 770], [957.411, 771], [956.395, 772], [955.411, 773], [954.477, 774], [953.479, 775], [952.458, 776], [951.406, 777], [950.376, 778], [949.367, 779], [948.349, 780], [947, 780.457], [946.482, 781], [945.439, 782], [944.432, 783], [943.392, 784], [942.374, 785], [941.358, 786], [940, 786.46], [939.437, 787], [938.43, 788], [937.424, 789], [936.43, 790], [935.396, 791], [934.312, 792], [933.29, 793], [932, 793.504], [931, 794.422], [930.433, 795], [929.393, 796], [928.322, 797], [927.283, 798], [926, 798.431], [925.41, 799], [924.359, 800], [923.334, 801], [922.304, 802], [921, 802.422], [920.396, 803], [919.226, 804], [918, 805], [917.095, 806], [916, 806.4], [915.387, 807], [914.332, 808], [913.327, 809], [912.342, 810], [911, 810.494], [910.404, 811], [909.436, 812], [908.468, 813], [907.435, 814], [906.419, 815], [905.41, 816], [904.403, 817], [903.41, 818], [902.393, 819], [901.363, 820], [900.33, 821], [899, 821.494], [898.475, 822], [897.434, 823], [896.431, 824], [895.417, 825], [894.398, 826], [893.372, 827], [892.334, 828], [891.275, 829], [890.231, 830], [889, 830.347], [888.366, 831], [887.293, 832], [886.173, 833], [885, 833.299], [884.304, 834], [883.216, 835], [882, 835.221], [881.29, 836], [880, 837], [879, 837.259], [878.263, 838], [877.241, 839], [876, 839.4], [875.373, 840], [874.264, 841], [873.214, 842], [872.235, 843], [871, 843.456], [870.459, 844], [869.459, 845], [868.467, 846], [867.424, 847], [866.355, 848], [865.32, 849], [864, 849.397], [863.443, 850], [862.305, 851], [861.116, 852], [860, 852.324], [859.324, 853], [858.21, 854], [857, 854.362], [856.367, 855], [855.331, 856], [854, 856.482], [853.491, 857], [852.462, 858], [851.419, 859], [850.338, 860], [849.128, 861], [848, 861.329], [847.363, 862], [846.16, 863], [845, 863.376], [844.386, 864], [843.363, 865], [842, 865.12], [842, 866]
-Path 127: [406, 746], [405, 746.57], [404, 747.552], [403, 748.474]
-Path 128: [464, 741], [463, 741.377], [461.558, 742], [461, 742.59], [460.458, 743], [460, 744], [459, 745], [458, 745.204], [457, 746.179], [456, 747], [455, 747]
-Path 129: [148, 745], [147.484, 745], [147, 746], [146.517, 747], [146, 748], [145.537, 749], [145, 749.559], [144.531, 751], [144, 751.406], [144, 752], [144, 753], [143.382, 754], [143, 755], [142.501, 756], [142, 756.594], [142, 758], [141.545, 759], [141, 759.542], [141, 761], [140.594, 762], [140, 762.506], [140, 764], [139.495, 765], [139, 766], [138.492, 767], [138, 768], [137.539, 769], [137, 769.563], [137, 771], [137, 772], [137, 773], [137, 774], [137, 775], [137, 776], [136.415, 777], [136, 778], [136, 779], [135.508, 780], [135, 780.497], [135, 781], [135, 782], [134.407, 783], [134, 784], [133.481, 785], [133, 786], [132.353, 787], [132, 788], [132, 789], [131.488, 790], [130.761, 791], [130, 791], [129, 792]
-Path 130: [292.713, 742], [292, 743], [292, 743.776], [291, 744.497], [290, 745], [289, 746], [288, 746.439], [287, 747.473], [286, 748.431], [285, 749.368], [284.424, 750], [283.63, 751], [283, 752], [283, 753], [282, 754], [282, 754.716], [281, 755]
-Path 131: [996, 752], [995, 752.085], [994, 753], [993, 754], [992, 754.278], [991, 755], [990, 755], [989.4, 756], [988, 756.61], [987.289, 758], [986.242, 759], [985, 759.378], [984.414, 760], [983.327, 761], [982.242, 762], [981, 762.377], [980.372, 763], [979.296, 764], [978.236, 765], [977.147, 766], [976, 766.35], [975.343, 767], [974.333, 768], [973, 768.516], [972, 769.455], [971.478, 770], [970.413, 771], [969.358, 772], [968.32, 773], [967.295, 774], [966, 774.517], [965, 775.542], [964, 776.513], [963, 777.461], [962.536, 778], [962, 778.351], [961.411, 779], [960, 779.584], [959, 781], [958, 782], [957.186, 783], [956, 783.659], [955.249, 785], [954.338, 786], [953.406, 787], [952.239, 788], [951.4, 789], [950.561, 790], [950, 790.399], [949.535, 791], [949, 791.342], [949, 792], [948, 793], [948, 794]
-Path 132: [950, 747], [949, 747.06], [948, 748], [947, 748.335], [946, 749.373], [945, 750.345], [944, 751.308], [943, 752.275], [942, 753.306], [941, 754.257], [940, 755.142], [939, 756.038], [938, 757], [937, 757], [936.271, 758], [935.236, 759], [934.26, 760], [933.25, 761], [932, 761.427], [931.533, 762], [931, 762.444], [931, 763], [930.199, 764], [929.191, 765], [928.114, 766], [927.076, 767], [926.024, 768], [925, 768.243], [924.338, 769]
-Path 133: [821, 752], [822, 752.345], [822.794, 753], [823, 753.711], [824, 754], [824.575, 754], [825, 754.601], [826, 755.465], [827, 756.41], [828.378, 757], [829, 757.663], [830, 758], [830.412, 759], [831, 759.076], [831, 760]
-Path 134: [270, 760], [270.512, 761], [271, 762], [271.333, 763], [272, 763.32], [272, 764], [272, 765]
-Path 135: [396, 759.432], [396.547, 760], [397, 761], [397, 762], [397, 763.483], [397.581, 764], [398, 765], [398, 765.505], [399, 766], [400, 766.589], [401, 767.491], [401.456, 768], [402, 768.482], [402.522, 769], [404, 769.578], [405, 770], [406, 770.503], [407, 771.469], [407.491, 772], [408, 772.485], [408.483, 773], [409, 773.511], [410, 774.519], [411, 775.496], [411.363, 776], [412, 776.419], [412, 777]
-Path 136: [527, 759], [526, 759.397], [525, 760.388], [524, 761.304], [522.513, 762], [522, 762.517], [521, 763.392], [520, 764.242], [518.515, 765], [518, 765.515], [517, 766], [516.395, 767], [515.304, 768], [514, 768.536], [513, 769.524], [512, 770.526], [511, 771.502], [510, 772.46], [509.453, 773], [508, 773.607], [507, 774.543], [506, 775.502], [505, 776.422], [504.416, 777], [503.327, 778], [502, 778]
-Path 137: [997, 766], [996, 766], [995, 766], [994.394, 767], [993.357, 768], [992.298, 769], [991, 769.42], [990.414, 770], [989.357, 771], [988.301, 772], [987, 772.418], [986.456, 773], [985.421, 774], [984.394, 775], [983.362, 776], [982.308, 777], [981, 777.419], [980.424, 778], [979.386, 779], [978.339, 780], [977.226, 781], [976, 781.38], [975.394, 782], [974.321, 783], [973.248, 784], [972, 784.418], [971.41, 785], [970.348, 786], [969.287, 787], [968, 787.432], [967.42, 788], [966.388, 789], [965.377, 790], [964.353, 791], [963, 791.432], [962.49, 792], [961.578, 793], [961, 793.623], [960, 794.442], [960, 795]
-Path 138: [448.464, 758], [449, 758.572], [449.646, 759], [450, 759.607], [450.586, 760], [451.412, 761], [452, 762.367], [453, 763], [454, 763], [455.073, 764], [456, 765.275], [456.849, 766], [457, 767], [457.489, 768], [458, 768.576], [459, 769.559], [460, 770.541], [461, 771.633], [461, 773]
-Path 139: [443, 775], [442, 775.469], [441.423, 776], [440, 776.653], [439, 777.579], [438, 778.496], [437.44, 779], [436.429, 780], [435, 780.638], [434, 781.654], [433, 782.553], [432, 784]
-Path 140: [761, 773], [761, 773.915], [761.542, 774], [762, 774.52], [763, 775], [764, 775.485], [764.54, 776], [765.538, 777], [766.487, 778], [767, 778.495], [767.502, 779], [769, 779.549], [770, 780.171], [770, 781]
-Path 141: [689, 772], [688, 772.174], [687, 773], [686, 773.317], [685, 774.289], [684, 775.311], [683, 776], [682.285, 777], [681.309, 778], [680, 778.568], [679.445, 780], [678.42, 781], [677.368, 782], [676.358, 783], [675.357, 784], [674.343, 785], [673.328, 786], [672, 786.277], [671.364, 787], [670.022, 788], [669, 789], [668, 789], [667, 790], [666, 791], [665, 792], [664, 792], [663, 792.275], [662.273, 793], [661.298, 794], [660, 794.489], [659.491, 795], [658.513, 796], [658, 796.54], [657, 797.497], [656.566, 798], [656, 798.45], [655.516, 799], [655, 799.342], [655, 800], [654, 801]
-Path 142: [831, 762], [831, 763], [831, 764.363], [831.568, 765], [832, 765.516], [833, 766], [833.699, 766], [834.444, 767], [835, 768], [835, 769], [835, 770.417], [835.539, 771], [836, 772.432], [837, 773.435], [838.312, 774], [839, 774.898], [839.669, 775], [840, 776], [840.359, 777], [841, 777]
-Path 143: [550, 778], [549, 778], [548.537, 779], [548, 779.554], [547, 780.541], [546, 781.578], [545, 782.644], [544, 783.573], [543, 784.572], [542, 785.524], [541, 786.51], [540, 787.479], [539.406, 788], [539, 789]
-Path 144: [523, 774], [522, 774], [521.36, 774], [521, 775], [520, 776], [519, 777], [518, 778], [517, 778], [516, 778.3], [515, 779], [514.268, 780], [513.272, 781], [512.292, 782], [511, 782.362], [511, 783], [510.175, 784], [509.15, 785], [508, 785.072], [507.381, 786], [506, 786]
-Path 145: [464, 781], [463, 781], [462, 781], [462, 782], [461.426, 783], [461, 784], [461, 785], [461, 786], [461, 787], [461, 788], [461, 789], [461.557, 790], [462.496, 791], [463, 791], [464, 791], [465, 791.545], [466, 792], [467, 792.598], [468, 793], [469, 793]
-Path 146: [116, 782], [116.564, 783], [117.382, 784], [118, 784.55], [119, 785], [120, 785.528], [121, 786.492], [121.19, 787], [122, 787]
-Path 147: [497, 778], [497.642, 778], [498, 778.62], [498.546, 779], [499.406, 780], [500, 781.498], [501, 782], [501.611, 783], [502.602, 784], [503.503, 785], [505, 785.249], [505.331, 786], [506, 786]
-Path 148: [752, 778], [751, 778.348], [750, 779.139], [749, 780], [748, 780.392], [747, 781.365], [746, 782], [745, 782], [744.472, 783], [743.421, 784], [742.343, 785], [741.278, 786], [740, 786.495], [739.505, 787], [739, 787.49], [738.475, 788], [737.43, 789], [736.35, 790], [735.286, 791], [734.22, 792], [733, 792.481], [732.468, 793], [731.457, 794], [730.424, 795], [729.349, 796], [728, 797], [727, 797], [726, 798], [725, 799], [724, 799.157], [723.064, 800], [722, 800.689], [721, 801.646], [720, 802.607], [719, 803.585], [718, 804.517], [717, 805.403], [716.399, 806], [715.307, 807], [714.263, 808], [713, 808.427], [712.414, 809], [711.36, 810], [710.24, 811], [709, 811.387], [708.369, 812], [707.317, 813], [706, 813.549], [705, 814.521], [704, 815.491], [703.604, 816], [703, 816.504], [702, 817.614], [701, 818.527], [700, 819.001], [699.001, 820], [698, 821], [697, 822], [696, 822.45], [695.404, 823], [694.338, 824], [693.147, 825]
-Path 149: [410, 782], [409, 782], [408.497, 782], [408, 782.627], [407, 783], [406.507, 784], [406, 784.528], [405, 785.405], [404.421, 786], [403.315, 787], [402.166, 788], [401.1, 789], [400, 789.42], [399.476, 790], [398.426, 791], [397.355, 792], [396.255, 793], [395.22, 794], [394, 794.481], [393.463, 795], [392.411, 796], [391.426, 797], [390.491, 798], [389.498, 799], [388.485, 800], [387.328, 801], [386, 802], [385, 803], [384, 804], [383, 805], [382, 805.355], [381.363, 806], [380.35, 807], [379.239, 808], [378.168, 809], [377, 810], [376, 810.037], [375.055, 811], [374, 812], [373, 812.25], [372.227, 813], [371, 813.526], [370, 814.491], [369.479, 815], [368.439, 816], [367.418, 817], [366.359, 818], [365.317, 819], [364, 819.38], [363.469, 820], [362.231, 821]
-Path 150: [911, 781], [910, 782], [909, 782], [908, 783], [907, 784], [906, 784], [905.126, 785], [904.046, 786], [903, 786.135], [902.187, 787], [901.044, 788], [900, 788.094], [899.152, 789], [898, 790], [897, 790.037], [896.067, 791], [895, 791.121], [894.186, 792], [893, 793], [892, 793], [891, 794], [890, 794], [889, 795], [888, 795], [887, 796], [886, 796], [885, 797], [884, 797], [883, 798], [882, 798], [881, 799]
-Path 151: [430, 785], [429, 786], [428, 786.476], [427, 787], [426.363, 788], [425, 788.583], [424, 789.499], [423.493, 790], [422.453, 791], [421.575, 792], [421, 792]
-Path 152: [494, 783], [493, 783.477], [492.47, 784], [492, 785.436], [491.445, 786], [491, 787], [491, 788], [490.531, 789], [490, 790], [489.514, 791], [489, 791.604], [488, 792.591], [487, 793.499], [487, 794], [486.167, 795], [485, 796], [484, 796], [483, 797], [482, 797]
-Path 153: [532, 796], [531, 796], [530, 796], [529.408, 797], [528.094, 798], [527, 799], [526, 799], [525, 799.643], [524, 800.568], [523, 801.397], [522.459, 802], [521, 803], [520, 804], [519, 805], [518, 805.511], [517, 806]
-Path 154: [957, 797], [956, 797], [955, 797], [954.453, 798], [953.482, 799], [952.492, 800], [951.529, 801], [951, 801.523], [950, 802.552], [949.461, 804], [948, 804.424], [948, 805], [947, 806], [946, 807], [945, 808]
-Path 155: [502, 798], [503, 798], [504, 798.607], [504.6, 800], [505.557, 801], [506.456, 802], [507, 802.451], [507, 803], [507.514, 804], [509, 804.334], [509, 805]
-Path 156: [748, 797], [748, 798], [748, 799], [748, 800], [748.549, 801], [749, 802], [749.333, 803], [750, 803]
-Path 157: [107, 801], [107, 802], [107.534, 803], [109, 803.378], [109.436, 804], [110, 804]
-Path 158: [550, 800], [549, 800.243], [548, 801.131], [547, 802], [546, 803], [545, 803], [544, 804], [543, 804], [542, 805], [541, 806], [540, 806.278], [539, 807], [538, 807], [537.46, 808], [536.47, 809], [535.473, 810], [534.44, 811], [533.425, 812], [532.405, 813], [531.413, 814], [530.447, 815], [529.511, 816], [529, 816.465], [528.541, 817], [528, 817.51], [527, 818.485], [527, 819], [526.296, 820], [525, 820.438], [524.442, 821], [523.377, 822], [522, 823]
-Path 159: [652, 802], [651, 802.258], [650, 803], [649, 803.44], [648, 804.393], [647, 805.405], [646, 806.426], [645, 807], [644, 807.57], [643.37, 809], [642.308, 810], [641, 810.377], [640.451, 811], [639.396, 812], [638.403, 813], [637.512, 814], [637, 814.538], [636, 815.566], [635.439, 817], [634.5, 818], [633.477, 819], [632.406, 820], [631, 821]
-Path 160: [866, 806], [866, 806.681], [867, 807], [867, 808], [867.5, 809], [868, 809], [869, 809.597], [870, 810]
-Path 161: [226, 805], [225, 805], [224.473, 805], [224, 806], [223.558, 807], [223, 808], [223, 809], [223, 810], [223, 811], [223, 812], [223, 813], [223, 814]
-Path 162: [110, 810], [110, 811], [110.522, 812], [112, 812.323], [112.282, 813], [113, 813]
-Path 163: [416, 811], [415, 811], [414, 811], [413.444, 812], [412.398, 813], [411.401, 814], [411, 815]
-Path 164: [482, 810], [482, 811], [482, 812], [483, 812.636], [483.529, 814], [484.425, 815], [485, 815.538], [486, 816.536], [487, 817.522], [488, 818.579], [489, 819.714], [490, 820.699], [490.409, 822], [491, 822.617], [491.603, 824], [492.489, 825], [493, 825.567], [493.617, 827], [494.463, 828], [495, 828.52], [495, 830]
-Path 165: [716, 813], [716, 814], [716, 815], [716.534, 816], [717, 817], [717.486, 818], [718, 818.363], [718.478, 819], [719, 819], [720, 819], [721, 820], [721.361, 821], [722, 821]
-Path 166: [918, 813], [917.599, 814], [917, 814.472], [916.522, 815], [916, 815.635], [915, 816.484], [914.404, 817], [913.404, 818], [912.325, 819], [911.291, 820], [910, 820.568], [909, 821.538], [908, 822.523], [907, 823.468], [906.451, 824], [905.411, 825], [904.389, 826], [903, 826.583], [902, 827.551], [901, 828.559], [900, 829.487], [899.454, 830], [898.406, 831], [897, 831.626], [896.294, 833], [895, 833.506], [894, 834.5], [893, 835.424], [892.478, 836], [891.305, 837], [890, 838], [889.014, 839], [888, 839.421], [887.449, 840], [887, 841]
-Path 167: [338, 815], [339, 815.481], [339, 816], [339, 817]
-Path 168: [939, 811], [937.527, 811], [936.559, 812], [936, 813.424], [935, 814.453], [934, 815], [933.365, 816], [932.332, 817], [931.298, 818], [930, 818.432], [929.425, 819], [928.451, 820], [927.434, 821], [926.352, 822], [925.295, 823], [924.118, 824], [923, 824.324], [922.308, 825], [921.251, 826], [920, 826.364], [919.359, 827], [918.314, 828], [917.266, 829], [916, 829.443], [915.438, 830], [914.394, 831], [913.375, 832], [912.348, 833], [911.295, 834], [910, 834.439], [909.506, 835], [909, 835.43], [908.428, 836], [907.378, 837], [906.336, 838], [905.253, 839], [904, 839.436], [903.43, 840], [902.409, 841], [901.389, 842], [900.334, 843], [899.206, 844], [898, 844.288], [897.307, 845], [896.199, 846], [895, 846.324], [894.41, 847], [893.354, 848], [892.193, 849], [891.183, 850], [890, 850.428], [889.425, 851], [888.414, 852], [887.392, 853], [886.337, 854], [885.265, 855], [884, 855.41], [883.413, 856], [882.403, 857], [881.374, 858], [880.324, 859], [879.268, 860], [878, 860.43], [877.432, 861], [876.41, 862], [875.376, 863], [874.334, 864], [873.288, 865], [872, 865.412], [871.423, 866], [870.397, 867], [869.425, 868], [869, 869]
-Path 169: [345, 816], [345.578, 817], [346.49, 818], [347, 818]
-Path 170: [354, 818], [353, 818], [352, 818], [351.706, 819], [351, 819.629], [350.316, 821], [349.233, 822], [348.225, 823], [347, 824], [346.382, 825], [346, 826], [346, 827], [345.717, 828], [347, 828]
-Path 171: [313, 820], [312, 820], [311, 820], [310.181, 821], [309, 822], [308, 822.177], [307.164, 823], [306, 823.474], [305.396, 824], [304.131, 825], [303, 826], [302, 826]
-Path 172: [321, 817], [321.471, 818], [322.493, 819], [323.489, 820], [324.455, 821], [325, 822], [325.611, 823], [326.5, 824], [327, 824.504], [328, 825.568]
-Path 173: [442, 821], [441, 821.051], [440, 822], [439, 822], [438.277, 823], [437.242, 824], [436.156, 825], [435.045, 826], [434, 826.245], [433.239, 827], [432.232, 828], [431, 828.339], [430.352, 829], [429.333, 830], [428.289, 831], [427.255, 832], [426.252, 833], [425, 833.374], [424.357, 834], [423.322, 835], [422.289, 836], [421.27, 837], [420.257, 838], [419.215, 839], [418, 839.309], [417.331, 840], [416.301, 841], [415.273, 842], [414.211, 843], [413.181, 844], [412, 844.325], [411.319, 845], [410.312, 846], [409.267, 847], [408.225, 848], [407.175, 849], [406, 849.331], [405.326, 850], [404.313, 851], [403.28, 852], [402.212, 853], [401.133, 854], [400, 854.25], [399.318, 855], [398.263, 856], [397.245, 857], [396.233, 858], [395, 858.323], [394.324, 859], [393.303, 860], [392.264, 861], [391.235, 862], [390.195, 863], [389.142, 864], [388, 864.1], [387.237, 865], [386, 866]
-Path 174: [445, 818.382], [445.614, 819], [446.486, 820], [447, 821.392], [448, 822], [448, 823]
-Path 175: [380, 820], [380, 821], [380, 821.533], [381, 822.463], [382, 823], [382, 824], [382.624, 825], [383, 826], [383, 827], [383, 828], [383, 829], [383, 830]
-Path 176: [626, 823], [625, 823], [624, 823], [623.383, 824], [622.412, 825], [621, 825.537], [620, 826.564], [619.423, 828], [618.399, 829], [617.346, 830], [616.136, 831], [615, 831], [614, 832], [613, 833], [612, 833], [611, 833.326], [610.351, 834], [609.283, 835], [608, 835.437], [607.505, 836], [607, 836.435], [606.483, 837], [605.488, 838], [604.513, 839], [604, 839.456], [603.505, 840], [603, 840.444], [602.475, 841], [601.448, 842], [600.422, 843], [599.429, 844], [598.589, 845], [598, 845.504], [597.547, 847], [597, 847.55], [597, 849], [596.675, 850], [596, 850]
-Path 177: [104, 825], [105, 825.434], [105.304, 826], [106, 826.404], [106, 827], [106, 828], [106.368, 829], [107, 829], [108, 829.387], [108.488, 830], [109, 830], [110, 830]
-Path 178: [456, 829], [456.401, 830], [457, 830], [458, 830], [459, 830]
-Path 179: [182, 826], [182, 826.528], [182.53, 827], [183, 828], [183, 829], [183, 829.531], [183.723, 830], [184, 831], [185, 831.498], [185.514, 832], [186.087, 833], [187, 833]
-Path 180: [269, 832], [269, 832.563], [270, 833], [270.619, 834], [271.448, 835], [272, 835.225], [272.329, 836], [273, 836.223], [273.55, 837]
-Path 181: [99, 835], [98, 835], [97, 835], [97, 836], [97, 837], [96.5831, 838], [96, 838.602], [96, 840], [96, 841], [96.4016, 842], [97, 842.592], [97.4843, 844], [98, 844.52], [98, 846]
-Path 182: [372, 833], [372, 834], [372, 835], [373, 835.565], [374, 836], [375, 837], [375, 838], [375.545, 839], [376, 840], [376.544, 841], [377.422, 842], [378, 842.453], [378.375, 843], [379, 843.559], [379, 845]
-Path 183: [508, 835], [508, 836], [508.509, 837], [509, 838], [509.422, 839], [510, 839.609], [510.471, 841], [511, 841.556], [512, 842.581], [513, 843.538], [514, 844.476], [514.551, 845], [516, 845.519], [517, 846], [518, 846], [519, 846.551], [520, 847], [521, 847], [522, 847.091], [522, 848]
-Path 184: [318, 836], [317, 836], [316.16, 837], [315, 837.297], [314.32, 838], [313.264, 839], [312.203, 840], [311, 840.354], [310.342, 841], [309.305, 842], [308.277, 843], [307.238, 844], [306, 844.399], [305.416, 845], [304.369, 846], [303.342, 847], [302.29, 848], [301.195, 849], [300.169, 850], [299, 850.264], [298.592, 851], [298, 851]
-Path 185: [704, 836], [703, 836], [702, 836], [701.361, 837], [700.295, 838], [699.176, 839], [698, 839.512], [697, 840.44], [696.418, 841], [695.375, 842], [694.312, 843], [693, 843.51], [692, 844.488], [691.473, 845], [690.461, 846], [689.429, 847], [688.395, 848], [687.355, 849], [686.267, 850], [685, 850.426], [684.423, 851], [683.373, 852], [682.289, 853], [681.165, 854], [680, 854.358], [679.355, 855], [678.307, 856], [677, 856.485], [676.478, 857], [675.445, 858], [674.395, 859], [673.344, 860], [672.299, 861], [671, 861.485], [670.479, 862], [669.435, 863], [668.359, 864], [667.273, 865], [666, 865.502], [665, 866.47], [664.454, 867], [663.426, 868], [662.385, 869], [661.347, 870], [660, 870.534], [659, 871.498], [658.475, 872], [657.431, 873], [656.391, 874], [655.347, 875], [654.291, 876], [653, 876.463], [652.441, 877], [651.416, 878], [650.379, 879], [649.3, 880], [648, 880.471], [647.441, 881], [646.41, 882], [645.329, 883], [644.201, 884], [643, 884.385], [642.385, 885], [641.332, 886], [640, 886.513], [639, 887.466], [638.452, 888], [637.442, 889], [636.414, 890], [635.368, 891], [634.347, 892], [633, 892.543], [632, 893.532], [631, 894.512], [630, 895.496], [629.48, 896], [628.462, 897], [627.44, 898], [626.412, 899], [625.391, 900], [624.354, 901], [623.282, 902], [622, 902.424], [621.422, 903], [620.334, 904], [619.213, 905], [618, 905.343], [617.349, 906], [616.293, 907], [615, 907.46], [614.451, 908], [613.391, 909], [612.34, 910], [611.302, 911], [610, 911.511], [609, 912.398], [608.395, 913], [607, 914]
-Path 186: [265.437, 836], [266, 837], [267, 838], [267.492, 839], [268, 839.542], [268, 841]
-Path 187: [384, 837], [383, 837], [382, 837.484], [381.618, 838], [381, 838.422], [381, 839], [381, 840]
-Path 188: [290, 838], [291, 838], [292, 838], [293, 838], [294, 838]
-Path 189: [334, 838], [333, 838], [332, 838], [331.432, 839], [330.433, 840], [329.395, 841], [328.23, 842], [327, 842.412], [326.418, 843], [325.38, 844], [324.386, 845], [323.443, 846], [322.444, 847], [321.404, 848], [320.349, 849], [319.283, 850], [318, 851], [317, 851.188], [316.243, 852], [315, 852.164], [314.29, 853], [313, 854]
-Path 190: [494, 840], [495, 841], [495.36, 842], [496, 842.568], [496.517, 844], [497, 845], [497, 846], [497.268, 847], [498, 847.643], [498, 849], [498, 850]
-Path 191: [274, 841], [274.641, 841], [275, 841.66], [276, 842], [276.629, 843], [278, 843.557], [279, 844.453], [279.409, 845], [280, 845.46], [280.329, 846], [281, 846]
-Path 192: [264, 842], [264, 843], [265, 843.688], [266, 844], [267, 845], [268, 846]
-Path 193: [253, 845], [253.535, 846], [254.51, 847], [255.4, 848], [256, 848.619], [256.634, 850], [257.573, 851], [258.577, 852], [260, 852.886]
-Path 194: [291, 845], [292, 845], [292, 846], [292.557, 847], [293, 848], [293.513, 849], [294, 850], [294, 851]
-Path 195: [249, 846], [248, 846], [247, 847], [246, 848], [245, 849]
-Path 196: [528, 846], [528, 847], [529, 847], [530, 847.527], [531, 848.524], [531.543, 850], [532, 851], [532.581, 852], [533.5, 853], [534, 853.527], [535, 854.553], [536, 855.546], [537, 856.523], [538, 857.49], [538.414, 858], [539, 858.497], [539, 859], [539.477, 860], [540, 860.522], [540, 862], [540.42, 863], [541, 863.584], [542, 864.645], [543, 865.589], [544, 866.55], [545, 867.468], [545.489, 868], [546, 868], [547, 868], [548, 868]
-Path 197: [249, 848], [249, 849], [249.638, 850], [250.483, 851], [251, 851.567], [252, 852.56], [253, 853.581], [254, 854.592], [255, 855.404], [255.592, 856], [257, 857]
-Path 198: [263, 848], [263, 849], [264, 850], [265, 850.356], [265.126, 851], [266, 851.226], [266, 852]
-Path 199: [355, 844], [354, 844.393], [353, 845.059], [352, 846], [351, 847], [350.467, 847], [350, 848], [349, 849], [348, 850], [347, 850], [346, 850.626], [345, 851.325], [344.411, 852], [343, 852.5], [342, 853], [341, 853.592], [340, 854.504], [340, 856], [340, 857], [340, 858], [340, 859], [340, 860]
-Path 200: [794, 846], [794, 847], [794, 848], [794.606, 849], [796, 849.426], [796, 850], [796, 851], [797, 852]
-Path 201: [840, 843], [839.397, 843], [839, 844], [838.501, 845], [838, 846.415], [837.323, 847], [837, 847.593], [836, 848], [835.546, 849], [835, 849.336], [834.412, 850], [833.123, 851], [832.105, 852], [831.15, 853], [830, 853.408], [829.637, 854], [829, 854]
-Path 202: [98, 849], [98, 850], [98.5541, 851], [99, 852], [99.4731, 853], [100, 853.388], [100.464, 854], [101, 854], [102, 854.49], [102.447, 855], [103, 855.508], [104, 856.521], [105, 857.529], [105.476, 859], [106, 859.443], [106, 860], [106, 861], [106, 862], [106, 863]
-Path 203: [694, 834], [693, 834.449], [692, 835.395], [691, 836.272], [690, 837.144], [689, 838.123], [688, 839.161], [687, 840], [686, 841], [685, 841.222], [684, 842.142], [683, 843.07], [682, 844], [681, 844.325], [680, 845.166], [679, 846.129], [678, 847.056], [677, 848.02], [676, 849], [675, 849.302], [674, 850], [673, 850.564], [672.16, 852], [671, 852.35], [670.383, 853], [669, 853.523], [668.169, 855], [667.072, 856], [666, 856], [665, 856.579], [664.079, 858], [663, 859], [662, 859.328], [661.347, 860], [660.309, 861], [659.296, 862], [658.291, 863], [657, 863.588], [656, 864.513], [655, 865.438], [654.461, 866], [653.409, 867], [652.317, 868], [651.239, 869], [650.147, 870], [649, 870.293], [648.281, 871], [647.169, 872], [646.125, 873], [645, 873.335], [644.353, 874], [643.342, 875], [642.374, 876], [641.303, 877], [640, 877.662], [639, 878.497], [639, 879], [638.031, 880], [637, 881], [636, 881], [635, 882], [634, 883], [633, 884], [632, 884.196], [631.227, 885], [630, 885.47], [629.441, 886], [629, 887], [628, 888], [627, 888.144], [626.158, 889], [625, 890], [624, 891], [623, 891.39], [622.338, 892], [621.302, 893], [620, 893.508], [619, 894.438], [618.416, 895], [617.464, 896], [616.424, 897], [615.248, 898], [614, 899], [613, 900], [612, 900], [611, 900.133], [611, 901]
-Path 204: [877, 849], [876, 850], [875, 850], [874, 850.431], [873, 851], [872, 851.619], [871, 852.537], [870, 853.41], [869.391, 854], [868, 854.573], [867.101, 856], [866, 857], [865, 857.06], [864.052, 858], [863.064, 859], [862, 859.409], [861.431, 860], [860.37, 861], [859.341, 862], [858, 862.512], [857, 863.495], [856.417, 864], [855.405, 865], [854.409, 866], [853.334, 867], [852.232, 868], [851.167, 869], [850, 869.427], [849.432, 870], [848.319, 871], [847.096, 872], [846.037, 873], [845, 873.398], [844.303, 874], [843.466, 875], [842.439, 876], [842, 877]
-Path 205: [244, 852], [245, 852.522], [246, 853.638], [246.593, 855], [247.578, 856], [248.593, 857], [249.64, 858], [251, 858.46], [251, 859]
-Path 206: [368, 850], [368.429, 851], [369, 852], [369.657, 853], [370.63, 854], [371.608, 855], [372.587, 856], [373.588, 857], [375, 857.543], [376, 858.464], [376.369, 859], [377, 859.531], [378, 860.591], [379, 861.689], [380, 862.481], [380, 863]
-Path 207: [365, 853], [364, 853], [363.248, 854], [362.199, 855], [361.165, 856], [360, 856.281], [359.306, 857], [358.272, 858], [357.222, 859], [356.178, 860], [355, 860.299], [354.311, 861], [353.273, 862], [352.231, 863], [351.211, 864], [350, 864.31], [349.32, 865], [348.3, 866], [347.291, 867], [346.097, 868], [345, 868.098], [344.147, 869], [343, 870], [342.273, 870.677], [343, 871.517], [344, 872.57], [345, 873.532], [346, 874.501], [347, 875.503], [348, 876.581]
-Path 208: [788, 853], [789, 853.318], [789, 854], [789, 855]
-Path 209: [239, 854], [238, 854], [237, 854], [237, 855], [236.536, 856], [236, 856], [235, 857], [235, 858]
-Path 210: [501, 855], [500, 855], [499.139, 856], [498.401, 857], [497.497, 858], [496, 858]
-Path 211: [382, 857], [383, 858], [383, 859], [383.492, 860], [384, 861], [385, 862]
-Path 212: [575, 857], [574, 857], [573, 857], [573, 858], [573, 859], [573, 860], [573.473, 861], [574, 861.541], [575, 862.519], [576, 863.568], [576.561, 865], [577.463, 866], [578, 866.521], [579, 867.517], [580, 868.593], [581, 869.639], [581.512, 871], [582.428, 872], [583, 872.578], [584, 873.615], [584.549, 875], [585.527, 876], [586.478, 877], [587, 877.511], [588, 878.527], [589, 879.543], [590, 880.547], [591, 881.04], [591, 882]
-Path 213: [814, 855], [813, 855.126], [812, 856.028], [811, 857], [810, 857], [809.226, 858], [808.127, 859], [807, 859.342], [806.345, 860], [805.357, 861], [804.363, 862], [803.267, 863], [802.217, 864], [801.288, 865], [800.268, 866], [799.245, 867], [798.259, 868], [797.063, 869], [797, 870]
-Path 214: [242, 858], [243, 858], [244, 859], [244.329, 860], [245, 860.543], [246, 861]
-Path 215: [495, 860], [494, 861], [493, 861.396], [492.46, 862], [492, 863]
-Path 216: [588, 860], [587.729, 861], [587, 861], [586, 861], [585, 861]
-Path 217: [509, 862], [508, 862], [507, 863], [507, 864], [506.597, 865], [506, 865]
-Path 218: [501, 866], [502, 866], [503, 866.37], [503, 867], [503, 868], [504, 869], [504, 870]
-Path 219: [566, 866], [567, 866], [568, 866.377], [568.404, 867], [569, 867], [570, 867], [571, 868]
-Path 220: [746, 865], [746.918, 865], [747, 865.652], [748, 866], [748.221, 867], [749, 867.471], [749, 868]
-Path 221: [819, 865], [817.516, 865], [817, 865.502], [816, 866.444], [815, 867], [814.382, 868], [813.337, 869], [812, 869.453], [811.454, 870], [810.395, 871], [809.384, 872], [808, 872.547], [807, 873.449], [806.425, 874], [805.329, 875], [804.211, 876], [803, 876.521], [802, 877.512], [801, 878.44], [800.416, 879], [799.375, 880], [798.325, 881], [797, 881.491], [796.5, 882], [795.474, 883], [794.441, 884], [793.283, 885], [792, 886], [791, 886], [790, 886.56], [789, 888], [788, 888], [787, 888.585], [786, 889.47], [786, 890], [785, 891], [784, 891.534], [783, 892.55], [782, 893.529], [781, 894.528], [780, 895.531], [779, 896.513], [778, 897.483], [777.46, 898], [776.422, 899], [775.397, 900], [774, 900.578], [773, 901.534], [772, 902.486], [771.448, 903], [770.405, 904], [769.366, 905], [768.355, 906], [767, 906.606], [766, 907.573], [765, 908.521], [764, 909.49], [763.476, 910], [762.469, 911], [761.483, 912], [760.542, 913], [760, 913.446], [759.581, 914], [759, 914.354], [758.365, 915], [757.302, 916], [756.267, 917], [755.177, 918], [754, 918.317], [753.392, 919], [752.321, 920], [751.259, 921], [750.216, 922], [749, 922.437], [749, 923], [748.055, 924], [747, 924.174], [746.24, 925], [745, 926], [744, 927], [743, 928], [742, 929], [741, 929], [740, 930], [739, 930], [738, 931], [737, 932], [736, 933], [735.326, 934], [734.595, 935], [734, 935]
-Path 222: [498, 868], [497.55, 869], [497, 869.575], [497, 871], [497, 872], [497, 873], [497, 874]
-Path 223: [515, 862], [515.451, 863], [516, 864.492], [516.554, 865], [517.492, 866], [518, 866.522], [518.503, 867], [519, 868], [520, 868.54], [520.331, 870], [521, 870]
-Path 224: [743, 868], [742, 868], [741.856, 869], [741, 869.692], [740, 871], [739.543, 872], [739, 872]
-Path 225: [839, 869], [838, 870], [837, 870], [836, 870], [835.481, 871], [834.55, 872], [834, 872.491], [833.563, 873], [833, 873.503], [832, 874.534], [831, 875.472], [830.488, 876], [829.454, 877], [828.392, 878], [827.313, 879], [826.18, 880], [825, 880.308], [824.364, 881], [823.309, 882], [822, 882.372], [821.426, 883], [820.332, 884], [819.249, 885], [818.161, 886], [817, 886.366], [816.38, 887], [815.319, 888], [814.207, 889], [813, 889.166], [812.265, 890], [811, 891]
-Path 226: [478, 871], [477, 871], [476, 871.55], [475, 872.559], [474, 873.548], [473, 874.491], [472.514, 875], [472, 875.469], [471.513, 876], [471, 876.474], [470.438, 877], [469.387, 878], [468.257, 879], [467, 879.515], [466, 880.537], [465, 881.418], [464.434, 882], [463.305, 883], [462.142, 884], [461, 884.494], [460.447, 885], [459.218, 886]
-Path 227: [598, 867], [598.409, 868], [599, 869.428], [600, 870.496], [601, 871], [601.444, 872], [602, 872.551], [603, 873.458], [603.407, 874], [604, 874.374], [604.45, 875], [605, 875.378], [605.413, 876], [606, 876.681], [606.537, 878], [607.539, 879], [608.433, 880], [609, 880.433], [609, 881]
-Path 228: [793, 871], [792, 871], [791.173, 872], [790, 872.338], [789.329, 873], [788.284, 874], [787.327, 875], [786, 875.501], [785, 876.578], [784.343, 878], [783.334, 879], [782.321, 880], [781, 881], [780.386, 882], [779.358, 883]
-Path 229: [566, 869], [566.371, 870], [567, 871.46], [568, 872], [568.513, 873], [569.409, 874], [570, 874.606], [571, 875.645], [571.646, 877], [572.549, 878], [573.498, 879], [574, 879.514], [575, 880.606], [576, 881.638], [577, 882.646], [577.645, 884], [578.596, 885], [579.569, 886], [580.446, 887], [581, 887.564], [582, 888.601], [583, 889.579], [583.64, 891], [584.557, 892], [585.445, 893], [586, 893.499], [586.362, 894], [587, 894.726], [587.667, 896], [588, 897]
-Path 230: [862, 874], [861, 874], [860, 874], [859.465, 875], [858.429, 876], [857.377, 877], [856.311, 878], [855.226, 879], [854, 879.394], [853.376, 880], [852.375, 881], [851.392, 882], [850.519, 883], [850, 883.452], [850, 884], [849.7, 885], [849, 885]
-Path 231: [737, 876], [738, 876], [739, 876], [740, 876.748]
-Path 232: [750, 875], [749, 875], [748.477, 875], [748, 875.547], [747.419, 876], [747, 876.512], [746, 877], [745.488, 878], [744.458, 879], [743.476, 880], [743, 881]
-Path 233: [204, 877], [204, 878], [205, 878], [206, 878.46], [206.523, 879]
-Path 234: [558, 876.173], [557, 877], [556, 878], [555, 878], [554.044, 879], [553.239, 880], [552.255, 881], [551.324, 882], [551, 883]
-Path 235: [643, 868], [642, 868], [641, 868], [640, 868], [639.483, 868], [639, 868.578], [638, 869], [637.479, 869], [637, 869.674], [636.483, 870], [636, 871], [635, 872], [634.495, 872], [633.506, 873], [632.525, 874], [631.582, 875], [631, 875.552], [630, 876.473], [629.396, 877], [629, 878], [628, 879], [627, 879], [626, 879], [625.413, 880], [624.434, 881], [623.449, 882], [622.388, 883], [621.137, 884]
-Path 236: [504, 875], [504, 875.517], [504.802, 876], [505, 877], [505, 878], [505, 879], [505, 880], [506, 880.395], [506, 881], [506, 882], [507, 883], [506.103, 884]
-Path 237: [271, 881], [270, 882], [269, 882], [268, 882]
-Path 238: [367, 881], [366, 881], [365.108, 882], [364.003, 883], [363, 883.31], [362.342, 884], [361.303, 885]
-Path 239: [199, 881], [198, 881.265], [197, 882.397], [196, 883], [195.334, 884], [194, 884.56], [193, 885.55], [192.435, 887], [191.542, 888], [191, 888.611], [190, 889.576], [189, 890.541], [188.455, 892], [187.039, 893], [186.25, 894], [186, 895], [185, 896], [184, 896], [183, 896], [182, 897]
-Path 240: [287, 883], [286, 883], [285.366, 884], [284, 884.413], [284, 885], [283, 886], [282, 887], [282, 888], [281.094, 889]
-Path 241: [524, 879], [524.286, 880], [525, 881], [525, 881.511], [525.581, 882], [526, 883], [527, 883.536], [528, 884.567], [529, 885.676], [529.464, 887], [530, 887.552], [531, 888.538], [532, 889.522], [533, 890.501], [534, 891.536], [534.54, 893], [535.374, 894], [536, 894.478], [536.401, 895], [537, 895.485], [537, 896], [537, 897], [537.29, 898], [538, 898.708], [538, 900]
-Path 242: [836, 882], [835, 882], [833.585, 882], [833, 883], [832.175, 884], [831, 885], [830, 885.316], [829.317, 886], [828, 886.55], [827, 887.492], [826.47, 888], [825.427, 889], [824.378, 890], [823.314, 891], [822, 891.435], [821.43, 892], [820.387, 893], [819.237, 894], [818, 894.386], [817.45, 895], [816.417, 896], [815.401, 897], [814, 897.339], [813.427, 898], [812.293, 899], [811.448, 900], [810.529, 901], [810, 901.549], [809, 902.48], [808.517, 903], [808, 903.433], [807.511, 904], [807, 904.407], [806.467, 905], [805.339, 906], [804.329, 907], [803, 907.539], [802, 908.49], [801.507, 909], [801, 909.471], [800.493, 910], [799.483, 911], [798.523, 912], [798, 912.383], [797.64, 913], [797, 913.46], [796.523, 914], [796, 914.522], [795, 915], [794, 915], [793, 915]
-Path 243: [228, 884], [227.055, 885], [226, 885.471], [226, 886], [225.49, 887]
-Path 244: [483, 884], [482, 884], [481.378, 885], [480.403, 886], [479, 886.368], [479, 887]
-Path 245: [907, 885], [908, 885], [909, 885], [910, 885], [911, 885], [912, 885.875], [913, 886], [914, 886], [915, 886], [916, 886.54], [917, 887], [918, 887], [919, 887.043], [919, 888]
-Path 246: [323, 886], [322, 886], [321.462, 887], [321, 888], [320.428, 889], [319.487, 890], [318.446, 891], [317.357, 892], [316.302, 893], [315, 893.457], [314.478, 894], [313.433, 895], [312.458, 896], [311.419, 897], [310.321, 898], [309.293, 899], [308.278, 900], [307, 900.479], [306.477, 901], [305.463, 902], [304.365, 903], [303.145, 904], [302, 905], [301, 905.355], [300.439, 906], [299.438, 907], [298.379, 908], [297, 908.456], [297, 909], [296.35, 910], [295, 910.358], [294.467, 911], [293.264, 912], [292.029, 913], [291.068, 914], [290, 914.061], [289.096, 915], [288, 916], [287, 917], [286, 918]
-Path 247: [231, 888], [230.502, 889], [230, 889], [229, 890], [229, 891], [228.624, 892], [228, 892]
-Path 248: [735, 882], [733.604, 882], [733, 883], [733, 883.782], [732.45, 884], [731.554, 885], [731, 886.416], [730, 887.446], [729, 888], [728, 889], [727, 890], [726, 891], [725, 892], [724, 892]
-Path 249: [928, 889], [927, 889], [926, 889], [925, 889.665], [924, 890], [923, 890], [922, 890]
-Path 250: [83, 890], [83.5498, 891], [85, 891.402], [85, 892]
-Path 251: [498, 890], [498, 890.635], [499, 891], [499, 892], [499.528, 893]
-Path 252: [731.486, 890], [732, 891], [733, 891.481], [733.206, 892], [734, 892]
-Path 253: [891, 886], [892, 886], [893, 886.498], [894, 887], [895, 887], [896, 887], [897, 887], [898, 887], [899.346, 887], [900, 888], [901, 889], [902, 889], [902.529, 889], [903, 889.508], [904, 890], [905.443, 890], [906, 891], [907, 891], [908, 891.535], [909, 892], [910, 892.455], [910.434, 893], [911, 893.319], [911, 894], [911.556, 895], [912, 896], [912.462, 897], [913, 897.572], [913.408, 899], [914, 899.525], [914, 901], [914.439, 902], [915, 902]
-Path 254: [520, 881], [518.719, 881], [518, 882], [517.509, 883], [517, 884.396], [516.305, 885], [515.503, 886], [514.565, 887], [514, 887.597], [513, 888.425], [512, 889], [511, 889], [510, 889.473], [509, 890], [508, 890], [507.485, 890], [507, 891.054], [506, 892], [505, 892], [504, 892], [503.442, 893]
-Path 255: [808, 892], [807, 892], [806.131, 893], [805.034, 894], [804, 894.243], [803.279, 895], [802.134, 896], [801, 896.325], [800.413, 897], [800, 898]
-Path 256: [495, 893], [494, 893], [493.166, 894], [492, 895], [491, 895]
-Path 257: [853, 895], [852, 895], [851.333, 896], [850.226, 897], [849, 897.667], [848.343, 899], [848, 900]
-Path 258: [238, 897], [237, 897], [236, 897], [235.304, 898], [235, 899], [234.707, 900], [234, 900.275], [233.336, 901], [232, 901.649], [232, 903]
-Path 259: [83, 898], [84, 898.441], [84, 899], [84.4691, 900], [85, 900.371], [85, 901]
-Path 260: [333, 898], [334, 898.503], [335, 899.521], [336, 900.572], [336.519, 902], [337.17, 903], [338, 903]
-Path 261: [610, 894], [609, 894], [608.464, 894], [608, 895], [607, 896.022], [606, 897], [605.37, 897], [605, 897.517], [604, 898.453], [603, 899], [602.533, 900], [602, 900]
-Path 262: [765, 895], [764, 896], [763, 896.01], [762, 897], [761, 897.256], [760, 898.288], [759, 899], [758.312, 900], [757.336, 901], [756.283, 902], [755.243, 903], [754.203, 904], [753.158, 905], [752.118, 906], [751, 907], [750, 907.193], [749.216, 908], [748, 909], [747, 910], [746, 910.054], [745.094, 911], [744, 912], [743, 913], [742, 913.096], [741.105, 914], [740.048, 915], [739, 915.348], [738.384, 916], [737.294, 917], [736.204, 918], [735.157, 919], [734.164, 920], [733, 920.416], [732.44, 921], [731.393, 922], [730.33, 923], [729.214, 924], [728.108, 925], [727.118, 926], [726.128, 927]
-Path 263: [843, 902], [842, 902], [841.426, 902], [841, 902.588], [840, 903], [840, 904], [839, 905], [838, 905.209], [837.232, 906], [836, 906.473], [835.47, 907], [834.44, 908], [833.398, 909], [832, 909.419], [831.509, 910], [831, 910.288], [830.554, 911], [830, 911.333], [829.292, 912], [828.433, 913], [827.434, 914], [826, 914.351], [825.55, 915], [825, 915.185], [825, 916]
-Path 264: [459, 904], [458, 904], [457, 904], [456.473, 905], [455.465, 906], [454.499, 907], [453.471, 908], [452.423, 909], [451.46, 910], [450.477, 911], [449.455, 912], [448, 912.601], [447, 913]
-Path 265: [487, 905], [486, 905], [485, 905], [484.547, 906], [484, 906.516], [483, 907.456], [482.461, 908], [481.393, 909], [480, 909.608], [479, 910.499], [478.46, 911], [477.385, 912], [476, 912.572], [475, 913.623], [474, 914.498], [473.484, 915], [472.395, 916], [471.283, 917], [470, 917.521], [469, 918.223], [468.23, 919], [467, 920], [466, 921], [465, 921], [464, 921], [463, 921.609], [462.185, 923], [461.087, 924], [460.006, 925], [459, 925.274], [458.266, 926], [457.164, 927], [456, 927.378], [455.44, 928], [454.41, 929]
-Path 266: [172, 904], [171, 904], [170.463, 904], [169.503, 905], [169, 905.599], [168, 906], [167.505, 907], [167, 907.38], [167, 908], [166, 909]
-Path 267: [513, 907], [512, 907], [511.097, 908], [510, 908.245], [509.452, 909]
-Path 268: [509, 911], [509.699, 912], [510.621, 913], [511.631, 914], [512.611, 915], [513.589, 916], [514.576, 917], [515.533, 918], [516.5, 919], [517, 919.532], [518, 920.165], [518, 921]
-Path 269: [707, 912], [708, 912], [708, 913], [708, 914], [708.568, 915], [709.312, 916], [710, 916], [711, 917], [711.464, 918], [712, 918.414], [712.407, 919], [713, 919]
-Path 270: [266, 913], [265, 913], [264.213, 914], [263.03, 915], [262, 915], [261, 915.478], [261, 916], [260.87, 917], [260, 917]
-Path 271: [465, 913], [464, 913], [463, 913], [462.572, 914], [462, 914.511], [461, 915.547], [460, 916.601], [459.275, 918], [458, 918.281], [457.284, 919], [456, 920], [455, 921], [454, 921.321], [453.343, 922], [452, 922.606], [451, 923.521], [450, 924.443], [450, 925]
-Path 272: [605, 915], [604, 916], [603, 916], [602, 916.584], [601, 917.57], [600, 918.483], [599.512, 919], [599, 919.418], [598.437, 920], [597.396, 921], [596.406, 922], [595.393, 923], [594.368, 924], [593.323, 925], [592, 925.507], [591.532, 927], [591, 927.488], [591, 928], [591, 929]
-Path 273: [533, 915], [534, 916], [534.823, 916], [535, 917], [536, 917]
-Path 274: [71, 917], [71, 918], [71.4585, 919], [72, 919], [73, 919], [74, 919.036], [74, 920]
-Path 275: [820, 918], [819, 918], [818.47, 918], [818, 919.078], [817, 920], [816, 920], [815.407, 921], [814.353, 922], [813.351, 923], [812, 923.571], [811, 924.501], [810, 926], [809, 926.664], [809, 928], [808.263, 929], [807, 929.286], [806.397, 930], [806, 931], [805.273, 932], [804, 932.594], [803, 933.204], [802.375, 934]
-Path 276: [175, 921], [175.563, 921], [176, 922], [176.493, 923], [177, 923.529]
-Path 277: [257, 923], [256, 923], [255, 923], [254.554, 924], [254, 924.601], [253, 925.513], [252, 926.438], [251.403, 927], [250.338, 928], [249, 928.534], [248, 929.467], [247.427, 930], [246.369, 931], [245.366, 932], [244.277, 933]
-Path 278: [239, 926], [238, 926], [237.219, 927], [236.047, 928], [235, 928.293], [234.28, 929], [234, 930]
-Path 279: [66, 926], [66, 927], [66, 928], [66.5362, 929], [68, 929], [69, 929]
-Path 280: [403, 913], [402, 913], [401, 913.346], [400.392, 914], [399.525, 915], [398.646, 916], [398, 916.525], [397.483, 917], [396.54, 918], [397, 919], [397, 920], [397, 921], [397, 922], [397, 923], [397, 924.459], [397.605, 925], [398.433, 926], [399, 927], [399.457, 928], [400, 928.571], [400.421, 930], [401, 930.588], [401, 932], [401.512, 933], [402, 934], [402, 935], [402.606, 936], [403.408, 937], [404, 937.584], [404.544, 939], [405.448, 940], [406, 940.539], [407, 941.593], [408, 942.357], [408, 943]
-Path 281: [684, 929], [684.664, 930], [685.441, 931], [686, 931.55], [686.461, 933], [687, 933.479], [687, 934], [687, 935]
-Path 282: [905, 928], [905, 929], [906, 929.451], [906, 930], [906, 931]
-Path 283: [345, 928], [345, 928.614], [345.581, 929], [346, 930], [347, 930.598], [347.492, 932], [348, 932.418], [348, 933], [348, 934]
-Path 284: [448, 931], [447, 931], [446, 931], [445.464, 932], [444.217, 933], [443.245, 934], [442.396, 935], [441.43, 936], [440, 936]
-Path 285: [591, 931], [591.461, 932], [592, 932.524], [592.566, 934], [593.487, 935], [594, 935.534], [594.566, 937], [595.469, 938], [596, 938.51], [597, 939.609], [597.575, 941], [598.471, 942], [599, 942.541], [600, 943.556], [601, 944.549], [602, 945.504], [603, 946], [604, 946.556], [605, 947], [606, 947.495], [606.546, 948], [608, 948.171], [608, 949]
-Path 286: [724, 928.064], [723, 929.022], [722, 930.032], [721, 931], [720, 931], [719.342, 932], [718.202, 933], [717.072, 934], [716, 935], [715, 935.278], [714.257, 936], [713.227, 937], [712.194, 938], [711.229, 939], [710, 939.396], [709.461, 940], [708.519, 941], [708, 941.357], [708, 942], [708, 943], [708, 944], [707.359, 945], [706.44, 946], [705.483, 947], [704.546, 948], [704, 948.599], [703.402, 950], [702.382, 951], [701.356, 952], [700.303, 953], [699, 953.378], [698.419, 954], [697.373, 955], [696.264, 956], [695.245, 957], [694.229, 958], [693, 958.253], [692.442, 959], [692, 960]
-Path 287: [543, 926], [543, 926.531], [543.553, 927], [544, 928], [544.474, 929], [545, 930], [545, 931], [545, 932], [545, 933], [545.407, 934], [546, 934.605], [546, 936], [546.501, 937], [547, 938], [547.485, 939], [548, 939.426], [548.323, 940], [549, 940.399], [549, 941]
-Path 288: [242, 934], [241, 935], [240, 935.06], [239.11, 936], [238, 936]
-Path 289: [426, 928], [425.376, 928], [424.528, 929], [424, 930], [424, 931.409], [423.404, 932], [423, 932.516], [422.473, 933], [422, 934], [421.409, 935], [420.508, 936], [420, 936.551], [419, 937.575], [418, 938.572], [417, 939.538], [416.264, 941], [415, 941.262], [414.38, 942]
-Path 290: [633, 934], [632, 934], [631, 934], [630, 934.649], [630, 936]
-Path 291: [843, 928], [843, 928.676], [843.512, 929], [844.449, 930], [845.457, 931], [846, 932], [846.486, 933], [847, 934], [847, 935], [847.553, 936], [848.508, 937], [850, 937.475], [850.496, 938], [851, 938], [852, 938.571], [853, 939.43], [853.339, 940], [854, 940]
-Path 292: [906, 935], [905, 935], [904.488, 936], [903.514, 937], [903, 937.527], [902, 938.46], [901.508, 939], [901, 939.348], [900.453, 940], [899.401, 941], [898.297, 942], [897, 943], [896, 943]
-Path 293: [227, 936], [226, 936], [225, 936], [224.393, 937], [223.408, 938]
-Path 294: [571, 935], [571, 936], [572, 936.597], [573, 937.598], [574, 938.566], [574, 940], [574, 941], [574, 942], [574.445, 943], [575, 943.594], [575.547, 945], [576, 946], [576, 947]
-Path 295: [67, 937], [67.404, 938], [68, 938.521], [68, 940], [68, 941], [68, 942], [68.4064, 943], [69, 943.083], [69, 944]
-Path 296: [167.487, 935], [168, 936], [168, 936.523], [169, 937], [169.432, 938], [170, 938.555], [170.461, 940], [171, 940.391], [171, 941]
-Path 297: [559, 935], [558, 935.485], [557.484, 936], [557, 937], [556, 937.59], [555, 938.559], [554, 939.468], [553.534, 940], [553, 940.314], [552.455, 941]
-Path 298: [798, 936], [797, 937], [796, 937], [795.346, 938], [794, 938.483], [793.503, 939], [793, 939.395], [792.423, 940], [791.343, 941], [790.348, 942], [789.315, 943], [788.186, 944], [787, 944.401], [786.488, 945], [785.511, 946], [785, 946.568], [784, 947.58], [783.407, 949], [782.41, 950], [781, 950.46], [781, 951], [780.565, 952], [780, 952.496], [779.495, 953], [778.121, 954]
-Path 299: [631, 938], [630, 938], [630, 939], [629.249, 940], [628, 940.403], [627.387, 941], [626.373, 942], [625.342, 943], [624.297, 944], [623.18, 945], [622, 946], [621, 946]
-Path 300: [672, 936], [673.245, 936], [674, 937], [675, 938], [675.497, 939], [676, 939.525], [677, 940.475], [677.467, 941], [678, 941.508], [678, 943]
-Path 301: [838, 930], [837, 930], [836, 931], [835, 931.105], [834, 932], [833, 932.31], [832, 933], [831, 934], [830, 934], [829, 935], [828, 936], [827, 936], [826, 937], [825, 937.319], [824, 938], [823, 938.543], [822, 939.381], [821.591, 940], [821, 940]
-Path 302: [234, 939], [234, 940], [233, 941], [232, 941]
-Path 303: [735, 937], [734, 937], [733.417, 937], [733, 937.529], [732, 938.486], [731, 939], [730.327, 940], [729.331, 941], [728.423, 942], [727.466, 943]
-Path 304: [300, 936], [300, 936.691], [300.593, 937], [301.396, 938], [302.28, 939], [303, 940], [303, 941], [303.585, 942], [304.472, 943], [305, 943.43], [305.483, 944], [306, 944.516], [307, 945.596], [308, 946]
-Path 305: [840, 942], [841, 942.369], [841.586, 943], [842.563, 944], [843.464, 945], [844, 945.538], [845, 946.612], [845.652, 948], [846.582, 949], [847.469, 950], [848, 950.549], [849, 951.63], [849.583, 953], [850, 954], [851, 955], [852, 956], [852.823, 957], [853.674, 958], [854.511, 959], [855, 960], [856, 961]
-Path 306: [768, 937], [767, 937.498], [766.419, 938], [765.514, 939], [764.551, 940], [763.507, 941], [763, 941.506], [762, 942.411], [761, 943], [760.333, 944], [759.243, 945], [758, 945.438], [757.425, 946], [756.379, 947], [755.295, 948], [754, 948.476], [753.463, 949], [752.442, 950], [751.383, 951], [750.31, 952], [749.231, 953], [748, 953.453], [747.439, 954], [746.417, 955], [745.394, 956], [744.327, 957], [743, 957.486], [742.493, 958], [741.483, 959], [740.448, 960], [739.369, 961], [738.137, 962], [737, 962.304], [736.305, 963], [735.13, 964], [734, 964.403], [733.421, 965], [732.377, 966], [731, 966.528], [730, 967.484], [729.467, 968], [728.366, 969], [727.285, 970], [726.262, 971], [725, 971.546], [724, 972.521], [723, 973.475], [722.48, 974], [721.395, 975], [720.337, 976], [719, 976.565], [718, 977.518], [717, 978.495], [716.508, 979], [716, 979.492], [715.496, 980], [714.431, 981], [713.417, 982], [712.395, 983], [711, 983.563], [710, 984.517], [709, 985.492], [708.484, 986], [707.492, 987], [706.501, 988], [706, 988.415], [705.448, 989], [704.355, 990], [703.268, 991], [702, 991.519], [701, 992.494], [700.442, 993], [699.399, 994], [698, 994.583], [697, 995.544], [696, 996.486], [695.41, 997], [694.387, 998], [694, 999]
-Path 307: [232, 944], [231, 944], [230, 944], [229.359, 945], [228.179, 946], [227, 947], [226, 947.248], [225.263, 948], [224, 948.446], [223.385, 949], [222.394, 950], [221.535, 951], [221, 951.427], [220.578, 952], [220, 952.437], [219.275, 953], [218.398, 954], [217.443, 955], [216.378, 956], [215, 957]
-Path 308: [665, 940], [665, 941], [665, 942.435], [665.773, 943], [666, 944], [666.552, 945], [667, 946], [667.562, 947], [668.501, 948], [669.488, 949], [670, 949.442], [670.38, 950], [671, 950], [672, 950]
-Path 309: [563, 944], [563, 945], [563.443, 946], [564, 946.583], [564, 948]
-Path 310: [546, 946], [545, 946], [544, 947], [543, 947], [542, 948], [541, 948.274], [540.266, 949], [539, 949.527], [538, 950.524], [537, 951.459], [536.349, 952], [535.3, 953], [534.275, 954], [533, 954.318], [532.599, 955], [532, 955.347], [531.659, 956], [531, 956.467], [531, 957], [530.277, 958], [529.258, 959], [528, 959.57], [527, 960.068], [527, 961]
-Path 311: [212, 947], [213, 947], [214, 947.425], [214.571, 948], [216, 949], [217, 949.523], [218, 950.423], [218, 951]
-Path 312: [835, 947], [834, 947], [833, 947], [832.291, 948], [831.25, 949], [830.204, 950], [829.029, 951], [828, 951.263], [827.29, 952], [826.251, 953]
-Path 313: [383, 947], [383, 948], [383.593, 949], [384.435, 950], [385, 950], [386, 950]
-Path 314: [678, 948], [677, 948], [676, 948], [675.403, 949], [675, 950]
-Path 315: [853, 947], [853, 948], [854, 948.537], [854.567, 950], [855, 951], [855.571, 952], [856.533, 953], [857.587, 954], [859, 954.527], [859.502, 956], [860, 957], [860.499, 958], [861, 958.421], [861.549, 959], [862.584, 960], [863.428, 961], [864, 961.569], [864.525, 963], [865.125, 964], [866, 964]
-Path 316: [60, 949], [59, 949], [58, 949], [58, 950], [57.5466, 951], [57, 951.552], [56.3484, 953], [55.3158, 954], [54.4304, 955], [53.5353, 956], [53, 956.317], [53, 957]
-Path 317: [509, 940], [509, 940.822], [510, 941], [511, 941.497], [512.442, 942], [513.379, 943], [514, 943.636], [515, 944.423], [516, 945.425], [517.445, 946], [518, 946.68], [519, 947.393], [520, 948], [520.516, 948], [521, 948.525], [522, 949], [522.599, 950], [524, 950.484], [524.451, 951], [525, 951.452], [525.435, 952], [526, 952.436], [526, 953], [526.431, 954], [527, 954.284], [527.555, 955]
-Path 318: [671, 933], [670, 933.023], [669, 934], [668, 934.434], [666.545, 935], [666, 935.51], [665, 936.4], [664, 937.179], [663, 938.054], [662, 939], [661, 940], [660, 940.409], [659, 941.012], [658, 942], [657, 943], [656, 944], [655, 944], [654, 945], [653, 945.033], [652, 946], [651, 946.246], [650, 947.169], [649, 948], [648.479, 948], [648, 948.547], [647.498, 949], [647, 949.584], [646.442, 950], [646, 950.537], [645, 951], [644.353, 952], [643, 952.57], [642, 953.584], [641, 954.556], [640, 955.547], [639, 956]
-Path 319: [728, 949], [726.502, 949], [725.512, 950], [725, 950.571], [724, 951], [723.457, 952], [722.319, 953], [721, 954], [720, 954], [719, 955], [718, 955.381], [717.314, 956], [716, 956.507], [715, 957.311], [714.383, 958], [713, 959], [712, 960], [711, 960], [710, 960.268], [709.302, 961], [708, 962], [707, 962], [706, 963], [705, 963], [704, 964], [703, 964], [702, 965], [701, 965.327], [700.336, 966], [699.303, 967], [698.163, 968], [697.239, 969], [696.49, 970], [695.621, 971], [695, 971.518], [694.458, 973]
-Path 320: [819, 950], [819, 950.893], [818, 951], [817, 951], [816, 952]
-Path 321: [207, 954], [207, 955], [207, 956], [208, 957], [208, 958]
-Path 322: [824, 954], [823.302, 955], [822, 955.465], [821.521, 956], [821, 956.425], [820.51, 957], [820, 957.402], [819.454, 958], [818.341, 959], [818, 960], [817, 961], [816, 961.241], [815.253, 962], [814.195, 963], [813, 963.37], [812.474, 964], [811.64, 965], [811, 965.616], [811, 967], [812, 967.773], [813, 968.827], [813.528, 970], [814.424, 971], [815, 971.581], [815.575, 973], [816.453, 974], [817, 974.578], [817.55, 976], [818.44, 977], [819, 977.545], [819.611, 979], [820.413, 980], [821, 980.544], [821.595, 982], [822.507, 983], [824, 983.912], [824.506, 985], [825.415, 986], [826, 986.572], [826.59, 988], [827.51, 989], [828.468, 990], [829, 990.551], [830, 991.61], [830.586, 993], [831.5, 994], [832, 994.492], [832.448, 995], [833, 995.535], [834, 996.553], [835, 997.538], [835, 999]
-Path 323: [263, 955], [264, 955.631], [265, 956.551], [266, 957.414], [266.626, 958], [267, 959]
-Path 324: [312, 955], [311, 955], [311, 956], [311, 957], [311.357, 958], [312, 958.314], [312.472, 959], [313, 959], [314, 959.467], [314.372, 960], [315, 960]
-Path 325: [200, 953], [199.401, 953], [199, 953.598], [198.365, 954], [198, 954.529], [197.385, 955], [196.508, 956], [196, 957], [195.498, 958], [194.524, 959], [194, 959.403], [193.417, 960], [192.386, 961], [191.534, 962], [191, 962.393], [190.397, 963], [189, 963.35], [189, 964], [188, 965], [187, 965]
-Path 326: [271, 957], [271, 958], [271.497, 959], [272, 959.561], [273, 960.548], [274, 961.473], [274.434, 962], [275, 962.349], [275.637, 963], [276.559, 964], [277, 965]
-Path 327: [774, 956], [773, 957], [772, 957.391], [771, 958], [770.378, 959], [769, 959.452], [769, 960], [768, 961], [767, 962], [766.259, 963], [765.449, 964], [764.488, 965], [763.5, 966], [763, 966.411], [762.455, 967], [761.389, 968], [760.386, 969], [759, 969.465], [758.428, 970], [757.351, 971], [756.294, 972], [755, 972.482], [754.478, 973], [753.42, 974], [752.332, 975], [751, 975.434], [750.47, 976], [749.429, 977], [748.356, 978], [747.271, 979], [746, 979.454], [745.439, 980], [744.379, 981], [743.345, 982], [742, 982.516], [741, 983.524], [740, 984.492], [739.472, 985], [738.395, 986], [737.05, 987], [736, 987.305], [735.322, 988], [734.292, 989], [733, 989.039], [732.091, 990], [731, 991], [730, 991.374], [730, 992], [729.842, 993], [729, 993], [728, 993.704], [727.253, 995], [726.303, 996], [725, 996.271], [725, 997]
-Path 328: [563, 953], [562, 953], [561, 953.391], [560.455, 954], [559.502, 955], [558.569, 956], [557.554, 957], [557, 957.522], [556, 958.399], [555, 959], [554.259, 960], [553, 960.455], [552.492, 961], [551.484, 962], [550.474, 963], [549.42, 964], [548, 964.517], [547, 965.299], [546.225, 966], [545, 966.467], [544.43, 967], [543.297, 968], [542.304, 969], [541, 969.51], [540.497, 971], [539.471, 972], [539, 973], [538, 974], [537, 975], [536, 976], [535, 976], [534, 976.54], [533, 977.562], [532, 978.539], [531, 979.483], [530.509, 980], [530, 980.438], [529.479, 981], [528.391, 982], [527.229, 983]
-Path 329: [641, 958], [641, 959], [641, 960], [641.544, 961], [642.42, 962], [643, 962.406], [643, 963], [643.504, 964], [644, 965], [644.265, 966], [645, 966]
-Path 330: [50, 960], [51, 960.497], [51, 961], [51, 962], [51, 963]
-Path 331: [254.042, 960], [255, 961], [255.621, 962], [256.146, 963], [257, 963]
-Path 332: [630, 961], [629, 962], [628, 963], [627, 963], [626, 964], [625, 965], [624, 966], [623, 966]
-Path 333: [683, 962], [682, 962], [681.277, 963], [680, 963.249], [679.301, 964], [678.192, 965], [677.105, 966], [676, 966.31], [675.3, 967], [674.25, 968], [673.173, 969], [672.127, 970], [671, 970.261], [670.283, 971], [669.201, 972], [668.141, 973], [667, 973.315], [666.33, 974], [665.259, 975], [664.169, 976], [663.055, 977], [662, 977.068], [661.083, 978], [660, 979], [659, 979.13], [658.149, 980], [657, 981], [656, 981.001], [655.002, 982], [654, 982.207], [653.252, 983], [652.16, 984], [651, 984.432], [650.45, 985], [649.441, 986], [648.443, 987], [647.481, 988], [646.498, 989], [645.432, 990], [645, 991], [644.016, 992], [643, 992.326], [642.321, 993], [641.399, 994], [640.405, 995], [639.436, 996], [638.537, 997], [638, 997.547], [638, 999]
-Path 334: [397, 957], [395.591, 957], [394.509, 958], [394, 958.51], [393, 959.441], [392, 960.392], [391, 961.479], [390, 962.496], [389, 963], [388.415, 964], [387.32, 965], [386.248, 966], [385, 966.476], [384.5, 967], [384, 967.441], [383.479, 968], [382.429, 969], [381.334, 970], [380, 971], [379, 971], [378, 972], [377, 973], [376, 973.601], [375, 974.562], [374, 975.487], [373.424, 976], [372, 976.619], [371, 977.6], [370, 978.587], [369, 979.546], [368, 980.479], [367.456, 981], [366.406, 982], [365.377, 983], [364, 983.519], [363, 984.478], [362.479, 985], [361.441, 986], [360.423, 987], [359.473, 988], [358.559, 989], [358, 989.576], [357, 990]
-Path 335: [316, 964], [315, 964], [314, 964], [313.583, 965], [313, 965]
-Path 336: [205, 965], [204, 965], [203.417, 966], [202.138, 967], [201, 968], [200, 969], [199, 970], [198, 970], [197, 970.404], [196.41, 971], [195, 971.505], [194, 973], [193.303, 974], [193, 975], [193, 976]
-Path 337: [272, 966], [272.712, 967], [273.396, 968], [274, 968.496], [274, 969], [274, 970]
-Path 338: [51, 965], [51.4704, 966], [52, 967], [52, 968], [52, 969], [52, 970], [52.4132, 971], [53, 971.429], [53.5542, 972], [55, 972], [56, 972.519]
-Path 339: [288, 966], [288, 966.596], [289, 967], [289.662, 968], [290.511, 969], [291.36, 970], [292, 970.299], [292.319, 971], [293, 971.445], [293, 972], [293.56, 973], [294.632, 974], [296, 974.543], [297, 975.556], [298, 976.537], [298.629, 978], [299.651, 979], [300.633, 980], [301, 981]
-Path 340: [887, 967], [887, 968], [888, 968.436], [888.455, 969], [889, 969]
-Path 341: [318, 970], [318.383, 971], [319, 971.546], [320, 972.54], [321, 973], [322, 973], [323, 973.268], [323.354, 974], [324, 974.249], [324, 975]
-Path 342: [902, 968], [902.476, 969], [903.431, 970], [904, 971], [905, 971.594], [906, 972.564], [907, 973.531], [908, 974.487], [908.494, 975], [909, 975.476], [909.538, 976], [910.553, 977], [911.563, 978], [912.576, 979], [913.574, 980], [914.579, 981], [915.601, 982], [916.582, 983], [917.551, 984], [918.53, 985], [920, 985.871], [921, 987], [921, 988], [921.055, 989], [922, 990]
-Path 343: [865, 969], [865.416, 970], [866.467, 971], [867.48, 972], [868, 973], [868, 973.505], [869, 974]
-Path 344: [587, 972], [586.205, 972], [586, 973.037], [585, 974], [584, 975], [583, 975], [582.115, 976], [581, 976.366], [581, 977], [580.464, 978], [579.507, 979], [579, 979.51], [578, 980]
-Path 345: [805, 970], [804, 970.457], [803.355, 971], [803, 972.317], [802, 973.296], [801.335, 974], [801, 975], [800, 976], [799, 976], [798, 976], [797.248, 977], [796.233, 978], [795.224, 979], [794, 979.328], [794, 980], [793.109, 981], [792, 981.221], [792, 982], [791, 983], [790, 983], [789, 984], [788, 984], [787, 985], [786.219, 986], [785.189, 987], [784.184, 988], [783, 988.292], [782.382, 989], [781.338, 990], [780.295, 991], [779.226, 992], [778.209, 993], [777, 994], [776, 995]
-Path 346: [165, 977], [164, 977], [163.386, 978], [162.426, 979], [161.495, 980], [160.583, 981], [160, 981.608], [159, 982.587], [158, 983.579], [157.344, 985], [156.009, 986], [155, 986]
-Path 347: [253, 977], [254, 977.54], [255, 978.611], [256, 979.525], [257, 980], [258, 980.581], [259, 981.396], [259.223, 982], [260, 982]
-Path 348: [227, 978], [227, 979], [228, 979.62], [229, 980.633], [229.551, 982], [230.44, 983], [231, 983.337], [231, 984]
-Path 349: [527, 977], [526, 978], [525, 979], [524, 979], [524, 980], [524, 981], [524, 982]
-Path 350: [683, 979], [682, 979], [681.023, 980], [680, 980.166], [679.22, 981], [678, 982], [677, 982.199], [676.217, 983], [675, 983.397], [674.405, 984], [673.341, 985], [672.219, 986], [671, 986.267], [670.297, 987], [669.203, 988], [668, 988.352], [667.384, 989], [666.391, 990], [666, 991]
-Path 351: [243, 976], [242, 976.064], [241, 977], [240, 977.474], [239, 978.415], [237.588, 979], [237, 980], [236, 980.54], [235, 981.478], [234.471, 982], [233.436, 983]
-Path 352: [285, 981], [286, 981.432], [286.311, 982], [287, 982]
-Path 353: [308, 981], [307, 981], [306, 982], [305, 982], [304, 983], [303, 983.513], [303, 985], [302.672, 986]
-Path 354: [312, 980.428], [313, 981], [313.644, 982], [314.563, 983], [315.518, 984], [316.444, 985], [317, 985.563], [317.594, 987], [318.27, 988], [319, 988]
-Path 355: [635, 979], [634, 979], [633, 980], [632, 980.143], [631, 981], [630, 981], [629.433, 982], [629, 983], [629, 984], [628.607, 985], [628, 985.185], [628, 986]
-Path 356: [868, 981], [867, 982], [866, 982.366], [866, 983], [865, 984], [864, 985], [863, 985.154], [862.184, 986], [861, 986.346], [860.341, 987], [859, 987.56], [858, 988.48], [858, 989], [857.186, 990], [856, 990], [855, 990.617], [854, 991.499], [854, 992], [853.317, 993], [852, 993.32], [852, 994]
-Path 357: [141, 982], [141, 983], [142, 983.531], [143, 984], [144, 984]
-Path 358: [619, 981], [619, 981.627], [620, 982], [620.562, 982], [621.479, 983], [622, 984], [622.47, 985], [623, 985.464], [623.381, 986], [624, 986], [625, 987]
-Path 359: [894, 968], [894, 968.635], [895.43, 969], [896.384, 970], [897, 971.359], [898, 972.479], [899, 973.474], [899.525, 974], [900.465, 975], [901.429, 976], [902, 977.423], [903, 978.476], [904, 979.431], [905, 980.392], [906, 981.401], [907.421, 982], [908.46, 983], [909, 984], [910, 984.421], [910.481, 985], [911, 985.39], [911.519, 986], [912.583, 987], [913.662, 988], [915, 988.619], [916, 989.565], [917, 990.545], [918, 991.609], [919, 992.7], [920, 993.549], [921, 994.482], [921.562, 995], [922.499, 996], [923, 996.383], [923.24, 997], [924, 997]
-Path 360: [292, 985], [293, 985], [294, 985.479], [294, 986]
-Path 361: [136, 986], [135, 986], [134.676, 987], [134, 987.378], [134, 988]
-Path 362: [523, 986], [522, 986], [521, 987], [520, 987.159], [519.202, 988], [518, 988.342], [517.343, 989], [516.327, 990], [515.326, 991], [514.313, 992], [513.238, 993], [512, 993.36], [511.36, 994], [510.292, 995], [509.207, 996], [508, 996.369], [507.38, 997], [506.335, 998], [505.374, 999]
-Path 363: [162, 987], [163, 987], [163.56, 988], [164.476, 989], [165, 989.585], [165.496, 991], [166, 991.401], [166.426, 992], [167, 992.358], [167, 993], [167.233, 994], [168, 994.778], [168, 996]
-Path 364: [380, 987], [379, 987], [378, 987], [377.598, 988], [377, 988.526], [376, 989]
-Path 365: [144, 987], [144, 988], [144, 989], [144, 990], [144.44, 991], [145, 991.301], [145, 992]
-Path 366: [434, 988], [433, 988], [432.449, 989], [431.37, 990], [431, 991], [430, 992], [429, 992.006], [428.005, 993], [427, 993.367], [426.379, 994], [425.312, 995], [424.317, 996], [423.858, 997], [423, 997]
-Path 367: [39, 989], [39.3222, 990], [40, 990], [41, 991], [42, 991.449], [42.5407, 992], [43.3585, 993], [44, 993.541], [45, 994], [46, 994.595], [47, 995]
-Path 368: [273, 988], [273, 989], [273, 990], [273.516, 991], [274.272, 992], [275, 992.418], [275.225, 993], [276, 993.452], [276.241, 994], [277, 994.562], [277.329, 996], [278, 996]
-Path 369: [874, 983], [874, 983.589], [875.433, 984], [876.395, 985], [877.474, 986], [878.458, 987], [879.485, 988], [880, 989], [881, 989.537], [882, 990.556], [883, 991.596], [883.592, 993], [884.603, 994], [885.602, 995], [886.592, 996], [887.55, 997], [888.427, 998], [889, 998.419], [889, 999]
-Path 370: [121, 990], [120, 990], [119, 991], [118, 991], [117, 992], [116, 992]
-Path 371: [615, 981], [614.055, 981], [614, 982.134], [612.614, 983], [611.645, 984], [610.666, 985], [610, 986], [609.6, 987], [609, 988], [609, 989], [609, 990]
-Path 372: [324, 991], [323, 991], [322, 991], [321.306, 992], [320.349, 993], [319.499, 994], [319, 995], [319, 996], [319, 997], [319.581, 998], [320, 999]
-Path 373: [774, 991], [774.328, 992], [775, 992.158], [775, 993]
-Path 374: [267, 992], [266.228, 992], [266, 992.692], [265, 993], [265, 994], [265, 995]
-Path 375: [353, 994], [352, 994], [351.338, 995], [350, 995.557], [349, 996.471], [348.604, 997], [348, 997.434], [347.709, 998], [347, 998.456], [347, 999]
-Path 376: [447, 993], [447, 993.508], [448, 994], [448.585, 995], [449.631, 996], [451, 996.572], [452, 997.449], [452.484, 998], [453, 998.382], [453, 999]
-Path 377: [360.445, 993], [361, 994], [361, 995], [362, 995.559], [363, 996.575], [363.493, 998], [364, 998.399], [364, 999]
-Path 378: [849, 995], [848, 995], [847, 996], [846, 997], [846, 998], [846, 999]
-Path 379: [36, 996], [37, 996.347], [37.5507, 997], [39, 997]
-Path 380: [382, 995], [382, 995.842], [383, 996], [384, 996], [384.621, 997], [385.566, 998], [386, 999]
-Path 381: [852, 994], [853, 995], [853, 996], [853.657, 997], [854.515, 998], [855, 999]
-Path 382: [195, 991], [194.435, 991], [194, 992.435], [193, 993.387], [192, 994.494], [191.458, 995], [191, 996.312], [190, 997], [189.395, 998], [189, 999]
-Path 383: [592, 995], [592, 996], [592, 996.547], [593, 997], [593.475, 998], [594, 998.378], [594, 999]
-Path 384: [927, 994], [928, 994], [929, 995], [929, 995.511], [930, 996.432], [931, 997], [932, 997.492], [932.455, 998], [933, 998.466], [933, 999]
diff --git a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.dbf b/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.dbf
deleted file mode 100644
index dad747fadfc34595b27fc718e1f0a0833bd0fb0f..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4910095bcc63510b5d14ced32ec054d329fb1f106676869563424bccd6d998bc
-size 12597
diff --git a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shp b/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shp
deleted file mode 100644
index db9524f4ac8c78193c1af6e2767f3ae5901dfba6..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a1e3ab5de6caec9d1e335eafe346c673f87ec06c02f0fb3a5ccafeb3919961c8
-size 12084
diff --git a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shx b/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shx
deleted file mode 100644
index 33a059571d78911f9ed73052eb7c74ad7222ad7a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0ffb45fdd34b1bb0bbb8817b1de538b4609e806972cf5287d9ec3b7828c86cc2
-size 628
diff --git a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.dbf b/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.dbf
deleted file mode 100644
index fdefcdf3425ca5e4912797aacabf50f7a36609cb..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1acfd03f31de99605e10020ae2646b81143bd7f816559bc7d962ef2b49216af7
-size 10055
diff --git a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shp b/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shp
deleted file mode 100644
index b3adb3d3bb2ccb2ae5bfefd4abb19bd64970103a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ff01566163097422211e31b35823cc6ede15efa3965bcc72f2e89f8b95fc2b30
-size 12860
diff --git a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shx b/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shx
deleted file mode 100644
index 8eb95e8e60e8cf4597630573a9dcfa4c795487fc..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b033aa81a9212511ecb13bf36bb9b92d26a2272e8fd2e7106fd938f623084664
-size 668
diff --git a/Data/Baseline/OTB/Files/obTvHooverMatrixFilter.txt b/Data/Baseline/OTB/Files/obTvHooverMatrixFilter.txt
index 94d2133f6b9804fd92b3caedf977dda8f0e3fb3c..f26c0213ffe4decceafcc5ddef12cfb7804081a4 100644
--- a/Data/Baseline/OTB/Files/obTvHooverMatrixFilter.txt
+++ b/Data/Baseline/OTB/Files/obTvHooverMatrixFilter.txt
@@ -1,4 +1,3 @@
-5826	0	0	0	0
-0	1221	0	0	0
-0	0	1560	0	76
-291	0	0	1476	72
+66	0	0
+0	66	0
+0	0	77
diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.dbf b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.dbf
deleted file mode 100644
index 0f08f3fb2beb363362f44b8b9dd9ff44202c288d..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7b569ccdf07c81702a2d9b9d2de6fb196f3ac8d3a28cac40b77b520b786cba61
-size 77
diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shp b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shp
deleted file mode 100644
index 9b56f40fa4796185ee13dad6841807407a6d48d3..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2ea4e04a7d38ecc8754828204aab67cdf51fd69054da7c1ed8c3257ce1764ece
-size 284
diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shx b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shx
deleted file mode 100644
index 2a1f95e40a1cf6322eacb52ab4c796a7ffba7b35..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3e4c1b4db2157ab84d77eaf714555cca7915b573fbe5e691e6ab2ce4f7e2defc
-size 108
diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.dbf b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.dbf
index 0f08f3fb2beb363362f44b8b9dd9ff44202c288d..631e7c82cb3ff2f983790645329a5d14cfe82596 100644
--- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.dbf
+++ b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.dbf
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:7b569ccdf07c81702a2d9b9d2de6fb196f3ac8d3a28cac40b77b520b786cba61
-size 77
+oid sha256:2dcf4153202960ac9e3d92293108c2ffa5ebb4c258695f366e3e49cf078f2808
+size 102
diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shp b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shp
index c6b34a49304ff32b6d7bb2314522a7fece34d6b5..73c5eea2ce3b904768567f18fa0b0ce0672eafcb 100644
--- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shp
+++ b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shp
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:42c325b877fb5db5b15ee30e5c691a4500370bda6bf851ec33cb868f0b8f73fe
-size 364
+oid sha256:a5b0b418ddcc3967ac3dc0c263799abcc2173f6755c984583bdae05e2f94e1c0
+size 828
diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shx b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shx
index ccd3962d47d6794f8b06ea86131e5853270d7df6..ed61a0c43a797502a4a2638de7b027a34f646c09 100644
--- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shx
+++ b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shx
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:7eb939ef1b4d627696c5ddb141d2364794e5fd7f85f56a31bacc97d161b4f692
-size 108
+oid sha256:5f275e86fab9c7dbd9aade5a425fb227d909b1b3ecc81b139f7ce01ffb5c2f91
+size 124
diff --git a/Data/Baseline/OTB/Files/srRCC8CalculatorOutput.txt b/Data/Baseline/OTB/Files/srRCC8CalculatorOutput.txt
deleted file mode 100644
index 443a0f86e801040b656531a5d6964a27e7964204..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/srRCC8CalculatorOutput.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Test results from otbImageToImageRCC8calculator test.
-7	1	0	0	
-1	7	4	6	
-0	3	7	2	
-0	5	2	7	
diff --git a/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput.dot b/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput.dot
deleted file mode 100644
index 79ae6d70ff30eba499eaf025da67cc89073e07f1..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput.dot
+++ /dev/null
@@ -1,19 +0,0 @@
-digraph G {
-0 [NumberOfPointsInPath="112",P0x="55.5",P0y="123.5",P100x="31.5",P100y="141",P101x="31.5",P101y="139.5",P102x="41.5",P102y="129.5",P103x="43",P103y="129.5",P104x="44.5",P104y="127.5",P105x="46",P105y="127.5",P106x="46.5",P106y="126.5",P107x="49",P107y="126.5",P108x="49.5",P108y="125.5",P109x="51",P109y="125.5",P10x="80",P10y="129.5",P110x="51.5",P110y="124.5",P111x="55",P111y="124.5",P11x="81.5",P11y="129.5",P12x="91.5",P12y="139.5",P13x="91.5",P13y="141",P14x="93.5",P14y="142.5",P15x="93.5",P15y="144",P16x="94.5",P16y="144.5",P17x="94.5",P17y="146",P18x="95.5",P18y="146.5",P19x="95.5",P19y="148",P1x="67.5",P1y="123.5",P20x="96.5",P20y="148.5",P21x="96.5",P21y="151",P22x="97.5",P22y="151.5",P23x="97.5",P23y="154",P24x="98.5",P24y="154.5",P25x="98.5",P25y="157",P26x="99.5",P26y="157.5",P27x="99.5",P27y="163",P28x="100.5",P28y="163.5",P29x="100.5",P29y="178.5",P2x="68",P2y="124.5",P30x="99.5",P30y="179",P31x="99.5",P31y="184.5",P32x="98.5",P32y="185",P33x="98.5",P33y="187.5",P34x="97.5",P34y="188",P35x="97.5",P35y="190.5",P36x="96.5",P36y="191",P37x="96.5",P37y="193.5",P38x="95.5",P38y="194",P39x="95.5",P39y="195.5",P3x="71.5",P3y="124.5",P40x="94.5",P40y="196",P41x="94.5",P41y="197.5",P42x="93.5",P42y="198",P43x="93.5",P43y="199.5",P44x="91.5",P44y="201",P45x="91.5",P45y="202.5",P46x="81.5",P46y="212.5",P47x="80",P47y="212.5",P48x="78.5",P48y="214.5",P49x="77",P49y="214.5",P4x="72",P4y="125.5",P50x="76.5",P50y="215.5",P51x="74",P51y="215.5",P52x="73.5",P52y="216.5",P53x="72",P53y="216.5",P54x="71.5",P54y="217.5",P55x="68",P55y="217.5",P56x="67.5",P56y="218.5",P57x="55.5",P57y="218.5",P58x="55",P58y="217.5",P59x="51.5",P59y="217.5",P5x="73.5",P5y="125.5",P60x="51",P60y="216.5",P61x="49.5",P61y="216.5",P62x="49",P62y="215.5",P63x="46.5",P63y="215.5",P64x="46",P64y="214.5",P65x="44.5",P65y="214.5",P66x="43",P66y="212.5",P67x="41.5",P67y="212.5",P68x="31.5",P68y="202.5",P69x="31.5",P69y="201",P6x="74",P6y="126.5",P70x="29.5",P70y="199.5",P71x="29.5",P71y="198",P72x="28.5",P72y="197.5",P73x="28.5",P73y="196",P74x="27.5",P74y="195.5",P75x="27.5",P75y="194",P76x="26.5",P76y="193.5",P77x="26.5",P77y="191",P78x="25.5",P78y="190.5",P79x="25.5",P79y="188",P7x="76.5",P7y="126.5",P80x="24.5",P80y="187.5",P81x="24.5",P81y="185",P82x="23.5",P82y="184.5",P83x="23.5",P83y="179",P84x="22.5",P84y="178.5",P85x="22.5",P85y="163.5",P86x="23.5",P86y="163",P87x="23.5",P87y="157.5",P88x="24.5",P88y="157",P89x="24.5",P89y="154.5",P8x="77",P8y="127.5",P90x="25.5",P90y="154",P91x="25.5",P91y="151.5",P92x="26.5",P92y="151",P93x="26.5",P93y="148.5",P94x="27.5",P94y="148",P95x="27.5",P95y="146.5",P96x="28.5",P96y="146",P97x="28.5",P97y="144.5",P98x="29.5",P98y="144",P99x="29.5",P99y="142.5",P9x="78.5",P9y="127.5",SegmentationLevel="0",SegmentationType="0"];
-1 [NumberOfPointsInPath="5",P0x="187.5",P0y="31.5",P1x="221.5",P1y="31.5",P2x="221.5",P2y="202.5",P3x="187.5",P3y="202.5",P4x="187.5",P4y="33",SegmentationLevel="0",SegmentationType="0"];
-2 [NumberOfPointsInPath="120",P0x="134.5",P0y="38.5",P100x="122.5",P100y="69",P101x="122.5",P101y="64.5",P102x="123.5",P102y="64",P103x="123.5",P103y="60.5",P104x="124.5",P104y="60",P105x="124.5",P105y="56.5",P106x="125.5",P106y="56",P107x="125.5",P107y="52.5",P108x="126.5",P108y="52",P109x="126.5",P109y="49.5",P10x="144.5",P10y="47.5",P110x="127.5",P110y="49",P111x="127.5",P111y="47.5",P112x="128.5",P112y="47",P113x="128.5",P113y="45.5",P114x="129.5",P114y="45",P115x="129.5",P115y="43.5",P116x="130.5",P116y="43",P117x="130.5",P117y="41.5",P118x="132.5",P118y="39.5",P119x="134",P119y="39.5",P11x="144.5",P11y="49",P12x="145.5",P12y="49.5",P13x="145.5",P13y="52",P14x="146.5",P14y="52.5",P15x="146.5",P15y="56",P16x="147.5",P16y="56.5",P17x="147.5",P17y="60",P18x="148.5",P18y="60.5",P19x="148.5",P19y="64",P1x="137.5",P1y="38.5",P20x="149.5",P20y="64.5",P21x="149.5",P21y="69",P22x="150.5",P22y="69.5",P23x="150.5",P23y="75",P24x="151.5",P24y="75.5",P25x="151.5",P25y="83",P26x="152.5",P26y="83.5",P27x="152.5",P27y="92",P28x="153.5",P28y="92.5",P29x="153.5",P29y="107",P2x="138",P2y="39.5",P30x="154.5",P30y="107.5",P31x="154.5",P31y="149.5",P32x="153.5",P32y="150",P33x="153.5",P33y="164.5",P34x="152.5",P34y="165",P35x="152.5",P35y="173.5",P36x="151.5",P36y="174",P37x="151.5",P37y="181.5",P38x="150.5",P38y="182",P39x="150.5",P39y="187.5",P3x="139.5",P3y="39.5",P40x="149.5",P40y="188",P41x="149.5",P41y="192.5",P42x="148.5",P42y="193",P43x="148.5",P43y="196.5",P44x="147.5",P44y="197",P45x="147.5",P45y="200.5",P46x="146.5",P46y="201",P47x="146.5",P47y="204.5",P48x="145.5",P48y="205",P49x="145.5",P49y="207.5",P4x="141.5",P4y="41.5",P50x="144.5",P50y="208",P51x="144.5",P51y="209.5",P52x="143.5",P52y="210",P53x="143.5",P53y="211.5",P54x="142.5",P54y="212",P55x="142.5",P55y="213.5",P56x="141.5",P56y="214",P57x="141.5",P57y="215.5",P58x="139.5",P58y="217.5",P59x="138",P59y="217.5",P5x="141.5",P5y="43",P60x="137.5",P60y="218.5",P61x="134.5",P61y="218.5",P62x="134",P62y="217.5",P63x="132.5",P63y="217.5",P64x="130.5",P64y="215.5",P65x="130.5",P65y="214",P66x="129.5",P66y="213.5",P67x="129.5",P67y="212",P68x="128.5",P68y="211.5",P69x="128.5",P69y="210",P6x="142.5",P6y="43.5",P70x="127.5",P70y="209.5",P71x="127.5",P71y="208",P72x="126.5",P72y="207.5",P73x="126.5",P73y="205",P74x="125.5",P74y="204.5",P75x="125.5",P75y="201",P76x="124.5",P76y="200.5",P77x="124.5",P77y="197",P78x="123.5",P78y="196.5",P79x="123.5",P79y="193",P7x="142.5",P7y="45",P80x="122.5",P80y="192.5",P81x="122.5",P81y="188",P82x="121.5",P82y="187.5",P83x="121.5",P83y="182",P84x="120.5",P84y="181.5",P85x="120.5",P85y="174",P86x="119.5",P86y="173.5",P87x="119.5",P87y="165",P88x="118.5",P88y="164.5",P89x="118.5",P89y="150",P8x="143.5",P8y="45.5",P90x="117.5",P90y="149.5",P91x="117.5",P91y="107.5",P92x="118.5",P92y="107",P93x="118.5",P93y="92.5",P94x="119.5",P94y="92",P95x="119.5",P95y="83.5",P96x="120.5",P96y="83",P97x="120.5",P97y="75.5",P98x="121.5",P98y="75",P99x="121.5",P99y="69.5",P9x="143.5",P9y="47",SegmentationLevel="0",SegmentationType="0"];
-3 [NumberOfPointsInPath="5",P0x="19.5",P0y="30.5",P1x="84.5",P1y="30.5",P2x="84.5",P2y="94.5",P3x="19.5",P3y="94.5",P4x="19.5",P4y="32",SegmentationLevel="0",SegmentationType="0"];
-4 [NumberOfPointsInPath="164",P0x="53.5",P0y="85.5",P100x="25.5",P100y="202.5",P101x="25.5",P101y="201",P102x="24.5",P102y="200.5",P103x="24.5",P103y="199",P104x="23.5",P104y="198.5",P105x="23.5",P105y="197",P106x="22.5",P106y="196.5",P107x="22.5",P107y="195",P108x="21.5",P108y="194.5",P109x="21.5",P109y="192",P10x="85",P10y="96.5",P110x="21",P110y="191.5",P111x="19.5",P111y="191.5",P112x="19.5",P112y="189",P113x="18.5",P113y="188.5",P114x="18.5",P114y="186",P115x="17.5",P115y="185.5",P116x="17.5",P116y="183",P117x="16.5",P117y="182.5",P118x="16.5",P118y="179",P119x="15.5",P119y="178.5",P11x="86.5",P11y="96.5",P120x="15.5",P120y="173",P121x="14.5",P121y="172.5",P122x="14.5",P122y="166",P123x="13.5",P123y="165.5",P124x="13.5",P124y="142.5",P125x="14.5",P125y="142",P126x="14.5",P126y="135.5",P127x="15.5",P127y="135",P128x="15.5",P128y="129.5",P129x="16.5",P129y="129",P12x="89.5",P12y="99.5",P130x="16.5",P130y="125.5",P131x="17.5",P131y="125",P132x="17.5",P132y="122.5",P133x="18.5",P133y="122",P134x="18.5",P134y="119.5",P135x="19.5",P135y="119",P136x="19.5",P136y="116.5",P137x="21",P137y="116.5",P138x="21.5",P138y="115",P139x="21.5",P139y="113.5",P13x="89.5",P13y="101",P140x="22.5",P140y="113",P141x="22.5",P141y="111.5",P142x="23.5",P142y="111",P143x="23.5",P143y="109.5",P144x="24.5",P144y="109",P145x="24.5",P145y="107.5",P146x="25.5",P146y="107",P147x="25.5",P147y="105.5",P148x="26.5",P148y="104.5",P149x="28",P149y="104.5",P14x="91.5",P14y="102.5",P150x="28.5",P150y="104",P151x="28.5",P151y="102.5",P152x="30.5",P152y="101",P153x="30.5",P153y="99.5",P154x="33.5",P154y="96.5",P155x="35",P155y="96.5",P156x="40.5",P156y="90.5",P157x="43",P157y="90.5",P158x="44.5",P158y="88.5",P159x="46",P159y="88.5",P15x="91.5",P15y="104",P160x="46.5",P160y="87.5",P161x="50",P161y="87.5",P162x="50.5",P162y="86.5",P163x="53",P163y="86.5",P16x="92",P16y="104.5",P17x="93.5",P17y="104.5",P18x="94.5",P18y="105.5",P19x="94.5",P19y="107",P1x="66.5",P1y="85.5",P20x="95.5",P20y="107.5",P21x="95.5",P21y="109",P22x="96.5",P22y="109.5",P23x="96.5",P23y="111",P24x="97.5",P24y="111.5",P25x="97.5",P25y="113",P26x="98.5",P26y="113.5",P27x="98.5",P27y="116",P28x="99",P28y="116.5",P29x="100.5",P29y="116.5",P2x="67",P2y="86.5",P30x="100.5",P30y="119",P31x="101.5",P31y="119.5",P32x="101.5",P32y="122",P33x="102.5",P33y="122.5",P34x="102.5",P34y="125",P35x="103.5",P35y="125.5",P36x="103.5",P36y="129",P37x="104.5",P37y="129.5",P38x="104.5",P38y="135",P39x="105.5",P39y="135.5",P3x="69.5",P3y="86.5",P40x="105.5",P40y="142",P41x="106.5",P41y="142.5",P42x="106.5",P42y="165.5",P43x="105.5",P43y="166",P44x="105.5",P44y="172.5",P45x="104.5",P45y="173",P46x="104.5",P46y="178.5",P47x="103.5",P47y="179",P48x="103.5",P48y="182.5",P49x="102.5",P49y="183",P4x="70",P4y="87.5",P50x="102.5",P50y="185.5",P51x="101.5",P51y="186",P52x="101.5",P52y="188.5",P53x="100.5",P53y="189",P54x="100.5",P54y="191.5",P55x="99",P55y="191.5",P56x="98.5",P56y="193",P57x="98.5",P57y="194.5",P58x="97.5",P58y="195",P59x="97.5",P59y="196.5",P5x="73.5",P5y="87.5",P60x="96.5",P60y="197",P61x="96.5",P61y="198.5",P62x="95.5",P62y="199",P63x="95.5",P63y="200.5",P64x="94.5",P64y="201",P65x="94.5",P65y="202.5",P66x="93.5",P66y="203.5",P67x="92",P67y="203.5",P68x="91.5",P68y="204",P69x="91.5",P69y="205.5",P6x="74",P6y="88.5",P70x="89.5",P70y="207",P71x="89.5",P71y="208.5",P72x="86.5",P72y="211.5",P73x="85",P73y="211.5",P74x="79.5",P74y="217.5",P75x="77",P75y="217.5",P76x="75.5",P76y="219.5",P77x="74",P77y="219.5",P78x="73.5",P78y="220.5",P79x="70",P79y="220.5",P7x="75.5",P7y="88.5",P80x="69.5",P80y="221.5",P81x="67",P81y="221.5",P82x="66.5",P82y="222.5",P83x="53.5",P83y="222.5",P84x="53",P84y="221.5",P85x="50.5",P85y="221.5",P86x="50",P86y="220.5",P87x="46.5",P87y="220.5",P88x="46",P88y="219.5",P89x="44.5",P89y="219.5",P8x="77",P8y="90.5",P90x="43",P90y="217.5",P91x="40.5",P91y="217.5",P92x="35",P92y="211.5",P93x="33.5",P93y="211.5",P94x="30.5",P94y="208.5",P95x="30.5",P95y="207",P96x="28.5",P96y="205.5",P97x="28.5",P97y="204",P98x="28",P98y="203.5",P99x="26.5",P99y="203.5",P9x="79.5",P9y="90.5",SegmentationLevel="0",SegmentationType="1"];
-5 [NumberOfPointsInPath="5",P0x="154.5",P0y="106.5",P1x="220.5",P1y="106.5",P2x="220.5",P2y="143.5",P3x="154.5",P3y="143.5",P4x="154.5",P4y="108",SegmentationLevel="0",SegmentationType="1"];
-6 [NumberOfPointsInPath="46",P0x="138",P0y="55.5",P10x="143.5",P10y="102",P11x="144.5",P11y="102.5",P12x="144.5",P12y="160.5",P13x="143.5",P13y="161",P14x="143.5",P14y="180.5",P15x="142.5",P15y="181",P16x="142.5",P16y="191.5",P17x="141.5",P17y="192",P18x="141.5",P18y="198.5",P19x="140.5",P19y="199",P1x="139.5",P1y="56.5",P20x="140.5",P20y="203.5",P21x="139.5",P21y="204",P22x="139.5",P22y="206.5",P23x="138",P23y="207.5",P24x="136.5",P24y="206.5",P25x="136.5",P25y="204",P26x="135.5",P26y="203.5",P27x="135.5",P27y="199",P28x="134.5",P28y="198.5",P29x="134.5",P29y="192",P2x="139.5",P2y="59",P30x="133.5",P30y="191.5",P31x="133.5",P31y="181",P32x="132.5",P32y="180.5",P33x="132.5",P33y="161",P34x="131.5",P34y="160.5",P35x="131.5",P35y="102.5",P36x="132.5",P36y="102",P37x="132.5",P37y="82.5",P38x="133.5",P38y="82",P39x="133.5",P39y="71.5",P3x="140.5",P3y="59.5",P40x="134.5",P40y="71",P41x="134.5",P41y="64.5",P42x="135.5",P42y="64",P43x="135.5",P43y="59.5",P44x="136.5",P44y="59",P45x="136.5",P45y="56.5",P4x="140.5",P4y="64",P5x="141.5",P5y="64.5",P6x="141.5",P6y="71",P7x="142.5",P7y="71.5",P8x="142.5",P8y="82",P9x="143.5",P9y="82.5",SegmentationLevel="0",SegmentationType="1"];
-7 [NumberOfPointsInPath="5",P0x="19.5",P0y="31.5",P1x="55.5",P1y="31.5",P2x="55.5",P2y="72.5",P3x="19.5",P3y="72.5",P4x="19.5",P4y="33",SegmentationLevel="0",SegmentationType="1"];
-8 [NumberOfPointsInPath="5",P0x="75.5",P0y="41.5",P1x="138.5",P1y="41.5",P2x="138.5",P2y="49.5",P3x="75.5",P3y="49.5",P4x="75.5",P4y="43",SegmentationLevel="0",SegmentationType="1"];
-0 -> 4 [Value="5"];
-1 -> 5 [Value="2"];
-2 -> 5 [Value="2"];
-2 -> 6 [Value="6"];
-2 -> 8 [Value="2"];
-3 -> 4 [Value="2"];
-3 -> 7 [Value="4"];
-3 -> 8 [Value="2"];
-}
diff --git a/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput2.dot b/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput2.dot
deleted file mode 100644
index 468c69f20b4ca03e3aefe782287282e9d48fddb6..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput2.dot
+++ /dev/null
@@ -1,11 +0,0 @@
-digraph G {
-0 [NumberOfPointsInPath="5",P0x="82.5",P0y="76.5",P1x="175.5",P1y="76.5",P2x="175.5",P2y="168.5",P3x="82.5",P3y="168.5",P4x="82.5",P4y="78",SegmentationLevel="0",SegmentationType="0"];
-1 [NumberOfPointsInPath="5",P0x="82.5",P0y="102.5",P1x="175.5",P1y="102.5",P2x="175.5",P2y="149.5",P3x="82.5",P3y="149.5",P4x="82.5",P4y="104",SegmentationLevel="0",SegmentationType="1"];
-2 [NumberOfPointsInPath="5",P0x="49.5",P0y="41.5",P1x="117.5",P1y="41.5",P2x="117.5",P2y="119.5",P3x="49.5",P3y="119.5",P4x="49.5",P4y="43",SegmentationLevel="1",SegmentationType="0"];
-3 [NumberOfPointsInPath="5",P0x="27.5",P0y="141.5",P1x="59.5",P1y="141.5",P2x="59.5",P2y="214.5",P3x="27.5",P3y="214.5",P4x="27.5",P4y="143",SegmentationLevel="1",SegmentationType="0"];
-4 [NumberOfPointsInPath="5",P0x="138.5",P0y="13.5",P1x="167.5",P1y="13.5",P2x="167.5",P2y="76.5",P3x="138.5",P3y="76.5",P4x="138.5",P4y="15",SegmentationLevel="1",SegmentationType="0"];
-0 -> 1 [Value="4"];
-0 -> 2 [Value="2"];
-0 -> 4 [Value="1"];
-1 -> 2 [Value="2"];
-}
diff --git a/Data/Baseline/OTB/Files/srRCC8GraphWriterOutput1.dot b/Data/Baseline/OTB/Files/srRCC8GraphWriterOutput1.dot
deleted file mode 100644
index bc065f3b862aa01c09a55a3a9e1d735e17855cbb..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/srRCC8GraphWriterOutput1.dot
+++ /dev/null
@@ -1,12 +0,0 @@
-digraph G {
-0 [NumberOfPointsInPath="3",P0x="0",P0y="0",P1x="10",P1y="10",P2x="-5",P2y="2",SegmentationLevel="0",SegmentationType="0"];
-1 [NumberOfPointsInPath="3",P0x="0",P0y="0",P1x="10",P1y="10",P2x="-5",P2y="2",SegmentationLevel="1",SegmentationType="1"];
-2 [NumberOfPointsInPath="3",P0x="0",P0y="0",P1x="10",P1y="10",P2x="-5",P2y="2",SegmentationLevel="2",SegmentationType="0"];
-3 [NumberOfPointsInPath="3",P0x="0",P0y="0",P1x="10",P1y="10",P2x="-5",P2y="2",SegmentationLevel="3",SegmentationType="0"];
-0 -> 1 [Value="1"];
-1 -> 2 [Value="2"];
-2 -> 3 [Value="3"];
-0 -> 2 [Value="4"];
-1 -> 3 [Value="5"];
-0 -> 3 [Value="6"];
-}
diff --git a/Data/Baseline/OTB/Files/srRCC8PolygonToPolygonCalculatorOutput.txt b/Data/Baseline/OTB/Files/srRCC8PolygonToPolygonCalculatorOutput.txt
deleted file mode 100644
index 0e6c0a5a795100d17da92b4cf77dda3573b80968..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/srRCC8PolygonToPolygonCalculatorOutput.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Test results from otbPolygonToPolygonRCC8calculator test.
-7	1	0	0	
-1	7	4	6	
-0	3	7	2	
-0	5	2	7	
diff --git a/Data/Baseline/OTB/Files/srTvPolygonListToRCC8GraphFilterOutput.dot b/Data/Baseline/OTB/Files/srTvPolygonListToRCC8GraphFilterOutput.dot
deleted file mode 100644
index b0ea91f66e5ded3e702027f8870e10d13d8a6224..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Files/srTvPolygonListToRCC8GraphFilterOutput.dot
+++ /dev/null
@@ -1,12 +0,0 @@
-digraph G {
-0 [NumberOfPointsInPath="4",P0x="0",P0y="0",P1x="2",P1y="0",P2x="2",P2y="6",P3x="0",P3y="6",SegmentationLevel="0",SegmentationType="1"];
-1 [NumberOfPointsInPath="4",P0x="1",P0y="1",P1x="4",P1y="1",P2x="4",P2y="5",P3x="1",P3y="5",SegmentationLevel="0",SegmentationType="1"];
-2 [NumberOfPointsInPath="4",P0x="3",P0y="1",P1x="4",P1y="1",P2x="4",P2y="2",P3x="3",P3y="2",SegmentationLevel="1",SegmentationType="1"];
-3 [NumberOfPointsInPath="4",P0x="5",P0y="1",P1x="8",P1y="1",P2x="8",P2y="5",P3x="5",P3y="5",SegmentationLevel="1",SegmentationType="1"];
-4 [NumberOfPointsInPath="4",P0x="6",P0y="2",P1x="7",P1y="2",P2x="7",P2y="3",P3x="6",P3y="3",SegmentationLevel="2",SegmentationType="1"];
-5 [NumberOfPointsInPath="4",P0x="8",P0y="1",P1x="9",P1y="1",P2x="9",P2y="5",P3x="8",P3y="5",SegmentationLevel="2",SegmentationType="1"];
-0 -> 1 [Value="2"];
-2 -> 1 [Value="3"];
-3 -> 5 [Value="2"];
-4 -> 3 [Value="5"];
-}
diff --git a/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.3.tif b/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.3.tif
new file mode 100644
index 0000000000000000000000000000000000000000..a55d2a4fdc0eb3fac06b9f324bafe52905567f78
--- /dev/null
+++ b/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.3.tif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d45e82154f7f148836f952c6a492d30b40c420f612370002b062eb790601c3ab
+size 4004576
diff --git a/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.4.tif b/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.4.tif
new file mode 100644
index 0000000000000000000000000000000000000000..9697dbe2512ad89ad861fc054a56f2fbb3302e23
--- /dev/null
+++ b/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.4.tif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3a86632ee6283bc1c03fce842b011fb29d5106d08d21567157e0b4bf6391bd7b
+size 4004576
diff --git a/Data/Baseline/OTB/Images/dmTvBSplinesInterpolateDeformationField.tif b/Data/Baseline/OTB/Images/dmTvBSplinesInterpolateDeformationField.tif
deleted file mode 100644
index 69c0b928afa3361c7e154c1a820e3715580af9e6..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/dmTvBSplinesInterpolateDeformationField.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9447965707e53fa16f1eaa4d8e198c79c67f58992fb0f3417e45e09197629b93
-size 193942
diff --git a/Data/Baseline/OTB/Images/dmTvNNearestPointsLinearInterpolateDeformationField.tif b/Data/Baseline/OTB/Images/dmTvNNearestPointsLinearInterpolateDeformationField.tif
deleted file mode 100644
index a823334750cd9f6c86d683f100662864eaee9994..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/dmTvNNearestPointsLinearInterpolateDeformationField.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7e3e1fb0f6625e1a63a93cf472797f5793af362e6ac5a455d202c607725ecfec
-size 198042
diff --git a/Data/Baseline/OTB/Images/dmTvNNearestTransformsLinearInterpolateDeformationField.tif b/Data/Baseline/OTB/Images/dmTvNNearestTransformsLinearInterpolateDeformationField.tif
deleted file mode 100644
index b59a569283720ffabb00256a5eebf9111a0a9993..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/dmTvNNearestTransformsLinearInterpolateDeformationField.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3e86de8b62d0d9b3bf0098efca75a7cbb6dd30f61bd6bb331bbe21189b54ab35
-size 199687
diff --git a/Data/Baseline/OTB/Images/dmTvNearestPointDeformationField.tif b/Data/Baseline/OTB/Images/dmTvNearestPointDeformationField.tif
deleted file mode 100644
index d098656a6f6e6605f71c8b21aa182c8d8f1b194a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/dmTvNearestPointDeformationField.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:35adef700d011fb7793a3751c5565eea206a03b7c73265cf693763cf3a02c198
-size 14780
diff --git a/Data/Baseline/OTB/Images/dmTvNearestTransformDeformationField.tif b/Data/Baseline/OTB/Images/dmTvNearestTransformDeformationField.tif
deleted file mode 100644
index 7cb2622d35b0188d4c2c458bf20005c41088871b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/dmTvNearestTransformDeformationField.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f7f8af0c00a846d0027df0688fc82c10dd6832b08d16aa86068d66d11f4a2485
-size 192056
diff --git a/Data/Baseline/OTB/Images/feDrawPathAlignDeuxTraits.png b/Data/Baseline/OTB/Images/feDrawPathAlignDeuxTraits.png
deleted file mode 100644
index fa2ce49bc9aee59ff1db19390cfaa907b9e5f51d..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/feDrawPathAlignDeuxTraits.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2c57a5038aa07298c3b42be3d1d47dd84136a4d7f210a08dbe5b223b266814f0
-size 568
diff --git a/Data/Baseline/OTB/Images/feImageToEdgePathFilterOutput.tif b/Data/Baseline/OTB/Images/feImageToEdgePathFilterOutput.tif
new file mode 100644
index 0000000000000000000000000000000000000000..fb2de39373f31b7c8967de82fd695a972d0c84dc
--- /dev/null
+++ b/Data/Baseline/OTB/Images/feImageToEdgePathFilterOutput.tif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c006246fea917e0870d9fcbac03c8ee7f80e65d3faffd1e76b731192dbef5978
+size 546
diff --git a/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductDirectionOutput.tif b/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductDirectionOutput.tif
deleted file mode 100644
index a5401aba3a1c7561fd18356e9c8d813acc6606ff..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductDirectionOutput.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4b67d658cebed1a8dcfb9fa45be201a00cdfe874321dc4c63cbcca540ec6c6f3
-size 741552
diff --git a/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductModulusOutput.tif b/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductModulusOutput.tif
deleted file mode 100644
index f3d6fec2decdd35ffc57ee088b85dd2a209c5c1a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductModulusOutput.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ca321fd53b489787e40bc9bf9dd49140d95d43fff73ae3501b25ceb75e529a23
-size 3023067
diff --git a/Data/Baseline/OTB/Images/feTvNonMaxRemovalByDirectionOutput.tif b/Data/Baseline/OTB/Images/feTvNonMaxRemovalByDirectionOutput.tif
deleted file mode 100644
index a0a6e6047bac5bfada96ec5afc74e21dacb99468..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/feTvNonMaxRemovalByDirectionOutput.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:57aae675e46c74467b7d34cc2fe660e4944e096db81115663960627e7e775ed4
-size 1018004
diff --git a/Data/Baseline/OTB/Images/feTvOutputRoadDetection.tif b/Data/Baseline/OTB/Images/feTvOutputRoadDetection.tif
deleted file mode 100644
index 7fe52fc0aeb9a86db404f1cefae1145da8292072..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/feTvOutputRoadDetection.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d0495a68b9e656915b10d5ff2c41c9f15fc46f1069a1e9dc429a153139b2607d
-size 196662
diff --git a/Data/Baseline/OTB/Images/feTvRemoveIsolatedByDirectionOutput.tif b/Data/Baseline/OTB/Images/feTvRemoveIsolatedByDirectionOutput.tif
deleted file mode 100644
index a7d309ac66e53468919f03954933fa9f93a23301..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/feTvRemoveIsolatedByDirectionOutput.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e56e9cadb996fea0621e258155d2414f12899652c33dbc04a69c884923981f72
-size 2166447
diff --git a/Data/Baseline/OTB/Images/feTvRemoveWrongDirectionOutput.tif b/Data/Baseline/OTB/Images/feTvRemoveWrongDirectionOutput.tif
deleted file mode 100644
index 15afc03958f1d221c020052230ffe5cea2e202a3..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/feTvRemoveWrongDirectionOutput.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6cda584546d11c80f5c32dbe32f843d178a182c47062de7d7e3dcb6931bf5304
-size 1360300
diff --git a/Data/Baseline/OTB/Images/feTvVectorizationPathListOutput.png b/Data/Baseline/OTB/Images/feTvVectorizationPathListOutput.png
deleted file mode 100644
index 542e264b833a1f712018a454168f529f40eae386..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/feTvVectorizationPathListOutput.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5c1fabb13b4184517fc6929de7f5ec9f41a7c59d6bd9f07208587dd19cb9855b
-size 23840
diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_an_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_an_2.png
deleted file mode 100644
index f42b4baef16bcda041abf7b6d93eae69bbd0a817..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_an_2.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c689b2d88a728f26e8464920bd0b8858621dcfec203a612e4cd8763b62d7c83c
-size 164
diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_id_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_id_2.png
deleted file mode 100644
index 02e9380066f73621e2908c406d1a32e78646d83b..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_id_2.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eb8b759bff6ee7b8972ee09f87094106334dbb84f4b41434ec6cf18ec1821129
-size 296
diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_if_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_if_2.png
deleted file mode 100644
index 3c40551414a347fbe12e6fac0b7da1164fbd1b1e..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_if_2.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b985a05924d453325761a1d99e3bb0c64ac61a6359533035d6368f4d0c2e0ef6
-size 110
diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_sd_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_sd_2.png
deleted file mode 100644
index 06af199a6bbee53c445ff1a24903f356ee1f6530..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_sd_2.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:94647a3bd9b8617e0686c2ad9d7541b6a23d00f3c38cd162eb9c96ec7c077f03
-size 280
diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_sf_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_sf_2.png
deleted file mode 100644
index 7d6ab132cb03f3a2b3fa5690b856000cfde1cc38..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_sf_2.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b5273aadaeb17d41f4fa8a3b6c006879f36d1a913aa84146a2004122757feec7
-size 133
diff --git a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_an_full.tif b/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_an_full.tif
deleted file mode 100644
index df49966b316319dac9e2c6cb94f2d3c2199c427d..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_an_full.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4acd9feb652abe765b4f93b6b08a59bde3111d1eae18e298848b04983d24e112
-size 2433975
diff --git a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_if_full.tif b/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_if_full.tif
deleted file mode 100644
index d373dfb668ec13cc83aa631849fd78a2fcdc4bf6..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_if_full.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0bfbe517069a01fcd757ede835ffe3df3602f95921e8793acb49947f86e022fe
-size 2084698
diff --git a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif b/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif
deleted file mode 100644
index 791be26fb902300057b5f5a85da06922d58cfd96..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7086793fa9d0d553e115fd3e92cb5455b2dbca6f01352aabbf7312e02e33ffa2
-size 1409779
diff --git a/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_256_2.tif b/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_256_2.tif
deleted file mode 100644
index 070eb61973a513c4b68733c4c68de91ab9be3d28..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_256_2.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eeaf4e2e3a704677c6fbc00550aa21a79f7b40126f677247abd652e39c967ff4
-size 162988
diff --git a/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_full.tif b/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_full.tif
deleted file mode 100644
index 876e6de02b97af902286a224e141d34db2b9203a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_full.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3fad9049c90e30e939018725efe1bdf8d0e35302d50ae891812acbb3fdea013a
-size 829512
diff --git a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_2.tif b/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_2.tif
deleted file mode 100644
index 457056589f50a72e5d6341ee2f06751493459701..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_2.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:24efbd3ab2d54b9066d15145402583db895d8c6747795c83db07b965669748bd
-size 30896
diff --git a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_4.tif b/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_4.tif
deleted file mode 100644
index 12bb4bd12f5a53be3e9416d09e8bd241f8c50450..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_4.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fc44580b13963e8db80966f7251b8ef77b1fcb967c0a192354959ca7b18df2b3
-size 22111
diff --git a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_5.tif b/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_5.tif
deleted file mode 100644
index a65b7a1e6d77aaed7b5f014b3a53ee35438feee4..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_5.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e1b31996ceec7f89920c029f0ccdb5adca0172d9850e4b0f37fc3ca48b471bd8
-size 21878
diff --git a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_7.tif b/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_7.tif
deleted file mode 100644
index e12083be6785bcd46158ab0550b2172654b94de2..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_7.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:47d986a0f28e59fa8586db478791df92c6d93816d392bfbf331054e771b25930
-size 24465
diff --git a/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_if.tif b/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_if.tif
deleted file mode 100644
index d6121605a13f36f9874bdfc6d067078ebb4d598a..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_if.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6abc1377ee09e3181c6600bece9ed11374f3c50dff1d98460e3f2adc273ecaca
-size 20179
diff --git a/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_sf.tif b/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_sf.tif
deleted file mode 100644
index e9f7589afcc41153e338f2885f8e6e05b49b1001..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_sf.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ba1c0155d39d3272d956c839f8f4e179dbef23ebee5499c0886a0cdb2bdeb05b
-size 22191
diff --git a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMGTIFF.tif b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMGTIFF.tif
index 9662d6048e1b5bc4eef3ad7c00b24ecfb24db433..3b1b11efef094cc93a80d22849d312da21c7c4f9 100644
--- a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMGTIFF.tif
+++ b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMGTIFF.tif
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:604ab2a554cb7f8b8bd2f793da761b944ea1585b267b19063d64fbdd8fe9bd75
-size 2471604
+oid sha256:39a2dd6ff12fd1ad13ce5c3014dac39b546aceb5e5d1fbb8a4bb7e58d06fcbeb
+size 2002472
diff --git a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMSRTM.tif b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMSRTM.tif
index 0c871089a6f291752cdfe701b38f59c8b8eb9db3..419e04824bcdb961f1fcc0e54fc1c5ecca21d05f 100644
--- a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMSRTM.tif
+++ b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMSRTM.tif
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:d0bf90e6e04a89d3876af4272815b3a47dd3cd2805ed3bdb6900a68ec3fb83a3
-size 2470925
+oid sha256:d684f0d16382f9a7402373b4e17dbc74c8d38b2e2a5ef0c95560374f4ae23a3f
+size 2002472
diff --git a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_noDEM.tif b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_noDEM.tif
index 22b97cb747f2ea635594d2d3fe1d3c99a82ad5b6..6a12b74e395f7e78dc669c19ea3463408fb01ebd 100644
--- a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_noDEM.tif
+++ b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_noDEM.tif
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:bfcce43b020c8838f1b710dd62cff8781dff095e88e056edf2df8863dc0ae3af
-size 2471252
+oid sha256:1b8c6e80b58829d09ec7ad2b7cca3104c0fd1676a203361bda5493f0060d8fee
+size 2002472
diff --git a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutput.tif b/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutput.tif
deleted file mode 100644
index 1582d4104bd26e22608c9c337ae659b4992a60c3..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutput.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e6946443c79f0ee5e07b3c653958ce13e5d97e87cc9958cb13051c9d3d07e416
-size 9378087
diff --git a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_GEOEYE.tif b/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_GEOEYE.tif
deleted file mode 100644
index 5b30246782bd321aeab3a79046db7e63a7a187b1..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_GEOEYE.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8fb50d087c6620f8836274927849326dc2fb77a592ca64a2a3f116236248fd03
-size 59434
diff --git a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_QUICKBIRD.tif b/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_QUICKBIRD.tif
deleted file mode 100644
index ca2897289d6507bcd3adf32e79d1fe62e0dddd5f..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_QUICKBIRD.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:89fb4f4c776f753b71e48c74b4c46231a03ae57451ccfc87903b0b0cb4b7ad7c
-size 41907
diff --git a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_WORLDVIEW2.tif b/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_WORLDVIEW2.tif
deleted file mode 100644
index 68f813382bae7b22465d7e4850f2a47bd7796caa..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_WORLDVIEW2.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cad5f798ddae790efa1d14ff57f7d0c25d5fd89f125961c0ba68c3923568ba05
-size 2656332
diff --git a/Data/Baseline/OTB/Images/raTvUrbanAreaDetection.png b/Data/Baseline/OTB/Images/raTvUrbanAreaDetection.png
deleted file mode 100644
index b4535ce33f3c4a19b9b297fe4c76acb870fdd5da..0000000000000000000000000000000000000000
--- a/Data/Baseline/OTB/Images/raTvUrbanAreaDetection.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d34b5be5393bbb04b1fa634fa175f2bf0eb7e5928abe4768fd08dfa7d72323f9
-size 2057
diff --git a/Data/Input/Classification/KMeansInputCentroids.txt b/Data/Input/Classification/KMeansInputCentroids.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d7302a51166ea6468ac049ad970582370605c10a
--- /dev/null
+++ b/Data/Input/Classification/KMeansInputCentroids.txt
@@ -0,0 +1,5 @@
+148.1360412249	176.9065574064	79.2367424483	275.6865470422
+180.3646315623	255.4157568188	138.2565634726	656.5357728603
+187.5074713392	256.7055784897	121.8671939978	115.8660938389
+220.0887858502	326.8933399989	229.672560688	434.3589597278
+515.191687488	834.8626368509	642.6102022528	814.8945435557
diff --git a/Data/Input/Classification/apTvClLabeledVector.dbf b/Data/Input/Classification/apTvClLabeledVector.dbf
index 8c9c8fa2e9adc2038102e6bbfe03e0e7f47d4ba4..99d7d94a0bc953330ba371b27922c4d0cb7788f6 100644
--- a/Data/Input/Classification/apTvClLabeledVector.dbf
+++ b/Data/Input/Classification/apTvClLabeledVector.dbf
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:c32639ad40e2cb8d439b0cb5961f0bce1b5bbfd258d13caa2a71392d54605cb4
-size 608145
+oid sha256:a22e6012765efaa5104afc6586b8c8e051294c9e9947f4f4ad25cf6d7cd67f09
+size 608146
diff --git a/Data/Input/Dempster-Shafer/DSFuzzyModel.xml b/Data/Input/Dempster-Shafer/DSFuzzyModel.xml
deleted file mode 100644
index 034442d66e8ad214fadb3037553ab092b9be323b..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/DSFuzzyModel.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" ?>
-<FuzzydDescriptorsModel>
-    <Descriptor name="NONDVI">
-        <Parameter value="0.0328422" />
-        <Parameter value="0.0966684" />
-        <Parameter value="0.128072" />
-        <Parameter value="0.892172" />
-    </Descriptor>
-    <Descriptor name="ROADSA">
-        <Parameter value="0.0528834" />
-        <Parameter value="0.125395" />
-        <Parameter value="0.216374" />
-        <Parameter value="1" />
-    </Descriptor>
-    <Descriptor name="NOBUIL">
-        <Parameter value="0.0198015" />
-        <Parameter value="0.0944664" />
-        <Parameter value="0.17092" />
-        <Parameter value="0.87146" />
-    </Descriptor>
-</FuzzydDescriptorsModel>
diff --git a/Data/Input/Dempster-Shafer/DSFuzzyModel_Init.xml b/Data/Input/Dempster-Shafer/DSFuzzyModel_Init.xml
deleted file mode 100644
index 83f733dc4c117e0ae898afa499e45ae6db65aa7a..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/DSFuzzyModel_Init.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" ?>
-<FuzzydDescriptorsModel>
-    <Descriptor name="NONDVI">
-        <Parameter value="0.05" />
-        <Parameter value="0.15" />
-        <Parameter value="0.20" />
-        <Parameter value="0.95" />
-    </Descriptor>
-    <Descriptor name="ROADSA">
-        <Parameter value="0.15" />
-        <Parameter value="0.30" />
-        <Parameter value="0.50" />
-        <Parameter value="0.95" />
-    </Descriptor>
-    <Descriptor name="NOBUIL">
-        <Parameter value="0.05" />
-        <Parameter value="0.07" />
-        <Parameter value="0.10" />
-        <Parameter value="0.95" />
-    </Descriptor>
-</FuzzydDescriptorsModel>
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.TIF b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
deleted file mode 100644
index c35e58f7734d48008a909fe36028bb11872914b8..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4c708f6360cadd64d7c530b6412397ddc60929b8c3bcea79d4b45e392dde59c
-size 1149268
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.geom b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.geom
deleted file mode 100644
index 68452848273e55170a47fdfad7c8175c0b3763dd..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.geom
+++ /dev/null
@@ -1,165 +0,0 @@
-adjustment_0.adj_param_0.center:  0
-adjustment_0.adj_param_0.description:  intrack_offset
-adjustment_0.adj_param_0.lock_flag:  0
-adjustment_0.adj_param_0.parameter:  0
-adjustment_0.adj_param_0.sigma:  50
-adjustment_0.adj_param_0.units:  pixel
-adjustment_0.adj_param_1.center:  0
-adjustment_0.adj_param_1.description:  crtrack_offset
-adjustment_0.adj_param_1.lock_flag:  0
-adjustment_0.adj_param_1.parameter:  0
-adjustment_0.adj_param_1.sigma:  50
-adjustment_0.adj_param_1.units:  pixel
-adjustment_0.adj_param_2.center:  0
-adjustment_0.adj_param_2.description:  intrack_scale
-adjustment_0.adj_param_2.lock_flag:  0
-adjustment_0.adj_param_2.parameter:  0
-adjustment_0.adj_param_2.sigma:  50
-adjustment_0.adj_param_2.units:  unknown
-adjustment_0.adj_param_3.center:  0
-adjustment_0.adj_param_3.description:  crtrack_scale
-adjustment_0.adj_param_3.lock_flag:  0
-adjustment_0.adj_param_3.parameter:  0
-adjustment_0.adj_param_3.sigma:  50
-adjustment_0.adj_param_3.units:  unknown
-adjustment_0.adj_param_4.center:  0
-adjustment_0.adj_param_4.description:  map_rotation
-adjustment_0.adj_param_4.lock_flag:  0
-adjustment_0.adj_param_4.parameter:  0
-adjustment_0.adj_param_4.sigma:  0.1
-adjustment_0.adj_param_4.units:  degrees
-adjustment_0.description:  Initial adjustment
-adjustment_0.dirty_flag:  0
-adjustment_0.number_of_params:  5
-bias_error:  0
-current_adjustment:  0
-height_off:  241
-height_scale:  500
-image_id:  02APR01105228-M1BS-000000128955_01_P001
-lat_off:  43.5757
-lat_scale:  0.0881
-line_den_coeff_00:  1
-line_den_coeff_01:  3.073151e-05
-line_den_coeff_02:  0.0006767593
-line_den_coeff_03:  0.0002759762
-line_den_coeff_04:  1.707011e-05
-line_den_coeff_05:  -4.215218e-07
-line_den_coeff_06:  -2.031982e-06
-line_den_coeff_07:  6.281466e-06
-line_den_coeff_08:  -2.098686e-05
-line_den_coeff_09:  1.091061e-05
-line_den_coeff_10:  3.716818e-08
-line_den_coeff_11:  5.435656e-08
-line_den_coeff_12:  -4.35619e-06
-line_den_coeff_13:  1.09022e-08
-line_den_coeff_14:  1.78519e-08
-line_den_coeff_15:  0.0004342067
-line_den_coeff_16:  6.371344e-08
-line_den_coeff_17:  0
-line_den_coeff_18:  -1.416592e-05
-line_den_coeff_19:  1.653665e-08
-line_num_coeff_00:  -0.001183432
-line_num_coeff_01:  0.001540212
-line_num_coeff_02:  -0.9858373
-line_num_coeff_03:  0.01594806
-line_num_coeff_04:  2.730892e-05
-line_num_coeff_05:  -9.785795e-07
-line_num_coeff_06:  0.0002528461
-line_num_coeff_07:  -0.0007762763
-line_num_coeff_08:  0.001998298
-line_num_coeff_09:  -5.855501e-06
-line_num_coeff_10:  -8.293341e-07
-line_num_coeff_11:  4.496584e-08
-line_num_coeff_12:  2.925877e-05
-line_num_coeff_13:  0
-line_num_coeff_14:  -8.818227e-06
-line_num_coeff_15:  -4.465644e-05
-line_num_coeff_16:  -1.06142e-05
-line_num_coeff_17:  4.172296e-07
-line_num_coeff_18:  -4.632173e-06
-line_num_coeff_19:  1.915274e-07
-line_off:  3630
-line_scale:  3691
-ll_lat:  43.4876885949517
-ll_lon:  1.35617248105186
-long_off:  1.4635
-long_scale:  0.1091
-lr_lat:  43.487956450501
-lr_lon:  1.57224225725364
-meters_per_pixel_x:  2.55166863064346
-meters_per_pixel_y:  2.68906571490787
-number_lines:  7265
-number_of_adjustments:  1
-number_samples:  6876
-polynomial_format:  B
-rand_error:  0
-rect:  0 0 6875 7264
-ref_point_hgt:  241
-ref_point_lat:  43.5755460927759
-ref_point_line:  3632
-ref_point_lon:  1.46371767649799
-ref_point_samp:  3437.5
-samp_den_coeff_00:  1
-samp_den_coeff_01:  0.001117681
-samp_den_coeff_02:  0.002334335
-samp_den_coeff_03:  -0.0006207135
-samp_den_coeff_04:  -5.962135e-05
-samp_den_coeff_05:  1.552717e-06
-samp_den_coeff_06:  -1.84009e-06
-samp_den_coeff_07:  -4.876876e-06
-samp_den_coeff_08:  3.158963e-05
-samp_den_coeff_09:  -1.201072e-05
-samp_den_coeff_10:  -1.579758e-07
-samp_den_coeff_11:  -9.944747e-08
-samp_den_coeff_12:  1.942372e-06
-samp_den_coeff_13:  0
-samp_den_coeff_14:  -8.945496e-08
-samp_den_coeff_15:  -1.480163e-06
-samp_den_coeff_16:  -6.008504e-08
-samp_den_coeff_17:  3.055564e-08
-samp_den_coeff_18:  1.11032e-07
-samp_den_coeff_19:  1.314046e-08
-samp_num_coeff_00:  -0.0021422
-samp_num_coeff_01:  1.003674
-samp_num_coeff_02:  0.00317708
-samp_num_coeff_03:  0.0002667587
-samp_num_coeff_04:  -0.002315384
-samp_num_coeff_05:  0.0006203277
-samp_num_coeff_06:  -0.0004161892
-samp_num_coeff_07:  0.001035653
-samp_num_coeff_08:  -0.001198854
-samp_num_coeff_09:  7.437719e-06
-samp_num_coeff_10:  2.503507e-06
-samp_num_coeff_11:  -2.185972e-05
-samp_num_coeff_12:  -4.893912e-05
-samp_num_coeff_13:  -1.149441e-05
-samp_num_coeff_14:  8.351017e-05
-samp_num_coeff_15:  -7.642065e-05
-samp_num_coeff_16:  -2.684169e-07
-samp_num_coeff_17:  2.340974e-08
-samp_num_coeff_18:  7.001246e-06
-samp_num_coeff_19:  -3.846245e-08
-samp_off:  3438
-samp_scale:  3443
-sensor:  QB02
-support_data.B_band_absCalFactor:  0.0160412
-support_data.G_band_absCalFactor:  0.0143847
-support_data.N_band_absCalFactor:  0.0154242
-support_data.R_band_absCalFactor:  0.0126735
-support_data.TDI_level:  13
-support_data.azimuth_angle:  154.8
-support_data.band_id:  Multi
-support_data.band_name_list:  B G R N
-support_data.bits_per_pixel:  16
-support_data.elevation_angle:  48.6
-support_data.generation_date:  2004-05-25T19:49:03.000000Z
-support_data.sat_azimuth_angle:  359
-support_data.sat_elevation_angle:  72.4
-support_data.sat_id:  QB02
-support_data.tlc_date:  2002-04-01T10:52:28.415362Z;
-support_data.type:  ossimQuickbirdMetaData
-type:  ossimQuickbirdRpcModel
-ul_lat:  43.663535886024
-ul_lon:  1.35446328287058
-ur_lat:  43.6638304625161
-ur_lon:  1.57254618315919
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.dbf b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.dbf
deleted file mode 100644
index 17a9903a40c7d097242b4f5367a8a1c3a0b30687..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:63f211d703d89d3abd9c7b0c2729f11b94fc9918108e77ab707c3a5b087c8da7
-size 1028
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.prj b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.prj
deleted file mode 100644
index a30c00a55de19be195abf9e942f6cff93bf0a825..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.prj
+++ /dev/null
@@ -1 +0,0 @@
-GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp
deleted file mode 100644
index f901be7cd3a3eb8e328388cb03d4db257cd46987..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a8d2eee9ba80d3bb867aada7db654ef86d17cad4f1d526b0385a943f29d82a6b
-size 4564
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shx b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shx
deleted file mode 100644
index 6f0fa666c0082c9bb48b431e0df4b44b357d6276..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f3bdf591bf2d6a7e3025629649f3e3effa4511f9f1af793193365b3ef53d8eb3
-size 252
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.dbf b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.dbf
deleted file mode 100644
index ed4287655d16eccbc86bc1926bc7b00c177ce96b..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d680b1d17582dc86c451bbe0446f9af84ae611b6afe06a5db38adecf191ba971
-size 4847
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.prj b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.prj
deleted file mode 100644
index a30c00a55de19be195abf9e942f6cff93bf0a825..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.prj
+++ /dev/null
@@ -1 +0,0 @@
-GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp
deleted file mode 100644
index d5ff96b9922859ed04a1f8c4479c89507f6c4daa..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d0b6e77ff1d3acae9432b63b929050ed0089e9aace8a831c817b07ac02b04063
-size 18388
diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shx b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shx
deleted file mode 100644
index 72bda750b8f93dbb743c133f9cdcb57e5d489314..0000000000000000000000000000000000000000
--- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8e3f91df5a62beb63ba9b17a952d2673a732aa428b20861dce0c6dd986e588db
-size 668
diff --git a/Data/Input/InputForRoadDetectionScalarProductDir.raw b/Data/Input/InputForRoadDetectionScalarProductDir.raw
deleted file mode 100644
index 95baee1dbe12bd62a063c59131b10dc4e8bde71c..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetectionScalarProductDir.raw
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:983ff7d0fd3f483320cd5739d48a65d89b39085be7689c9ccf2c1909646abe37
-size 8000000
diff --git a/Data/Input/InputForRoadDetectionScalarProductDir.raw.hdr b/Data/Input/InputForRoadDetectionScalarProductDir.raw.hdr
deleted file mode 100644
index 542943fbb79a3e0a855c28857c843cfc6fa64f18..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetectionScalarProductDir.raw.hdr
+++ /dev/null
@@ -1,14 +0,0 @@
-ENVI
-description = {
-/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvNeigborhoodScalarProductDirectionOutput}
-samples = 1000
-lines   = 1000
-bands   = 1
-header offset = 0
-file type = ENVI Standard
-data type = 5
-interleave = bsq
-byte order = 0
-map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North}
-band names = {
-Band 1}
diff --git a/Data/Input/InputForRoadDetectionScalarProductMod.raw b/Data/Input/InputForRoadDetectionScalarProductMod.raw
deleted file mode 100644
index 1965bed30248a82446ddaf14b1080f9a1e1a755a..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetectionScalarProductMod.raw
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4381a7c3cb500cf48069d96e6cfd22d93c314d9b72ed13db4b63d71595cf4d0d
-size 8000000
diff --git a/Data/Input/InputForRoadDetectionScalarProductMod.raw.hdr b/Data/Input/InputForRoadDetectionScalarProductMod.raw.hdr
deleted file mode 100644
index 4718fbd683e934c6b1228b843fbf722e17ca6b2c..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetectionScalarProductMod.raw.hdr
+++ /dev/null
@@ -1,14 +0,0 @@
-ENVI
-description = {
-/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvNeigborhoodScalarProductModulusOutput}
-samples = 1000
-lines   = 1000
-bands   = 1
-header offset = 0
-file type = ENVI Standard
-data type = 5
-interleave = bsq
-byte order = 0
-map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North}
-band names = {
-Band 1}
diff --git a/Data/Input/InputForRoadDetection_IsolatedRem.raw b/Data/Input/InputForRoadDetection_IsolatedRem.raw
deleted file mode 100644
index 47f0f275c53646931b0dd5c8b3734a3d2db3447b..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetection_IsolatedRem.raw
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:708c193109abedbfbf512198f0ddfb3d395877892535ac24ebd69debed6d252a
-size 8000000
diff --git a/Data/Input/InputForRoadDetection_IsolatedRem.raw.hdr b/Data/Input/InputForRoadDetection_IsolatedRem.raw.hdr
deleted file mode 100644
index c3059e85c1b67b6662f1fc540bb7b52f52f871a8..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetection_IsolatedRem.raw.hdr
+++ /dev/null
@@ -1,14 +0,0 @@
-ENVI
-description = {
-/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvRemoveIsolatedByDirectionOutput}
-samples = 1000
-lines   = 1000
-bands   = 1
-header offset = 0
-file type = ENVI Standard
-data type = 5
-interleave = bsq
-byte order = 0
-map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North}
-band names = {
-Band 1}
diff --git a/Data/Input/InputForRoadDetection_NonMaxRem.raw b/Data/Input/InputForRoadDetection_NonMaxRem.raw
deleted file mode 100644
index 5798a2e6cff1445685a8633fd0ccaa7951982471..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetection_NonMaxRem.raw
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:38e0a731bd1b6032cfa78f0bf04953af80d47503d7a309c0a151c24d8a7d4c92
-size 8000000
diff --git a/Data/Input/InputForRoadDetection_NonMaxRem.raw.hdr b/Data/Input/InputForRoadDetection_NonMaxRem.raw.hdr
deleted file mode 100644
index f127f633be1cf99c10cd5abf9c5abf5707b9e9c7..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetection_NonMaxRem.raw.hdr
+++ /dev/null
@@ -1,14 +0,0 @@
-ENVI
-description = {
-/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvNonMaxRemovalByDirectionOutput}
-samples = 1000
-lines   = 1000
-bands   = 1
-header offset = 0
-file type = ENVI Standard
-data type = 5
-interleave = bsq
-byte order = 0
-map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North}
-band names = {
-Band 1}
diff --git a/Data/Input/InputForRoadDetection_SpectralAngle.raw b/Data/Input/InputForRoadDetection_SpectralAngle.raw
deleted file mode 100644
index fcfe442dca79ccfc12b2f1b2fb7abfee4cf74a9a..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetection_SpectralAngle.raw
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:650d138fc001f6e44fe4c937736c0fee5a0421f8924116c104e52c5ac60e6845
-size 8000000
diff --git a/Data/Input/InputForRoadDetection_SpectralAngle.raw.hdr b/Data/Input/InputForRoadDetection_SpectralAngle.raw.hdr
deleted file mode 100644
index e8d1181b91312aa95409ed3257c39f57c40f43b2..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetection_SpectralAngle.raw.hdr
+++ /dev/null
@@ -1,14 +0,0 @@
-ENVI
-description = {
-/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/bfTvSpectralAngleDistanceOutput}
-samples = 1000
-lines   = 1000
-bands   = 1
-header offset = 0
-file type = ENVI Standard
-data type = 5
-interleave = bsq
-byte order = 0
-map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North}
-band names = {
-Band 1}
diff --git a/Data/Input/InputForRoadDetection_WrongRem.raw b/Data/Input/InputForRoadDetection_WrongRem.raw
deleted file mode 100644
index b77cb617091761f57ab8a441e59a5a0d72ecb26f..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetection_WrongRem.raw
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cfce41cafcedca2eec656277cda36f4c5dceaef30abfb367858a0a274d41b2aa
-size 8000000
diff --git a/Data/Input/InputForRoadDetection_WrongRem.raw.hdr b/Data/Input/InputForRoadDetection_WrongRem.raw.hdr
deleted file mode 100644
index a8093309243fe19444a67cace922dfebf88bea04..0000000000000000000000000000000000000000
--- a/Data/Input/InputForRoadDetection_WrongRem.raw.hdr
+++ /dev/null
@@ -1,14 +0,0 @@
-ENVI
-description = {
-/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvRemoveWrongDirectionOutput}
-samples = 1000
-lines   = 1000
-bands   = 1
-header offset = 0
-file type = ENVI Standard
-data type = 5
-interleave = bsq
-byte order = 0
-map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North}
-band names = {
-Band 1}
diff --git a/Data/Input/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml b/Data/Input/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml
deleted file mode 100644
index 36bf8590e956116f6e4a111960f27111f41faa0f..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" ?>
-<FeatureStatistics>
-    <Statistic name="mean">
-        <StatisticVector value="823.004" />
-        <StatisticVector value="81672" />
-        <StatisticVector value="0.821769" />
-        <StatisticVector value="3.36296" />
-    </Statistic>
-    <Statistic name="stddev">
-        <StatisticVector value="366.639" />
-        <StatisticVector value="135865" />
-        <StatisticVector value="1.31875" />
-        <StatisticVector value="9.14568" />
-    </Statistic>
-</FeatureStatistics>
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01.tif b/Data/Input/ObjectReco/Boats/maur_B010202_01.tif
deleted file mode 100644
index e3b946f57282e32006c7930175f75a6c23a9ad20..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:76240f31ab0ebe2c8e83b38d8a02a2840f98b34aa470e92395763014c8b9cc05
-size 13234829
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.dbf b/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.dbf
deleted file mode 100644
index a0aa2d0d932106f2394124898383c7cac084c7d9..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:01de58ce3c495b414e3f919d615130b06be4bbf1003b6b0de4f5253f2f75be54
-size 128437
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shp b/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shp
deleted file mode 100644
index cfa8f3d8dbcf234345c82d3b9153ba3120dd0635..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0d1c844b374bafb64de032505d8289c60df1a902468126eddd39a88223e1c4de
-size 39160
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shx b/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shx
deleted file mode 100644
index 4a2c3af97936c8dcb47fa4403afe509a53710708..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:be403f366f2b77b0d0e003483d14e3a791132d8553071062e7291d54a85f8e3e
-size 11260
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.dbf b/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.dbf
deleted file mode 100644
index 202ee4ebf826690e08e4824b170606210b443de7..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:397c38ef052e1be71c0417e8755149f56e29a89db317020b118683950807072f
-size 580
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shp b/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shp
deleted file mode 100644
index 6c61252e5cde1badc59f9dcab1deb7ef9aaf8661..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3de1390f4caeb34c796e97b5fd734118267dab9b7de9edd731013ebfb938772a
-size 2236
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shx b/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shx
deleted file mode 100644
index eedcb9a4a63e2e0e2f855ed1a9a8a4840f778aa2..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bc1895c35aa8f5da834af41323f450b6bad52514d7965ceb8a1e18dbaeddc7b1
-size 124
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.dbf b/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.dbf
deleted file mode 100644
index 3522a6c3014f619bed4fbbc4950e5928f903e858..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.dbf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:53d0f24062de7d7d09a7daa461a58a7e86e432d599655b89578f72f137f905d8
-size 365699
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shp b/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shp
deleted file mode 100644
index 24cb707432de271be01f81c9c3e2ca6c0b9a6e87..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shp
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0cf2710d95e4c820526a25bc6690ef7a3b976f18cf17f3f2ed1ffbe035515747
-size 126492
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shx b/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shx
deleted file mode 100644
index aa895b96ac97a0ee0052261977e5ce92bac4ebcb..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:78090fcacc5e730c68b21172cd3879d44817317527c415e713a872129d3fc6bc
-size 36212
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01_amplitude.tif b/Data/Input/ObjectReco/Boats/maur_B010202_01_amplitude.tif
deleted file mode 100644
index 1476026469d7d1da3ac47455c8fc6ac6cbc3028f..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01_amplitude.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0a9b97df1f6ae5a5356cbb4710e1cb0b95c7b8b82211dde09ba236164ecd965d
-size 8584511
diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif b/Data/Input/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif
deleted file mode 100644
index 0aebc9c9a6236adfda6f6f6ae4f48a121064951a..0000000000000000000000000000000000000000
--- a/Data/Input/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:32dd7458e8c64d1779b1513e7a22e28249939d49e6e9023888c12c89eeade1c8
-size 71853
diff --git a/Data/Input/Seg1InputForRCC8Graph.tif b/Data/Input/Seg1InputForRCC8Graph.tif
deleted file mode 100644
index e677622f9e4c0d4d464a97c7868746d837030406..0000000000000000000000000000000000000000
--- a/Data/Input/Seg1InputForRCC8Graph.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:75bfc4c053eeb623f1c3c072989a39835f7c6632b40902604bab4c8c7567c3d9
-size 5564
diff --git a/Data/Input/Seg2InputForRCC8Graph.tif b/Data/Input/Seg2InputForRCC8Graph.tif
deleted file mode 100644
index 6acc661a46c63f05ebc2b1114eba866af69151cd..0000000000000000000000000000000000000000
--- a/Data/Input/Seg2InputForRCC8Graph.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ebfa2c070d97c3f7a524766a02360ad9b8c21c98e49d5e7dd7eea9ff23224900
-size 4691
diff --git a/Data/Input/Seg3InputForRCC8Graph.tif b/Data/Input/Seg3InputForRCC8Graph.tif
deleted file mode 100644
index 2e27e0ee07e6a96ee3080888d565476f87127f8f..0000000000000000000000000000000000000000
--- a/Data/Input/Seg3InputForRCC8Graph.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e2b58aefe1fa20b19ea16c34bbc047fd8a4b06ccb302b39d900cbead96c62ca6
-size 3340
diff --git a/Data/Input/Seg4InputForRCC8Graph.tif b/Data/Input/Seg4InputForRCC8Graph.tif
deleted file mode 100644
index c2886b585ce56f98b79be4f016cdd69180bac30f..0000000000000000000000000000000000000000
--- a/Data/Input/Seg4InputForRCC8Graph.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8da097d6896b059cda7de7ff1225ce04be314844ecf8ef62c43d2db2335b8f53
-size 3024
diff --git a/Data/Input/Seg5InputForRCC8Graph.tif b/Data/Input/Seg5InputForRCC8Graph.tif
deleted file mode 100644
index 6b8329bcff20dd012dd54dfdbe1f1e60e968591c..0000000000000000000000000000000000000000
--- a/Data/Input/Seg5InputForRCC8Graph.tif
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c84224aa400ed08bc16edb53596dd9f205996e1dc0fdf377220beebf54119c09
-size 3931
diff --git a/Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png b/Data/Input/qb_ExtractRoad_pretty.png
similarity index 100%
rename from Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png
rename to Data/Input/qb_ExtractRoad_pretty.png
diff --git a/Data/Input/rcc8_mire1.png b/Data/Input/rcc8_mire1.png
deleted file mode 100644
index 84d80b5e476e3cda75dea149e44b344d157c7437..0000000000000000000000000000000000000000
--- a/Data/Input/rcc8_mire1.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:12f42927804f6acac12efbe0822696999f081d3b1c2d2e0660227a63635f2fba
-size 10261
diff --git a/Data/Input/rcc8_mire2.png b/Data/Input/rcc8_mire2.png
deleted file mode 100644
index fe51b7d93dca6819628b8aeccd1786b05ef28f12..0000000000000000000000000000000000000000
--- a/Data/Input/rcc8_mire2.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:41dc58713412957c17566c85387bf1b8b260ccf1f8fd8196fe649643887f2d03
-size 10261
diff --git a/Data/Input/rcc8_mire3.png b/Data/Input/rcc8_mire3.png
deleted file mode 100644
index 6ca1fb1ed79527ade0d0d39d517d2b27590fec86..0000000000000000000000000000000000000000
--- a/Data/Input/rcc8_mire3.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a2cde01113be3caeb86230817cd34355becc8aa74536929d3b22a8fe82f58659
-size 294
diff --git a/Data/Input/rcc8_mire4.png b/Data/Input/rcc8_mire4.png
deleted file mode 100644
index 10cd0bd99ff3ade23944d2d64bdba05104de70ea..0000000000000000000000000000000000000000
--- a/Data/Input/rcc8_mire4.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:57d4c7a833e915885ee3702f7990864e0583838d395f7e4fccb38502607d7189
-size 10261
diff --git a/Data/Input/rcc8_mire5.png b/Data/Input/rcc8_mire5.png
deleted file mode 100644
index 25031a9c185cce67878d7f32db1d587524d22bb5..0000000000000000000000000000000000000000
--- a/Data/Input/rcc8_mire5.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:32d1a7049dcdf8cf0488452d6347467740c97536baa73e21751d499ef41f306b
-size 112
diff --git a/Data/Input/rcc8_mire5.png.aux.xml b/Data/Input/rcc8_mire5.png.aux.xml
deleted file mode 100644
index 098625bf84b4ca0de04765727ac8e21380994743..0000000000000000000000000000000000000000
--- a/Data/Input/rcc8_mire5.png.aux.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<PAMDataset>
-  <GeoTransform>  5.0000000000000000e+00,  1.0000000000000000e+00,  0.0000000000000000e+00,  1.5000000000000000e+01,  0.0000000000000000e+00,  1.0000000000000000e+00</GeoTransform>
-  <Metadata>
-    <MDI key="Comment">Created with The GIMP</MDI>
-  </Metadata>
-</PAMDataset>
diff --git a/Data/Output/DEMToHotImageGenerator.png b/Data/Output/DEMToHotImageGenerator.png
new file mode 100644
index 0000000000000000000000000000000000000000..12224d6f0908d6c273cf87b787de7cfdd0ac7620
--- /dev/null
+++ b/Data/Output/DEMToHotImageGenerator.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d36b4f16b0f0be1d4d2247de214510349da67d37ae928945940898904e5a0a85
+size 234062
diff --git a/Data/Output/DEMToRainbowImageGenerator.png b/Data/Output/DEMToRainbowImageGenerator.png
new file mode 100644
index 0000000000000000000000000000000000000000..935878f01c767e1f0aebc632201d9e2ba89bcfac
--- /dev/null
+++ b/Data/Output/DEMToRainbowImageGenerator.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fd8b080e078549cdcfa949a31a286b30b7d6f1c96c923a977083a02855994256
+size 239121
diff --git a/Data/Output/DEMToReliefImageGenerator.png b/Data/Output/DEMToReliefImageGenerator.png
new file mode 100644
index 0000000000000000000000000000000000000000..97820270f0a32bc9d4c104a05045287c8f631e88
--- /dev/null
+++ b/Data/Output/DEMToReliefImageGenerator.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a9ed1706ab135a72068d49d0671e4c64c038d738928485b3721d29851c56ff1
+size 333514
diff --git a/Data/Output/GomaSmallFrostFiltered.png b/Data/Output/GomaSmallFrostFiltered.png
new file mode 100644
index 0000000000000000000000000000000000000000..4bb8d0aff26b48ac98cf4449cd8f7134ece2952f
--- /dev/null
+++ b/Data/Output/GomaSmallFrostFiltered.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8469a05c42dbe0468daa7f9355fa6af0d79fa81793c93d001eb6310bf5c0ade6
+size 26542
diff --git a/Data/Output/HillShadingColorExample.png b/Data/Output/HillShadingColorExample.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef71ef616873d212669e28f78d1ce307fed60284
--- /dev/null
+++ b/Data/Output/HillShadingColorExample.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ba2f71579dafa1317e7f036223d1d849f3dfd8eb3a3e699c6fa91d5226372ab2
+size 484983
diff --git a/Data/Output/HillShadingExample.png b/Data/Output/HillShadingExample.png
new file mode 100644
index 0000000000000000000000000000000000000000..d86e845d681b010064d24657bfc5cb93bf2f23e1
--- /dev/null
+++ b/Data/Output/HillShadingExample.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:11d6eb5b30a7a0507a0c2b15275a69d583ae89c49da1ecb1fd29eb7e4aabbb5b
+size 183418
diff --git a/Data/Output/MSClusteredOutput-pretty.png b/Data/Output/MSClusteredOutput-pretty.png
new file mode 100644
index 0000000000000000000000000000000000000000..caa286e69843f35949a09bc8bc42019420bb4892
--- /dev/null
+++ b/Data/Output/MSClusteredOutput-pretty.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf676b3188f175f21ea758ccfb7f551eb9468398d67f926ef677a89ca68dc622
+size 105266
diff --git a/Data/Output/MSLabeledOutput-pretty.png b/Data/Output/MSLabeledOutput-pretty.png
new file mode 100644
index 0000000000000000000000000000000000000000..ec6a18fbe4105fb582189df496e3beb846c083c2
--- /dev/null
+++ b/Data/Output/MSLabeledOutput-pretty.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e2abea57f9bd5d62e708f6971178d2a3dd94997db37ab0846a66d6d99d37152a
+size 105590
diff --git a/Data/Output/PrintableExampleOutput1.jpg b/Data/Output/PrintableExampleOutput1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ab0a5d601db100171d2b4eebccaa087276ebee1a
--- /dev/null
+++ b/Data/Output/PrintableExampleOutput1.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:895c3c368f3daf3049ec2be7164e94f1e0fd3cdd52259bf99fb3b187fece5b3b
+size 108726
diff --git a/Data/Output/PrintableExampleOutput2.jpg b/Data/Output/PrintableExampleOutput2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..5254ab0bb4c6736dd2930eba0070ddaf28164488
--- /dev/null
+++ b/Data/Output/PrintableExampleOutput2.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57a2949eb07c569b5d0b474d2b9cf8e3f8de62260850dfc1a9b3614c57cdf5bb
+size 116071
diff --git a/Data/Output/QB_Toulouse_Ortho_PAN_casted.png b/Data/Output/QB_Toulouse_Ortho_PAN_casted.png
new file mode 100644
index 0000000000000000000000000000000000000000..23aee06b351d171c95dd0bf521b046c8ebb3fd63
--- /dev/null
+++ b/Data/Output/QB_Toulouse_Ortho_PAN_casted.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ca5363df6bf1a9fd48d17b033cd507ece65605bce33a8f3da8e3ba4af5f5e705
+size 182862
diff --git a/Data/Output/QB_Toulouse_Ortho_PAN_rescaled.png b/Data/Output/QB_Toulouse_Ortho_PAN_rescaled.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a70131af5f2a3b3e2d3eef3b5fcf88c7fcacec6
--- /dev/null
+++ b/Data/Output/QB_Toulouse_Ortho_PAN_rescaled.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e333f7abd77db1ab2158975e767ed1ea94ff547747584be07f54a01eae0bb3fa
+size 108051
diff --git a/Data/Output/buildingExtractionIndexed_scaled.png b/Data/Output/buildingExtractionIndexed_scaled.png
new file mode 100644
index 0000000000000000000000000000000000000000..f5c8ecd3189513614019da20e01580e77f2eddc5
--- /dev/null
+++ b/Data/Output/buildingExtractionIndexed_scaled.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90304742fc7c5d8d88cff5abc627954337856160799856adb5dcb352db484ddd
+size 17406
diff --git a/Data/Output/buildingExtractionRGB.png b/Data/Output/buildingExtractionRGB.png
new file mode 100644
index 0000000000000000000000000000000000000000..0dbdd3d556a7aabcd2c736d68e3fbedc8b53301e
--- /dev/null
+++ b/Data/Output/buildingExtractionRGB.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a91156558f5de2353efe3d8e3b17ef2284e74200a0bd1fed5d36bffcf720fc7a
+size 26026
diff --git a/Data/Output/qb_BandMath-pretty.jpg b/Data/Output/qb_BandMath-pretty.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..bd7702f79d46340d9a6cf011270092ab6b1f22af
--- /dev/null
+++ b/Data/Output/qb_BandMath-pretty.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:280cbf6de4cfc271371df94f79bdef1b6fb5089225e0d5105a6ad494ae7be89e
+size 67381
diff --git a/Documentation/Cookbook/Scripts/RunExamples.py b/Documentation/Cookbook/Scripts/RunExamples.py
index e04ea62e62a0d781018c498504ebdfc72f25c100..41cb849897d494cf71cfc858e9dc2258bd673ff2 100755
--- a/Documentation/Cookbook/Scripts/RunExamples.py
+++ b/Documentation/Cookbook/Scripts/RunExamples.py
@@ -33,7 +33,7 @@ blacklist = [
         "LAIAndPROSAILToSensorResponse" # does not run, wrong arguments
     ]
 
-def run_example(otb_root, otb_data, name, dry_run):
+def run_example(otb_root, name, dry_run):
     """
     Run an example by name
     Assumes the current working directory is an OTB build
@@ -71,6 +71,7 @@ def run_example(otb_root, otb_data, name, dry_run):
         print("$ " + binary + " " + " ".join(example_args))
 
         if not dry_run:
+            otb_data = join(otb_root, "Data")
             # Make sure Output dir exists
             os.makedirs(join(otb_data, "Output"), exist_ok=True)
 
@@ -81,19 +82,18 @@ def run_example(otb_root, otb_data, name, dry_run):
 def main():
     parser = argparse.ArgumentParser(usage="Run one or all OTB cxx examples")
     parser.add_argument("otb_root", help="Path to otb repository")
-    parser.add_argument("otb_data", help="Path to otb-data repository")
     parser.add_argument("--name", type=str, help="Run only one example with then given name")
     parser.add_argument("-n", "--dry-run", action='store_true', help="Dry run, only print commands")
     parser.add_argument("-k", "--keep-going", action='store_true', help="Keep going after failing examples")
     args = parser.parse_args()
 
     if args.name:
-        run_example(args.otb_root, args.otb_data, args.name, dry_run=args.dry_run)
+        run_example(args.otb_root, args.name, dry_run=args.dry_run)
     else:
         list_of_examples =[os.path.splitext(os.path.basename(f))[0] for f in glob.glob(join(args.otb_root, "Examples/*/*.cxx"))]
         for name in list_of_examples:
             try:
-                run_example(args.otb_root, args.otb_data, name, dry_run=args.dry_run)
+                run_example(args.otb_root, name, dry_run=args.dry_run)
             except Exception as e:
                 if args.keep_going:
                     print("Warning:", e)
diff --git a/Documentation/Cookbook/Scripts/otbGenerateExamplesRstDoc.py b/Documentation/Cookbook/Scripts/otbGenerateExamplesRstDoc.py
index 95463f1191d2f8a44e23f2397445fae2a7028247..f534a97dcb0578ab7928a44c0ba1aa262acb244e 100644
--- a/Documentation/Cookbook/Scripts/otbGenerateExamplesRstDoc.py
+++ b/Documentation/Cookbook/Scripts/otbGenerateExamplesRstDoc.py
@@ -44,7 +44,7 @@ def generate_examples_index(rst_dir, list_of_examples):
     index_f = open(join(rst_dir, "Examples.rst"), "w")
     index_f.write(RstPageHeading("C++ Examples", 3, ref="cpp-examples"))
 
-    for tag, examples_filenames in tag_files.items():
+    for tag, examples_filenames in sorted(tag_files.items()):
         tag_filename = join("Examples", tag + ".rst")
         index_f.write("\t" + tag_filename + "\n")
 
diff --git a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py
index 1fdf53d44841712fcb7f221dfc5618bd4c6cc47c..8cd9ab8ed70e204d915e32c25ebb4944f52b4a9b 100755
--- a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py
+++ b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py
@@ -426,7 +426,7 @@ def GenerateRstForApplications(rst_dir):
                 tagFile.write("\tapp_" + appName + "\n")
 
         # Write application rst
-        with open(rst_dir + '/Applications/app_'  + appName + '.rst', 'w') as appFile:
+        with open(rst_dir + '/Applications/app_'  + appName + '.rst', 'w',encoding='utf-8') as appFile:
             appFile.write(render_application(appName, appNames))
 
 if __name__ == "__main__":
diff --git a/Documentation/Cookbook/rst/C++/DeveloperGuide.rst b/Documentation/Cookbook/rst/C++/DeveloperGuide.rst
index 2808c4479c704bf71bd2ced9c010af2c65e57228..e34e034a08d94a074443ec8d26215f953c5ae8ca 100644
--- a/Documentation/Cookbook/rst/C++/DeveloperGuide.rst
+++ b/Documentation/Cookbook/rst/C++/DeveloperGuide.rst
@@ -7,6 +7,7 @@ Developer Guide
     Iterators
     Filters
     StreamingAndThreading
+    FunctorImageFilter
     PersistentFilters
     WriteAnApplication
     AddingNewModules
diff --git a/Documentation/Cookbook/rst/C++/FunctorImageFilter.rst b/Documentation/Cookbook/rst/C++/FunctorImageFilter.rst
new file mode 100644
index 0000000000000000000000000000000000000000..95fd6124f8c02481e07b7313481c677bbabd01ec
--- /dev/null
+++ b/Documentation/Cookbook/rst/C++/FunctorImageFilter.rst
@@ -0,0 +1,253 @@
+.. _FunctorImageFilter:
+
+FunctorImageFilter
+==================
+
+In image processing and remote sensing, it is very common to write custom
+pixel-based or neighborhood-based operations between one or several
+co-registered images. Starting OTB 7.0, there is now a unique filter
+:doxygen:`FunctorImageFilter` that will handle most cases:
+
+* Any number of input images, being either ``Image``, ``VectorImage`` or a mix of both,
+* An ``Image`` or ``VectorImage`` output
+* Operation based on pixels, neighborhoods or a mix of both,
+* Functor classes, function, lambdas.
+
+With :doxygen:`FunctorImageFilter` you only need to write the operation you want to perform, and the filter will take care of everything (including multi-threading and streaming).
+
+Quickstart
+----------
+
+Defining the operation to perform
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The operation to perform can be defined as a free function:
+
+.. code-block:: cpp
+
+    double myFreeFunction(const double& int in) {...}
+
+It can also be defined as a functor (i.e. a class defining ``operator()``:
+
+.. code-block:: cpp
+
+    class MyFunctor
+    {
+    public:
+        double operator()(const double& int in) {...}
+    };
+
+It can also be defined as a lambda:
+
+.. code-block:: cpp
+
+    auto myLambda = [](const double & int in) -> double {...}
+
+
+Creating a ``FunctorImageFilter``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Once the operation to perform has been implemented, it is very easy to get an instance of ``FunctorImageFilter`` from it:
+
+.. code-block:: cpp
+
+    auto filterFromFreeFunction = NewFunctorFilter(myFreeFunction);
+    auto filterFromFunctor      = NewFunctorFilter(MyFunctor);
+    auto filterFromLambda       = NewFunctorFilter(myLambda);
+
+And you can use it just like any other filter:
+
+.. code-block:: cpp
+
+    filterFromLambda->SetInput(upStreamFilter->GetOutput());
+    downstreamFilter->SetInput(filterFromLambda->GetOutput());
+
+You can also directly define instances of ``FunctorImageFilter`` with built-in math functions:
+
+.. code-block:: cpp
+
+    using CosType  = double(double);
+    auto filterCos = NewFunctorFilter(static_cast<CosType*>(std::cos));
+
+Note, the ``static_cast`` trick, which allows to disambguiate between different prototypes of the ``cos`` function.
+
+Automatic types deduction
+-------------------------
+
+You probably notice that, contrary to other filters in ITK and OTB, there is no
+need to specify input and output image types. This is because
+``FunctorImageFilter`` uses C++ metaprogramming to automatically derive the
+input and output image types from the free function, functor or lambda, with
+the following rules.
+
+Let ``R (T1 t1, T2 t2 ..., TN tn)`` be the signature of the free function, ``operator()`` or lambda. Note that the filter conversely supports passing by value ``TN tn`` or by const reference ``const TN & tn``.
+
+First lets define basic types:
+
+- Scalar type (double, float, unsigned int, short ...)
+- ``std::complex<T>`` with T a scalar type
+- ``itk::FixedArray<T,N>``, ``itk::RGBPixel<T>``, ``itk::RGBAPixel<T>`` with T a scalar type
+
+
+Automatic input type deduction
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+From the basic types, the following deduction rules apply:
+
+- If ``TN`` is a basic type as defined above, the Nth input will be of type ``otb::Image<TN>``
+- If ``TN`` is of type ``itk::VariableLengthVector<T>`` with T a basic type as defined above, the Nth input will be of type ``otb::VectorImage<T>``
+- If ``TN`` is of type  ``const itk::ConstNeighborhoodIterator<otb::Image<T>> &`` with T a basic type as defined above, the Nth input will be of type ``otb::Image<TN>``
+- If ``TN`` is of type  ``const itk::ConstNeighborhoodIterator<otb::VectorImage<T>> &`` with T a basic type as defined above, the Nth input will be of type ``otb::VectorImage<TN>``
+
+Note that this will work for any number of inputs.
+
+Automatic output type deduction
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Rules for output type deduction are simpler:
+- If ``R`` is a basic type, output of the filter will be of type ``otb::Image<R>``
+- If ``R`` is of type ``itk::VariableLengthVector<T>`` with T a basic type as defined above, the output of the filter will be of type ``otb::VectorImage<R>``
+
+Note that if ``R`` is of type ``itk::VariableLengthVector<T>``, you need extra steps so that the filter can allocate the correct number of output bands, as explained in NumberOfOutputBands_ section.
+
+Alternative prototype for performance
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Automatic type deduction will also work with the following signature:
+``void (const R&, T1 t1, T2 t2 ..., TN tn)``
+
+This will be more efficient when ``R`` is of type ``itk::VariableLengthVector<T>`` and should be prefered in this case.
+
+Automatic type deduction examples
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Consider the following free function:
+
+.. code-block:: cpp
+
+    itk::VariableLenghtVector<double> myFreeFunction(unsigned char a,
+                                                     const std::complex<float>& b,
+                                                     const itk::VariableLengthVector<short>& c,
+                                                     const itk::ConstNeighborhoodIterator<otb::Image<double>>& d) {...}
+
+When a ``FunctorImageFilter`` is built from this function, the following types will be deduced:
+
+- First input (corresponding to a) will be of type ``otb::Image<unsigned char>``
+- Second input (corresponding to b) will be of type ``otb::Image<std::complex<float>>``
+- Third input (corresponding to c) will be of type ``otb::VectorImage<short>``
+- Fourth input (corresponding to d) will be of type ``otb::Image<double>``
+- Output type will be of type ``otb::VectorImage<double>``
+
+This is strictly equivalent to:
+
+.. code-block:: cpp
+
+    void myFreeFunction(const itk::VariableLengthVector<double> & out ,
+                        unsigned char a, 
+                        const std::complex<float> & b,
+                        const itk::VariableLengthVector<short> &c,
+                        const itk::ConstNeighborhoodIterator<otb::Image<double>> & d) {...}
+
+Since the output type is of type ``itk::VariableLengthVector<T>``, the latter should be preferred.
+
+
+Using the filter
+----------------
+
+Setting inputs
+~~~~~~~~~~~~~~
+
+The Nth parameter can be set with the template ``SetInput()`` method:
+
+.. code-block:: cpp
+
+    myFilter->SetInput<N>(imageN);
+
+You can also set all inputs at once with the ``SetInputs()`` method:
+
+.. code-block:: cpp
+
+    myFilter->SetInputs(image0,...,imageN);
+
+If you only have one input, you can simply call:
+
+.. code-block:: cpp
+
+    myFilter->SetInput(image);
+
+Of course, input types must match the types deducted from the operator(), free function or lambda!
+
+Accessing the function
+~~~~~~~~~~~~~~~~~~~~~~
+
+If ``FunctorImageFilter`` was built from a functor class, this class may have parameters that you wish to change or read.
+
+You can call ``GetFunctor()`` to access a const reference to the functor in order to read a parameter value:
+
+.. code-block:: cpp
+
+    auto a = myFilter->GetFunctor().GetParameterA();
+
+If you wish to modify a parameter of the functor, you will have to call ``GetModifiableFunctor()``, which will return a non-const reference to the functor and ensure that the filter will be re-run when updated.
+
+Setting the neighborhood radius
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+If you have ``itk::ConstNeighborhoodIterator<otb::Image<T>>`` or ``itk::ConstNeighborhoodIterator<otb::VectorImage<T>>`` as input type, you can set the neighborhood radius when building the filter instance, with:
+
+.. code-block:: cpp
+
+    auto filterFromFunctor = NewFunctorFilter(MyFunctor,{{3,3}});
+
+Advanced use
+------------
+
+Number of output bands
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. _NumberOfOutputBands:
+
+If is of type ``itk::VariableLengthVector<T>``, then the functor class should provide an ``OutputSize()`` method as follows.
+
+If the number of output bands is fixed:
+
+.. code-block:: cpp
+
+    class MyFunctor {
+    public:
+    ...
+    constexpr size_t OutputSize(...) const
+    {
+      // Return the number of output bands
+      return 3;
+    }
+    };
+
+If the number of output bands depends on the number of bands in one or more input images:
+
+.. code-block:: cpp
+
+    class MyFunctor {
+    public:
+    ...
+    size_t OutputSize(const std::array<size_t,N> & nbBands) const
+    {
+      // N Is the number of inputs
+      // nbBands is an array containing the number of bands for each input
+      ...
+      return outputNumberOfBands;
+    }
+    };
+
+In this case you can use the information provided by the ``nbBands`` parameter
+which contain the number of bands for each input, to derive and return the
+output number of bands.
+
+If you are using a lambda, a free function or an existing functor which does not
+offer the ``OutputSize()`` method, you can still use ``FunctorImageFilter`` but
+you need to provide the number of bands when constructing the filter instance:
+
+.. code-block:: cpp
+
+    // Specify that the lambda output has 3 bands
+    auto filterFromLambda       = NewFunctorFilter(myLambda,3);
+
diff --git a/Documentation/Cookbook/rst/C++/UserGuide.rst b/Documentation/Cookbook/rst/C++/UserGuide.rst
index 10304efb75adc6ae0782a52ed781e162e07c37e3..956d36e3ca03d27e8638f2cf1a376b9763e3de3e 100644
--- a/Documentation/Cookbook/rst/C++/UserGuide.rst
+++ b/Documentation/Cookbook/rst/C++/UserGuide.rst
@@ -618,8 +618,6 @@ vegetation had been demonstrated, users tended to also use the NDVI to
 quantify the photosynthetic capacity of plant canopies. This, however,
 can be a rather more complex undertaking if not done properly.
 
-* NDVI. See example :ref:`NDVIRAndNIRVegetationIndexImageFilter.cxx`.
-
 * ARVI. See example :ref:`ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx`.
 
 * AVI. See example :ref:`AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx`.
@@ -707,7 +705,6 @@ Interest Points
   See example :ref:`RatioLineDetectorExample.cxx`.
   See example :ref:`CorrelationLineDetectorExample.cxx`.
   See example :ref:`AsymmetricFusionOfLineDetectorExample.cxx`.
-  See example :ref:`ParallelLineDetectionExample.cxx`.
 
 * Segment Extraction. See example :ref:`LineSegmentDetectorExample.cxx`.
 
@@ -787,26 +784,9 @@ following expressions:
 
 * Flusser Moments for Images. See example :ref:`FlusserMomentsImageFunctionExample.cxx`.
 
-Road and cloud extraction
+Cloud extraction
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Road extraction is a critical feature for an efficient use of high
-resolution satellite images. There are many applications of road
-extraction: update of GIS database, reference for image registration,
-help for identification algorithms and rapid mapping for example. Road
-network can be used to register an optical image with a map or an
-optical image with a radar image for example. Road network extraction
-can help for other algorithms: isolated building detection, bridge
-detection. In these cases, a rough extraction can be sufficient. In the
-context of response to crisis, a fast mapping is necessary: within
-6 hours, infrastructures for the designated area are required. Within
-this timeframe, a manual extraction is inconceivable and an automatic
-help is necessary.
-
-* Road extraction filter. See example :ref:`ExtractRoadExample.cxx`.
-
-* Step by step road extraction. See example :ref:`ExtractRoadByStepsExample.cxx`.
-
 * Cloud Detection. See example :ref:`CloudDetectionExample.cxx`.
 
 Image Simulation
diff --git a/Documentation/Cookbook/rst/CompilingOTBFromSource.rst b/Documentation/Cookbook/rst/CompilingOTBFromSource.rst
index 7961cc02b4c01a66b884a02cc678759f70bc5a34..84dccaaf529465b0f31124b78401f8e5f0e3c593 100644
--- a/Documentation/Cookbook/rst/CompilingOTBFromSource.rst
+++ b/Documentation/Cookbook/rst/CompilingOTBFromSource.rst
@@ -23,7 +23,6 @@ majority) are optional and can be activated or not during the build
 process:
 
 .. table:: External libraries used in OTB
-    :widths: 50 20 30
     :align: center
 
     +------------------------------------------------------------------+-----------------------+--------------------------+
diff --git a/Documentation/Cookbook/rst/recipes/featextract.rst b/Documentation/Cookbook/rst/recipes/featextract.rst
index 64afc6814ead8eed8f69d63f7b41af1aaab1f47e..23267e65276dc6d011b2a4967ff2dc73bf335792 100644
--- a/Documentation/Cookbook/rst/recipes/featextract.rst
+++ b/Documentation/Cookbook/rst/recipes/featextract.rst
@@ -111,37 +111,62 @@ The *RadiometricIndices* application has the following input parameters:
    (default value is 1)
 
 -``-list`` the list of available radiometric indices (default value is
-   Vegetation:NDVI)
+   ``Vegetation:NDVI``)
 
-The available radiometric indices to be listed into -list with their
-relevant channels in brackets are:
+Note that band numbering starts at 1.
 
-::
+The available radiometric indices to be listed into ``-list`` with their
+relevant channels in brackets are:
 
-    Vegetation:NDVI - Normalized difference vegetation index (Red, NIR)
-    Vegetation:TNDVI - Transformed normalized difference vegetation index (Red, NIR)
-    Vegetation:RVI - Ratio vegetation index (Red, NIR)
-    Vegetation:SAVI - Soil adjusted vegetation index (Red, NIR)
-    Vegetation:TSAVI - Transformed soil adjusted vegetation index (Red, NIR)
-    Vegetation:MSAVI - Modified soil adjusted vegetation index (Red, NIR)
-    Vegetation:MSAVI2 - Modified soil adjusted vegetation index 2 (Red, NIR)
-    Vegetation:GEMI - Global environment monitoring index (Red, NIR)
-    Vegetation:IPVI - Infrared percentage vegetation index (Red, NIR)
-
-    Water:NDWI - Normalized difference water index (Gao 1996) (NIR, MIR)
-    Water:NDWI2 - Normalized difference water index (Mc Feeters 1996) (Green, NIR)
-    Water:MNDWI - Modified normalized difference water index (Xu 2006) (Green, MIR)
-    Water:NDPI - Normalized difference pond index (Lacaux et al.) (MIR, Green)
-    Water:NDTI - Normalized difference turbidity index (Lacaux et al.) (Red, Green)
-
-    Soil:RI - Redness index (Red, Green)
-    Soil:CI - Color index (Red, Green)
-    Soil:BI - Brightness index (Red, Green)
-    Soil:BI2 - Brightness index 2 (NIR, Red, Green)
++------------------------------+----------------------------------------------------------+---------------+
+|Index                         |Description                                               |Required bands |
++==============================+==========================================================+===============+
+|Vegetation:NDVI               |Normalized difference vegetation index                    |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation:TNDVI              |Transformed normalized difference vegetation index        |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation:RVI                |Ratio vegetation index                                    |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation:SAVI               |Soil adjusted vegetation index                            |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation:TSAVI              |Transformed soil adjusted vegetation index                |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation:MSAVI              |Modified soil adjusted vegetation index                   |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation:MSAVI2             |Modified soil adjusted vegetation index 2                 |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation:GEMI               |Global environment monitoring index                       |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation:IPVI               |Infrared percentage vegetation index                      |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation:LAIFromNDVILog     |Leaf Area Index from log NDVI                             |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation::LAIFromReflLinear |Leaf Area Index from reflectances with linear combination |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Vegetation::LAIFromNDVIFormo  |Leaf Area Index from Formosat 2  TOC                      |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Water:NDWI                    |Normalized difference water index (Gao 1996)              |NIR, MIR       |
++------------------------------+----------------------------------------------------------+---------------+
+|Water:NDWI2                   |Normalized difference water index (Mc Feeters 1996)       |Green, NIR     |
++------------------------------+----------------------------------------------------------+---------------+
+|Water:MNDWI                   |Modified normalized difference water index (Xu 2006)      |Green, MIR     |
++------------------------------+----------------------------------------------------------+---------------+
+|Water:NDTI                    |Normalized difference turbidity index (Lacaux et al.)     |Green, Red     |
++------------------------------+----------------------------------------------------------+---------------+
+|Soil:RI                       |Redness index                                             |Green, Red     |
++------------------------------+----------------------------------------------------------+---------------+
+|Soil:CI                       |Color index                                               |Green, Red     |
++------------------------------+----------------------------------------------------------+---------------+
+|Soil:BI                       |Brightness index                                          |Green, Red     |
++------------------------------+----------------------------------------------------------+---------------+
+|Soil:BI2                      |Brightness index 2                                        |Green, Red, NIR|
++------------------------------+----------------------------------------------------------+---------------+
+|BuiltUp:ISU                   |Built Surfaces Index                                      |Red, NIR       |
++------------------------------+----------------------------------------------------------+---------------+
 
 The application can be used as follows, which would produce an output image
-containing 3 bands, respectively with the Vegetation:NDVI, Vegetation:RVI and
-Vegetation:IPVI radiometric indices in this exact order:
+containing 3 bands, respectively with the ``Vegetation:NDVI``, ``Vegetation:RVI`` and
+``Vegetation:IPVI`` radiometric indices in this exact order:
 
 ::
 
@@ -154,7 +179,7 @@ Vegetation:IPVI radiometric indices in this exact order:
                                               Vegetation:IPVI 
 
 or as follows, which would produce a single band output image with the
-Water:NDWI2 radiometric index:
+``Water:NDWI2`` radiometric index:
 
 ::
 
diff --git a/Documentation/Cookbook/rst/recipes/improc.rst b/Documentation/Cookbook/rst/recipes/improc.rst
index 4216062f7ebafc55de4e5ab342b03cb90ffee1a6..72f24b429994e2f58729ff50b2773bb58bdf25b1 100644
--- a/Documentation/Cookbook/rst/recipes/improc.rst
+++ b/Documentation/Cookbook/rst/recipes/improc.rst
@@ -289,128 +289,3 @@ skipped.
 
 There is a cleanup option that can be disabled in order to check intermediate
 outputs of this composite application.
-
-Dempster Shafer based Classifier Fusion
----------------------------------------
-
-This framework is dedicated to perform cartographic validation starting
-from the result of a detection (for example a road extraction), enhance
-the results viability by using a classifier fusion algorithm. Using a
-set of descriptors, the processing chain validates or invalidates the
-input geometrical features.
-
-Fuzzy Model (requisite)
-~~~~~~~~~~~~~~~~~~~~~~~
-
-The *DSFuzzyModelEstimation* application performs the fuzzy model
-estimation (once by use case: descriptor set / Belief support /
-Plausibility support). It has the following input parameters:
-
--  ``-psin`` a vector data of positive samples enriched according to the
-   “Compute Descriptors” part
-
--  ``-nsin`` a vector data of negative samples enriched according to the
-   “Compute Descriptors” part
-
--  ``-belsup`` a support for the Belief computation
-
--  ``-plasup`` a support for the Plausibility computation
-
--  ``-desclist`` an initialization model (xml file) or a descriptor name
-   list (listing the descriptors to be included in the model)
-
-The application can be used like this:
-
-::
-
-    otbcli_DSFuzzyModelEstimation -psin     PosSamples.shp
-                                  -nsin     NegSamples.shp
-                                  -belsup   "ROADSA"
-                                  -plasup   "NONDVI" "ROADSA" "NOBUIL"
-                                  -desclist "NONDVI" "ROADSA" "NOBUIL"
-                                  -out      FuzzyModel.xml
-
-The output file ``FuzzyModel.xml`` contains the optimal model to perform
-information fusion.
-
-First Step: Compute Descriptors
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The first step in the classifier fusion based validation is to compute,
-for each studied polyline, the chosen descriptors. In this context, the
-*ComputePolylineFeatureFromImage* application can be used for a large
-range of descriptors. It has the following inputs:
-
--  ``-in`` an image (of the studied scene) corresponding to the chosen
-   descriptor (NDVI, building Mask…)
-
--  ``-vd`` a vector data containing polyline of interest
-
--  ``-expr`` a formula (“b1 >0.4”, “b1 == 0”) where b1 is the standard
-   name of input image first band
-
--  ``-field`` a field name corresponding to the descriptor codename
-   (NONDVI, ROADSA...)
-
-The output is a vector data containing polylines with a new field
-containing the descriptor value. In order to add the “NONDVI” descriptor
-to an input vector data (“inVD.shp”) corresponding to the percentage of
-pixels along a polyline that verifies the formula “NDVI >0.4”:
-
-::
-
-    otbcli_ComputePolylineFeatureFromImage -in   NDVI.TIF
-                                           -vd  inVD.shp
-                                           -expr  "b1 > 0.4"
-                                           -field "NONDVI"
-                                           -out   VD_NONDVI.shp
-
-``NDVI.TIF`` is the NDVI mono band image of the studied scene. This step
-must be repeated for each chosen descriptor:
-
-::
-
-    otbcli_ComputePolylineFeatureFromImage -in   roadSpectralAngle.TIF
-                                           -vd  VD_NONDVI.shp
-                                           -expr  "b1 > 0.24"
-                                           -field "ROADSA"
-                                           -out   VD_NONDVI_ROADSA.shp
-
-::
-
-    otbcli_ComputePolylineFeatureFromImage -in   Buildings.TIF
-                                           -vd  VD_NONDVI_ROADSA.shp
-                                           -expr  "b1 == 0"
-                                           -field "NOBUILDING"
-                                           -out   VD_NONDVI_ROADSA_NOBUIL.shp
-
-Both ``NDVI.TIF`` and ``roadSpectralAngle.TIF`` can be produced using
-**Monteverdi** feature extraction capabilities, and ``Buildings.TIF``
-can be generated using **Monteverdi** rasterization module. From now on,
-``VD_NONDVI_ROADSA_NOBUIL.shp`` contains three descriptor fields. It
-will be used in the following part.
-
-Second Step: Feature Validation
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The final application (*VectorDataDSValidation* ) will validate or
-invalidate the studied samples using `the Dempster-Shafer
-theory <http://en.wikipedia.org/wiki/Dempster%E2%80%93Shafer_theory>`_ 
-. Its inputs are:
-
--  ``-in`` an enriched vector data “VD\_NONDVI\_ROADSA\_NOBUIL.shp”
-
--  ``-belsup`` a support for the Belief computation
-
--  ``-plasup`` a support for the Plausibility computation
-
--  ``-descmod`` a fuzzy model FuzzyModel.xml
-
-The output is a vector data containing only the validated samples.
-
-::
-
-    otbcli_VectorDataDSValidation -in      extractedRoads_enriched.shp
-                                  -descmod FuzzyModel.xml
-                                  -out     validatedSamples.shp
-
diff --git a/Examples/BasicFilters/BandMathFilterExample.cxx b/Examples/BasicFilters/BandMathFilterExample.cxx
index 7404742ba2b75dd6eee7323870c5d7be7cdfd112..98d13618c6bac6176ee144408c22d09c60876769 100644
--- a/Examples/BasicFilters/BandMathFilterExample.cxx
+++ b/Examples/BasicFilters/BandMathFilterExample.cxx
@@ -22,22 +22,6 @@
 ./BandMathFilterExample Input/qb_RoadExtract.tif Output/RoadExtractBandMath.tif Output/qb_BandMath-pretty.jpg
 */
 
-
-// This filter is based on the mathematical parser library muParser.
-// The built in functions and operators list is available at:
-// http://muparser.sourceforge.net/mup_features.html.
-//
-// In order to use this filter, at least one input image should be
-// set. An associated variable name can be specified or not by using
-// the corresponding SetNthInput method. For the nth input image, if
-// no associated variable name has been specified, a default variable
-// name is given by concatenating the letter "b" (for band) and the
-// corresponding input index.
-//
-// The next step is to set the expression according to the variable
-// names. For example, in the default case with three input images the
-// following expression is valid: ``(b1+b2)*b3``.
-
 #include "itkMacro.h"
 #include <iostream>
 
@@ -65,11 +49,10 @@ int main(int argc, char* argv[])
     return EXIT_FAILURE;
   }
 
-  // We start by the typedef needed for reading and
+  // We start by the typedefs needed for reading and
   // writing the images. The BandMathImageFilter class
   // works with Image as input, so we need to define additional
   // filters to extract each layer of the multispectral image.
-
   typedef double                                                           PixelType;
   typedef otb::VectorImage<PixelType, 2>                                   InputImageType;
   typedef otb::Image<PixelType, 2>                                         OutputImageType;
@@ -78,13 +61,12 @@ int main(int argc, char* argv[])
   typedef otb::ImageFileReader<InputImageType>                             ReaderType;
   typedef otb::ImageFileWriter<OutputImageType>                            WriterType;
 
-  // We can now define the type for the filter:
+  // We can now define the type for the filter
   typedef otb::BandMathImageFilter<OutputImageType> FilterType;
 
-  // We instantiate the filter, the reader, and the writer:
+  // We instantiate the filter, the reader, and the writer
   ReaderType::Pointer reader = ReaderType::New();
   WriterType::Pointer writer = WriterType::New();
-
   FilterType::Pointer filter = FilterType::New();
 
   writer->SetInput(filter->GetOutput());
@@ -93,9 +75,9 @@ int main(int argc, char* argv[])
 
   reader->UpdateOutputInformation();
 
-  // We now need to extract each band from the input \doxygen{otb}{VectorImage},
-  // it illustrates the use of the \doxygen{otb}{VectorImageToImageList}.
-  // Each extracted layer is an input to the \doxygen{otb}{BandMathImageFilter}:
+  // We now need to extract each band from the input VectorImage,
+  // it illustrates the use of the VectorImageToImageList.
+  // Each extracted layer is an input to the BandMathImageFilter
   VectorImageToImageListType::Pointer imageList = VectorImageToImageListType::New();
   imageList->SetInput(reader->GetOutput());
 
@@ -111,8 +93,8 @@ int main(int argc, char* argv[])
   // Now we can define the mathematical expression to perform on the layers (b1, b2, b3, b4).
   // The filter takes advantage of the parsing capabilities of the muParser library and
   // allows setting the expression as on a digital calculator.
-  //
-  // The expression below returns 255 if the ratio $(NIR-RED)/(NIR+RED)$ is greater than 0.4 and 0 if not.
+
+  // The expression below returns 255 if the ratio (NIR-RED)/(NIR+RED) is greater than 0.4 and 0 if not.
   filter->SetExpression("if((b4-b3)/(b4+b3) > 0.4, 255, 0)");
 
 #ifdef OTB_MUPARSER_HAS_CXX_LOGICAL_OPERATORS
@@ -125,19 +107,7 @@ int main(int argc, char* argv[])
   writer->Update();
 
   // The muParser library also provides the possibility to extend existing built-in functions. For example,
-  // you can use the OTB expression "ndvi(b3, b4)" with the filter. In this instance, the mathematical expression would be
-  // \textit{if($ndvi(b3, b4)>0.4$, 255, 0)}, which would return the same result.
-
-  // Figure~\ref{fig:BandMathImageFilter} shows the result of the threshold applied to the NDVI index
-  // of a Quickbird image.
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.45\textwidth]{qb_ExtractRoad_pretty.eps}
-  // \includegraphics[width=0.45\textwidth]{qb_BandMath-pretty.eps}
-  // \itkcaption[Band Math]{From left to right:
-  // Original image, thresholded NDVI index.}
-  // \label{fig:BandMathImageFilter}
-  // \end{figure}
+  // you can use the OTB expression "ndvi(b3, b4)" with the filter. In this instance, the mathematical expression would be "if(ndvi(b3, b4)>0.4, 255, 0)", which would return the same result.
 
   typedef otb::Image<unsigned char, 2>                                 OutputPrettyImageType;
   typedef otb::ImageFileWriter<OutputPrettyImageType>                  PrettyImageFileWriterType;
@@ -151,6 +121,4 @@ int main(int argc, char* argv[])
   prettyWriter->SetFileName(argv[3]);
 
   prettyWriter->Update();
-
-  return EXIT_SUCCESS;
 }
diff --git a/Examples/BasicFilters/BandMathFilterExample.rst b/Examples/BasicFilters/BandMathFilterExample.rst
new file mode 100644
index 0000000000000000000000000000000000000000..47da3da8989b1e399f5a20222c1529de6e44d757
--- /dev/null
+++ b/Examples/BasicFilters/BandMathFilterExample.rst
@@ -0,0 +1,27 @@
+The :doxygen:`BandMathImageFilter` is based on the mathematical parser library muParser.
+The built in functions and operators list is available at:
+http://muparser.sourceforge.net/mup_features.html.
+
+In order to use this filter, at least one input image should be
+set. An associated variable name can be specified or not by using
+the corresponding ``SetNthInput`` method. For the nth input image, if
+no associated variable name has been specified, a default variable
+name is given by concatenating the letter "b" (for band) and the
+corresponding input index.
+
+The next step is to set the expression according to the variable
+names. For example, in the default case with three input images the
+following expression is valid: ``(b1+b2)*b3``.
+
+.. |image1| image:: /Input/qb_ExtractRoad_pretty.png
+
+.. |image2| image:: /Output/qb_BandMath-pretty.jpg
+
+.. _Figure1:
+
++--------------------------+-------------------------+
+|        |image1|          |         |image2|        |
++--------------------------+-------------------------+
+
+    NDVI of a Quickbird image computed with BandMathImageFilter
+
diff --git a/Examples/BasicFilters/DEMToRainbowExample.cxx b/Examples/BasicFilters/DEMToRainbowExample.cxx
index f1cf3e83a3ca04a550f95b21bff3dbcbb325a763..fcceeae63cc27416400a727f6397176b82708a1c 100644
--- a/Examples/BasicFilters/DEMToRainbowExample.cxx
+++ b/Examples/BasicFilters/DEMToRainbowExample.cxx
@@ -33,19 +33,6 @@
 ./DEMToRainbowExample Output/DEMToReliefImageGenerator.png 6.5 45.5 500 500 0.002 -0.002 Input/DEM_srtm relief
 */
 
-
-// In some situation, it is desirable to represent a gray scale image in color for easier
-// interpretation. This is particularly the case if pixel values in the image are used
-// to represent some data such as elevation, deformation map,
-// interferogram. In this case, it is important to ensure that similar
-// values will get similar colors. You can notice how this requirement
-// differs from the previous case.
-//
-// The following example illustrates the use of the \doxygen{otb}{DEMToImageGenerator} class
-// combined with the \doxygen{otb}{ScalarToRainbowRGBPixelFunctor}. You can refer to the
-// source code or to section \ref{sec:ReadDEM} for the DEM conversion to image,
-// we will focus on the color conversion part here.
-
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
 
@@ -103,9 +90,9 @@ int main(int argc, char* argv[])
 
   demToImage->SetOutputSpacing(spacing);
 
-  // As in the previous example, the \doxygen{itk}{ScalarToRGBColormapImageFilter} is
+  // The ScalarToRGBColormapImageFilter is
   // the filter in charge of calling the functor we specify to do the work for
-  // each pixel. Here it is the \doxygen{otb}{ScalarToRainbowRGBPixelFunctor}.
+  // each pixel. Here it is the ScalarToRainbowRGBPixelFunctor.
 
   typedef itk::ScalarToRGBColormapImageFilter<ImageType, RGBImageType> ColorMapFilterType;
   ColorMapFilterType::Pointer                                          colormapper = ColorMapFilterType::New();
@@ -146,34 +133,5 @@ int main(int argc, char* argv[])
 
   writer->SetInput(colormapper->GetOutput());
 
-  try
-  {
-    writer->Update();
-  }
-  catch (itk::ExceptionObject& excep)
-  {
-    std::cerr << "Exception caught !" << std::endl;
-    std::cerr << excep << std::endl;
-  }
-  catch (...)
-  {
-    std::cout << "Unknown exception !" << std::endl;
-    return EXIT_FAILURE;
-  }
-
-  // Figure~\ref{fig:RAINBOW_FILTER} shows the effect of applying the filter to
-  // a gray scale image.
-  //
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{pretty_DEMToImageGenerator.eps}
-  // \includegraphics[width=0.44\textwidth]{DEMToRainbowImageGenerator.eps}
-  // \includegraphics[width=0.44\textwidth]{DEMToHotImageGenerator.eps}
-  // \includegraphics[width=0.44\textwidth]{DEMToReliefImageGenerator.eps}
-  // \itkcaption[Grayscale to color]{The gray level DEM extracted from SRTM
-  // data (top-left) and the same area represented in color.}
-  // \label{fig:RAINBOW_FILTER}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
+  writer->Update();
 }
diff --git a/Examples/BasicFilters/DEMToRainbowExample.rst b/Examples/BasicFilters/DEMToRainbowExample.rst
new file mode 100644
index 0000000000000000000000000000000000000000..a1164c7cdf091ba8106c4c6161ce60a1c94d9a28
--- /dev/null
+++ b/Examples/BasicFilters/DEMToRainbowExample.rst
@@ -0,0 +1,23 @@
+In some situation, it is desirable to represent a gray scale image in color for easier
+interpretation. This is particularly the case if pixel values in the image are used
+to represent some data such as elevation, deformation map,
+interferogram. In this case, it is important to ensure that similar
+values will get similar colors. You can notice how this requirement
+differs from the previous case.
+
+The following example illustrates the use of the :doxygen:`DEMToImageGenerator`
+class combined with the `ScalarToRainbowRGBPixelFunctor`. You can refer to the
+source code for the DEM conversion to image, we will focus on the color
+conversion part here.
+
+.. |image1| image:: /Output/DEMToRainbowImageGenerator.png
+
+.. |image2| image:: /Output/DEMToHotImageGenerator.png
+
+.. |image3| image:: /Output/DEMToReliefImageGenerator.png
+
+.. _Figure1:
+
++--------------------------+-------------------------+-------------------------+
+|        |image1|          |         |image2|        |         |image3|        |
++--------------------------+-------------------------+-------------------------+
diff --git a/Examples/BasicFilters/FrostImageFilter.cxx b/Examples/BasicFilters/FrostImageFilter.cxx
index 13d12674854981e964a32c70fe8d60756cbb9681..913ac71a271f1fc1abb1b45243aacf1999da22e3 100644
--- a/Examples/BasicFilters/FrostImageFilter.cxx
+++ b/Examples/BasicFilters/FrostImageFilter.cxx
@@ -23,34 +23,6 @@
 ./FrostImageFilter Input/GomaSmall.png Output/GomaSmallFrostFiltered.png 5 0.1
 */
 
-
-// This example illustrates the use of the \doxygen{otb}{FrostImageFilter}.
-// This filter belongs to the family of the edge-preserving smoothing
-// filters which are usually used for speckle reduction in radar
-// images.
-//
-// This filter uses a negative exponential convolution kernel.
-// The output of the filter for pixel p is:
-//      $ \hat I_{s}=\sum_{p\in\eta_{p}} m_{p}I_{p} $
-//
-// where :   $ m_{p}=\frac{KC_{s}^{2}\exp(-KC_{s}^{2}d_{s, p})}{\sum_{p\in\eta_{p}} KC_{s}^{2}\exp(-KC_{s}^{2}d_{s, p})} $
-//    and  $ d_{s, p}=\sqrt{(i-i_{p})^2+(j-j_{p})^2} $
-//
-// \begin{itemize}
-// \item $ K $     : the decrease coefficient
-// \item $ (i, j)$ : the coordinates of the pixel inside the region
-// defined by $ \eta_{s} $
-// \item $ (i_{p}, j_{p})$ : the coordinates of the pixels belonging to $ \eta_{p} \subset \eta_{s} $
-// \item $ C_{s}$ : the variation coefficient computed over $ \eta_{p}$
-// \end{itemize}
-//
-//
-//
-// Most of this example is similar to the previous one and only the differences
-// will be highlighted.
-//
-// First, we need to include the header:
-
 #include "otbFrostImageFilter.h"
 
 #include "otbImage.h"
@@ -68,16 +40,12 @@ int main(int argc, char* argv[])
   }
 
   typedef unsigned char PixelType;
-
   typedef otb::Image<PixelType, 2> InputImageType;
   typedef otb::Image<PixelType, 2> OutputImageType;
 
-  //  The filter can be instantiated using the image types defined previously.
-
+  // The filter can be instantiated using the image types defined previously.
   typedef otb::FrostImageFilter<InputImageType, OutputImageType> FilterType;
-
   typedef otb::ImageFileReader<InputImageType> ReaderType;
-
   typedef otb::ImageFileWriter<OutputImageType> WriterType;
 
   ReaderType::Pointer reader = ReaderType::New();
@@ -87,22 +55,12 @@ int main(int argc, char* argv[])
   writer->SetInput(filter->GetOutput());
   reader->SetFileName(argv[1]);
 
-  //  The image obtained with the reader is passed as input to the
-  //  \doxygen{otb}{FrostImageFilter}.
-  //
-  //  \index{otb::FrostImageFilter!SetInput()}
-  //  \index{otb::FileImageReader!GetOutput()}
-
+  // The image obtained with the reader is passed as input to the FrostImageFilter
   filter->SetInput(reader->GetOutput());
 
-  //  The method \code{SetRadius()} defines the size of the window to
-  //  be used for the computation of the local statistics. The method
-  //  \code{SetDeramp()} sets the $K$ coefficient.
-  //
-  //  \index{otb::FrostImageFilter!SetRadius()}
-  //  \index{otb::FrostImageFilter!SetDeramp()}
-  //  \index{SetDeramp()!otb::FrostImageFilter}
-
+  // The method SetRadius() defines the size of the window to
+  // be used for the computation of the local statistics. The method
+  // SetDeramp() sets the K coefficient.
   FilterType::SizeType Radius;
   Radius[0] = atoi(argv[3]);
   Radius[1] = atoi(argv[3]);
@@ -112,22 +70,4 @@ int main(int argc, char* argv[])
 
   writer->SetFileName(argv[2]);
   writer->Update();
-
-  // Figure~\ref{fig:FROST_FILTER} shows the result of applying the Frost
-  // filter to a SAR image.
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{GomaSmall.eps}
-  // \includegraphics[width=0.44\textwidth]{GomaSmallFrostFiltered.eps}
-  // \itkcaption[Frost Filter Application]{Result of applying the
-  // \doxygen{otb}{FrostImageFilter} to a SAR image.}
-  // \label{fig:FROST_FILTER}
-  // \end{figure}
-  //
-  //  \relatedClasses
-  //  \begin{itemize}
-  //  \item \doxygen{otb}{LeeImageFilter}
-  //  \end{itemize}
-
-  return EXIT_SUCCESS;
 }
diff --git a/Examples/BasicFilters/FrostImageFilter.rst b/Examples/BasicFilters/FrostImageFilter.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2951e334e7a6c3c7d087e6ae37ad8c05d8c880bc
--- /dev/null
+++ b/Examples/BasicFilters/FrostImageFilter.rst
@@ -0,0 +1,34 @@
+This example illustrates the use of the :doxygen:`FrostImageFilter`.
+This filter belongs to the family of the edge-preserving smoothing
+filters which are usually used for speckle reduction in radar
+images.
+
+This filter uses a negative exponential convolution kernel.
+The output of the filter for pixel p is:
+
+.. math::
+
+   \hat I_{s}=\sum_{p\in\eta_{p}} m_{p}I_{p}
+
+   m_{p}=\frac{KC_{s}^{2}\exp(-KC_{s}^{2}d_{s, p})}{\sum_{p\in\eta_{p}} KC_{s}^{2}\exp(-KC_{s}^{2}d_{s, p})}
+
+   d_{s, p}=\sqrt{(i-i_{p})^2+(j-j_{p})^2}
+
+where:
+
+* :math:`K`: the decrease coefficient
+* :math:`(i, j)`: the coordinates of the pixel inside the region defined by :math:`\eta_{s}`
+* :math:`(i_{p}, j_{p})`: the coordinates of the pixels belonging to :math:`\eta_{p} \subset \eta_{s}`
+* :math:`C_{s}`: the variation coefficient computed over :math:`\eta_{p}`
+
+.. |image1| image:: /Input/GomaSmall.png
+
+.. |image2| image:: /Output/GomaSmallFrostFiltered.png
+
+.. _Figure1:
+
++--------------------------+-------------------------+
+|        |image1|          |         |image2|        |
++--------------------------+-------------------------+
+
+    Result of applying the FrostImageFilter to a SAR image.
diff --git a/Examples/BasicFilters/HillShadingExample.cxx b/Examples/BasicFilters/HillShadingExample.cxx
index 1d58ca2f68482dc62bdfe16e8fca5e4a9ce76668..a281e9aef85d86116d5ca7c35b719cbd832e9e19 100644
--- a/Examples/BasicFilters/HillShadingExample.cxx
+++ b/Examples/BasicFilters/HillShadingExample.cxx
@@ -24,18 +24,6 @@
 */
 
 
-// Visualization of digital elevation models (DEM) is often more intuitive by simulating a
-// lighting source and generating the corresponding shadows. This principle is called
-// hill shading.
-//
-// Using a simple functor \doxygen{otb}{HillShadingFunctor} and the DEM image generated
-// using the \doxygen{otb}{DEMToImageGenerator} (refer to \ref{sec:ReadDEM}), you can easily
-// obtain a representation of the DEM. Better yet, using the
-// \doxygen{otb}{ScalarToRainbowRGBPixelFunctor}, combined with the
-// \doxygen{otb}{ReliefColormapFunctor} you can easily generate the classic elevation maps.
-//
-// This example will focus on the shading itself.
-
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
 
@@ -50,7 +38,6 @@
 
 int main(int argc, char* argv[])
 {
-
   if (argc < 10)
   {
     std::cout << argv[0] << " <output_filename> <output_color_filename> "
@@ -162,21 +149,8 @@ int main(int argc, char* argv[])
 
   writer2->SetInput(multiply->GetOutput());
 
-  try
-  {
-    writer->Update();
-    writer2->Update();
-  }
-  catch (itk::ExceptionObject& excep)
-  {
-    std::cerr << "Exception caught !" << std::endl;
-    std::cerr << excep << std::endl;
-  }
-  catch (...)
-  {
-    std::cout << "Unknown exception !" << std::endl;
-    return EXIT_FAILURE;
-  }
+  writer->Update();
+  writer2->Update();
 
   otb::WorldFile::Pointer worldFile = otb::WorldFile::New();
   worldFile->SetLonOrigin(origin[0]);
@@ -188,17 +162,4 @@ int main(int argc, char* argv[])
   worldFile->Update();
   worldFile->SetImageFilename(argv[2]);
   worldFile->Update();
-
-  // Figure~\ref{fig:HILL_SHADING} shows the hill shading result from SRTM data.
-  //
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{HillShadingExample.eps}
-  // \includegraphics[width=0.44\textwidth]{HillShadingColorExample.eps}
-  // \itkcaption[Hill shading]{Hill shading obtained from SRTM data (left) and combined with
-  // the color representation (right)}
-  // \label{fig:HILL_SHADING}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
 }
diff --git a/Examples/BasicFilters/HillShadingExample.rst b/Examples/BasicFilters/HillShadingExample.rst
new file mode 100644
index 0000000000000000000000000000000000000000..98e95d368c9306e06501e696483d743a41c01700
--- /dev/null
+++ b/Examples/BasicFilters/HillShadingExample.rst
@@ -0,0 +1,23 @@
+Visualization of digital elevation models (DEM) is often more intuitive by
+simulating a lighting source and generating the corresponding shadows. This
+principle is called hill shading.
+
+Using :doxygen:`HillShadingFilter` and the DEM image generated
+using the :doxygen:`DEMToImageGenerator`, you can easily obtain a representation
+of the DEM. Better yet, using the :doxygen-itk:`ScalarToRGBColormapImageFilter`
+combined with the ``ReliefColormapFunctor`` you can easily generate the
+classic elevation maps.
+
+This example will focus on the shading itself.
+
+.. |image1| image:: /Output/HillShadingExample.png
+
+.. |image2| image:: /Output/HillShadingColorExample.png
+
+.. _Figure1:
+
++--------------------------+-------------------------+
+|        |image1|          |         |image2|        |
++--------------------------+-------------------------+
+
+    Hill shading obtained from SRTM data (left) and combined with the color representation (right)
diff --git a/Examples/BasicFilters/IndexedToRGBExample.cxx b/Examples/BasicFilters/IndexedToRGBExample.cxx
index adba63456d9ca821727c58f18b15b81477c563f0..d7a8226949d33aa41c6e1a43f8c0ed00dc8f453b 100644
--- a/Examples/BasicFilters/IndexedToRGBExample.cxx
+++ b/Examples/BasicFilters/IndexedToRGBExample.cxx
@@ -24,25 +24,11 @@
 */
 
 
-//  Some algorithms produce an indexed image as output. In such images,
-// each pixel is given a value according to the region number it belongs to.
-// This value starting at 0 or 1 is usually an integer value.
-// Often, such images are produced by segmentation or classification algorithms.
-//
-// If such regions are easy to manipulate -- it is easier and faster to compare two integers
-// than a RGB value -- it is different when it comes to displaying the results.
-//
-// Here we present a convient way to convert such indexed image to a color image. In
-// such conversion, it is important to ensure that neighborhood region, which are
-// likely to have consecutive number have easily dicernable colors. This is done
-// randomly using a hash function by the \doxygen{itk}{ScalarToRGBPixelFunctor}.
-
 #include "otbImage.h"
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
 #include "itkUnaryFunctorImageFilter.h"
 #include "itkScalarToRGBPixelFunctor.h"
-
 #include "itkRescaleIntensityImageFilter.h"
 
 int main(int argc, char* argv[])
@@ -65,10 +51,8 @@ int main(int argc, char* argv[])
 
   reader->SetFileName(inputFilename);
 
-  //  The \doxygen{itk}{UnaryFunctorImageFilter} is the filter in charge of
-  // calling the functor we specify to do the work for each pixel. Here it is the
-  // \doxygen{itk}{ScalarToRGBPixelFunctor}.
-
+  // The UnaryFunctorImageFilter is the filter in charge of calling the functor
+  // we specify to do the work for each pixel. Here it is the ScalarToRGBPixelFunctor
   typedef itk::Functor::ScalarToRGBPixelFunctor<unsigned long>                       ColorMapFunctorType;
   typedef itk::UnaryFunctorImageFilter<ImageType, RGBImageType, ColorMapFunctorType> ColorMapFilterType;
   ColorMapFilterType::Pointer                                                        colormapper = ColorMapFilterType::New();
@@ -93,17 +77,4 @@ int main(int argc, char* argv[])
   writer2->SetFileName(outputScaledFilename);
   writer2->SetInput(rescaler->GetOutput());
   writer2->Update();
-
-  // Figure~\ref{fig:INDEXTORGB_FILTER} shows the result of the conversion
-  // from an indexed image to a color image.
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{buildingExtractionIndexed_scaled.eps}
-  // \includegraphics[width=0.44\textwidth]{buildingExtractionRGB.eps}
-  // \itkcaption[Scaling images]{The original indexed image (left) and the
-  // conversion to color image.}
-  // \label{fig:INDEXTORGB_FILTER}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
 }
diff --git a/Examples/BasicFilters/IndexedToRGBExample.rst b/Examples/BasicFilters/IndexedToRGBExample.rst
new file mode 100644
index 0000000000000000000000000000000000000000..b9c02e70cc8661bed202df3aecf4e2bb90196459
--- /dev/null
+++ b/Examples/BasicFilters/IndexedToRGBExample.rst
@@ -0,0 +1,24 @@
+Some algorithms produce an indexed image as output. In such images,
+each pixel is given a value according to the region number it belongs to.
+This value starting at 0 or 1 is usually an integer value.
+Often, such images are produced by segmentation or classification algorithms.
+
+If such regions are easy to manipulate -- it is easier and faster to compare two integers
+than a RGB value -- it is different when it comes to displaying the results.
+
+Here we present a convient way to convert such indexed image to a color image. In
+such conversion, it is important to ensure that neighboring regions, which are
+likely to have consecutive number have easily dicernable colors. This is done
+randomly using a hash function by ``ScalarToRGBPixelFunctor``.
+
+.. |image1| image:: /Output/buildingExtractionIndexed_scaled.png
+
+.. |image2| image:: /Output/buildingExtractionRGB.png
+
+.. _Figure1:
+
++--------------------------+-------------------------+
+|        |image1|          |         |image2|        |
++--------------------------+-------------------------+
+
+    The original indexed image (left) and the conversion to color image.
diff --git a/Examples/BasicFilters/LeeImageFilter.cxx b/Examples/BasicFilters/LeeImageFilter.cxx
index fee4c62c8772beb4c285aa855faaca4dcbc88579..d8c7aa947db0bbde16790f0024a444c1deb3c40c 100644
--- a/Examples/BasicFilters/LeeImageFilter.cxx
+++ b/Examples/BasicFilters/LeeImageFilter.cxx
@@ -47,16 +47,16 @@ int main(int argc, char* argv[])
   // The filter can be instantiated using the image types defined above.
   typedef otb::LeeImageFilter<InputImageType, OutputImageType> FilterType;
 
-  //  An ImageFileReader class is also instantiated in order to read
-  //  image data from a file.
+  // An ImageFileReader class is also instantiated in order to read
+  // image data from a file.
   typedef otb::ImageFileReader<InputImageType> ReaderType;
 
-  // An \doxygen{otb}{ImageFileWriter} is instantiated in order to write the
+  // An ImageFileWriter is instantiated in order to write the
   // output image to a file.
   typedef otb::ImageFileWriter<OutputImageType> WriterType;
 
-  //  Both the filter and the reader are created by invoking their \code{New()}
-  //  methods and assigning the result to SmartPointers.
+  // Both the filter and the reader are created by invoking their New()
+  // methods and assigning the result to SmartPointers.
   ReaderType::Pointer reader = ReaderType::New();
   FilterType::Pointer filter = FilterType::New();
 
@@ -64,8 +64,8 @@ int main(int argc, char* argv[])
   writer->SetInput(filter->GetOutput());
   reader->SetFileName(argv[1]);
 
-  //  The image obtained with the reader is passed as input to the
-  //  LeeImageFilter.
+  // The image obtained with the reader is passed as input to the
+  // LeeImageFilter.
   filter->SetInput(reader->GetOutput());
 
   // The method SetRadius() defines the size of the window to
diff --git a/Examples/BasicFilters/LeeImageFilter.rst b/Examples/BasicFilters/LeeImageFilter.rst
index bb34942a9ec560a722e01b71309dc570862d30b1..612bd8eb9ea84d5ced38c4dc92151aa77815c598 100644
--- a/Examples/BasicFilters/LeeImageFilter.rst
+++ b/Examples/BasicFilters/LeeImageFilter.rst
@@ -1,12 +1,19 @@
-This example illustrates the use of the LeeImageFilter.
+This example illustrates the use of the :doxygen:`LeeImageFilter`.
 This filter belongs to the family of the edge-preserving smoothing
 filters which are usually used for speckle reduction in radar
 images. The LeeFilter aplies a linear regression
 which minimizes the mean-square error in the frame of a
 multiplicative speckle model.
 
-.. figure:: /Input/GomaSmall.png
+.. |image1| image:: /Input/GomaSmall.png
 
-.. figure:: /Output/GomaSmallLeeFiltered.png
+.. |image2| image:: /Output/GomaSmallLeeFiltered.png
+
+.. _Figure1:
+
++--------------------------+-------------------------+
+|        |image1|          |         |image2|        |
++--------------------------+-------------------------+
 
     Result of applying the Lee filter to a SAR image.
+
diff --git a/Examples/BasicFilters/MeanShiftSegmentationFilterExample.cxx b/Examples/BasicFilters/MeanShiftSegmentationFilterExample.cxx
index f3992ead4089875bee8132029e4278585e214d66..9e665a35f21b216bc11ea6f433a1534233ee0f5e 100644
--- a/Examples/BasicFilters/MeanShiftSegmentationFilterExample.cxx
+++ b/Examples/BasicFilters/MeanShiftSegmentationFilterExample.cxx
@@ -32,29 +32,15 @@
                                      0.1
 */
 
-
-//  This example demonstrates the use of the
-//  \doxygen{otb}{MeanShiftSegmentationFilter} class which implements
-//  filtering and clustering using the mean shift algorithm
-//  \cite{Comaniciu2002}. For a given pixel, the mean shift will
-//  build a set of neighboring pixels within a given spatial radius
-//  and a color range. The spatial and color center of this set is
-//  then computed and the algorithm iterates with this new spatial and
-//  color center. The Mean Shift can be used for edge-preserving
-//  smoothing, or for clustering.
-
 #include "otbVectorImage.h"
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
 #include "otbImageFileWriter.h"
 #include "otbPrintableImageFilter.h"
-
 #include "itkScalarToRGBPixelFunctor.h"
 #include "itkUnaryFunctorImageFilter.h"
-
-//  We start by including the needed header file.
-
 #include "otbMeanShiftSegmentationFilter.h"
+
 int main(int argc, char* argv[])
 {
   if (argc != 11)
@@ -75,9 +61,6 @@ int main(int argc, char* argv[])
   const unsigned int maxiter         = atoi(argv[9]);
   const double       thres           = atof(argv[10]);
 
-  //  We start by the classical \code{typedef}s needed for reading and
-  //  writing the images.
-
   const unsigned int Dimension = 2;
 
   typedef float                        PixelType;
@@ -94,36 +77,39 @@ int main(int argc, char* argv[])
 
   typedef otb::MeanShiftSegmentationFilter<ImageType, LabelImageType, ImageType> FilterType;
 
-  //  We instantiate the filter, the reader, and 2 writers (for the
-  //  labeled and clustered images).
+  // We instantiate the filter, the reader, and 2 writers (for the
+  // labeled and clustered images).
 
   FilterType::Pointer      filter  = FilterType::New();
   ReaderType::Pointer      reader  = ReaderType::New();
   WriterType::Pointer      writer1 = WriterType::New();
   LabelWriterType::Pointer writer2 = LabelWriterType::New();
 
-  //  We set the file names for the reader and the writers:
-
+  // We set the file names for the reader and the writers:
   reader->SetFileName(infname);
   writer1->SetFileName(clusteredfname);
   writer2->SetFileName(labeledfname);
 
-  //  We can now set the parameters for the filter. There are 3 main
-  //  parameters: the spatial radius used for defining the neighborhood,
-  //  the range radius used for defining the interval in the color space
-  //  and the minimum size for the regions to be kept after clustering.
+  // We can now set the parameters for the filter. There are 3 main
+  // parameters: the spatial radius used for defining the neighborhood,
+  // the range radius used for defining the interval in the color space
+  // and the minimum size for the regions to be kept after clustering.
 
   filter->SetSpatialBandwidth(spatialRadius);
   filter->SetRangeBandwidth(rangeRadius);
   filter->SetMinRegionSize(minRegionSize);
-  // Two another parameters can be set  : the maximum iteration number, which defines maximum number of iteration until convergence.
-  //  Algorithm iterative scheme will stop if convergence hasn't been reached after the maximum number of iterations.
-  //  Threshold parameter defines mean-shift vector convergence value. Algorithm iterative scheme will stop if mean-shift vector is below this threshold or if
-  //  iteration number reached maximum number of iterations.
+
+  // Two another parameters can be set: the maximum iteration number, which
+  // defines maximum number of iteration until convergence.  Algorithm
+  // iterative scheme will stop if convergence hasn't been reached after the
+  // maximum number of iterations.  Threshold parameter defines mean-shift
+  // vector convergence value. Algorithm iterative scheme will stop if
+  // mean-shift vector is below this threshold or if iteration number reached
+  // maximum number of iterations.
 
   filter->SetMaxIterationNumber(maxiter);
   filter->SetThreshold(thres);
-  //  We can now plug the pipeline and run it.
+  // We can now plug the pipeline and run it.
 
   filter->SetInput(reader->GetOutput());
   writer1->SetInput(filter->GetClusteredOutput());
@@ -132,19 +118,6 @@ int main(int argc, char* argv[])
   writer1->Update();
   writer2->Update();
 
-  // Figure~\ref{fig:MeanShiftSegmentationFilter} shows the result of applying the mean shift
-  // to a Quickbird image.
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.40\textwidth]{ROI_QB_MUL_1.eps}
-  // \includegraphics[width=0.40\textwidth]{MSClusteredOutput-pretty.eps}
-  // \includegraphics[width=0.40\textwidth]{MSLabeledOutput-pretty.eps}
-  // \itkcaption[Mean Shift]{From top to bottom and left to right:
-  // Original image, image filtered by
-  // mean shift after clustering , and labeled image.}
-  // \label{fig:MeanShiftSegmentationFilter}
-  // \end{figure}
-
   typedef otb::PrintableImageFilter<ImageType> PrintableFilterType;
   PrintableFilterType::Pointer                 printableImageFilter = PrintableFilterType::New();
 
@@ -176,6 +149,4 @@ int main(int argc, char* argv[])
   labelRGBWriter->SetFileName(labeledpretty);
   labelRGBWriter->SetInput(labelToRGB->GetOutput());
   labelRGBWriter->Update();
-
-  return EXIT_SUCCESS;
 }
diff --git a/Examples/BasicFilters/MeanShiftSegmentationFilterExample.rst b/Examples/BasicFilters/MeanShiftSegmentationFilterExample.rst
new file mode 100644
index 0000000000000000000000000000000000000000..48e8fc09402b1907bc67ae3c8099dbbb2170cc9c
--- /dev/null
+++ b/Examples/BasicFilters/MeanShiftSegmentationFilterExample.rst
@@ -0,0 +1,21 @@
+This example demonstrates the use of the :doxygen:`MeanShiftSegmentationFilter`
+class which implements filtering and clustering using the mean shift algorithm.
+For a given pixel, the mean shift will build a set of neighboring pixels within
+a given spatial radius and a color range. The spatial and color center of this
+set is then computed and the algorithm iterates with this new spatial and color
+center. The Mean Shift can be used for edge-preserving smoothing, or for
+clustering.
+
+.. |image1| image:: /Input/ROI_QB_MUL_1.png
+
+.. |image2| image:: /Output/MSClusteredOutput-pretty.png
+
+.. |image3| image:: /Output/MSLabeledOutput-pretty.png
+
+.. _Figure1:
+
++--------------------------+-------------------------+-------------------------+
+|        |image1|          |         |image2|        |         |image3|        |
++--------------------------+-------------------------+-------------------------+
+
+    Original image, image filtered by mean shift after clustering, and labeled image.
diff --git a/Examples/BasicFilters/PrintableImageFilterExample.cxx b/Examples/BasicFilters/PrintableImageFilterExample.cxx
index abe40efdbbb6d00a6e6009e7296ddb5882feb802..f632da523ccbc7faa000df846524fe12d88f3f65 100644
--- a/Examples/BasicFilters/PrintableImageFilterExample.cxx
+++ b/Examples/BasicFilters/PrintableImageFilterExample.cxx
@@ -29,30 +29,6 @@
 */
 
 
-//  Most of the time, satellite images have more than three spectral bands. As we
-// are only able to see three colors (red, green and blue), we have to find a way to
-// represent these images using only three bands. This is called creating a color
-// composition.
-//
-// Of course, any color composition will not be able to render all the information
-// available in the original image. As a consequence, sometimes, creating more than
-// one color composition will be necessary.
-//
-// If you want to obtain an image with natural colors, you have to match the wavelength
-// captured by the satellite with those captured by your eye: thus matching the red band
-// with the red color, etc.
-//
-// Some satellites (SPOT 5 is an example) do not acquire all the {\em human} spectral bands:
-// the blue can be missing and replaced by some other wavelength of interest for a specific application.
-// In these situations, another mapping has to be created. That's why, the vegetation often appears in
-// red in satellite images (see on left of figure~\ref{fig:PRINTABLE_FILTER}).
-//
-// The band order in the image products can be also quite tricky. It could be in the wavelength order,
-// as it is the case for Quickbird (1: Blue, 2: Green, 3: Red, 4: NIR), in this case, you
-// have to be careful to reverse the order if you want a natural display. It could also be reverse
-// to facilitate direct viewing, as for SPOT5 (1: NIR, 2: Red, 3: Green, 4: SWIR) but in this situations
-// you have to be careful when you process the image.
-
 #include "otbVectorImage.h"
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
@@ -84,9 +60,8 @@ int main(int argc, char* argv[])
   ReaderType::Pointer reader = ReaderType::New();
   reader->SetFileName(inputFilename);
 
-  //  To easily convert the image to a {\em printable} format, i.e. 3 bands
-  // \code{unsigned char} value, you can use the \doxygen{otb}{PrintableImageFilter}.
-
+  // To easily convert the image to a printable format, i.e. 3 bands
+  // unsigned char value, you can use the PrintableImageFilter.
   typedef otb::PrintableImageFilter<InputImageType> PrintableFilterType;
   PrintableFilterType::Pointer                      printableImageFilter = PrintableFilterType::New();
 
@@ -95,9 +70,8 @@ int main(int argc, char* argv[])
   printableImageFilter->SetChannel(greenChannelNumber);
   printableImageFilter->SetChannel(blueChannelNumber);
 
-  //  When you create the writer to plug at the output of the \code{printableImageFilter}
+  // When you create the writer to plug at the output of the printableImageFilter
   // you may want to use the direct type definition as it is a good way to avoid mismatch:
-
   typedef PrintableFilterType::OutputImageType  OutputImageType;
   typedef otb::ImageFileWriter<OutputImageType> WriterType;
 
@@ -106,17 +80,4 @@ int main(int argc, char* argv[])
   writer->SetInput(printableImageFilter->GetOutput());
 
   writer->Update();
-
-  // Figure~\ref{fig:PRINTABLE_FILTER} illustrates different color compositions for a SPOT 5 image.
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{PrintableExampleOutput1.eps}
-  // \includegraphics[width=0.44\textwidth]{PrintableExampleOutput2.eps}
-  // \itkcaption[Scaling images]{On the left, a classic SPOT5
-  // combination: XS3 in red, XS2 in green and XS1 in blue. On the
-  // right another composition: XS3 in red, XS4 in green and XS2 in blue.}
-  // \label{fig:PRINTABLE_FILTER}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
 }
diff --git a/Examples/BasicFilters/PrintableImageFilterExample.rst b/Examples/BasicFilters/PrintableImageFilterExample.rst
new file mode 100644
index 0000000000000000000000000000000000000000..9c503fa73bb81e54857e01cdac3e3fce27c071bf
--- /dev/null
+++ b/Examples/BasicFilters/PrintableImageFilterExample.rst
@@ -0,0 +1,37 @@
+Most of the time, satellite images have more than three spectral bands. As we
+are only able to see three colors (red, green and blue), we have to find a way
+to represent these images using only three bands. This is called creating a
+color composition.
+
+Of course, any color composition will not be able to render all the information
+available in the original image. As a consequence, sometimes, creating more than
+one color composition will be necessary.
+
+If you want to obtain an image with natural colors, you have to match the
+wavelength captured by the satellite with those captured by your eye: thus
+matching the red band with the red color, etc.
+
+Some satellites (SPOT 5 is an example) do not acquire all the visible
+spectral bands: the blue can be missing and replaced by some other wavelength of
+interest for a specific application.  In these situations, another mapping has
+to be created. That's why the vegetation often appears in red in satellite
+images.
+
+The band order in the image products can be also quite tricky. It could be in
+the wavelength order, as it is the case for Quickbird (1: Blue, 2: Green, 3:
+Red, 4: NIR), in this case, you have to be careful to reverse the order if you
+want a natural display. It could also be reverse to facilitate direct viewing,
+as for SPOT5 (1: NIR, 2: Red, 3: Green, 4: SWIR) but in this situations you have
+to be careful when you process the image.
+
+.. |image1| image:: /Output/PrintableExampleOutput1.jpg
+
+.. |image2| image:: /Output/PrintableExampleOutput2.jpg
+
+.. _Figure1:
+
++--------------------------+-------------------------+
+|        |image1|          |         |image2|        |
++--------------------------+-------------------------+
+
+On the left, a classic SPOT5 combination: XS3 in red, XS2 in green and XS1 in blue. On the right another composition: XS3 in red, XS4 in green and XS2 in blue.
diff --git a/Examples/BasicFilters/ScalingFilterExample.cxx b/Examples/BasicFilters/ScalingFilterExample.cxx
index 174fa6699ca6a13dfd88f1d28c79e03ca960d1b5..feef4ec7231e8f0e1a456196a52b04e59daa7f1e 100644
--- a/Examples/BasicFilters/ScalingFilterExample.cxx
+++ b/Examples/BasicFilters/ScalingFilterExample.cxx
@@ -23,13 +23,6 @@
 ./ScalingFilterExample Input/QB_Toulouse_Ortho_PAN.tif Output/QB_Toulouse_Ortho_PAN_rescaled.png Output/QB_Toulouse_Ortho_PAN_casted.png
 */
 
-
-// On one hand, satellite images are commonly coded on more than 8 bits to provide
-// the dynamic range required from shadows to clouds. On the other hand, image formats
-// in use for printing and display are usually limited to 8 bits. We need to convert the value
-// to enable a proper display. This is usually done using linear scaling. Of course, you have
-// to be aware that some information is lost in the process.
-
 #include "otbImage.h"
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
@@ -56,8 +49,7 @@ int main(int argc, char* argv[])
   ReaderType::Pointer                          reader = ReaderType::New();
   reader->SetFileName(argv[1]);
 
-  //  The \doxygen{itk}{RescaleIntensityImageFilter} is used to rescale the value:
-
+  // The RescaleIntensityImageFilter is used to rescale the value
   typedef itk::RescaleIntensityImageFilter<InputImageType, OutputImageType> RescalerType;
   RescalerType::Pointer                                                     rescaler = RescalerType::New();
   rescaler->SetInput(reader->GetOutput());
@@ -75,20 +67,4 @@ int main(int argc, char* argv[])
   writer->SetFileName(argv[3]);
   writer->SetInput(caster->GetOutput());
   writer->Update();
-
-  // Figure~\ref{fig:SCALING_FILTER} illustrates the difference between a proper scaling and
-  // a simple truncation of the value and demonstrates why it is
-  // important to keep this in mind.
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{QB_Toulouse_Ortho_PAN_casted.eps}
-  // \includegraphics[width=0.44\textwidth]{QB_Toulouse_Ortho_PAN_rescaled.eps}
-  // \itkcaption[Scaling images]{On the left, the image obtained by truncated pixel values
-  // at the dynamic acceptable for a png file (between 0 and 255). On the right,
-  // the same image with
-  // a proper rescaling}
-  // \label{fig:SCALING_FILTER}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
 }
diff --git a/Examples/BasicFilters/ScalingFilterExample.rst b/Examples/BasicFilters/ScalingFilterExample.rst
new file mode 100644
index 0000000000000000000000000000000000000000..a284ff97abf3eef2c906d4040e28990aa48acad1
--- /dev/null
+++ b/Examples/BasicFilters/ScalingFilterExample.rst
@@ -0,0 +1,17 @@
+On one hand, satellite images are commonly coded on more than 8 bits to provide
+the dynamic range required from shadows to clouds. On the other hand, image formats
+in use for printing and display are usually limited to 8 bits. We need to convert the value
+to enable a proper display. This is usually done using linear scaling. Of course, you have
+to be aware that some information is lost in the process.
+
+.. |image1| image:: /Output/QB_Toulouse_Ortho_PAN_casted.png
+
+.. |image2| image:: /Output/QB_Toulouse_Ortho_PAN_rescaled.png
+
+.. _Figure1:
+
++--------------------------+-------------------------+
+|        |image1|          |         |image2|        |
++--------------------------+-------------------------+
+
+    On the left, the image obtained by truncated pixel values at the dynamic acceptable for a png file (between 0 and 255). On the right, the same image with a proper rescaling.
diff --git a/Examples/FeatureExtraction/CMakeLists.txt b/Examples/FeatureExtraction/CMakeLists.txt
index 19c504f658d111d89bbd3a107d495d0989e3d003..5d48aead0da95f1391506976bcfeb80c37083e36 100644
--- a/Examples/FeatureExtraction/CMakeLists.txt
+++ b/Examples/FeatureExtraction/CMakeLists.txt
@@ -38,18 +38,6 @@ target_link_libraries(CorrelationLineDetectorExample ${OTB_LIBRARIES})
 add_executable(EdgeDensityExample EdgeDensityExample.cxx)
 target_link_libraries(EdgeDensityExample ${OTB_LIBRARIES})
 
-#OTBRoadExtraction depends OTBMathParser. But OTB_USE_MUPARSER is OFF
-if(OTBMathParser_LOADED)
-add_executable(ExtractRoadByStepsExample ExtractRoadByStepsExample.cxx)
-target_link_libraries(ExtractRoadByStepsExample ${OTB_LIBRARIES})
-
-add_executable(ExtractRoadExample ExtractRoadExample.cxx)
-target_link_libraries(ExtractRoadExample ${OTB_LIBRARIES})
-
-add_executable(ParallelLineDetectionExample ParallelLineDetectionExample.cxx)
-target_link_libraries(ParallelLineDetectionExample ${OTB_LIBRARIES})
-endif()
-
 add_executable(FlusserMomentsImageFunctionExample FlusserMomentsImageFunctionExample.cxx)
 target_link_libraries(FlusserMomentsImageFunctionExample ${OTB_LIBRARIES})
 
@@ -71,12 +59,6 @@ target_link_libraries(PanTexExample ${OTB_LIBRARIES})
 add_executable(RatioLineDetectorExample RatioLineDetectorExample.cxx)
 target_link_libraries(RatioLineDetectorExample ${OTB_LIBRARIES})
 
-add_executable(SeamCarvingExample SeamCarvingExample.cxx)
-target_link_libraries(SeamCarvingExample ${OTB_LIBRARIES})
-
-add_executable(SeamCarvingOtherExample SeamCarvingOtherExample.cxx)
-target_link_libraries(SeamCarvingOtherExample ${OTB_LIBRARIES})
-
 add_executable(SFSExample SFSExample.cxx)
 target_link_libraries(SFSExample ${OTB_LIBRARIES})
 
diff --git a/Examples/FeatureExtraction/ExtractRoadByStepsExample.cxx b/Examples/FeatureExtraction/ExtractRoadByStepsExample.cxx
deleted file mode 100644
index 54891d83c85169c20f0e82311a78b2d4aba5f986..0000000000000000000000000000000000000000
--- a/Examples/FeatureExtraction/ExtractRoadByStepsExample.cxx
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-// This example illustrates the details of the \doxygen{otb}{RoadExtractionFilter}.
-// This filter, described in the previous section,  is a composite filter that includes
-// all the steps below. Individual filters can be replaced to design a road detector
-// targeted at SAR images for example.
-
-#include "otbPolyLineParametricPathWithValue.h"
-#include "otbSpectralAngleDistanceImageFilter.h"
-#include "itkGradientRecursiveGaussianImageFilter.h"
-#include "otbNeighborhoodScalarProductFilter.h"
-#include "otbRemoveIsolatedByDirectionFilter.h"
-#include "otbRemoveWrongDirectionFilter.h"
-#include "otbNonMaxRemovalByDirectionFilter.h"
-#include "otbVectorizationPathListFilter.h"
-#include "otbSimplifyPathListFilter.h"
-#include "otbBreakAngularPathListFilter.h"
-#include "otbRemoveTortuousPathListFilter.h"
-#include "otbLinkPathListFilter.h"
-#include "otbLikelihoodPathListFilter.h"
-#include "otbDrawPathListFilter.h"
-#include "otbLikelihoodPathListFilter.h"
-#include "otbMultiToMonoChannelExtractROI.h"
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkRescaleIntensityImageFilter.h"
-#include "itkSqrtImageFilter.h"
-
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbMultiChannelExtractROI.h"
-#include "otbVectorRescaleIntensityImageFilter.h"
-#include "itkAddImageFilter.h"
-#include "itkSubtractImageFilter.h"
-#include "itkRGBPixel.h"
-#include "itkComposeImageFilter.h"
-#include "itkThresholdImageFilter.h"
-#include "itkSigmoidImageFilter.h"
-#include "itkThresholdImageFilter.h"
-#include "itkBinaryBallStructuringElement.h"
-#include "itkGrayscaleDilateImageFilter.h"
-
-/* Example usage:
-./ExtractRoadByStepsExample Input/qb_RoadExtract.tif Output/ExtractRoadByStepsExampleOutput.jpg Output/qb_ExtractRoad_pretty.jpg 337 557 432 859 0.00005 1.0
-*/
-
-/* Example usage:
-./ExtractRoadByStepsExample Input/qb_RoadExtract2.tif Output/ExtractRoadByStepsExampleOutput2.jpg Output/qb_ExtractRoad_pretty2.jpg 228 316 207 282 0.00005 1.0
-*/
-
-
-int main(int itkNotUsed(argc), char* argv[])
-{
-
-  const unsigned int                                 Dimension = 2;
-  typedef double                                     PixelType;
-  typedef unsigned char                              OutputPixelType;
-  typedef itk::CovariantVector<PixelType, Dimension> VectorPixelType;
-  typedef otb::Image<PixelType, Dimension>           InternalImageType;
-  typedef otb::VectorImage<PixelType, Dimension>     MultiSpectralImageType;
-  typedef otb::Image<VectorPixelType, Dimension>     VectorImageType;
-
-  typedef otb::PolyLineParametricPathWithValue<double, Dimension> PathType;
-
-  typedef otb::ImageFileReader<MultiSpectralImageType> MultispectralReaderType;
-
-  MultispectralReaderType::Pointer multispectralReader = MultispectralReaderType::New();
-  multispectralReader->SetFileName(argv[1]);
-
-  // Create an 3 band image for the software guide
-  typedef otb::VectorImage<OutputPixelType, Dimension>                                          OutputVectorImageType;
-  typedef otb::ImageFileWriter<OutputVectorImageType>                                           VectorWriterType;
-  typedef otb::VectorRescaleIntensityImageFilter<MultiSpectralImageType, OutputVectorImageType> VectorRescalerType;
-  typedef otb::MultiChannelExtractROI<unsigned char, unsigned char>                             ChannelExtractorType;
-
-  // The GenerateOutputInformation() information is required here so
-  // that the number of component per pixel is update and known to set
-  // up the maximum and minimum values for the rescaling filter
-  multispectralReader->GenerateOutputInformation();
-
-  OutputVectorImageType::PixelType minimum, maximum;
-  minimum.SetSize(multispectralReader->GetOutput()->GetNumberOfComponentsPerPixel());
-  maximum.SetSize(multispectralReader->GetOutput()->GetNumberOfComponentsPerPixel());
-  minimum.Fill(0);
-  maximum.Fill(255);
-
-  VectorRescalerType::Pointer vr = VectorRescalerType::New();
-  vr->SetInput(multispectralReader->GetOutput());
-  vr->SetOutputMinimum(minimum);
-  vr->SetOutputMaximum(maximum);
-  vr->SetClampThreshold(0.01);
-
-  ChannelExtractorType::Pointer selecter = ChannelExtractorType::New();
-  selecter->SetInput(vr->GetOutput());
-  selecter->SetExtractionRegion(multispectralReader->GetOutput()->GetLargestPossibleRegion());
-  selecter->SetChannel(3);
-  selecter->SetChannel(2);
-  selecter->SetChannel(1);
-
-  VectorWriterType::Pointer vectWriter = VectorWriterType::New();
-  vectWriter->SetFileName(argv[3]);
-  vectWriter->SetInput(selecter->GetOutput());
-  vectWriter->Update();
-
-  MultiSpectralImageType::PixelType pixelRef;
-  pixelRef.SetSize(4);
-  pixelRef[0] = atoi(argv[4]);
-  pixelRef[1] = atoi(argv[5]);
-  pixelRef[2] = atoi(argv[6]);
-  pixelRef[3] = atoi(argv[7]);
-
-  double resolution = 0.6; // to get directly from metadata
-  double alpha      = atof(argv[9]);
-
-  //  The spectral angle is used to compute a grayscale image from the
-  //  multispectral original image using
-  //  \doxygen{otb}{SpectralAngleDistanceImageFilter}. The spectral
-  //  angle is illustrated on
-  // Figure~\ref{fig:RoadExtractionSpectralAngleDiagram}. Pixels
-  // corresponding to roads are in darker color.
-  //
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.40\textwidth]{RoadExtractionSpectralAngleDiagram.eps}
-  // \itkcaption[Spectral Angle]{Illustration of the spectral angle
-  // for one pixel of a three-band image. One of the vector is the
-  // reference pixel and the other is the current pixel.}
-  // \label{fig:RoadExtractionSpectralAngleDiagram}
-  // \end{figure}
-  //
-  //
-
-  typedef otb::SpectralAngleDistanceImageFilter<MultiSpectralImageType, InternalImageType> SAFilterType;
-  SAFilterType::Pointer                                                                    saFilter = SAFilterType::New();
-  saFilter->SetReferencePixel(pixelRef);
-  saFilter->SetInput(multispectralReader->GetOutput());
-
-  //  A square root is applied to the spectral angle image in order to enhance contrast between
-  //  darker pixels (which are pixels of interest) with \doxygen{itk}{SqrtImageFilter}.
-
-  typedef itk::SqrtImageFilter<InternalImageType, InternalImageType> SqrtFilterType;
-  SqrtFilterType::Pointer                                            sqrtFilter = SqrtFilterType::New();
-  sqrtFilter->SetInput(saFilter->GetOutput());
-
-  //  Use the Gaussian gradient filter compute the gradient in x and y direction
-  // respectively
-  // (\doxygen{itk}{GradientRecursiveGaussianImageFilter}).
-
-  double                                                                                sigma = alpha * (1.2 / resolution + 1);
-  typedef itk::GradientRecursiveGaussianImageFilter<InternalImageType, VectorImageType> GradientFilterType;
-  GradientFilterType::Pointer                                                           gradientFilter = GradientFilterType::New();
-  gradientFilter->SetSigma(sigma);
-  gradientFilter->SetInput(sqrtFilter->GetOutput());
-
-  //  Compute the scalar product of the neighboring pixels and keep the
-  //  minimum value and the direction with \doxygen{otb}{NeighborhoodScalarProductFilter}.
-  // This is the line detector described
-  //  in \cite{Lacroix1998}.
-
-  typedef otb::NeighborhoodScalarProductFilter<VectorImageType, InternalImageType, InternalImageType> NeighborhoodScalarProductType;
-  NeighborhoodScalarProductType::Pointer                                                              scalarFilter = NeighborhoodScalarProductType::New();
-  scalarFilter->SetInput(gradientFilter->GetOutput());
-
-  //  The resulting image is passed to the \doxygen{otb}{RemoveIsolatedByDirectionFilter}
-  // filter to remove pixels
-  //  with no neighbor having the same direction.
-
-  typedef otb::RemoveIsolatedByDirectionFilter<InternalImageType, InternalImageType, InternalImageType> RemoveIsolatedByDirectionType;
-  RemoveIsolatedByDirectionType::Pointer removeIsolatedByDirectionFilter = RemoveIsolatedByDirectionType::New();
-  removeIsolatedByDirectionFilter->SetInput(scalarFilter->GetOutput());
-  removeIsolatedByDirectionFilter->SetInputDirection(scalarFilter->GetOutputDirection());
-
-  //  We remove pixels having a direction corresponding to bright lines
-  //  as we know that after the spectral angle, roads are in darker color
-  //  with the \doxygen{otb}{RemoveWrongDirectionFilter} filter.
-
-  typedef otb::RemoveWrongDirectionFilter<InternalImageType, InternalImageType, InternalImageType> RemoveWrongDirectionType;
-  RemoveWrongDirectionType::Pointer                                                                removeWrongDirectionFilter = RemoveWrongDirectionType::New();
-  removeWrongDirectionFilter->SetInput(removeIsolatedByDirectionFilter->GetOutput());
-  removeWrongDirectionFilter->SetInputDirection(scalarFilter->GetOutputDirection());
-
-  //  We remove pixels which are not maximum on the direction
-  //  perpendicular to the road direction with the \doxygen{otb}{NonMaxRemovalByDirectionFilter}.
-
-  typedef otb::NonMaxRemovalByDirectionFilter<InternalImageType, InternalImageType, InternalImageType> NonMaxRemovalByDirectionType;
-  NonMaxRemovalByDirectionType::Pointer nonMaxRemovalByDirectionFilter = NonMaxRemovalByDirectionType::New();
-  nonMaxRemovalByDirectionFilter->SetInput(removeWrongDirectionFilter->GetOutput());
-  nonMaxRemovalByDirectionFilter->SetInputDirection(scalarFilter->GetOutputDirection());
-
-  //  Extracted road are vectorized into polylines with \doxygen{otb}{VectorizationPathListFilter}.
-
-  typedef otb::VectorizationPathListFilter<InternalImageType, InternalImageType, PathType> VectorizationFilterType;
-  VectorizationFilterType::Pointer                                                         vectorizationFilter = VectorizationFilterType::New();
-  vectorizationFilter->SetInput(nonMaxRemovalByDirectionFilter->GetOutput());
-  vectorizationFilter->SetInputDirection(scalarFilter->GetOutputDirection());
-  vectorizationFilter->SetAmplitudeThreshold(atof(argv[8]));
-
-  //  However, this vectorization is too simple and need to be refined
-  //  to be usable. First, we remove all aligned points to make one segment with
-  // \doxygen{otb}{SimplifyPathListFilter}.
-  //  Then we break the polylines which have sharp angles as they are probably
-  //  not road with \doxygen{otb}{BreakAngularPathListFilter}.
-  // Finally we remove path which are too short with \doxygen{otb}{RemoveTortuousPathListFilter}.
-
-  typedef otb::SimplifyPathListFilter<PathType> SimplifyPathType;
-  SimplifyPathType::Pointer                     simplifyPathListFilter = SimplifyPathType::New();
-  simplifyPathListFilter->GetFunctor().SetTolerance(1.0);
-  simplifyPathListFilter->SetInput(vectorizationFilter->GetOutput());
-
-  typedef otb::BreakAngularPathListFilter<PathType> BreakAngularPathType;
-  BreakAngularPathType::Pointer                     breakAngularPathListFilter = BreakAngularPathType::New();
-  breakAngularPathListFilter->SetMaxAngle(otb::CONST_PI / 8.);
-  breakAngularPathListFilter->SetInput(simplifyPathListFilter->GetOutput());
-
-  typedef otb::RemoveTortuousPathListFilter<PathType> RemoveTortuousPathType;
-  RemoveTortuousPathType::Pointer                     removeTortuousPathListFilter = RemoveTortuousPathType::New();
-  removeTortuousPathListFilter->GetFunctor().SetThreshold(1.0);
-  removeTortuousPathListFilter->SetInput(breakAngularPathListFilter->GetOutput());
-
-  //  Polylines within a certain range are linked (\doxygen{otb}{LinkPathListFilter}) to
-  //  try to fill gaps due to occultations by vehicules, trees, etc. before simplifying
-  //  polylines (\doxygen{otb}{SimplifyPathListFilter}) and
-  //  removing the shortest ones with \doxygen{otb}{RemoveTortuousPathListFilter}.
-
-  typedef otb::LinkPathListFilter<PathType> LinkPathType;
-  LinkPathType::Pointer                     linkPathListFilter = LinkPathType::New();
-  linkPathListFilter->SetDistanceThreshold(25.0 / resolution);
-  linkPathListFilter->SetAngularThreshold(otb::CONST_PI / 8);
-  linkPathListFilter->SetInput(removeTortuousPathListFilter->GetOutput());
-
-  SimplifyPathType::Pointer simplifyPathListFilter2 = SimplifyPathType::New();
-  simplifyPathListFilter2->GetFunctor().SetTolerance(1.0);
-  simplifyPathListFilter2->SetInput(linkPathListFilter->GetOutput());
-
-  RemoveTortuousPathType::Pointer removeTortuousPathListFilter2 = RemoveTortuousPathType::New();
-  removeTortuousPathListFilter2->GetFunctor().SetThreshold(10.0);
-  removeTortuousPathListFilter2->SetInput(simplifyPathListFilter2->GetOutput());
-
-  //  A value can be associated with each polyline according to pixel values
-  // under the polyline with \doxygen{otb}{LikelihoodPathListFilter}. A higher value
-  // will mean a higher Likelihood to be a road.
-
-  typedef otb::LikelihoodPathListFilter<PathType, InternalImageType> PathListToPathListWithValueType;
-  PathListToPathListWithValueType::Pointer                           pathListConverter = PathListToPathListWithValueType::New();
-  pathListConverter->SetInput(removeTortuousPathListFilter2->GetOutput());
-  pathListConverter->SetInputImage(nonMaxRemovalByDirectionFilter->GetOutput());
-
-  // A black background image is built to draw the path on.
-
-  InternalImageType::Pointer output = InternalImageType::New();
-  output->CopyInformation(multispectralReader->GetOutput());
-  output->SetRegions(output->GetLargestPossibleRegion());
-  output->Allocate();
-  output->FillBuffer(0.0);
-
-  // Polylines are drawn on a black background image with \doxygen{otb}{DrawPathListFilter}.
-  // The \code{SetUseIternalValues()} tell the drawing filter to draw the path with its Likelihood
-  // value.
-
-  typedef otb::DrawPathListFilter<InternalImageType, PathType, InternalImageType> DrawPathType;
-  DrawPathType::Pointer                                                           drawPathListFilter = DrawPathType::New();
-  drawPathListFilter->SetInput(output);
-  drawPathListFilter->SetInputPath(pathListConverter->GetOutput());
-  drawPathListFilter->SetUseInternalPathValue(true);
-
-  // The output from the drawing filter contains very small values (Likelihood values). Therefore
-  // the image has to be rescaled to be viewed. The whole pipeline is executed by invoking
-  // the \code{Update()} method on this last filter.
-
-  typedef itk::RescaleIntensityImageFilter<InternalImageType, InternalImageType> RescalerType;
-  RescalerType::Pointer                                                          rescaler = RescalerType::New();
-  rescaler->SetOutputMaximum(255);
-  rescaler->SetOutputMinimum(0);
-  rescaler->SetInput(drawPathListFilter->GetOutput());
-  rescaler->Update();
-
-  // this small piece of code aims at producing a pretty RGB png result image.
-  typedef otb::MultiToMonoChannelExtractROI<OutputPixelType, PixelType>                                 ChannelExtractionFilterType;
-  typedef itk::AddImageFilter<InternalImageType, InternalImageType, InternalImageType>                  AddFilterType;
-  typedef itk::SubtractImageFilter<InternalImageType, InternalImageType, InternalImageType>             SubtractFilterType;
-  typedef itk::ThresholdImageFilter<InternalImageType>                                                  ThresholdFilterType;
-  typedef itk::RGBPixel<OutputPixelType>                                                                RGBPixelType;
-  typedef otb::Image<RGBPixelType, Dimension>                                                           RGBImageType;
-  typedef itk::ComposeImageFilter<InternalImageType, RGBImageType>                                      ComposeFilterType;
-  typedef otb::ImageFileWriter<RGBImageType>                                                            RGBWriterType;
-  typedef itk::BinaryBallStructuringElement<PixelType, Dimension>                                       StructuringElementType;
-  typedef itk::GrayscaleDilateImageFilter<InternalImageType, InternalImageType, StructuringElementType> DilateFilterType;
-
-  StructuringElementType se;
-  se.SetRadius(1);
-  se.CreateStructuringElement();
-
-  // Filters definitions
-  ChannelExtractionFilterType::Pointer channelExtractor1 = ChannelExtractionFilterType::New();
-  ChannelExtractionFilterType::Pointer channelExtractor2 = ChannelExtractionFilterType::New();
-  ChannelExtractionFilterType::Pointer channelExtractor3 = ChannelExtractionFilterType::New();
-
-  AddFilterType::Pointer       addFilter   = AddFilterType::New();
-  SubtractFilterType::Pointer  subtract2   = SubtractFilterType::New();
-  SubtractFilterType::Pointer  subtract3   = SubtractFilterType::New();
-  ThresholdFilterType::Pointer threshold11 = ThresholdFilterType::New();
-  ThresholdFilterType::Pointer threshold21 = ThresholdFilterType::New();
-  ThresholdFilterType::Pointer threshold31 = ThresholdFilterType::New();
-  ThresholdFilterType::Pointer threshold12 = ThresholdFilterType::New();
-  ThresholdFilterType::Pointer threshold22 = ThresholdFilterType::New();
-  ThresholdFilterType::Pointer threshold32 = ThresholdFilterType::New();
-
-  ComposeFilterType::Pointer composer = ComposeFilterType::New();
-  RGBWriterType::Pointer     writer   = RGBWriterType::New();
-
-  DilateFilterType::Pointer dilater = DilateFilterType::New();
-
-  dilater->SetInput(rescaler->GetOutput());
-  dilater->SetKernel(se);
-
-  // Extract each channel
-  channelExtractor1->SetInput(vr->GetOutput());
-  channelExtractor2->SetInput(vr->GetOutput());
-  channelExtractor3->SetInput(vr->GetOutput());
-
-  channelExtractor1->SetChannel(3);
-  channelExtractor2->SetChannel(2);
-  channelExtractor3->SetChannel(1);
-
-  // Add the path to the red component
-  addFilter->SetInput1(channelExtractor1->GetOutput());
-  addFilter->SetInput2(dilater->GetOutput());
-
-  subtract2->SetInput1(channelExtractor2->GetOutput());
-  subtract2->SetInput2(dilater->GetOutput());
-  subtract3->SetInput1(channelExtractor3->GetOutput());
-  subtract3->SetInput2(dilater->GetOutput());
-
-  // Threshold outside the [0, 255] range
-
-  threshold11->SetInput(addFilter->GetOutput());
-  threshold11->ThresholdBelow(0);
-  threshold11->SetOutsideValue(0);
-  threshold12->SetInput(threshold11->GetOutput());
-  threshold12->ThresholdAbove(255);
-  threshold12->SetOutsideValue(255);
-
-  threshold21->SetInput(subtract2->GetOutput());
-  threshold21->ThresholdBelow(0);
-  threshold21->SetOutsideValue(0);
-  threshold22->SetInput(threshold21->GetOutput());
-  threshold22->ThresholdAbove(255);
-  threshold22->SetOutsideValue(255);
-
-  threshold31->SetInput(subtract3->GetOutput());
-  threshold31->ThresholdBelow(0);
-  threshold31->SetOutsideValue(0);
-  threshold32->SetInput(threshold31->GetOutput());
-  threshold32->ThresholdAbove(255);
-  threshold32->SetOutsideValue(255);
-
-  // Compose the output image
-  composer->SetInput(0, threshold12->GetOutput());
-  composer->SetInput(1, threshold22->GetOutput());
-  composer->SetInput(2, threshold32->GetOutput());
-
-  // Write the new rgb image
-  writer->SetInput(composer->GetOutput());
-  writer->SetFileName(argv[2]);
-  writer->Update();
-
-  // Figures~\ref{fig:ROADEXTRACTIONBYSTEPS} and \ref{fig:ROADEXTRACTIONBYSTEPS2}
-  // show the result of applying
-  // the road extraction by steps to a fusionned Quickbird image. The result image
-  // is a RGB composition showing the extracted path in red. Full processing took
-  // about 3 seconds for each image.
-  //
-  // \begin{figure}[htbp]
-  // \center
-  // \includegraphics[width=0.44\textwidth]{qb_ExtractRoad_pretty.eps}
-  // \includegraphics[width=0.44\textwidth]{ExtractRoadByStepsExampleOutput.eps}
-  // \itkcaption[Road extraction filter application]{Result of applying
-  // the road extraction by steps pipeline to a fusionned Quickbird
-  // image. From left to right : original image, extracted road with their
-  // Likelihood values.}
-  // \label{fig:ROADEXTRACTIONBYSTEPS}
-  // \end{figure}
-  //
-  // \begin{figure}[htbp]
-  // \center
-  // \includegraphics[width=0.44\textwidth]{qb_ExtractRoad_pretty2.eps}
-  // \includegraphics[width=0.44\textwidth]{ExtractRoadByStepsExampleOutput2.eps}
-  // \itkcaption[Road extraction filter application]{Result of applying
-  // the road extraction by steps pipeline to a fusionned Quickbird
-  // image. From left to right : original image, extracted road with their
-  // Likelihood values.}
-  // \label{fig:ROADEXTRACTIONBYSTEPS2}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
-}
diff --git a/Examples/FeatureExtraction/ExtractRoadExample.cxx b/Examples/FeatureExtraction/ExtractRoadExample.cxx
deleted file mode 100644
index 94c4361e0d20c29ea24a6461e2248374e7047524..0000000000000000000000000000000000000000
--- a/Examples/FeatureExtraction/ExtractRoadExample.cxx
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-/* Example usage:
-./ExtractRoadExample Input/qb_RoadExtract.tif Output/ExtractRoadOutput.png 337 557 432 859 1.0 0.00005 1.0 0.39269 1.0 10.0 25.
-*/
-
-
-// The easiest way to use the road extraction filter provided by OTB is to use the composite
-// filter. If a modification in the pipeline is required to adapt to a particular situation,
-// the step by step example, described in the next section can be adapted.
-//
-// This example demonstrates the use of the \doxygen{otb}{RoadExtractionFilter}.
-// This filter is a composite filter achieving road extraction according to the algorithm
-// adapted by E. Christophe and J. Inglada \cite{Christophe2007} from an original method
-// proposed in \cite{Lacroix1998}.
-//
-// The first step toward the use of this filter is the inclusion of the proper header files.
-
-#include "otbPolyLineParametricPathWithValue.h"
-#include "otbRoadExtractionFilter.h"
-#include "otbDrawPathListFilter.h"
-
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "itkRescaleIntensityImageFilter.h"
-#include "otbMath.h"
-
-#include "itkInvertIntensityImageFilter.h"
-#include "itkGrayscaleDilateImageFilter.h"
-#include "itkBinaryBallStructuringElement.h"
-
-int main(int argc, char* argv[])
-{
-
-  if (argc != 14)
-  {
-    std::cerr << "Usage: " << argv[0];
-    std::cerr << " inputFileName outputFileName firstPixelComponent secondPixelComponent ";
-    std::cerr << "thirdPixelComponent fourthPixelComponent alpha amplitudeThrehsold tolerance ";
-    std::cerr << "angularThreshold-maxAngle firstMeanDistanceThreshold secondMeanDistanceThreshold ";
-    std::cerr << "distanceThreshold" << std::endl;
-    return EXIT_FAILURE;
-  }
-
-  const unsigned int Dimension = 2;
-  // Then we must decide what pixel type to use for the image. We choose to do
-  // all the computation in floating point precision and rescale the results
-  // between 0 and 255 in order to export PNG images.
-
-  typedef double        InputPixelType;
-  typedef unsigned char OutputPixelType;
-
-  //  The images are defined using the pixel type and the dimension. Please note that
-  //  the \doxygen{otb}{RoadExtractionFilter} needs an \doxygen{otb}{VectorImage} as input
-  //  to handle multispectral images.
-
-  typedef otb::VectorImage<InputPixelType, Dimension> InputVectorImageType;
-  typedef otb::Image<InputPixelType, Dimension>       InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension>      OutputImageType;
-
-  // We define the type of the polyline that the filter produces. We use the
-  // \doxygen{otb}{PolyLineParametricPathWithValue}, which allows the filter to produce
-  // a likehood value along with each polyline. The filter is able to produce
-  // \doxygen{itk}{PolyLineParametricPath} as well.
-
-  typedef otb::PolyLineParametricPathWithValue<InputPixelType, Dimension> PathType;
-
-  // Now we can define the \doxygen{otb}{RoadExtractionFilter} that takes a multi-spectral
-  // image as input and produces a list of polylines.
-
-  typedef otb::RoadExtractionFilter<InputVectorImageType, PathType> RoadExtractionFilterType;
-
-  // We also define an \doxygen{otb}{DrawPathListFilter} to draw the output
-  // polylines on an image, taking their likehood values into account.
-
-  typedef otb::DrawPathListFilter<InputImageType, PathType, InputImageType> DrawPathFilterType;
-
-  // The intensity rescaling of the results will be carried out by the
-  // \doxygen{itk}{RescaleIntensityImageFilter} which is templated by the
-  // input and output image types.
-
-  typedef itk::RescaleIntensityImageFilter<InputImageType, OutputImageType> RescalerType;
-
-  //  An \doxygen{otb}{ImageFileReader} class is also instantiated in order to read
-  //  image data from a file. Then, an \doxygen{otb}{ImageFileWriter}
-  //  is instantiated in order to write the output image to a file.
-
-  typedef otb::ImageFileReader<InputVectorImageType> ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType>      WriterType;
-
-  // The different filters composing our pipeline are created by invoking their
-  // \code{New()} methods, assigning the results to smart pointers.
-
-  ReaderType::Pointer               reader               = ReaderType::New();
-  RoadExtractionFilterType::Pointer roadExtractionFilter = RoadExtractionFilterType::New();
-  DrawPathFilterType::Pointer       drawingFilter        = DrawPathFilterType::New();
-  RescalerType::Pointer             rescaleFilter        = RescalerType::New();
-  WriterType::Pointer               writer               = WriterType::New();
-
-  reader->SetFileName(argv[1]);
-
-  // The \doxygen{otb}{RoadExtractionFilter} needs to have a reference pixel
-  // corresponding to the spectral content likely to represent a road. This is done
-  // by passing a pixel to the filter. Here we suppose that the input image
-  // has four spectral bands.
-
-  InputVectorImageType::PixelType ReferencePixel;
-  ReferencePixel.SetSize(4);
-  ReferencePixel.SetElement(0, ::atof(argv[3]));
-  ReferencePixel.SetElement(1, ::atof(argv[4]));
-  ReferencePixel.SetElement(2, ::atof(argv[5]));
-  ReferencePixel.SetElement(3, ::atof(argv[6]));
-  roadExtractionFilter->SetReferencePixel(ReferencePixel);
-
-  // We must also set the  alpha parameter of the filter which allows us to tune the width of the roads
-  // we want to extract. Typical value is $1.0$ and should be working in most situations.
-
-  roadExtractionFilter->SetAlpha(atof(argv[7]));
-
-  // All other parameter should not influence the results too much in most situation and can
-  // be kept at the default value.
-  //
-  // The amplitude threshold parameter tunes the sensitivity of the vectorization step. A typical
-  // value is $5 \cdot 10^{-5}$.
-
-  roadExtractionFilter->SetAmplitudeThreshold(atof(argv[8]));
-
-  // The tolerance threshold tunes the sensitivity of the path simplification step.
-  // Typical value is $1.0$.
-
-  roadExtractionFilter->SetTolerance(atof(argv[9]));
-
-  // Roads are not likely to have sharp turns. Therefore we set the max angle parameter,
-  // as well as the link angular threshold. The value is typically $\frac{\pi}{8}$.
-
-  roadExtractionFilter->SetMaxAngle(atof(argv[10]));
-  roadExtractionFilter->SetAngularThreshold(atof(argv[10]));
-
-  // The \doxygen{otb}{RoadExtractionFilter} performs two odd path removing operations at different stage of
-  // its execution. The first mean distance threshold and the second mean distance threshold set their criterion
-  // for removal. Path are removed if their mean distance between nodes is to small, since such path coming
-  // from previous filters are likely to be tortuous. The first removal operation as a typical mean distance
-  // threshold parameter of $1.0$, and the second of $10.0$.
-
-  roadExtractionFilter->SetFirstMeanDistanceThreshold(atof(argv[11]));
-  roadExtractionFilter->SetSecondMeanDistanceThreshold(atof(argv[12]));
-
-  // The \doxygen{otb}{RoadExtractionFilter} is able to link path whose ends are near
-  // according to an euclidean distance criterion. The threshold for this distance
-  // to link a path is the distance threshold parameter. A typical value is $25$.
-
-  roadExtractionFilter->SetDistanceThreshold(atof(argv[13]));
-
-  // We will now create a black background image to draw the resulting polyline on.
-  // To achieve this we need to know the size of our input image. Therefore we trigger the
-  // \code{GenerateOutputInformation()} of the reader.
-
-  reader->GenerateOutputInformation();
-  InputImageType::Pointer blackBackground = InputImageType::New();
-  blackBackground->CopyInformation(reader->GetOutput());
-  blackBackground->SetRegions(blackBackground->GetLargestPossibleRegion());
-  blackBackground->Allocate();
-  blackBackground->FillBuffer(0);
-
-  // We tell the \doxygen{otb}{DrawPathListFilter} to try to use the likehood value
-  // embedded within the polyline as a value for drawing this polyline if possible.
-
-  drawingFilter->UseInternalPathValueOn();
-
-  //  The \code{itk::RescaleIntensityImageFilter} needs to know which
-  //  is the minimum and maximum values of the output generated
-  //  image. Those can be chosen in a generic way by using the
-  //  \code{NumericTraits} functions, since they are templated over
-  //  the pixel type.
-
-  rescaleFilter->SetOutputMinimum(itk::NumericTraits<OutputPixelType>::min());
-  rescaleFilter->SetOutputMaximum(itk::NumericTraits<OutputPixelType>::max());
-
-  // Now it is time for some pipeline wiring.
-
-  roadExtractionFilter->SetInput(reader->GetOutput());
-  drawingFilter->SetInput(blackBackground);
-  drawingFilter->SetInputPath(roadExtractionFilter->GetOutput());
-  rescaleFilter->SetInput(drawingFilter->GetOutput());
-
-  // The update of the pipeline is triggered by the \code{Update()} method
-  // of the rescale intensity filter.
-
-  rescaleFilter->Update();
-
-  // output image enhancement
-  typedef itk::BinaryBallStructuringElement<OutputPixelType, Dimension>                             StructuringElementType;
-  typedef itk::GrayscaleDilateImageFilter<OutputImageType, OutputImageType, StructuringElementType> DilateFilterType;
-  typedef itk::InvertIntensityImageFilter<OutputImageType, OutputImageType>                         InvertFilterType;
-
-  StructuringElementType se;
-  se.SetRadius(1);
-  se.CreateStructuringElement();
-
-  DilateFilterType::Pointer dilater = DilateFilterType::New();
-
-  dilater->SetInput(rescaleFilter->GetOutput());
-  dilater->SetKernel(se);
-
-  InvertFilterType::Pointer invertFilter = InvertFilterType::New();
-  invertFilter->SetInput(dilater->GetOutput());
-
-  writer->SetFileName(argv[2]);
-  writer->SetInput(invertFilter->GetOutput());
-  writer->Update();
-
-  // Figure~\ref{fig:ROADEXTRACTION_FILTER} shows the result of applying
-  // the road extraction filter to a fusionned Quickbird image.
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{qb_ExtractRoad_pretty.eps}
-  // \includegraphics[width=0.44\textwidth]{ExtractRoadOutput.eps}
-  // \itkcaption[Road extraction filter application]{Result of applying
-  // the \doxygen{otb}{RoadExtractionFilter} to a fusionned Quickbird
-  // image. From left to right : original image, extracted road with their
-  // likehood values (color are inverted for display).}
-  // \label{fig:ROADEXTRACTION_FILTER}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
-}
diff --git a/Examples/FeatureExtraction/HarrisExample.cxx b/Examples/FeatureExtraction/HarrisExample.cxx
index 62cc413105b759a9e7b22a0b26c95e0d051af1ff..cde2e254a38da5c1a3523b52918909e5ea6a8e43 100644
--- a/Examples/FeatureExtraction/HarrisExample.cxx
+++ b/Examples/FeatureExtraction/HarrisExample.cxx
@@ -19,7 +19,7 @@
  */
 
 
-#include "itkMacro.h"
+#include "otbMacro.h"
 #include "otbImage.h"
 
 #include "otbImageFileReader.h"
@@ -166,7 +166,7 @@ int main(int argc, char* argv[])
   {
     typedef OutputPointSetType::PointType OutputPointType;
     OutputPointType                       pCoordinate = (itList.Value());
-    std::cout << pCoordinate << std::endl;
+    otbLogMacro(Debug, << pCoordinate);
     ++itList;
   }
 
diff --git a/Examples/FeatureExtraction/ParallelLineDetectionExample.cxx b/Examples/FeatureExtraction/ParallelLineDetectionExample.cxx
deleted file mode 100644
index 305fd72b5ade098bd0ec217ee49a71b41c3211e6..0000000000000000000000000000000000000000
--- a/Examples/FeatureExtraction/ParallelLineDetectionExample.cxx
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-/* Example usage:
-./ParallelLineDetectionExample Output/Lines.png Output/ParallelLines.png 20 2 10
-*/
-
-
-// This example illustrates the details of the \doxygen{otb}{ParallelLinePathListFilter}.
-//
-
-#include "itkPolyLineParametricPath.h"
-#include "otbDrawPathListFilter.h"
-
-#include "otbParallelLinePathListFilter.h"
-
-#include "otbImage.h"
-#include "otbImageFileWriter.h"
-
-int main(int argc, char* argv[])
-{
-  if (argc != 6)
-  {
-    std::cerr << "Usage: " << std::endl;
-    std::cerr << argv[0] << " outputImage ";
-    std::cerr << " outputParallelLineImage ";
-    std::cerr << " distThreshParallel angThreshParallel commonDistThreshParallel" << std::endl;
-    return EXIT_FAILURE;
-  }
-
-  double distThreshParallel       = atof(argv[3]);
-  double angThreshParallel        = atof(argv[4]);
-  double commonDistThreshParallel = atof(argv[5]);
-
-  // We start by creating an empty image
-  const unsigned int    Dimension = 2;
-  typedef unsigned char PixelType;
-
-  typedef otb::Image<PixelType, Dimension> ImageType;
-
-  ImageType::Pointer image = ImageType::New();
-
-  ImageType::IndexType start;
-
-  start[0] = 0;
-  start[1] = 0;
-
-  ImageType::SizeType size;
-  size[0] = 600;
-  size[1] = 300;
-
-  ImageType::RegionType region;
-
-  region.SetSize(size);
-  region.SetIndex(start);
-  image->SetRegions(region);
-  image->Allocate();
-  image->FillBuffer(itk::NumericTraits<PixelType>::Zero);
-
-  // We create some lines
-  typedef itk::PolyLineParametricPath<Dimension> PathType;
-  typedef otb::ObjectList<PathType>              PathListType;
-
-  PathListType::Pointer lineList = PathListType::New();
-
-  typedef PathType::ContinuousIndexType ContinuousIndexType;
-  ContinuousIndexType                   cindex;
-
-  /*-----*/
-  PathType::Pointer aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 1;
-  cindex[1] = 41;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 175;
-  cindex[1] = 204;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-
-  /*-----*/
-  aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 60;
-  cindex[1] = 18;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 203;
-  cindex[1] = 164;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-
-  /*-----*/
-  aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 174;
-  cindex[1] = 99;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 281;
-  cindex[1] = 1;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-
-  /*-----*/
-  aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 3;
-  cindex[1] = 233;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 191;
-  cindex[1] = 227;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-
-  /*-----*/
-  aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 254;
-  cindex[1] = 279;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 351;
-  cindex[1] = 110;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-
-  /*-----*/
-  aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 270;
-  cindex[1] = 287;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 368;
-  cindex[1] = 120;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-
-  /*-----*/
-  aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 355;
-  cindex[1] = 204;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 528;
-  cindex[1] = 199;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-
-  /*-----*/
-  aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 437;
-  cindex[1] = 243;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 591;
-  cindex[1] = 237;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-
-  // Polylines are drawn on a black
-  typedef otb::DrawPathListFilter<ImageType, PathType, ImageType> DrawPathType;
-  DrawPathType::Pointer                                           drawPathListFilter = DrawPathType::New();
-  drawPathListFilter->SetInput(image);
-  drawPathListFilter->SetInputPath(lineList);
-  drawPathListFilter->SetPathValue(itk::NumericTraits<PixelType>::max());
-
-  typedef otb::ImageFileWriter<ImageType> WriterType;
-  WriterType::Pointer                     writer = WriterType::New();
-  writer->SetInput(drawPathListFilter->GetOutput());
-  writer->SetFileName(argv[1]);
-  writer->Update();
-
-  // Parallel lines are detected. A minimum common length, an angular
-  // threshold and a maximum distance threshold have to specified.
-  // The input is a pathList of the previously extracted line segments.
-  typedef otb::ParallelLinePathListFilter<PathType> ParallelLinePathType;
-  ParallelLinePathType::Pointer                     parallelLinePathListFilter = ParallelLinePathType::New();
-  parallelLinePathListFilter->SetDistanceThreshold(distThreshParallel);
-  parallelLinePathListFilter->SetAngularThreshold(angThreshParallel);
-  parallelLinePathListFilter->SetCommonDistanceThreshold(commonDistThreshParallel);
-  parallelLinePathListFilter->SetInput(lineList);
-  parallelLinePathListFilter->Update();
-
-  // A black background image is built to draw the path on.
-  ImageType::Pointer outputParallel = ImageType::New();
-  outputParallel->SetRegions(image->GetLargestPossibleRegion());
-  outputParallel->Allocate();
-  outputParallel->FillBuffer(itk::NumericTraits<PixelType>::Zero);
-
-  // Parallel lines are drawn on a black background image with \doxygen{otb}{DrawPathListFilter}.
-  // The \code{SetUseIternalValues()} tells the drawing filter to draw the path with its likelihood
-  // value.
-  // typedef otb::DrawPathListFilter<ImageType, PathType, ImageType> DrawPathType;
-  DrawPathType::Pointer drawPathListFilterParallel = DrawPathType::New();
-  drawPathListFilterParallel->SetInput(outputParallel);
-  drawPathListFilterParallel->SetInputPath(parallelLinePathListFilter->GetOutput());
-  drawPathListFilter->SetPathValue(itk::NumericTraits<PixelType>::max());
-  drawPathListFilterParallel->SetUseInternalPathValue(false);
-
-  // Write the Line image
-  WriterType::Pointer writerParallel = WriterType::New();
-  writerParallel->SetInput(drawPathListFilterParallel->GetOutput());
-  writerParallel->SetFileName(argv[2]);
-  writerParallel->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Examples/FeatureExtraction/SeamCarvingExample.cxx b/Examples/FeatureExtraction/SeamCarvingExample.cxx
deleted file mode 100644
index 854872a1b56ec802b03b13569154f4e1c2df596b..0000000000000000000000000000000000000000
--- a/Examples/FeatureExtraction/SeamCarvingExample.cxx
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-// 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}.
-//
-// 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.
-
-/* Example usage:
-./SeamCarvingExample Input/QB_Suburb.png Output/SeamCarvingExampleOutput.png 50
-*/
-
-
-#include "otbImage.h"
-#include "itkPolyLineParametricPath.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkGradientMagnitudeImageFilter.h"
-#include "itkRescaleIntensityImageFilter.h"
-
-#include "otbDrawPathFilter.h"
-#include "otbImageToCarvingPathFilter.h"
-#include "otbRemoveCarvingPathFilter.h"
-
-#include "itkImageDuplicator.h"
-
-int main(int itkNotUsed(argc), char* argv[])
-{
-
-  typedef float         InputPixelType;
-  typedef unsigned char OutputPixelType;
-  const unsigned int    Dimension = 2;
-
-  typedef otb::Image<InputPixelType, Dimension>  ImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-  typedef itk::PolyLineParametricPath<Dimension> PathType;
-
-  typedef otb::ImageFileReader<ImageType>                              ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType>                        WriterType;
-  typedef itk::RescaleIntensityImageFilter<ImageType, OutputImageType> RescalerType;
-
-  ReaderType::Pointer   reader   = ReaderType::New();
-  WriterType::Pointer   writer   = WriterType::New();
-  RescalerType::Pointer rescaler = RescalerType::New();
-
-  const char* filenamereader = argv[1];
-  reader->SetFileName(filenamereader);
-
-  const char* filenamewriter = argv[2];
-  writer->SetFileName(filenamewriter);
-
-  int iteration = atoi(argv[3]);
-
-  // Energy is computed according to the gradient of the image, thus an
-  // \doxygen{itk}{GradientMagnitudeImageFilter} is instantiated
-
-  typedef itk::GradientMagnitudeImageFilter<ImageType, ImageType> GradientType;
-  GradientType::Pointer                                           gradient = GradientType::New();
-
-  // 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.
-
-  typedef otb::ImageToCarvingPathFilter<ImageType, PathType> CarvingFilterType;
-  CarvingFilterType::Pointer                                 carvingFilterVert = CarvingFilterType::New();
-  CarvingFilterType::Pointer                                 carvingFilterHor  = CarvingFilterType::New();
-
-  // The \doxygen{otb}{RemoveCarvingPathFilter} will really resize the image
-  // deleting the path.
-
-  typedef otb::RemoveCarvingPathFilter<ImageType, PathType, ImageType> RemoveCarvingPathFilterType;
-  RemoveCarvingPathFilterType::Pointer                                 removeCarvingPath = RemoveCarvingPathFilterType::New();
-
-  // 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}
-
-  typedef itk::ImageDuplicator<ImageType> duplicatorType;
-  duplicatorType::Pointer                 duplicator = duplicatorType::New();
-
-  // Now that all elements have been instantiated, we start to plug the pipeline
-  // and to define the loop.
-
-  reader->Update();
-  duplicator->SetInputImage(reader->GetOutput());
-  duplicator->Update();
-
-  double energyVert, energyHor;
-
-  for (int i = 0; i < iteration; ++i)
-  {
-
-    gradient->SetInput(duplicator->GetOutput());
-
-    // 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.
-
-    carvingFilterVert->SetInput(gradient->GetOutput());
-    carvingFilterVert->SetDirection(0);
-    carvingFilterVert->UpdateLargestPossibleRegion();
-    energyVert = carvingFilterVert->GetEnergyPerPix();
-
-    carvingFilterHor->SetInput(gradient->GetOutput());
-    carvingFilterHor->SetDirection(1);
-    carvingFilterHor->UpdateLargestPossibleRegion();
-    energyHor = carvingFilterHor->GetEnergyPerPix();
-
-    // The vertical or the horizontal seam with the minimal energy is chosen.
-
-    if (energyVert < energyHor)
-    {
-      removeCarvingPath->SetInput(duplicator->GetOutput());
-      removeCarvingPath->SetInputPath(carvingFilterVert->GetOutput());
-      removeCarvingPath->SetDirection(0);
-      removeCarvingPath->UpdateLargestPossibleRegion();
-    }
-    else
-    {
-      removeCarvingPath->SetInput(duplicator->GetOutput());
-      removeCarvingPath->SetInputPath(carvingFilterHor->GetOutput());
-      removeCarvingPath->SetDirection(1);
-      removeCarvingPath->UpdateLargestPossibleRegion();
-    }
-
-    // The duplicator filter keep the results for the next loop
-
-    duplicator->SetInputImage(removeCarvingPath->GetOutput());
-    duplicator->Update();
-  }
-
-  // Finally, the resulting image is saved on an image file as usual
-
-  rescaler->SetInput(duplicator->GetOutput());
-  writer->SetInput(rescaler->GetOutput());
-  writer->Update();
-
-  // Figure~\ref{fig:SEAMCARVING_FILTER} shows the result of applying
-  // the seam carving filter to a satellite image.
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{QB_Suburb.eps}
-  // \includegraphics[width=0.38\textwidth]{SeamCarvingExampleOutput.eps}
-  // \itkcaption[Seam carving filter application]{Result of applying
-  // the \doxygen{otb}{ImageToCarvingPathFilter} followed by the
-  // \doxygen{otb}{RemoveCarvingPathFilter} to Quickbird
-  // image. From left to right : original image, reduced image removing the 50
-  // seams with the lowest energy.}
-  // \label{fig:SEAMCARVING_FILTER}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
-}
diff --git a/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx b/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx
deleted file mode 100644
index f8ac6e4e1b794f09b246ba2105d9dff9333d823b..0000000000000000000000000000000000000000
--- a/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-// This example illustrates the use of the \doxygen{otb}{AddCarvingPathFilter},
-// the opposite of the \doxygen{otb}{RemoveCarvingPathFilter}.
-//
-// Here, we use this filter combined with the \doxygen{otb}{DrawPathFilter} to
-// output the image with the removed seam in white.
-//
-// Most of the code is similar to the previous example.
-
-/* Example usage:
-./SeamCarvingOtherExample Input/QB_Suburb.png Output/SeamCarvingOtherExampleOutput.png 50
-*/
-
-
-#include "otbImage.h"
-#include "itkPolyLineParametricPath.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkRescaleIntensityImageFilter.h"
-#include "itkGradientMagnitudeImageFilter.h"
-
-#include "otbDrawPathFilter.h"
-#include "otbImageToCarvingPathFilter.h"
-#include "otbRemoveCarvingPathFilter.h"
-#include "otbAddCarvingPathFilter.h"
-
-#include "itkImageDuplicator.h"
-#include "otbObjectList.h"
-
-int main(int itkNotUsed(argc), char* argv[])
-{
-
-  typedef float         InputPixelType;
-  typedef unsigned char OutputPixelType;
-  const unsigned int    Dimension = 2;
-
-  typedef otb::Image<InputPixelType, Dimension>  ImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-  typedef itk::PolyLineParametricPath<Dimension> PathType;
-
-  // We need to define a list to keep the path in memory until the end of
-  // the seam carving process. This is done using an \doxygen{otb}{ObjectList}
-
-  typedef otb::ObjectList<PathType> PathListType;
-  PathListType::Pointer             pathList = PathListType::New();
-
-  typedef otb::ImageFileReader<ImageType>                              ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType>                        WriterType;
-  typedef itk::RescaleIntensityImageFilter<ImageType, OutputImageType> RescalerType;
-
-  ReaderType::Pointer   reader   = ReaderType::New();
-  WriterType::Pointer   writer   = WriterType::New();
-  RescalerType::Pointer rescaler = RescalerType::New();
-
-  const char* filenamereader = argv[1];
-  reader->SetFileName(filenamereader);
-
-  const char* filenamewriter = argv[2];
-  writer->SetFileName(filenamewriter);
-
-  int iteration = atoi(argv[3]);
-
-  // We instantiate the different filters of the pipeline as before.
-
-  typedef itk::GradientMagnitudeImageFilter<ImageType, ImageType> GradientType;
-  GradientType::Pointer                                           gradient = GradientType::New();
-
-  typedef otb::ImageToCarvingPathFilter<ImageType, PathType> CarvingFilterType;
-  CarvingFilterType::Pointer                                 carvingFilter = CarvingFilterType::New();
-
-  typedef otb::DrawPathFilter<ImageType, PathType, ImageType> DrawPathFilterType;
-  DrawPathFilterType::Pointer                                 drawPathFilter = DrawPathFilterType::New();
-
-  typedef otb::RemoveCarvingPathFilter<ImageType, PathType, ImageType> RemoveCarvingPathFilterType;
-  RemoveCarvingPathFilterType::Pointer                                 removeCarvingPath = RemoveCarvingPathFilterType::New();
-
-  typedef otb::AddCarvingPathFilter<ImageType, PathType, ImageType> AddCarvingPathFilterType;
-  AddCarvingPathFilterType::Pointer                                 addCarvingPath = AddCarvingPathFilterType::New();
-
-  typedef itk::ImageDuplicator<ImageType> duplicatorType;
-  duplicatorType::Pointer                 duplicator = duplicatorType::New();
-  reader->Update();
-  duplicator->SetInputImage(reader->GetOutput());
-  duplicator->Update();
-
-  // The loop to shorten the image is similar to the previous one. Here we
-  // decide to remove alternatively one vertical and one horizontal seam. At
-  // each iteration, we save the seam on the list using the \code{PushBack()}
-  // method.
-
-  for (int i = 0; i < iteration; ++i)
-  {
-
-    gradient->SetInput(duplicator->GetOutput());
-
-    carvingFilter->SetInput(gradient->GetOutput());
-    carvingFilter->SetDirection(i % 2);
-
-    removeCarvingPath->SetInput(duplicator->GetOutput());
-    removeCarvingPath->SetInputPath(carvingFilter->GetOutput());
-    removeCarvingPath->SetDirection(i % 2);
-    removeCarvingPath->UpdateLargestPossibleRegion();
-
-    pathList->PushBack(carvingFilter->GetOutput());
-    carvingFilter->GetOutput()->DisconnectPipeline();
-
-    duplicator->SetInputImage(removeCarvingPath->GetOutput());
-    duplicator->Update();
-  }
-
-  // The next loop will put back the seam using the
-  // \doxygen{otb}{AddCarvingPathFilter} and drawing it with the
-  // \doxygen{otb}{DrawPathFilter}.
-
-  for (int i = iteration - 1; i >= 0; i--)
-  {
-
-    addCarvingPath->SetInput(duplicator->GetOutput());
-    addCarvingPath->SetInputPath(pathList->GetNthElement(i));
-    addCarvingPath->SetDirection(i % 2);
-    addCarvingPath->UpdateLargestPossibleRegion();
-
-    drawPathFilter->SetInput(addCarvingPath->GetOutput());
-    drawPathFilter->SetInputPath(pathList->GetNthElement(i));
-    drawPathFilter->UpdateLargestPossibleRegion();
-
-    duplicator->SetInputImage(drawPathFilter->GetOutput());
-    duplicator->Update();
-  }
-
-  // Finally, the resulting image is saved on an image file as usual
-
-  rescaler->SetInput(duplicator->GetOutput());
-  writer->SetInput(rescaler->GetOutput());
-  writer->Update();
-
-  // Figure~\ref{fig:SEAMCARVING2_FILTER} shows the result of applying
-  // the seam carving filter to a satellite image.
-  // \begin{figure}
-  // \center
-  // \includegraphics[width=0.44\textwidth]{QB_Suburb.eps}
-  // \includegraphics[width=0.44\textwidth]{SeamCarvingOtherExampleOutput.eps}
-  // \itkcaption[Seam carving filter application]{Illustration of the minimum
-  // seams alternatively vertical and horizontal on a Quickbird
-  // image. From left to right : original image, image with the 25 vertical
-  // seams and the 25 horizontal seams.}
-  // \label{fig:SEAMCARVING2_FILTER}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
-}
diff --git a/Examples/FeatureExtraction/test/CMakeLists.txt b/Examples/FeatureExtraction/test/CMakeLists.txt
index 0f1e957d04e949f5bcf3d51906014e7fc2e0061e..bea835448e0a05ee71769a08dbca9cb19dbef7e4 100644
--- a/Examples/FeatureExtraction/test/CMakeLists.txt
+++ b/Examples/FeatureExtraction/test/CMakeLists.txt
@@ -90,54 +90,6 @@ otb_add_test(NAME feTeRatioLineDetectorExampleTest COMMAND ${OTB_TEST_DRIVER}
     5 1
 )
 
-# ------- RoadExtractionExamplesTest----------
-
-
-otb_add_test(NAME feTeExtractRoadByStepsExampleTest COMMAND ${OTB_TEST_DRIVER}
-  --compare-n-images ${NOTOL} 2
-    ${BASELINE}/qb_ExtractRoad_pretty.png
-    ${TEMP}/qb_ExtractRoad_pretty.png
-    ${BASELINE}/ExtractRoadByStepsExampleOutput.png
-    ${TEMP}/ExtractRoadByStepsExampleOutput.png
-  Execute $<TARGET_FILE:ExtractRoadByStepsExample>
-    ${INPUTDATA}/qb_RoadExtract.tif
-    ${TEMP}/ExtractRoadByStepsExampleOutput.png
-    ${TEMP}/qb_ExtractRoad_pretty.png
-    337 557 432 859 0.00005 1.0
-)
-
-
-otb_add_test(NAME feTeExtractRoadExampleTest COMMAND ${OTB_TEST_DRIVER}
-  --compare-image ${NOTOL}
-    ${BASELINE}/ExtractRoadExampleOutput.png
-    ${TEMP}/ExtractRoadExampleOutput.png
-  Execute $<TARGET_FILE:ExtractRoadExample>
-    ${INPUTDATA}/qb_RoadExtract.tif
-    ${TEMP}/ExtractRoadExampleOutput.png
-    337 557 432 859 1.0 0.00005 1.0 0.39269 1.0 10.0 25.
-)
-
-# ------- SeamCarvingExamplesTest----------
-
-otb_add_test(NAME feTeSeamCarvingExampleTest COMMAND ${OTB_TEST_DRIVER}
-  --compare-image ${NOTOL}
-    ${BASELINE}/SeamCarvingExampleOutput.png
-    ${TEMP}/SeamCarvingExampleOutput.png
-  Execute $<TARGET_FILE:SeamCarvingExample>
-    ${INPUTDATA}/QB_Suburb.png
-    ${TEMP}/SeamCarvingExampleOutput.png
-    50
-)
-
-otb_add_test(NAME feTeSeamCarvingOtherExampleTest COMMAND ${OTB_TEST_DRIVER}
-  --compare-image ${NOTOL}
-    ${BASELINE}/SeamCarvingOtherExampleOutput.png
-    ${TEMP}/SeamCarvingOtherExampleOutput.png
-  Execute $<TARGET_FILE:SeamCarvingOtherExample>
-    ${INPUTDATA}/QB_Suburb.png
-    ${TEMP}/SeamCarvingOtherExampleOutput.png
-    50
-)
 
 #otb_add_test(NAME feTeImageToSIFTKeyPointSetFilterTest COMMAND ${OTB_TEST_DRIVER}
 #        --compare-image ${NOTOL}
diff --git a/Examples/Hyperspectral/HyperspectralUnmixingExample.cxx b/Examples/Hyperspectral/HyperspectralUnmixingExample.cxx
index 228e4d7386159a4a3f1ece1660fcdea882f5706e..e45218c390298e7cf84f31a29fec2b9575340f57 100644
--- a/Examples/Hyperspectral/HyperspectralUnmixingExample.cxx
+++ b/Examples/Hyperspectral/HyperspectralUnmixingExample.cxx
@@ -44,6 +44,8 @@
 #include "otbVcaImageFilter.h"
 #include "otbUnConstrainedLeastSquareImageFilter.h"
 
+#include "itkMersenneTwisterRandomVariateGenerator.h"
+
 int main(int argc, char* argv[])
 {
   if (argc != 7)
@@ -71,6 +73,10 @@ int main(int argc, char* argv[])
   typedef otb::VectorRescaleIntensityImageFilter<ImageType, ImageType> RescalerType;
   typedef otb::VectorImageToMatrixImageFilter<ImageType>               VectorImageToMatrixImageFilterType;
 
+  // We set the seed of the random number generator.
+
+  itk::Statistics::MersenneTwisterRandomVariateGenerator::GetInstance()->SetSeed(121212);
+
   // We instantiate now the image reader and we set the image file name.
 
   ReaderType::Pointer reader = ReaderType::New();
diff --git a/Examples/OBIA/LabelMapToVectorData.cxx b/Examples/OBIA/LabelMapToVectorData.cxx
index 001d38ecf9d139292dbcf9ffda681be03a85e87c..2f2a1423404845c1fd60146b0e0ae5524472ee87 100644
--- a/Examples/OBIA/LabelMapToVectorData.cxx
+++ b/Examples/OBIA/LabelMapToVectorData.cxx
@@ -20,7 +20,7 @@
 
 
 /* Example usage:
-./LabelMapToVectorData Input/rcc8_mire1.png Output/rcc8_mire2_vectorizer.shp
+./LabelMapToVectorData Input/labelImage_UnsignedChar.tif Output/LabelMapToVectorData.shp
 */
 
 
diff --git a/Examples/OBIA/RadiometricAttributesLabelMapFilterExample.cxx b/Examples/OBIA/RadiometricAttributesLabelMapFilterExample.cxx
index 9991cf7db9e6627f3341c92a2908829044d33509..1ab6443c048376eafa4f9cbd31dabafba345711c 100644
--- a/Examples/OBIA/RadiometricAttributesLabelMapFilterExample.cxx
+++ b/Examples/OBIA/RadiometricAttributesLabelMapFilterExample.cxx
@@ -107,7 +107,7 @@ int main(int argc, char* argv[])
   typedef otb::BandsStatisticsAttributesLabelMapFilter<LabelMapType, VectorImageType> RadiometricLabelMapFilterType;
   typedef otb::AttributesMapOpeningLabelMapFilter<LabelMapType>                       OpeningLabelMapFilterType;
   typedef itk::LabelMapToBinaryImageFilter<LabelMapType, MaskImageType>               LabelMapToBinaryImageFilterType;
-  typedef itk::UnaryFunctorImageFilter<VectorImageType, ImageType,otb::Functor::NDVI<PixelType,PixelType,PixelType> > NDVIImageFilterType;
+  typedef itk::UnaryFunctorImageFilter<VectorImageType, ImageType, otb::Functor::NDVI<PixelType, PixelType>> NDVIImageFilterType;
   typedef otb::ImageToVectorImageCastFilter<ImageType, VectorImageType>   ImageToVectorImageCastFilterType;
 
   ReaderType::Pointer reader = ReaderType::New();
@@ -166,8 +166,8 @@ int main(int argc, char* argv[])
   //  In our case, statistics are computed on the NDVI coefficient on each label object.
   NDVIImageFilterType::Pointer ndviImageFilter = NDVIImageFilterType::New();
 
-  ndviImageFilter->GetFunctor().SetRedIndex(3);
-  ndviImageFilter->GetFunctor().SetNIRIndex(4);
+  ndviImageFilter->GetFunctor().SetBandIndex(CommonBandNames::RED, 3);
+  ndviImageFilter->GetFunctor().SetBandIndex(CommonBandNames::NIR, 4);
   ndviImageFilter->SetInput(vreader->GetOutput());
 
   ImageToVectorImageCastFilterType::Pointer ndviVectorImageFilter = ImageToVectorImageCastFilterType::New();
diff --git a/Examples/OBIA/test/CMakeLists.txt b/Examples/OBIA/test/CMakeLists.txt
index 49cb2f872e107f61111f8f8de573c974f6c1badb..563fdaf61883ef675fe38633608791d02554e5d8 100644
--- a/Examples/OBIA/test/CMakeLists.txt
+++ b/Examples/OBIA/test/CMakeLists.txt
@@ -42,6 +42,6 @@ set(INPUTDATA ${OTB_DATA_ROOT}/Input)
 
 otb_add_test(NAME trTeLabelMapToVectorData COMMAND ${OTB_TEST_DRIVER}
   Execute $<TARGET_FILE:LabelMapToVectorData>
-    ${INPUTDATA}/rcc8_mire1.png
-    ${TEMP}/rcc8_mire2_vectorizer.shp
+    ${INPUTDATA}/labelImage_UnsignedChar.tif
+    ${TEMP}/trTeLabelMapToVectorDataOutput.shp
 )
diff --git a/Examples/Projections/OrthoRectificationExample.cxx b/Examples/Projections/OrthoRectificationExample.cxx
index 93bfecc1681ac8d3c5093c9f74664ca97c50c369..e3a2f4d1c5cdaf2a682c9b2bbc516f970134aba5 100644
--- a/Examples/Projections/OrthoRectificationExample.cxx
+++ b/Examples/Projections/OrthoRectificationExample.cxx
@@ -23,7 +23,7 @@
 #include "otbImageFileWriter.h"
 
 // This example demonstrates the use of the
-// \doxygen{otb}{OrthoRectificationFilter}. This filter is intended to
+// \doxygen{otb}{GenericRSResampleImageFilter}. This filter is intended to
 // orthorectify images which are in a distributor format with the
 // appropriate meta-data describing the sensor model. In this example,
 // we will choose to use an UTM projection for the output image.
@@ -32,7 +32,7 @@
 // proper header files: the one for the ortho-rectification filter and
 // the one defining the different projections available in OTB.
 
-#include "otbOrthoRectificationFilter.h"
+#include "otbGenericRSResampleImageFilter.h"
 #include "otbSpatialReference.h"
 
 int main(int argc, char* argv[])
@@ -66,15 +66,12 @@ int main(int argc, char* argv[])
   writer->SetFileName(argv[2]);
 
   // We can now proceed to declare the type for the ortho-rectification
-  // filter. The class \doxygen{otb}{OrthoRectificationFilter} is
-  // templated over the input and the output image types as well as over
-  // the cartographic projection. We define therefore the
-  // type of the projection we want, which is an UTM projection for this case.
-
-// Software Guide : BeginCodeSnippet
-  typedef otb::GenericMapProjection<otb::TransformDirection::FORWARD> MapProjectionType;
-  typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType,
-      MapProjectionType>
+  // filter. The class \doxygen{otb}{GenericRSResampleImageFilter} is
+  // templated over the input and the output image types.
+
+  // Software Guide : BeginCodeSnippet
+
+  typedef otb::GenericRSResampleImageFilter<VectorImageType, VectorImageType>
   OrthoRectifFilterType;
 
   OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New();
@@ -83,10 +80,9 @@ int main(int argc, char* argv[])
   // instantiate the map projection, set the {\em zone} and {\em hemisphere}
   // parameters and pass this projection to the orthorectification filter.
 
-  MapProjectionType::Pointer utmMapProjection = MapProjectionType::New();  
-  utmMapProjection->SetWkt(otb::SpatialReference::FromUTM(atoi(argv[3]),*argv[4]=='N'? otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt());
-  std::cout<<utmMapProjection->GetWkt()<<std::endl;
-  orthoRectifFilter->SetMapProjection(utmMapProjection);
+  std::string wkt = otb::SpatialReference::FromUTM(atoi(argv[3]),*argv[4]=='N'? otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt();
+  std::cout<<wkt<<std::endl;
+  orthoRectifFilter->SetOutputProjectionRef(wkt);
 
   // We then wire the input image to the orthorectification filter.
 
@@ -129,8 +125,6 @@ int main(int argc, char* argv[])
 
   writer->SetInput(orthoRectifFilter->GetOutput());
 
-  writer->SetAutomaticTiledStreaming();
-
   // Finally, we trigger the pipeline execution by calling the
   // \code{Update()} method on the writer. Please note that the
   // ortho-rectification filter is derived from the
diff --git a/Examples/Projections/test/CMakeLists.txt b/Examples/Projections/test/CMakeLists.txt
index a65749b842bdbf900b8117f201700c3b70a60c50..5cd898e29184e612e87d43477cd79effbd0a6c24 100644
--- a/Examples/Projections/test/CMakeLists.txt
+++ b/Examples/Projections/test/CMakeLists.txt
@@ -66,7 +66,7 @@ otb_add_test(NAME prTeVectorDataProjectionExampleTest COMMAND ${OTB_TEST_DRIVER}
 )
 
 otb_add_test(NAME prTeGeometriesProjectionTest COMMAND ${OTB_TEST_DRIVER}
-  --compare-ogr ${NOTOL}
+  --compare-ogr ${EPSILON_7}
     ${BASELINE}/geometriesProjectionExample.shp
     ${TEMP}/geometriesProjectionExample.shp
   Execute $<TARGET_FILE:GeometriesProjectionExample>
diff --git a/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx b/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx
index 7f051c3e438c87c6dae83164058571601eccb65c..6845750ac2c420db14567e6aa6dc0c85b720072e 100644
--- a/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx
+++ b/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx
@@ -26,8 +26,7 @@
                                                         Output/pretty_ARVIMultiChannelRAndBAndNIRVegetationIndex.png \
                                                         1 \
                                                         3 \
-                                                        2 \
-                                                        0.6
+                                                        2
 */
 
 
@@ -87,11 +86,11 @@
 
 int main(int argc, char* argv[])
 {
-  if (argc < 8)
+  if (argc < 7)
   {
     std::cerr << "Missing Parameters " << std::endl;
     std::cerr << "Usage: " << argv[0];
-    std::cerr << " inputImage , outputImage , prettyInput , prettyOutput , redChannel , blueChannel , nirChannel , gama" << std::endl;
+    std::cerr << " inputImage , outputImage , prettyInput , prettyOutput , redChannel , blueChannel , nirChannel" << std::endl;
     return 1;
   }
 
@@ -114,7 +113,7 @@ int main(int argc, char* argv[])
   // Note that we also can use other functors which operate with the
   // Red, Blue and Nir channels such as EVI, ARVI and TSARVI.
 
-  typedef otb::Functor::ARVI<InputPixelType, InputPixelType, InputPixelType, OutputPixelType> FunctorType;
+  typedef otb::Functor::ARVI<InputPixelType, OutputPixelType> FunctorType;
 
   // The
   // \doxygen{itk}{UnaryFunctorImageFilter}
@@ -134,17 +133,9 @@ int main(int argc, char* argv[])
   writer->SetFileName(argv[2]);
 
   // The three used index bands (red, blue and NIR) are declared.
-
-  filter->GetFunctor().SetRedIndex(::atoi(argv[5]));
-  filter->GetFunctor().SetBlueIndex(::atoi(argv[6]));
-  filter->GetFunctor().SetNIRIndex(::atoi(argv[7]));
-
-  // The $\gamma$ parameter is set. The
-  // \doxygen{otb::Functor}{ARVI}
-  // class sets the default value of $\gamma$ to $0.5$.  This parameter
-  // is used to reduce the atmospheric effect on a global scale.
-
-  filter->GetFunctor().SetGamma(::atof(argv[8]));
+  filter->GetFunctor().SetBandIndex(CommonBandNames::RED, ::atoi(argv[5]));
+  filter->GetFunctor().SetBandIndex(CommonBandNames::BLUE, ::atoi(argv[6]));
+  filter->GetFunctor().SetBandIndex(CommonBandNames::NIR, ::atoi(argv[7]));
 
   // The filter input is linked to the reader output and
   // the filter output is linked to the writer input.
diff --git a/Examples/Radiometry/AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx b/Examples/Radiometry/AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx
index 68653b4e0d5bb5a4a17e240bb6068bb8f94264e1..d42f8cd56e1227d88f1fe1b8bd956538a4bb80aa 100644
--- a/Examples/Radiometry/AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx
+++ b/Examples/Radiometry/AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx
@@ -26,10 +26,7 @@
                                                        Output/pretty_AVIMultiChannelRAndGAndNIRVegetationIndex.png \
                                                        3 \
                                                        2 \
-                                                       4 \
-                                                       660 \
-                                                       560 \
-                                                       830
+                                                       4
 */
 
 
@@ -76,12 +73,11 @@
 
 int main(int argc, char* argv[])
 {
-  if (argc < 11)
+  if (argc < 8)
   {
     std::cerr << "Missing Parameters " << std::endl;
     std::cerr << "Usage: " << argv[0];
-    std::cerr << " inputImage , outputImage , prettyInput , prettyOutput , redChannel , greenChannel , nirChannel ,";
-    std::cerr << " lambdaR, lambdaG, lambdaNIR " << std::endl;
+    std::cerr << " inputImage , outputImage , prettyInput , prettyOutput , redChannel , greenChannel , nirChannel ," << std::endl;
     return 1;
   }
 
@@ -102,7 +98,7 @@ int main(int argc, char* argv[])
   // The AVI (Angular Vegetation Index) is
   // instantiated using the image pixel types as template parameters.
 
-  typedef otb::Functor::AVI<InputPixelType, InputPixelType, InputPixelType, OutputPixelType> FunctorType;
+  typedef otb::Functor::AVI<InputPixelType, OutputPixelType> FunctorType;
 
   // The
   // \doxygen{itk}{UnaryFunctorImageFilter}
@@ -123,18 +119,9 @@ int main(int argc, char* argv[])
 
   // The three used index bands (red, green and NIR) are declared.
 
-  filter->GetFunctor().SetRedIndex(::atoi(argv[5]));
-  filter->GetFunctor().SetGreenIndex(::atoi(argv[6]));
-  filter->GetFunctor().SetNIRIndex(::atoi(argv[7]));
-
-  // The $\lambda$ R, G and NIR parameters are set. The
-  // \doxygen{otb::Functor}{AVI}
-  // class sets the default values of $\lambda$ to $660$, $560$ and
-  // $830$.
-
-  filter->GetFunctor().SetLambdaR(::atof(argv[8]));
-  filter->GetFunctor().SetLambdaG(::atof(argv[9]));
-  filter->GetFunctor().SetLambdaNir(::atof(argv[10]));
+  filter->GetFunctor().SetBandIndex(CommonBandNames::RED, ::atoi(argv[5]));
+  filter->GetFunctor().SetBandIndex(CommonBandNames::GREEN, ::atoi(argv[6]));
+  filter->GetFunctor().SetBandIndex(CommonBandNames::NIR, ::atoi(argv[7]));
 
   // The filter input is linked to the reader output and
   // the filter output is linked to the writer input.
diff --git a/Examples/Radiometry/CMakeLists.txt b/Examples/Radiometry/CMakeLists.txt
index c33eed313333af0b2a675d1ef787e596ebe4a3d0..48af7c1d8fb654efb198553c3b648b932073c558 100644
--- a/Examples/Radiometry/CMakeLists.txt
+++ b/Examples/Radiometry/CMakeLists.txt
@@ -32,10 +32,6 @@ endif()
 add_executable(AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx)
 target_link_libraries(AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter ${OTB_LIBRARIES})
 
-add_executable(NDVIRAndNIRVegetationIndexImageFilter NDVIRAndNIRVegetationIndexImageFilter.cxx)
-target_link_libraries(NDVIRAndNIRVegetationIndexImageFilter ${OTB_LIBRARIES})
-
-
 if(BUILD_TESTING)
   add_subdirectory(test)
 endif()
diff --git a/Examples/Radiometry/NDVIRAndNIRVegetationIndexImageFilter.cxx b/Examples/Radiometry/NDVIRAndNIRVegetationIndexImageFilter.cxx
deleted file mode 100644
index d95aae28065d70a953109885e2f428fddc14f5a9..0000000000000000000000000000000000000000
--- a/Examples/Radiometry/NDVIRAndNIRVegetationIndexImageFilter.cxx
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-/* Example usage:
-./NDVIRAndNIRVegetationIndexImageFilter Input/NDVI_2.hdr \
-                                        Input/NDVI_3.hdr \
-                                        Output/NDVIRAndNIRVegetationIndex.tif \
-                                        Output/pretty_Red.png \
-                                        Output/pretty_NIR.png \
-                                        Output/pretty_NDVIRAndNIRVegetationIndex.png
-*/
-
-
-// \index{otb::VegetationIndicesFunctor}
-// \index{otb::VegetationIndicesFunctor!header}
-//
-// The following example illustrates the use of the
-// \doxygen{itk}{BinaryFunctorImageFilter} with the use of the Normalized
-// Difference Vegatation Index (NDVI).
-// NDVI computes the difference between the NIR channel, noted $L_{NIR}$, and the red channel,
-// noted $L_{r}$ radiances reflected from the surface and transmitted through the atmosphere:
-//
-// \begin{equation}
-// \mathbf{NDVI} = \frac{L_{NIR}-L_{r}}{L_{NIR}+L_{r}}
-// \end{equation}
-//
-//  \relatedClasses
-//  \begin{itemize}
-//  \item \subdoxygen{otb}{Functor}{RVI}
-//  \item \subdoxygen{otb}{Functor}{PVI}
-//  \item \subdoxygen{otb}{Functor}{SAVI}
-//  \item \subdoxygen{otb}{Functor}{TSAVI}
-//  \item \subdoxygen{otb}{Functor}{MSAVI}
-//  \item \subdoxygen{otb}{Functor}{GEMI}
-//  \item \subdoxygen{otb}{Functor}{WDVI}
-//  \item \subdoxygen{otb}{Functor}{IPVI}
-//  \item \subdoxygen{otb}{Functor}{TNDVI}
-//  \end{itemize}
-//
-// Let's look at the minimal code required to use this algorithm.
-
-#include "itkMacro.h"
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "itkBinaryFunctorImageFilter.h"
-#include "otbVegetationIndicesFunctor.h"
-#include "itkRescaleIntensityImageFilter.h"
-
-int main(int argc, char* argv[])
-{
-  if (argc < 6)
-  {
-    std::cerr << "Missing Parameters " << std::endl;
-    std::cerr << "Usage: " << argv[0];
-    std::cerr << " inputImage1 , inputImage2 , outputImage , prettyinputImage1 , prettyinputImage2 , prettyOutput" << std::endl;
-    return 1;
-  }
-
-  // The image types are now defined using pixel types the
-  // dimension. Input and output images are defined as \doxygen{otb}{Image}.
-
-  const unsigned int                             Dimension = 2;
-  typedef double                                 InputPixelType;
-  typedef float                                  OutputPixelType;
-  typedef otb::Image<InputPixelType, Dimension>  InputRImageType;
-  typedef otb::Image<InputPixelType, Dimension>  InputNIRImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  // We instantiate reader and writer types
-  typedef otb::ImageFileReader<InputRImageType>   RReaderType;
-  typedef otb::ImageFileReader<InputNIRImageType> NIRReaderType;
-  typedef otb::ImageFileWriter<OutputImageType>   WriterType;
-
-  // The NDVI (Normalized Difference Vegetation Index) is instantiated using
-  // the images pixel type as template parameters. It is
-  // implemented as a functor class which will be passed as a
-  // parameter to an \doxygen{itk}{BinaryFunctorImageFilter}.
-
-  typedef otb::Functor::NDVI<InputPixelType, InputPixelType, OutputPixelType> FunctorType;
-
-  // The \doxygen{itk}{BinaryFunctorImageFilter} type is instantiated using the images
-  // types and the NDVI functor as template parameters.
-
-  typedef itk::BinaryFunctorImageFilter<InputRImageType, InputNIRImageType, OutputImageType, FunctorType> NDVIImageFilterType;
-
-  // Instantiating object
-  NDVIImageFilterType::Pointer filter            = NDVIImageFilterType::New();
-  RReaderType::Pointer                 readerR   = RReaderType::New();
-  NIRReaderType::Pointer               readerNIR = NIRReaderType::New();
-  WriterType::Pointer                  writer    = WriterType::New();
-
-  //  Now the input images are set and a name is given to the output image.
-
-  readerR->SetFileName(argv[1]);
-  readerNIR->SetFileName(argv[2]);
-  writer->SetFileName(argv[3]);
-
-  // We set the processing pipeline: filter inputs are linked to
-  // the reader output and the filter output is linked to the writer
-  // input.
-
-  filter->SetInput1(readerR->GetOutput());
-  filter->SetInput2(readerNIR->GetOutput());
-
-  writer->SetInput(filter->GetOutput());
-
-  // Invocation of the \code{Update()} method on the writer triggers the
-  // execution of the pipeline.  It is recommended to place \code{update()} calls in a
-  // \code{try/catch} block in case errors occur and exceptions are thrown.
-
-  try
-  {
-    writer->Update();
-  }
-  catch (itk::ExceptionObject& excep)
-  {
-    std::cerr << "Exception caught !" << std::endl;
-    std::cerr << excep << std::endl;
-  }
-  catch (...)
-  {
-    std::cout << "Unknown exception !" << std::endl;
-    return EXIT_FAILURE;
-  }
-
-  // Pretty image creation for the printing
-  typedef otb::Image<unsigned char, Dimension>                                       OutputPrettyImageType;
-  typedef otb::ImageFileWriter<OutputPrettyImageType>                                WriterPrettyType;
-  typedef itk::RescaleIntensityImageFilter<OutputImageType, OutputPrettyImageType>   RescalerType;
-  typedef itk::RescaleIntensityImageFilter<InputRImageType, OutputPrettyImageType>   RescalerRType;
-  typedef itk::RescaleIntensityImageFilter<InputNIRImageType, OutputPrettyImageType> RescalerNIRType;
-
-  RescalerType::Pointer     rescaler     = RescalerType::New();
-  WriterPrettyType::Pointer prettyWriter = WriterPrettyType::New();
-  rescaler->SetInput(filter->GetOutput());
-  rescaler->SetOutputMinimum(0);
-  rescaler->SetOutputMaximum(255);
-  prettyWriter->SetFileName(argv[6]);
-  prettyWriter->SetInput(rescaler->GetOutput());
-
-  RescalerRType::Pointer    rescalerR       = RescalerRType::New();
-  RescalerNIRType::Pointer  rescalerNIR     = RescalerNIRType::New();
-  WriterPrettyType::Pointer prettyWriterR   = WriterPrettyType::New();
-  WriterPrettyType::Pointer prettyWriterNIR = WriterPrettyType::New();
-  rescalerR->SetInput(readerR->GetOutput());
-  rescalerR->SetOutputMinimum(0);
-  rescalerR->SetOutputMaximum(255);
-  prettyWriterR->SetFileName(argv[4]);
-  prettyWriterR->SetInput(rescalerR->GetOutput());
-
-  rescalerNIR->SetInput(readerNIR->GetOutput());
-  rescalerNIR->SetOutputMinimum(0);
-  rescalerNIR->SetOutputMaximum(255);
-  prettyWriterNIR->SetFileName(argv[5]);
-  prettyWriterNIR->SetInput(rescalerNIR->GetOutput());
-
-  try
-  {
-    prettyWriter->Update();
-    prettyWriterNIR->Update();
-    prettyWriterR->Update();
-  }
-  catch (itk::ExceptionObject& excep)
-  {
-    std::cerr << "Exception caught !" << std::endl;
-    std::cerr << excep << std::endl;
-  }
-  catch (...)
-  {
-    std::cout << "Unknown exception !" << std::endl;
-    return EXIT_FAILURE;
-  }
-
-  // Let's now run this example using as input the images
-  // \code{NDVI\_3.hdr} and  \code{NDVI\_4.hdr} (images kindly and free of charge given by SISA and CNES)
-  // provided in the directory \code{Examples/Data}.
-  //
-  //
-  // \begin{figure} \center
-  // \includegraphics[width=0.24\textwidth]{pretty_Red.eps}
-  // \includegraphics[width=0.24\textwidth]{pretty_NIR.eps}
-  // \includegraphics[width=0.24\textwidth]{pretty_NDVIRAndNIRVegetationIndex.eps}
-  // \itkcaption[ARVI Example]{NDVI input images on the left (Red channel and NIR channel), on the right the result of the algorithm.}
-  // \label{fig:NDVIRAndNIRIndex}
-  // \end{figure}
-
-  return EXIT_SUCCESS;
-}
diff --git a/Examples/Radiometry/test/CMakeLists.txt b/Examples/Radiometry/test/CMakeLists.txt
index b30d3aa7ce82dc01e623f5bbd7efb4d843133498..4bd6befaff4c0b1de63209fcbf8f48bd55990365 100644
--- a/Examples/Radiometry/test/CMakeLists.txt
+++ b/Examples/Radiometry/test/CMakeLists.txt
@@ -35,7 +35,6 @@ otb_add_test(NAME raTeARVIMultiChannelRAndBAndNIRVegetationIndexImageFilterTest
     1
     2
     3
-    0.6 # Gamma parameter
 )
 
 # -------            AVIMultiChannelRAndGAndNIRVegetationIndexImageFilterTest   ------------------------------
@@ -52,24 +51,6 @@ otb_add_test(NAME raTeAVIMultiChannelRAndGAndNIRVegetationIndexImageFilterTest C
     3
     2
     4 # indices of the channels
-    660.
-    560.
-    830. # lambdaR, lambdaG, lambdaNir
-)
-
-# -------            NDVIRAndNIRVegetationIndexImageFilter   ------------------------------
-
-otb_add_test(NAME raTeNDVIRAndNIRVegetationIndexImageFilterTest COMMAND ${OTB_TEST_DRIVER}
-  --compare-image ${NOTOL}
-    ${BASELINE}/NDVIRAndNIRVegetationIndex.tif
-    ${TEMP}/NDVIRAndNIRVegetationIndex.tif
-  Execute $<TARGET_FILE:NDVIRAndNIRVegetationIndexImageFilter>
-    ${INPUTDATA}/poupees_sub_c1.png
-    ${INPUTDATA}/poupees_sub_c2.png
-    ${TEMP}/NDVIRAndNIRVegetationIndex.tif
-    ${TEMP}/NDVIRAndNIRVegetationIndex2.tif
-    ${TEMP}/NDVIRAndNIRVegetationIndex3.tif
-    ${TEMP}/NDVIRAndNIRVegetationIndex4.tif
 )
 
 if(OTBOpticalCalibration_LOADED)
@@ -103,4 +84,4 @@ otb_add_test(NAME raTeAtmosphericCorrectionSequencementTest COMMAND ${OTB_TEST_D
     2       # Radius;
     0.020   # pixel spacing in kilometers
 )
-endif()
\ No newline at end of file
+endif()
diff --git a/Examples/Simulation/LAIFromNDVIImageTransform.cxx b/Examples/Simulation/LAIFromNDVIImageTransform.cxx
index ec6dce3b1ce40748987273f04334b077785945a1..133e5dd6444ddfd50625cc421e9642dc5558bd98 100644
--- a/Examples/Simulation/LAIFromNDVIImageTransform.cxx
+++ b/Examples/Simulation/LAIFromNDVIImageTransform.cxx
@@ -64,8 +64,7 @@ int main(int argc, char* argv[])
   // Filter type is a generic \doxygen{itk}{UnaryFunctorImageFilter} using Formosat2 specific LAI
   //  \doxygen{otb}{LAIFromNDVIFormosat2Functor}.
 
-  typedef otb::Functor::LAIFromNDVIFormosat2Functor<InputImageType::InternalPixelType, InputImageType::InternalPixelType, OutputImageType::PixelType>
-                                                                                                 FunctorType;
+  typedef otb::Functor::LAIFromNDVIFormosat2Functor<InputImageType::InternalPixelType, OutputImageType::PixelType> FunctorType;
   typedef itk::UnaryFunctorImageFilter<InputImageType, OutputImageType, FunctorType> LAIFRomNDVIImageFilterType;
 
   // Instantiating object
@@ -96,8 +95,8 @@ int main(int argc, char* argv[])
   //
   unsigned int redChannel = static_cast<unsigned int>(atoi(argv[5]));
   unsigned int nirChannel = static_cast<unsigned int>(atoi(argv[6]));
-  filter->GetFunctor().SetRedIndex(redChannel);
-  filter->GetFunctor().SetNIRIndex(nirChannel);
+  filter->GetFunctor().SetBandIndex(CommonBandNames::RED, redChannel);
+  filter->GetFunctor().SetBandIndex(CommonBandNames::NIR, nirChannel);
 
   //  The invocation of the \code{Update()} method triggers the
   //  execution of the pipeline.
diff --git a/Examples/Simulation/ProsailModel.cxx b/Examples/Simulation/ProsailModel.cxx
index 33ed31b2daa108ad31df4f60caac91edac2f0488..42e06f71691e029c1f55ba3199b175c9f5cd04ee 100644
--- a/Examples/Simulation/ProsailModel.cxx
+++ b/Examples/Simulation/ProsailModel.cxx
@@ -34,7 +34,7 @@
 
 #include "otbSailModel.h"
 #include "otbProspectModel.h"
-
+#include "otbMacro.h"
 
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
@@ -151,13 +151,12 @@ int main(int argc, char* argv[])
 
   for (unsigned int i = 0; i < sail->GetViewingReflectance()->Size(); ++i)
   {
-    std::cout << "wavelength  : ";
-    std::cout << sail->GetViewingReflectance()->GetResponse()[i].first;
-    std::cout << ". Viewing reflectance ";
-    std::cout << sail->GetViewingReflectance()->GetResponse()[i].second;
-    std::cout << ". Hemispherical reflectance ";
-    std::cout << sail->GetHemisphericalReflectance()->GetResponse()[i].second;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << "wavelength  : "
+       << sail->GetViewingReflectance()->GetResponse()[i].first
+       << ". Viewing reflectance "
+       << sail->GetViewingReflectance()->GetResponse()[i].second
+       << ". Hemispherical reflectance "
+       << sail->GetHemisphericalReflectance()->GetResponse()[i].second);
   }
 
   std::ofstream outputFile(OutputName, std::ios::out);
diff --git a/Examples/Tutorials/OrthoFusion.cxx b/Examples/Tutorials/OrthoFusion.cxx
index a94f608086de60b7907003cecca3822fee7ce8e4..c0ead29574f94efba0267646cbeea59af4162b45 100644
--- a/Examples/Tutorials/OrthoFusion.cxx
+++ b/Examples/Tutorials/OrthoFusion.cxx
@@ -28,8 +28,7 @@
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
 
-#include "otbOrthoRectificationFilter.h"
-#include "otbGenericMapProjection.h"
+#include "otbGenericRSResampleImageFilter.h"
 
 #include "otbSimpleRcsPanSharpeningFusionImageFilter.h"
 #include "otbStandardFilterWatcher.h"
@@ -89,12 +88,9 @@ int main(int argc, char* argv[])
   // \item the hemisphere
   // \end{itemize}
 
-  typedef otb::GenericMapProjection<otb::TransformDirection::INVERSE> InverseProjectionType;
-  InverseProjectionType::Pointer utmMapProjection = InverseProjectionType::New();
-  utmMapProjection->SetWkt(
-    otb::SpatialReference::FromUTM(atoi(argv[4]),argv[5][0]=='N' ? 
+  std::string wkt = otb::SpatialReference::FromUTM(atoi(argv[4]),argv[5][0]=='N' ? 
       otb::SpatialReference::hemisphere::north : 
-      otb::SpatialReference::hemisphere::south).ToWkt());
+      otb::SpatialReference::hemisphere::south).ToWkt();
 
   //  We will need to pass several parameters to the orthorectification
   // concerning the desired output region:
@@ -118,10 +114,10 @@ int main(int argc, char* argv[])
   // We declare the orthorectification filter. And provide the different
   // parameters:
 
-  typedef otb::OrthoRectificationFilter<ImageType, DoubleImageType, InverseProjectionType> OrthoRectifFilterType;
+  typedef otb::GenericRSResampleImageFilter<ImageType, DoubleImageType> OrthoRectifFilterType;
 
   OrthoRectifFilterType::Pointer orthoRectifPAN = OrthoRectifFilterType::New();
-  orthoRectifPAN->SetMapProjection(utmMapProjection);
+  orthoRectifPAN->SetOutputProjectionRef(wkt);
 
   orthoRectifPAN->SetInput(readerPAN->GetOutput());
 
@@ -133,12 +129,12 @@ int main(int argc, char* argv[])
   // Now we are able to have the orthorectified area from the PAN image. We just
   // have to follow a similar process for the XS image.
 
-  typedef otb::OrthoRectificationFilter<VectorImageType, DoubleVectorImageType, InverseProjectionType> VectorOrthoRectifFilterType;
+  typedef otb::GenericRSResampleImageFilter<VectorImageType, DoubleVectorImageType> VectorOrthoRectifFilterType;
 
 
   VectorOrthoRectifFilterType::Pointer orthoRectifXS = VectorOrthoRectifFilterType::New();
 
-  orthoRectifXS->SetMapProjection(utmMapProjection);
+  orthoRectifXS->SetOutputProjectionRef(wkt);
 
   orthoRectifXS->SetInput(readerXS->GetOutput());
 
@@ -160,8 +156,6 @@ int main(int argc, char* argv[])
 
   writer->SetInput(fusion->GetOutput());
 
-  writer->SetAutomaticTiledStreaming();
-
   otb::StandardFilterWatcher watcher(writer, "OrthoFusion");
 
   writer->Update();
diff --git a/Modules/Adapters/GdalAdapters/src/otbSpatialReference.cxx b/Modules/Adapters/GdalAdapters/src/otbSpatialReference.cxx
index 012b04c2b6d78f9c1df7cebc4eee57bb7dd97682..19958c297110bb1920f4f547686e6dcfdb0daa14 100644
--- a/Modules/Adapters/GdalAdapters/src/otbSpatialReference.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbSpatialReference.cxx
@@ -200,7 +200,9 @@ unsigned int SpatialReference::ToEPSG() const
   
   OGRSpatialReferencePtr tmpSRS(m_SR->Clone());
 
+#if GDAL_VERSION_NUM < 2050000
   tmpSRS->Fixup();
+#endif
   tmpSRS->AutoIdentifyEPSG();
   
   const char * epsg = nullptr;
diff --git a/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx b/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx
index 6de34b30ed9b51edcab3f751057f4370855ee418..84b2ee18a43f2631fa8d3fc6269c103d6546b8d9 100644
--- a/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx
+++ b/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx
@@ -19,6 +19,7 @@
  */
 
 #include "otbImageKeywordlist.h"
+#include "otbConfigurationManager.h"
 
 #include <cassert>
 
@@ -38,6 +39,7 @@
 #include "ossim/ossimTileMapModel.h"
 #include "ossim/projection/ossimProjectionFactoryRegistry.h"
 #include "ossim/projection/ossimRpcModel.h"
+#include "ossim/base/ossimNotify.h"
 #pragma GCC diagnostic pop
 #else
 #include "ossim/base/ossimKeywordlist.h"
@@ -47,6 +49,7 @@
 #include "ossim/ossimTileMapModel.h"
 #include "ossim/projection/ossimProjectionFactoryRegistry.h"
 #include "ossim/projection/ossimRpcModel.h"
+#include "ossim/base/ossimNotify.h"
 #endif
 
 #include "otbSensorModelAdapter.h"
@@ -228,6 +231,15 @@ ReadGeometryFromImage(const std::string& filename, bool checkRpcTag)
   ossimKeywordlist geom_kwl; // = new ossimKeywordlist();
   ImageKeywordlist otb_kwl;
 
+  // Save Ossim notify flags
+  ossimPushNotifyFlags();
+
+  // Except for DEBUG logger level, only fatal errors of OSSIM should be seen
+  if(otb::ConfigurationManager::GetLoggerLevel() < itk::LoggerBase::DEBUG)
+    {
+    ossimSetNotifyFlag(ossimNotifyFlags_FATAL);
+    }
+
   /****************************************************/
   /* First try : test the OSSIM plugins factory       */
   /****************************************************/
@@ -313,6 +325,9 @@ ReadGeometryFromImage(const std::string& filename, bool checkRpcTag)
   // which uses ossimSensorModelFactory and ossimPluginProjectionFactory internally,
   // thus by-passing the need for a valid ossimImageHandler.
 
+  // Restore Ossim notify flags
+  ossimPopNotifyFlags();
+
   return otb_kwl;
 }
 
diff --git a/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx b/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx
index 27316187ac7ff5f1d7434c654b9f03026871dac2..eebdacb42da3f3f3ad5bd03f42b89669a03fba3a 100644
--- a/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx
+++ b/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx
@@ -37,6 +37,8 @@
 #include "ossim/projection/ossimRpcProjection.h"
 #include "ossim/ossimPluginProjectionFactory.h"
 #include "ossim/base/ossimTieGptSet.h"
+#include "ossim/projection/ossimRpcSolver.h"
+#include "ossim/imaging/ossimImageGeometry.h"
 
 #pragma GCC diagnostic pop
 #else
@@ -46,6 +48,8 @@
 #include "ossim/projection/ossimRpcProjection.h"
 #include "ossim/ossimPluginProjectionFactory.h"
 #include "ossim/base/ossimTieGptSet.h"
+#include "ossim/projection/ossimRpcSolver.h"
+#include "ossim/imaging/ossimImageGeometry.h"
 
 #endif
 
@@ -221,8 +225,36 @@ double SensorModelAdapter::Optimize()
       }
     else if (simpleRpcModel != nullptr)
       {
-      // Call optimize fit
-      precision  = simpleRpcModel->optimizeFit(*m_TiePoints);
+      ossimRefPtr<ossimRpcSolver> rpcSolver = new ossimRpcSolver(false, false);
+
+      std::vector<ossimDpt> imagePoints;
+      std::vector<ossimGpt> groundPoints;
+      m_TiePoints->getSlaveMasterPoints(imagePoints, groundPoints);
+      rpcSolver->solveCoefficients(imagePoints, groundPoints);
+
+#if OTB_OSSIM_VERSION < 20200
+      ossimRefPtr<ossimRpcProjection> rpcProjection = dynamic_cast<ossimRpcProjection*>(rpcSolver->createRpcProjection()->getProjection());
+#else
+      ossimRefPtr<ossimRpcModel> rpcProjection = rpcSolver->getRpcModel();
+#endif
+
+      if (!rpcProjection)
+        {
+        itkExceptionMacro(<< "Optimize(): Failed to solve RPC!");
+        }
+
+      ossimKeywordlist geom;
+      rpcProjection->saveState(geom);
+#if OTB_OSSIM_VERSION < 20200
+      simpleRpcModel->loadState(geom);
+#else
+      // we have to convert simpleRpcModel into an ossimRpcModel
+      delete m_SensorModel;
+      m_SensorModel = new ossimRpcModel;
+      m_SensorModel->loadState(geom);
+#endif
+
+      precision = std::pow(rpcSolver->getRmsError(), 2);
       }
     }
 
@@ -238,6 +270,18 @@ bool SensorModelAdapter::ReadGeomFile(const std::string & infile)
 
   m_SensorModel = ossimSensorModelFactory::instance()->createProjection(geom);
 
+  // search for ossimRpcProjection (not in ossimSensorModelFactory since OSSIM 2)
+  const char * typeValue = geom.find(0, "type");
+  if (m_SensorModel == nullptr && strcmp(typeValue, "ossimRpcProjection") == 0)
+    {
+    m_SensorModel = new ossimRpcProjection;
+    if (!m_SensorModel->loadState(geom))
+      {
+      delete m_SensorModel;
+      m_SensorModel = nullptr;
+      }
+    }
+
   if (m_SensorModel == nullptr)
     {
     m_SensorModel = ossimplugins::ossimPluginProjectionFactory::instance()->createProjection(geom);
diff --git a/Modules/Applications/AppClassification/app/CMakeLists.txt b/Modules/Applications/AppClassification/app/CMakeLists.txt
index b646618959248fab615337a300a67a254f1337b5..50ac00ea1619c068da99774d0010ee532a5b7fd1 100644
--- a/Modules/Applications/AppClassification/app/CMakeLists.txt
+++ b/Modules/Applications/AppClassification/app/CMakeLists.txt
@@ -48,11 +48,6 @@ otb_create_application(
   SOURCES        otbFusionOfClassifications.cxx
   LINK_LIBRARIES ${${otb-module}_LIBRARIES})
 
-otb_create_application(
-  NAME           ComputePolylineFeatureFromImage
-  SOURCES        otbComputePolylineFeatureFromImage.cxx
-  LINK_LIBRARIES ${${otb-module}_LIBRARIES})
-
 if(OTB_USE_SHARK)
   otb_create_application(
     NAME           KMeansClassification
@@ -75,11 +70,6 @@ otb_create_application(
   SOURCES        otbPredictRegression.cxx
   LINK_LIBRARIES ${${otb-module}_LIBRARIES})
 
-otb_create_application(
-  NAME           DSFuzzyModelEstimation
-  SOURCES        otbDSFuzzyModelEstimation.cxx
-  LINK_LIBRARIES ${${otb-module}_LIBRARIES})
-
 otb_create_application(
   NAME           ClassificationMapRegularization
   SOURCES        otbClassificationMapRegularization.cxx
@@ -95,11 +85,6 @@ otb_create_application(
   SOURCES        otbComputeImagesStatistics.cxx
   LINK_LIBRARIES ${${otb-module}_LIBRARIES})
 
-otb_create_application(
-  NAME           VectorDataDSValidation
-  SOURCES        otbVectorDataDSValidation.cxx
-  LINK_LIBRARIES ${${otb-module}_LIBRARIES})
-
 otb_create_application(
   NAME           PolygonClassStatistics
   SOURCES        otbPolygonClassStatistics.cxx
diff --git a/Modules/Applications/AppClassification/app/otbComputePolylineFeatureFromImage.cxx b/Modules/Applications/AppClassification/app/otbComputePolylineFeatureFromImage.cxx
deleted file mode 100644
index 919ad16354ffb3fbed8b08585e2d5c562c044955..0000000000000000000000000000000000000000
--- a/Modules/Applications/AppClassification/app/otbComputePolylineFeatureFromImage.cxx
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include <iostream>
-
-#include "otbVectorImage.h"
-
-#include "otbWrapperApplicationFactory.h"
-
-
-#include "otbVectorDataFileReader.h"
-#include "otbVectorDataFileWriter.h"
-#include "itkPreOrderTreeIterator.h"
-
-#include "otbVectorDataIntoImageProjectionFilter.h"
-#include "otbVectorDataTransformFilter.h"
-#include "itkAffineTransform.h"
-
-#include "otbParserConditionDataNodeFeatureFunction.h"
-#include "otbNDVIDataNodeFeatureFunction.h"
-
-// Elevation handler
-#include "otbWrapperElevationParametersHandler.h"
-
-namespace otb
-{
-namespace Wrapper
-{
-
-class ComputePolylineFeatureFromImage: public Application
-{
-public:
-  /** Standard class typedefs. */
-  typedef ComputePolylineFeatureFromImage Self;
-  typedef Application Superclass;
-  typedef itk::SmartPointer<Self> Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  // Images
-  typedef FloatVectorImageType::PixelType PixelType;
-  typedef FloatVectorImageType ImageType;
-
-  // VectorData
-  typedef VectorData<> VectorDataType;
-  typedef VectorDataType::DataNodeType DataNodeType;
-  typedef DataNodeType::ValuePrecisionType PrecisionType;
-  typedef DataNodeType::PrecisionType CoordRepType;
-  typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> TreeIteratorType;
-  typedef VectorDataIntoImageProjectionFilter<VectorDataType, ImageType> VectorDataIntoImageProjType;
-  typedef VectorDataProjectionFilter<VectorDataType, VectorDataType> VectorDataProjectionFilterType;
-
-  typedef ParserConditionDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType>
-      ParserConditionFeatureFunctionType;
-
-  /** Standard macro */
-  itkNewMacro(Self)
-;
-
-  itkTypeMacro(ComputePolylineFeatureFromImage, otb::Application)
-;
-
-private:
-  void DoInit() override
-  {
-    SetName("ComputePolylineFeatureFromImage");
-    SetDescription("This application computes the chosen descriptors for each studied polyline contained in the input VectorData.");
-
-    SetDocName("Compute Polyline Feature From Image");
-    SetDocLongDescription("The first step in the classifier fusion based validation is to compute the chosen descriptors for each studied polyline.");
-    SetDocLimitations("Since it does not rely on streaming process, take care of the size of input image before launching application.");
-    SetDocAuthors("OTB-Team");
-    SetDocSeeAlso(" ");
-    AddDocTag(Tags::FeatureExtraction);
-
-    AddParameter(ParameterType_InputImage, "in", "Input Image");
-    SetParameterDescription("in", "An image to compute the descriptors on.");
-
-    AddParameter(ParameterType_InputVectorData, "vd", "Vector Data");
-    SetParameterDescription("vd", "Vector data containing the polylines where the features will be computed.");
-
-    // Elevation
-    ElevationParametersHandler::AddElevationParameters(this, "elev");
-
-    AddParameter(ParameterType_String, "expr", "Feature expression");
-    SetParameterDescription("expr", "The feature formula (b1 < 0.3) where b1 is the standard name of input image first band");
-
-    AddParameter(ParameterType_String, "field", "Feature name");
-    SetParameterDescription("field", "The field name corresponding to the feature codename (NONDVI, ROADSA...)");
-
-    AddParameter(ParameterType_OutputVectorData, "out", "Output Vector Data");
-    SetParameterDescription("out", "The output vector data containing polylines with a new field");
-
-    // Doc example parameter settings
-    SetDocExampleParameterValue("in", "NDVI.TIF");
-    SetDocExampleParameterValue("vd", "roads_ground_truth.shp");
-    SetDocExampleParameterValue("expr", "\"(b1 > 0.4)\"");
-    SetDocExampleParameterValue("field", "NONDVI");
-    SetDocExampleParameterValue("out", "PolylineFeatureFromImage_LI_NONDVI_gt.shp");
-
-    SetOfficialDocLink();
-  }
-
-  void DoUpdateParameters() override
-  {
-    // Nothing to do here : all parameters are independent
-  }
-
-  void DoExecute() override
-  {
-    // Vector Data into Image projection
-    FloatVectorImageType::Pointer inImage = GetParameterImage("in");
-
-    inImage->UpdateOutputInformation();
-    try
-      {
-      inImage->Update();
-      }
-    catch (...)
-      {
-      itkGenericExceptionMacro(<< "Error during image update, maybe your image is to big.");
-      }
-
-    otbAppLogDEBUG( << "Starting PolylineFeature extraction process" )
-
-    // Vector Data into Image projection
-    //// Read the Vectordata
-
-    VectorDataType* inVectorData = GetParameterVectorData("vd");
-    inVectorData->Update();
-    //// Projection
-    VectorDataIntoImageProjType::Pointer vprojIm = VectorDataIntoImageProjType::New();
-    vprojIm->SetInputVectorData(inVectorData);
-    vprojIm->SetInputImage(inImage);
-
-    // Setup the DEM Handler
-    otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
-
-    vprojIm->SetUseOutputSpacingAndOriginFromImage(true); // we want index as input;
-    vprojIm->Update();
-
-    // Add description
-    ParserConditionFeatureFunctionType::Pointer vdescriptor = ParserConditionFeatureFunctionType::New();
-    vdescriptor->SetExpression(GetParameterString("expr"));
-    vdescriptor->SetInputImage(inImage);
-
-    m_OutVectorData = VectorDataType::New();
-    // Retrieving root node
-    DataNodeType::Pointer root = m_OutVectorData->GetDataTree()->GetRoot()->Get();
-    // Create the document node
-    DataNodeType::Pointer document = DataNodeType::New();
-    document->SetNodeType(otb::DOCUMENT);
-    // Adding the layer to the data tree
-    m_OutVectorData->GetDataTree()->Add(document, root);
-    // Create the folder node
-    DataNodeType::Pointer folder = DataNodeType::New();
-    folder->SetNodeType(otb::FOLDER);
-    // Adding the layer to the data tree
-    m_OutVectorData->GetDataTree()->Add(folder, document);
-
-    TreeIteratorType itVector(vprojIm->GetOutput()->GetDataTree());
-    itVector.GoToBegin();
-
-    while (!itVector.IsAtEnd())
-      {
-      vdescriptor->SetInputImage(inImage);
-      if (!itVector.Get()->IsRoot() && !itVector.Get()->IsDocument() && !itVector.Get()->IsFolder())
-        {
-        DataNodeType::Pointer currentGeometry = itVector.Get();
-        currentGeometry->SetFieldAsDouble(GetParameterString("field"),
-                                          (double) (vdescriptor->Evaluate(*(currentGeometry.GetPointer()))[0]));
-        m_OutVectorData->GetDataTree()->Add(currentGeometry, folder);
-        }
-      ++itVector;
-      }
-
-    /*
-     * Reprojection of the output VectorData
-     *
-     * The output of VectorDataToRoadDescription is in image index coordinates
-     *
-     * 3 cases :
-     * - input image has no geo-information : pass through
-     * - input image is in cartographic projection : apply image spacing and origin, and set the ProjectionRef
-     * - input image is in sensor model geometry : reproject in WGS84
-     *
-     */
-
-    std::string projRef = inImage->GetProjectionRef();
-    ImageKeywordlist kwl;
-    itk::ExposeMetaData<ImageKeywordlist>(inImage->GetMetaDataDictionary(), MetaDataKey::OSSIMKeywordlistKey, kwl);
-
-    if (!projRef.empty())
-      {
-      // image is in cartographic projection
-      // apply spacing and origin + set projection WKT
-      // The VectorData in output of the chain is in image index coordinate,
-      // and the projection information is lost
-      // Apply an affine transform to apply image origin and spacing,
-      // and arbitrarily set the ProjectionRef to the input image ProjectionRef
-
-      typedef itk::AffineTransform<VectorDataType::PrecisionType, 2> TransformType;
-      typedef otb::VectorDataTransformFilter<VectorDataType, VectorDataType> VDTransformType;
-
-      TransformType::ParametersType params;
-      params.SetSize(6);
-      params[0] = inImage->GetSignedSpacing()[0];
-      params[1] = 0;
-      params[2] = 0;
-      params[3] = inImage->GetSignedSpacing()[1];
-      params[4] = inImage->GetOrigin()[0];
-      params[5] = inImage->GetOrigin()[1];
-
-      TransformType::Pointer transform = TransformType::New();
-      transform->SetParameters(params);
-
-      VDTransformType::Pointer vdTransform = VDTransformType::New();
-      vdTransform->SetTransform(transform);
-      vdTransform->SetInput(m_OutVectorData);
-      vdTransform->Update();
-
-      m_ProjectedVectorData = vdTransform->GetOutput();
-
-      m_ProjectedVectorData->SetProjectionRef(inImage->GetProjectionRef());
-      }
-    else
-      if (kwl.GetSize() > 0)
-        {
-        // image is in sensor model geometry
-
-        // Reproject VectorData in image projection
-        VectorDataProjectionFilterType::Pointer vproj = VectorDataProjectionFilterType::New();
-        vproj->SetInput(m_OutVectorData);
-
-        vproj->SetOutputKeywordList(inImage->GetImageKeywordlist());
-        vproj->SetOutputProjectionRef(inImage->GetProjectionRef());
-        vproj->SetOutputOrigin(inImage->GetOrigin());
-        vproj->SetOutputSpacing(inImage->GetSignedSpacing());
-
-        // Setup the DEM Handler
-        otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
-
-        vproj->Update();
-        m_ProjectedVectorData = vproj->GetOutput();
-        }
-      else
-        {
-        // no georeferencing information
-        m_ProjectedVectorData = m_OutVectorData;
-        }
-
-    // Set the output vectorData
-    SetParameterOutputVectorData("out", m_ProjectedVectorData);
-
-  };
-
-  VectorDataType::Pointer m_ProjectedVectorData;
-  VectorDataType::Pointer m_OutVectorData;
-
-};
-
-}
-}
-
-OTB_APPLICATION_EXPORT(otb::Wrapper::ComputePolylineFeatureFromImage)
-
-
diff --git a/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx b/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx
deleted file mode 100644
index 2804718d78036f2a3c21a8c1661a948b2538b8a4..0000000000000000000000000000000000000000
--- a/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-#include <iostream>
-
-#include "otbWrapperApplication.h"
-#include "otbWrapperApplicationFactory.h"
-#include "otbWrapperStringListParameter.h"
-#include "otbImageToEnvelopeVectorDataFilter.h"
-#include "otbVectorDataToRandomLineGenerator.h"
-#include "itkAmoebaOptimizer.h"
-#include "otbStandardDSCostFunction.h"
-
-
-namespace otb
-{
-
-namespace Wrapper
-{
-
-#include "itkCommand.h"
-class CommandIterationUpdate : public itk::Command
-{
-public:
-typedef  CommandIterationUpdate   Self;
-typedef  itk::Command             Superclass;
-typedef itk::SmartPointer<Self>   Pointer;
-itkNewMacro( Self );
-protected:
-CommandIterationUpdate() {};
-public:
-typedef itk::AmoebaOptimizer         OptimizerType;
-typedef   const OptimizerType   *    OptimizerPointer;
-
-
-void Execute(itk::Object *caller, const itk::EventObject & event) override
-{
-  Execute( (const itk::Object *)caller, event);
-}
-
-void Execute(const itk::Object * object, const itk::EventObject & event) override
-{
-  OptimizerPointer optimizer =
-      dynamic_cast< OptimizerPointer >( object );
-  if( ! itk::IterationEvent().CheckEvent( &event ) )
-    {
-    return;
-    }
-  std::ostringstream message;
-  message << optimizer->GetCachedValue() << "   ";
-  message << optimizer->GetCachedCurrentPosition() << std::endl;
-  std::cout<<message.str()<<std::endl;
-}
-
-
-};
-
-
-class DSFuzzyModelEstimation: public Application
-{
-public:
-  /** Standard class typedefs. */
-  typedef DSFuzzyModelEstimation Self;
-  typedef Application Superclass;
-  typedef itk::SmartPointer<Self> Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-
-  typedef VectorData<double>                          VectorDataType;
-
-  typedef VectorDataType::DataTreeType                DataTreeType;
-  typedef VectorDataType::DataNodeType                DataNodeType;
-
-  typedef VectorDataType::ValuePrecisionType          PrecisionType;
-  typedef VectorDataType::PrecisionType               CoordRepType;
-
-  typedef otb::Wrapper::StringListParameter::StringListType         StringListType;
-
-  typedef otb::VectorDataToDSValidatedVectorDataFilter<VectorDataType, PrecisionType>
-                                                            ValidationFilterType;
-  typedef otb::StandardDSCostFunction<ValidationFilterType> CostFunctionType;
-  typedef CostFunctionType::LabelSetType                    LabelSetType;
-
-  typedef itk::AmoebaOptimizer                            OptimizerType;
-
-  typedef otb::FuzzyDescriptorsModelManager::DescriptorsModelType
-                                                          DescriptorsModelType;
-  typedef otb::FuzzyDescriptorsModelManager::DescriptorListType
-                                                          DescriptorListType;
-
-     typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType>
-     TreeIteratorType;
-
-
-  /** Standard macro */
-  itkNewMacro(Self);
-
-  itkTypeMacro(DSFuzzyModelEstimation, otb::Application);
-
-private:
-  void DoInit() override
-  {
-    SetName("DSFuzzyModelEstimation");
-    SetDescription("Estimate feature fuzzy model parameters using 2 vector data (ground truth samples and wrong samples).");
-
-    SetDocName("Fuzzy Model estimation");
-    SetDocLongDescription("Estimate feature fuzzy model parameters using 2 vector data (ground truth samples and wrong samples).");
-    SetDocLimitations("None.");
-    SetDocAuthors("OTB-Team");
-    SetDocSeeAlso(" ");
-
-    AddDocTag(Tags::FeatureExtraction);
-
-    AddParameter(ParameterType_InputVectorData, "psin", "Input Positive Vector Data");
-    SetParameterDescription("psin", "Ground truth vector data for positive samples");
-
-    AddParameter(ParameterType_InputVectorData, "nsin", "Input Negative Vector Data");
-    SetParameterDescription("nsin", "Ground truth vector data for negative samples");
-
-    AddParameter(ParameterType_StringList, "belsup", "Belief Support");
-    SetParameterDescription("belsup", "Dempster Shafer study hypothesis to compute belief");
-
-    AddParameter(ParameterType_StringList, "plasup", "Plausibility Support");
-    SetParameterDescription("plasup", "Dempster Shafer study hypothesis to compute plausibility");
-
-    AddParameter(ParameterType_OutputFilename, "out", "Output filename");
-    SetParameterDescription("out", "Output model file name (xml file) contains the optimal model to perform information fusion.");
-
-    AddParameter(ParameterType_String, "cri", "Criterion");
-    SetParameterDescription("cri", "Dempster Shafer criterion (by default (belief+plausibility)/2)");
-    MandatoryOff("cri");
-    SetParameterString("cri","((Belief + Plausibility)/2.)");
-
-    AddParameter(ParameterType_Float,"wgt","Weighting");
-    SetParameterDescription("wgt","Coefficient between 0 and 1 to promote undetection or false detections (default 0.5)");
-    MandatoryOff("wgt");
-    SetParameterFloat("wgt",0.5);
-
-    AddParameter(ParameterType_InputFilename,"initmod","initialization model");
-    SetParameterDescription("initmod","Initialization model (xml file) to be used. If the xml initialization model is set, the descriptor list is not used (specified using the option -desclist)");
-    MandatoryOff("initmod");
-
-    AddParameter(ParameterType_StringList, "desclist","Descriptor list");
-    SetParameterDescription("desclist","List of the descriptors to be used in the model (must be specified to perform an automatic initialization)");
-    MandatoryOff("desclist");
-
-    AddParameter(ParameterType_Int,"maxnbit","Maximum number of iterations");
-    MandatoryOff("maxnbit");
-    SetParameterDescription("maxnbit","Maximum number of optimizer iteration (default 200)");
-    SetParameterInt("maxnbit",200);
-
-    AddParameter(ParameterType_Bool,"optobs","Optimizer Observer");
-    SetParameterDescription("optobs","Activate the optimizer observer");
-
-    // Doc example parameter settings
-    SetDocExampleParameterValue("psin", "cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp");
-    SetDocExampleParameterValue("nsin", "cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp");
-    SetDocExampleParameterValue("belsup", "\"ROADSA\"");
-    SetDocExampleParameterValue("plasup", "\"NONDVI\" \"ROADSA\" \"NOBUIL\"");
-    SetDocExampleParameterValue("initmod", "Dempster-Shafer/DSFuzzyModel_Init.xml");
-    SetDocExampleParameterValue("maxnbit", "4");
-    SetDocExampleParameterValue("optobs", "true");
-    SetDocExampleParameterValue("out", "DSFuzzyModelEstimation.xml");
-
-    SetOfficialDocLink();
-  }
-
-  void DoUpdateParameters() override
-  {
-    // Nothing to do here : all parameters are independent
-
-
-    // .. //
-
-
-  }
-
-  void DoExecute() override
-  {
-
-    //Instantiate
-    m_CostFunction = CostFunctionType::New();
-    m_Optimizer = OptimizerType::New();
-
-    //Read the vector datas
-    VectorDataType::Pointer psVectorData = GetParameterVectorData("psin");
-    psVectorData->Update();
-    VectorDataType::Pointer nsVectorData = GetParameterVectorData("nsin");
-    nsVectorData->Update();
-
-    // Load the initial descriptor model
-    DescriptorListType descList;
-    DescriptorsModelType descMod;
-    if (IsParameterEnabled("initmod"))
-      {
-      std::string descModFile = GetParameterString("initmod");
-      descMod = FuzzyDescriptorsModelManager::Read(descModFile);
-      descList = FuzzyDescriptorsModelManager::GetDescriptorList(descMod);
-      }
-    else
-      {
-      StringListType stringList = GetParameterStringList("desclist");
-      int nbsdDesc = stringList.size();
-      for (int i = 0; i < nbsdDesc; i++)
-        {
-        descList.push_back(stringList[i]);
-        }
-      }
-
-    m_CostFunction->SetDescriptorList(descList);
-
-    // Compute statistics of all the descriptors
-
-    std::vector<double> accFirstOrderPS, accSecondOrderPS, minPS, maxPS;
-    accFirstOrderPS.resize(descList.size());
-    accSecondOrderPS.resize(descList.size());
-    std::fill(accFirstOrderPS.begin(), accFirstOrderPS.end(), 0);
-    std::fill(accSecondOrderPS.begin(), accSecondOrderPS.end(), 0);
-    minPS.resize(descList.size());
-    maxPS.resize(descList.size());
-    unsigned int accNbElemPS = 0;
-
-    TreeIteratorType itVectorPS(psVectorData->GetDataTree());
-    for (itVectorPS.GoToBegin(); !itVectorPS.IsAtEnd(); ++itVectorPS)
-      {
-      if (!itVectorPS.Get()->IsRoot() && !itVectorPS.Get()->IsDocument() && !itVectorPS.Get()->IsFolder())
-        {
-        DataNodeType::Pointer currentGeometry = itVectorPS.Get();
-
-        for (unsigned int i = 0; i < descList.size(); ++i)
-          {
-          double desc = currentGeometry->GetFieldAsDouble(descList[i]);
-
-          accFirstOrderPS[i] += desc;
-          accSecondOrderPS[i] += desc * desc;
-
-          if (desc < minPS[i])
-            {
-            minPS[i] = desc;
-            }
-          if (desc > maxPS[i])
-            {
-            maxPS[i] = desc;
-            }
-
-          }
-        accNbElemPS++;
-        }
-      }
-    if (accNbElemPS == 0)
-      {
-      otbAppLogFATAL(<< "Error : no element found in positive vector data!");
-      }
-
-    TreeIteratorType itVectorNS(nsVectorData->GetDataTree());
-    std::vector<double> accFirstOrderNS, accSecondOrderNS, minNS, maxNS;
-    minNS.resize(descList.size());
-    maxNS.resize(descList.size());
-    accFirstOrderNS.resize(descList.size());
-    accSecondOrderNS.resize(descList.size());
-    std::fill(accFirstOrderNS.begin(), accFirstOrderNS.end(), 0);
-    std::fill(accSecondOrderNS.begin(), accSecondOrderNS.end(), 0);
-    std::fill(minNS.begin(), minNS.end(), 1);
-    std::fill(maxNS.begin(), maxNS.end(), 0);
-    unsigned int accNbElemNS = 0;
-
-    for (itVectorNS.GoToBegin(); !itVectorNS.IsAtEnd(); ++itVectorNS)
-      {
-      if (!itVectorNS.Get()->IsRoot() && !itVectorNS.Get()->IsDocument() && !itVectorNS.Get()->IsFolder())
-        {
-        DataNodeType::Pointer currentGeometry = itVectorNS.Get();
-
-        for (unsigned int i = 0; i < descList.size(); ++i)
-          {
-          double desc = currentGeometry->GetFieldAsDouble(descList[i]);
-
-          accFirstOrderNS[i] += desc;
-          accSecondOrderNS[i] += desc * desc;
-
-          if (desc < minNS[i])
-            {
-            minNS[i] = desc;
-            }
-          if (desc > maxNS[i])
-            {
-            maxNS[i] = desc;
-            }
-
-          }
-        accNbElemNS++;
-        }
-      }
-    if (accNbElemNS == 0)
-      {
-      otbAppLogFATAL(<< "Error : no element found in negative vector data!");
-      }
-    otbAppLogINFO( << "Descriptors Stats : ");
-    otbAppLogINFO( << "Positive Samples");
-    for (unsigned int i = 0; i < descList.size(); ++i)
-      {
-      double mean = accFirstOrderPS[i] / accNbElemPS;
-      double stddev = std::sqrt(accSecondOrderPS[i] / accNbElemPS - mean * mean);
-      otbAppLogINFO( << descList[i] << "  :  " << mean << " +/- " << stddev << "  (min: " << minPS[i] << "  max: " << maxPS[i] << ")"<< std::endl);
-      }
-
-    otbAppLogINFO( << "Negative Samples" << std::endl);
-    for (unsigned int i = 0; i < descList.size(); ++i)
-      {
-      double mean = accFirstOrderNS[i] / accNbElemNS;
-      double stddev = std::sqrt(accSecondOrderNS[i] / accNbElemNS - mean * mean);
-      otbAppLogINFO(<< descList[i] << "  :  " << mean << " +/- " << stddev << "  (min: " << minNS[i] << "  max: " << maxNS[i] << ")"<< std::endl);
-      }
-
-    OptimizerType::ParametersType initialPosition(4 * descList.size());
-
-    if (IsParameterEnabled("initmod"))
-      {
-
-      for (unsigned int i = 0; i < 4; i++)
-        {
-        for (unsigned int j = 0; j < descList.size(); j++)
-          {
-          initialPosition.SetElement(
-                                     i + 4 * j,
-                                     otb::FuzzyDescriptorsModelManager::GetDescriptor(descList[j].c_str(), descMod).second[i]);
-          }
-        }
-      }
-    else
-      {
-      for (unsigned int j = 0; j < descList.size(); j++)
-        {
-        initialPosition.SetElement((j * 4), std::min(minNS[j], maxPS[j]));
-        initialPosition.SetElement((j * 4) + 2, std::max(minNS[j], maxPS[j]));
-        initialPosition.SetElement(
-                                   (j * 4) + 1,
-                                       0.5
-                                       * (initialPosition.GetElement((j * 4)) + initialPosition.GetElement((j * 4) + 2)));
-        initialPosition.SetElement((j * 4) + 3, 0.95);
-        }
-      }
-
-    otbAppLogINFO(<<"Initial model: "<<initialPosition);
-
-    //Cost Function
-    //Format Hypothesis
-    LabelSetType Bhyp, Phyp;
-    int nbSet;
-
-    StringListType stringList = GetParameterStringList("belsup");
-    nbSet = stringList.size();
-
-    for (int i = 0; i < nbSet; i++)
-      {
-      std::string str = stringList[i];
-      Bhyp.insert(str);
-      }
-    m_CostFunction->SetBeliefHypothesis(Bhyp);
-    stringList = GetParameterStringList("plasup");
-    nbSet = stringList.size();
-    for (int i = 0; i < nbSet; i++)
-      {
-      std::string str = stringList[i];
-      Phyp.insert(str);
-      }
-    m_CostFunction->SetPlausibilityHypothesis(Phyp);
-
-    m_CostFunction->SetWeight(GetParameterFloat("wgt"));
-
-    m_CostFunction->SetCriterionFormula(GetParameterString("cri"));
-
-    m_CostFunction->SetGTVectorData(psVectorData);
-    m_CostFunction->SetNSVectorData(nsVectorData);
-    //Optimizer
-    m_Optimizer->SetCostFunction(m_CostFunction);
-
-    m_Optimizer->SetMaximumNumberOfIterations(GetParameterInt("maxnbit"));
-
-    OptimizerType::ParametersType simplexDelta(m_CostFunction->GetNumberOfParameters());
-    simplexDelta.Fill(0.1);
-
-    m_Optimizer->AutomaticInitialSimplexOff();
-    m_Optimizer->SetInitialSimplexDelta(simplexDelta);
-
-    m_Optimizer->SetInitialPosition(initialPosition);
-
-    // Create the Command observer and register it with the optimizer.
-    CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();
-    if (GetParameterInt("optobs"))
-      {
-      m_Optimizer->AddObserver(itk::IterationEvent(), observer);
-      }
-
-    try
-      {
-      // do the optimization
-      m_Optimizer->StartOptimization();
-      }
-    catch (itk::ExceptionObject& err)
-      {
-      // An error has occurred in the optimization.
-      // Update the parameters
-      otbAppLogFATAL("ERROR: Exception Caught : "<< err.GetDescription() << std::endl
-        << "numberOfIterations : " << m_Optimizer->GetOptimizer()->get_num_evaluations() << std::endl
-        << "Results : " << m_Optimizer->GetCurrentPosition() << std::endl);
-      }
-    // get the results
-    const unsigned int numberOfIterations = m_Optimizer->GetOptimizer()->get_num_evaluations();
-    otbAppLogINFO("numberOfIterations : " << numberOfIterations << std::endl);
-    otbAppLogINFO("Results : " << m_Optimizer->GetCurrentPosition() << std::endl);
-
-    for (unsigned int i = 0; i < descList.size(); i++)
-      {
-      otb::FuzzyDescriptorsModelManager::ParameterType tmpParams;
-      for (unsigned int j = 0; j < 4; j++)
-        {
-        tmpParams.push_back(m_Optimizer->GetCurrentPosition()[(i * 4) + j]);
-        }
-      otb::FuzzyDescriptorsModelManager::AddDescriptor(descList[i], tmpParams, m_Model);
-      }
-    otb::FuzzyDescriptorsModelManager::Save(GetParameterString("out"), m_Model);
-
-  };
-
-  CostFunctionType::Pointer                               m_CostFunction;
-  OptimizerType::Pointer                                  m_Optimizer;
-  otb::FuzzyDescriptorsModelManager::DescriptorsModelType m_Model;
-};
-
-}
-}
-
-OTB_APPLICATION_EXPORT(otb::Wrapper::DSFuzzyModelEstimation)
-
diff --git a/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx b/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx
index bcb546e03d11118b8e5c98a29d1cc7dbd824873e..d1c7fcd52f0e88e315536ec6afc7343f1ca9d5bd 100644
--- a/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx
+++ b/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx
@@ -77,13 +77,22 @@ protected:
     MandatoryOff("ts");
 
     AddParameter(ParameterType_Int, "maxit", "Maximum number of iterations");
-    SetParameterDescription("maxit", "Maximum number of iterations for the learning step.");
+    SetParameterDescription("maxit",
+                            "Maximum number of iterations for the learning step."
+                            " If this parameter is set to 0, the KMeans algorithm will not stop until convergence");
     SetDefaultParameterInt("maxit", 1000);
     MandatoryOff("maxit");
 
-    AddParameter(ParameterType_OutputFilename, "outmeans", "Centroid filename");
-    SetParameterDescription("outmeans", "Output text file containing centroid positions");
-    MandatoryOff("outmeans");
+    AddParameter(ParameterType_Group, "centroids", "Centroids IO parameters");
+    SetParameterDescription("centroids", "Group of parameters for centroids IO.");
+
+    AddParameter(ParameterType_InputFilename, "centroids.in", "input centroids text file");
+    SetParameterDescription("centroids.in",
+                            "Input text file containing centroid positions used to initialize the algorithm. "
+                            "Each centroid must be described by p parameters, p being the number of bands in "
+                            "the input image, and the number of centroids must be equal to the number of classes "
+                            "(one centroid per line with values separated by spaces).");
+    MandatoryOff("centroids.in");
 
     ShareKMSamplingParameters();
     ConnectKMSamplingParams();
@@ -99,6 +108,7 @@ protected:
   {
     ShareParameter("ram", "polystats.ram");
     ShareParameter("sampler", "select.sampler");
+    ShareParameter("centroids.out", "training.classifier.sharkkm.centroids.out");
     ShareParameter("vm", "polystats.mask", "Validity Mask",
       "Validity mask, only non-zero pixels will be used to estimate KMeans modes.");
   }
@@ -248,6 +258,14 @@ protected:
                                                         GetParameterInt("maxit"));
     GetInternalApplication("training")->SetParameterInt("classifier.sharkkm.k",
                                                         GetParameterInt("nc"));
+    if (IsParameterEnabled("centroids.in") && HasValue("centroids.in"))
+    {
+      GetInternalApplication("training")->SetParameterString("classifier.sharkkm.centroids.in", GetParameterString("centroids.in"));
+
+      GetInternalApplication("training")
+          ->SetParameterString("classifier.sharkkm.centroids.stats", GetInternalApplication("imgstats")->GetParameterString("out"));
+    }
+
 
     if( IsParameterEnabled("rand"))
       GetInternalApplication("training")->SetParameterInt("rand", GetParameterInt("rand"));
@@ -276,55 +294,6 @@ protected:
     ExecuteInternal( "classif" );
   }
 
-  void CreateOutMeansFile(FloatVectorImageType *image,
-                          const std::string &modelFileName,
-                          unsigned int nbClasses)
-  {
-    if (IsParameterEnabled("outmeans"))
-    {
-      unsigned int nbBands = image->GetNumberOfComponentsPerPixel();
-      unsigned int nbElements = nbClasses * nbBands;
-      // get the line in model file that contains the centroids positions
-      std::ifstream infile(modelFileName);
-      if(!infile)
-      {
-        itkExceptionMacro(<< "File: " << modelFileName << " couldn't be opened");
-      }
-
-      // get the line with the centroids (starts with "2 ")
-      std::string line, centroidLine;
-      while(std::getline(infile,line))
-      {
-        if (line.size() > 2 && line[0] == '2' && line[1] == ' ')
-          {
-          centroidLine = line;
-          break;
-          }
-      }
-
-      std::vector<std::string> centroidElm;
-      boost::split(centroidElm,centroidLine,boost::is_any_of(" "));
-
-      // remove the first elements, not the centroids positions
-      int nbWord = centroidElm.size();
-      int beginCentroid = nbWord-nbElements;
-      centroidElm.erase(centroidElm.begin(), centroidElm.begin()+beginCentroid);
-
-      // write in the output file
-      std::ofstream outfile;
-      outfile.open(GetParameterString("outmeans"));
-
-      for (unsigned int i = 0; i < nbClasses; i++)
-      {
-        for (unsigned int j = 0; j < nbBands; j++)
-        {
-          outfile << std::setw(8) << centroidElm[i * nbBands + j] << " ";
-        }
-        outfile << std::endl;
-      }
-    }
-  }
-
   class KMeansFileNamesHandler
     {
     public:
@@ -495,9 +464,6 @@ private:
     // Compute a classification of the input image according to a model file
     Superclass::KMeansClassif();
 
-    // Create the output text file containing centroids positions
-    Superclass::CreateOutMeansFile(GetParameterImage("in"), fileNames.modelFile, GetParameterInt("nc"));
-
     // Remove all tempory files
     if( GetParameterInt( "cleanup" ) )
       {
diff --git a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
index 95e3314e115ac5254d08d6320207b4e1a80f43fe..bbfb99010e2df503fc561fad3ba528b8b3904151 100644
--- a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
+++ b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
@@ -54,7 +54,7 @@ public:
 
   /** Filters typedef */
   typedef otb::OGRDataToClassStatisticsFilter<FloatVectorImageType,UInt8ImageType> FilterType;
-  
+
   typedef otb::StatisticsXMLFileWriter<FloatVectorImageType::PixelType> StatWriterType;
 
   typedef otb::GeometriesSet GeometriesType;
@@ -64,7 +64,6 @@ public:
 private:
   PolygonClassStatistics()
     {
-   
     }
 
   void DoInit() override
@@ -98,17 +97,17 @@ private:
     AddParameter(ParameterType_InputImage,  "mask",   "Input validity mask");
     SetParameterDescription("mask", "Validity mask (only pixels corresponding to a mask value greater than 0 will be used for statistics)");
     MandatoryOff("mask");
-    
+
     AddParameter(ParameterType_InputFilename, "vec", "Input vectors");
     SetParameterDescription("vec","Input geometries to analyze");
-    
+
     AddParameter(ParameterType_OutputFilename, "out", "Output XML statistics file");
     SetParameterDescription("out","Output file to store statistics (XML format)");
 
     AddParameter(ParameterType_ListView, "field", "Field Name");
     SetParameterDescription("field","Name of the field carrying the class name in the input vectors.");
     SetListViewSingleSelectionMode("field",true);
-    
+
     AddParameter(ParameterType_Int, "layer", "Layer Index");
     SetParameterDescription("layer", "Layer index to read in the input vector file.");
     MandatoryOff("layer");
@@ -138,16 +137,16 @@ private:
       ogr::Feature feature = layer.ogr().GetNextFeature();
 
       ClearChoices("field");
-      
+
       for(int iField=0; iField<feature.ogr().GetFieldCount(); iField++)
         {
         std::string key, item = feature.ogr().GetFieldDefnRef(iField)->GetNameRef();
         key = item;
         std::string::iterator end = std::remove_if(key.begin(),key.end(),IsNotAlphaNum);
         std::transform(key.begin(), end, key.begin(), tolower);
-        
+
         OGRFieldType fieldType = feature.ogr().GetFieldDefnRef(iField)->GetType();
-        
+
         if(fieldType == OFTString || fieldType == OFTInteger || fieldType == OFTInteger64)
           {
           std::string tmpKey="field."+key.substr(0, end - key.begin());
@@ -159,7 +158,7 @@ private:
      // Check that the extension of the output parameter is XML (mandatory for
      // StatisticsXMLFileWriter)
      // Check it here to trigger the error before polygons analysis
-     
+
      if ( HasValue("out") )
        {
        // Store filename extension
@@ -175,46 +174,39 @@ private:
 
   void DoExecute() override
   {
-  otb::ogr::DataSource::Pointer vectors = 
-    otb::ogr::DataSource::New(this->GetParameterString("vec"));
+    otb::ogr::DataSource::Pointer vectors = otb::ogr::DataSource::New(this->GetParameterString("vec"));
 
-  // Retrieve the field name
-  std::vector<int> selectedCFieldIdx = GetSelectedItems("field");
+    // Retrieve the field name
+    std::vector<int> selectedCFieldIdx = GetSelectedItems("field");
 
-  if(selectedCFieldIdx.empty())
+    if (selectedCFieldIdx.empty())
     {
     otbAppLogFATAL(<<"No field has been selected for data labelling!");
     }
 
-  std::vector<std::string> cFieldNames = GetChoiceNames("field");  
-  std::string fieldName = cFieldNames[selectedCFieldIdx.front()];
-
-  otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
-
-  // Reproject geometries
-  FloatVectorImageType::Pointer inputImg = this->GetParameterImage("in");
-  std::string imageProjectionRef = inputImg->GetProjectionRef();
-  FloatVectorImageType::ImageKeywordlistType imageKwl =
-    inputImg->GetImageKeywordlist();
-  std::string vectorProjectionRef =
-    vectors->GetLayer(GetParameterInt("layer")).GetProjectionRef();
-
-  otb::ogr::DataSource::Pointer reprojVector = vectors;
-  GeometriesType::Pointer inputGeomSet;
-  ProjectionFilterType::Pointer geometriesProjFilter;
-  GeometriesType::Pointer outputGeomSet;
-  const OGRSpatialReference imgOGRSref = 
-        OGRSpatialReference( imageProjectionRef.c_str() );
-    const OGRSpatialReference vectorOGRSref = 
-        OGRSpatialReference( vectorProjectionRef.c_str() );
-  bool doReproj = true;
-  // don't reproject for these cases
-  if (  vectorProjectionRef.empty() 
-     || ( imgOGRSref.IsSame( &vectorOGRSref ) ) 
-     || ( imageProjectionRef.empty() && imageKwl.GetSize() == 0) )
-    doReproj = false;
-
-  if (doReproj)
+    std::vector<std::string> cFieldNames = GetChoiceNames("field");
+    std::string              fieldName   = cFieldNames[selectedCFieldIdx.front()];
+
+    otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this, "elev");
+
+    // Reproject geometries
+    FloatVectorImageType::Pointer              inputImg            = this->GetParameterImage("in");
+    std::string                                imageProjectionRef  = inputImg->GetProjectionRef();
+    FloatVectorImageType::ImageKeywordlistType imageKwl            = inputImg->GetImageKeywordlist();
+    std::string                                vectorProjectionRef = vectors->GetLayer(GetParameterInt("layer")).GetProjectionRef();
+
+    otb::ogr::DataSource::Pointer reprojVector = vectors;
+    GeometriesType::Pointer       inputGeomSet;
+    ProjectionFilterType::Pointer geometriesProjFilter;
+    GeometriesType::Pointer       outputGeomSet;
+    const OGRSpatialReference     imgOGRSref    = OGRSpatialReference(imageProjectionRef.c_str());
+    const OGRSpatialReference     vectorOGRSref = OGRSpatialReference(vectorProjectionRef.c_str());
+    bool                          doReproj      = true;
+    // don't reproject for these cases
+    if (vectorProjectionRef.empty() || (imgOGRSref.IsSame(&vectorOGRSref)) || (imageProjectionRef.empty() && imageKwl.GetSize() == 0))
+      doReproj = false;
+
+    if (doReproj)
     {
     inputGeomSet = GeometriesType::New(vectors);
     reprojVector = otb::ogr::DataSource::New();
@@ -236,7 +228,7 @@ private:
   filter->SetInput(this->GetParameterImage("in"));
   if (IsParameterEnabled("mask") && HasValue("mask"))
     {
-    filter->SetMask(this->GetParameterImage<UInt8ImageType>("mask"));
+      filter->SetMask(this->GetParameterUInt8Image("mask"));
     }
   filter->SetOGRData(reprojVector);
   filter->SetFieldName(fieldName);
@@ -245,10 +237,10 @@ private:
 
   AddProcess(filter->GetStreamer(),"Analyze polygons...");
   filter->Update();
-  
+
   FilterType::ClassCountMapType &classCount = filter->GetClassCountOutput()->Get();
   FilterType::PolygonSizeMapType &polySize = filter->GetPolygonSizeOutput()->Get();
-  
+
   StatWriterType::Pointer statWriter = StatWriterType::New();
   statWriter->SetFileName(this->GetParameterString("out"));
   statWriter->AddInputMap<FilterType::ClassCountMapType>("samplesPerClass",classCount);
diff --git a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx
index a4f8b1fc33a73f4e1a2f123dafd8498238f3f984..959f3c129d0c32c3f77343f249c0b18e022232de 100644
--- a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx
+++ b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx
@@ -63,7 +63,7 @@ public:
     UInt8ImageType,
     otb::RandomSampler>                             RandomSamplerType;
   typedef otb::SamplingRateCalculator               RateCalculatorType;
-  
+
   typedef std::map<std::string, unsigned long>      ClassCountMapType;
   typedef RateCalculatorType::MapRateType           MapRateType;
   typedef itk::VariableLengthVector<float> MeasurementType;
@@ -87,40 +87,41 @@ private:
 
     // Documentation
     SetDocName("Sample Selection");
-    SetDocLongDescription("The application selects a set of samples from geometries "
-      "intended for training (they should have a field giving the associated "
-      "class). \n\nFirst of all, the geometries must be analyzed by the PolygonClassStatistics application "
-      "to compute statistics about the geometries, which are summarized in an xml file. "
-      "\nThen, this xml file must be given as input to this application (parameter instats).\n\n"
-      "The input support image and the input training vectors shall be given in "
-      "parameters 'in' and 'vec' respectively. Only the sampling grid (origin, size, spacing)"
-      "will be read in the input image.\n"
-      "There are several strategies to select samples (parameter strategy) : \n\n"
-      "  - smallest (default) : select the same number of sample in each class" 
-      " so that the smallest one is fully sampled.\n"
-      "  - constant : select the same number of samples N in each class" 
-      " (with N below or equal to the size of the smallest class).\n"
-      "  - byclass : set the required number for each class manually, with an input CSV file"
-      " (first column is class name, second one is the required samples number).\n\n"
-      "  - percent: set a target global percentage of samples to use. Class proportions will be respected. \n\n"
-      "  - total: set a target total number of samples to use. Class proportions will be respected. \n\n"
-      "There is also a choice on the sampling type to performs : \n\n"
-      "  - periodic : select samples uniformly distributed\n"
-      "  - random : select samples randomly distributed\n\n"
-      "Once the strategy and type are selected, the application outputs samples positions"
-      "(parameter out).\n\n"
-      
-      "The other parameters to look at are : \n\n"
-      "  - layer : index specifying from which layer to pick geometries.\n"
-      "  - field : set the field name containing the class.\n"
-      "  - mask : an optional raster mask can be used to discard samples.\n"
-      "  - outrates : allows outputting a CSV file that summarizes the sampling rates for each class.\n"
-      
-      "\nAs with the PolygonClassStatistics application, different types  of geometry are supported : "
-      "polygons, lines, points. \nThe behavior of this application is different for each type of geometry : \n\n"
-      "  - polygon: select points whose center is inside the polygon\n"
-      "  - lines  : select points intersecting the line\n"
-      "  - points : select closest point to the provided point");
+    SetDocLongDescription(
+        "The application selects a set of samples from geometries "
+        "intended for training (they should have a field giving the associated "
+        "class). \n\nFirst of all, the geometries must be analyzed by the PolygonClassStatistics application "
+        "to compute statistics about the geometries, which are summarized in an xml file. "
+        "\nThen, this xml file must be given as input to this application (parameter instats).\n\n"
+        "The input support image and the input training vectors shall be given in "
+        "parameters 'in' and 'vec' respectively. Only the sampling grid (origin, size, spacing)"
+        "will be read in the input image.\n"
+        "There are several strategies to select samples (parameter strategy) : \n\n"
+        "  - smallest (default) : select the same number of sample in each class"
+        " so that the smallest one is fully sampled.\n"
+        "  - constant : select the same number of samples N in each class"
+        " (with N below or equal to the size of the smallest class).\n"
+        "  - byclass : set the required number for each class manually, with an input CSV file"
+        " (first column is class name, second one is the required samples number).\n\n"
+        "  - percent: set a target global percentage of samples to use. Class proportions will be respected. \n\n"
+        "  - total: set a target total number of samples to use. Class proportions will be respected. \n\n"
+        "There is also a choice on the sampling type to performs : \n\n"
+        "  - periodic : select samples uniformly distributed\n"
+        "  - random : select samples randomly distributed\n\n"
+        "Once the strategy and type are selected, the application outputs samples positions"
+        "(parameter out).\n\n"
+
+        "The other parameters to look at are : \n\n"
+        "  - layer : index specifying from which layer to pick geometries.\n"
+        "  - field : set the field name containing the class.\n"
+        "  - mask : an optional raster mask can be used to discard samples.\n"
+        "  - outrates : allows outputting a CSV file that summarizes the sampling rates for each class.\n"
+
+        "\nAs with the PolygonClassStatistics application, different types  of geometry are supported : "
+        "polygons, lines, points. \nThe behavior of this application is different for each type of geometry : \n\n"
+        "  - polygon: select points whose center is inside the polygon\n"
+        "  - lines  : select points intersecting the line\n"
+        "  - points : select closest point to the provided point");
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
     SetDocSeeAlso(" ");
@@ -192,7 +193,7 @@ private:
     SetParameterDescription("strategy.total.v","The number of samples to generate");
     SetMinimumParameterIntValue("strategy.total.v",1);
     SetDefaultParameterInt("strategy.total.v",1000);
-    
+
     AddChoice("strategy.smallest","Set same number of samples for all classes, with the smallest class fully sampled");
     SetParameterDescription("strategy.smallest","Set same number of samples for all classes, with the smallest class fully sampled");
 
@@ -238,16 +239,16 @@ private:
       ogr::Feature feature = layer.ogr().GetNextFeature();
 
       ClearChoices("field");
-      
+
       for(int iField=0; iField<feature.ogr().GetFieldCount(); iField++)
         {
         std::string key, item = feature.ogr().GetFieldDefnRef(iField)->GetNameRef();
         key = item;
         std::string::iterator end = std::remove_if(key.begin(),key.end(),IsNotAlphaNum);
         std::transform(key.begin(), end, key.begin(), tolower);
-        
+
         OGRFieldType fieldType = feature.ogr().GetFieldDefnRef(iField)->GetType();
-        
+
         if(fieldType == OFTString || fieldType == OFTInteger || fieldType == OFTInteger64)
           {
           std::string tmpKey="field."+key.substr(0, end - key.begin());
@@ -266,27 +267,26 @@ private:
 
     // Get field name
     std::vector<int> selectedCFieldIdx = GetSelectedItems("field");
-    
+
     if(selectedCFieldIdx.empty())
       {
       otbAppLogFATAL(<<"No field has been selected for data labelling!");
       }
-    
-    std::vector<std::string> cFieldNames = GetChoiceNames("field");  
-    std::string fieldName = cFieldNames[selectedCFieldIdx.front()];
-    
-    m_ReaderStat->SetFileName(this->GetParameterString("instats"));
-    ClassCountMapType classCount = m_ReaderStat->GetStatisticMapByName<ClassCountMapType>("samplesPerClass");
-    m_RateCalculator->SetClassCount(classCount);
-    
-    switch (this->GetParameterInt("strategy"))
+
+      std::vector<std::string> cFieldNames = GetChoiceNames("field");
+      std::string              fieldName   = cFieldNames[selectedCFieldIdx.front()];
+
+      m_ReaderStat->SetFileName(this->GetParameterString("instats"));
+      ClassCountMapType classCount = m_ReaderStat->GetStatisticMapByName<ClassCountMapType>("samplesPerClass");
+      m_RateCalculator->SetClassCount(classCount);
+
+      switch (this->GetParameterInt("strategy"))
       {
       // byclass
       case 0:
         {
         otbAppLogINFO("Sampling strategy : set number of samples for each class");
-        ClassCountMapType requiredCount = 
-          otb::SamplingRateCalculator::ReadRequiredSamples(this->GetParameterString("strategy.byclass.in"));
+        ClassCountMapType requiredCount = otb::SamplingRateCalculator::ReadRequiredSamples(this->GetParameterString("strategy.byclass.in"));
         m_RateCalculator->SetNbOfSamplesByClass(requiredCount);
         }
       break;
@@ -330,12 +330,12 @@ private:
         otbAppLogFATAL("Strategy mode unknown :"<<this->GetParameterString("strategy"));
       break;
       }
-      
+
     if (IsParameterEnabled("outrates") && HasValue("outrates"))
       {
       m_RateCalculator->Write(this->GetParameterString("outrates"));
       }
-    
+
     MapRateType rates = m_RateCalculator->GetRatesByClass();
     std::ostringstream oss;
     oss << " className  requiredSamples  totalSamples  rate" << std::endl;
@@ -376,16 +376,14 @@ private:
     ProjectionFilterType::Pointer geometriesProjFilter;
     GeometriesType::Pointer outputGeomSet;
     bool doReproj = true;
-    const OGRSpatialReference imgOGRSref = 
-        OGRSpatialReference( imageProjectionRef.c_str() );
-    const OGRSpatialReference vectorOGRSref = 
-        OGRSpatialReference( vectorProjectionRef.c_str() );
+    const OGRSpatialReference     imgOGRSref    = OGRSpatialReference(imageProjectionRef.c_str());
+    const OGRSpatialReference     vectorOGRSref = OGRSpatialReference(vectorProjectionRef.c_str());
     // don't reproject for these cases
     if (  vectorProjectionRef.empty()
        || ( imgOGRSref.IsSame( &vectorOGRSref ) )
        || ( imageProjectionRef.empty() && imageKwl.GetSize() == 0) )
       doReproj = false;
-  
+
     if (doReproj)
       {
       inputGeomSet = GeometriesType::New(vectors);
@@ -407,7 +405,7 @@ private:
     // Create output dataset for sample positions
     otb::ogr::DataSource::Pointer outputSamples =
       otb::ogr::DataSource::New(this->GetParameterString("out"),otb::ogr::DataSource::Modes::Overwrite);
-    
+
     switch (this->GetParameterInt("sampler"))
       {
       // periodic
@@ -426,7 +424,7 @@ private:
         periodicFilt->SetSamplerParameters(param);
         if (IsParameterEnabled("mask") && HasValue("mask"))
           {
-          periodicFilt->SetMask(this->GetParameterImage<UInt8ImageType>("mask"));
+            periodicFilt->SetMask(this->GetParameterUInt8Image("mask"));
           }
         periodicFilt->GetStreamer()->SetAutomaticTiledStreaming(this->GetParameterInt("ram"));
         AddProcess(periodicFilt->GetStreamer(),"Selecting positions with periodic sampler...");
@@ -444,7 +442,7 @@ private:
         randomFilt->SetLayerIndex(this->GetParameterInt("layer"));
         if (IsParameterEnabled("mask") && HasValue("mask"))
           {
-          randomFilt->SetMask(this->GetParameterImage<UInt8ImageType>("mask"));
+            randomFilt->SetMask(this->GetParameterUInt8Image("mask"));
           }
         randomFilt->GetStreamer()->SetAutomaticTiledStreaming(this->GetParameterInt("ram"));
         AddProcess(randomFilt->GetStreamer(),"Selecting positions with random sampler...");
diff --git a/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx b/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx
deleted file mode 100644
index 64001c6a135e44b17e39ed920cef41a329b9d2bf..0000000000000000000000000000000000000000
--- a/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-#include "otbVectorDataToDSValidatedVectorDataFilter.h"
-#include "otbWrapperApplication.h"
-#include "otbWrapperApplicationFactory.h"
-#include "otbWrapperStringListParameter.h"
-
-
-namespace otb
-{
-namespace Wrapper
-{
-
-class VectorDataDSValidation: public Application
-{
-
-
-public:
-   /** Standard class typedefs. */
-  typedef VectorDataDSValidation Self;
-  typedef Application Superclass;
-  typedef itk::SmartPointer<Self> Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-
-
-  typedef double                          PrecisionType;
-  typedef otb::VectorData<PrecisionType>  VectorDataType;
-  typedef otb::VectorDataToDSValidatedVectorDataFilter<VectorDataType, PrecisionType>
-                                          VectorDataValidationFilterType;
-  typedef VectorDataValidationFilterType::LabelSetType
-                                          LabelSetType;
-  typedef FuzzyDescriptorsModelManager::DescriptorsModelType DescriptorsModelType;
-
-  typedef otb::Wrapper::StringListParameter::StringListType    StringListType;
-
-  /** Standard macro */
-  itkNewMacro(Self);
-
-  itkTypeMacro(VectorDataDSValidation, otb::Application);
-
-private:
-  void DoInit() override
-  {
-    SetName("VectorDataDSValidation");
-    SetDescription("Vector data validation based on the fusion of features using Dempster-Shafer evidence theory framework.");
-
-    SetDocName("Vector Data validation");
-    SetDocLongDescription("This application validates or unvalidate the studied samples using the Dempster-Shafer theory.");
-    SetDocLimitations("None.");
-    SetDocAuthors("OTB-Team");
-    SetDocSeeAlso("http://en.wikipedia.org/wiki/Dempster-Shafer_theory");
-
-    AddDocTag(Tags::FeatureExtraction);
-
-
-    AddParameter(ParameterType_InputVectorData, "in", "Input Vector Data");
-    SetParameterDescription("in", "Input vector data to validate");
-
-    AddParameter(ParameterType_InputFilename, "descmod", "Descriptors model filename");
-    SetParameterDescription("descmod", "Fuzzy descriptors model (xml file)");
-
-    AddParameter(ParameterType_StringList, "belsup", "Belief Support");
-    SetParameterDescription("belsup", "Dempster Shafer study hypothesis to compute belief");
-
-    AddParameter(ParameterType_StringList, "plasup", "Plausibility Support");
-    SetParameterDescription("plasup", "Dempster Shafer study hypothesis to compute plausibility");
-
-    AddParameter(ParameterType_OutputVectorData, "out", "Output Vector Data");
-    SetParameterDescription("out", "Output VectorData containing only the validated samples");
-
-    AddParameter(ParameterType_String, "cri", "Criterion");
-    SetParameterDescription("cri", "Dempster Shafer criterion (by default (belief+plausibility)/2)");
-    MandatoryOff("cri");
-    SetParameterString("cri", "((Belief + Plausibility)/2.)");
-
-    AddParameter(ParameterType_Float, "thd", "Criterion threshold");
-    SetParameterDescription("thd", "Criterion threshold (default 0.5)");
-    MandatoryOff("thd");
-    SetParameterFloat("thd",0.5);
-
-    // Doc example parameter settings
-    SetDocExampleParameterValue("in", "cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp");
-    SetDocExampleParameterValue("belsup", "cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp");
-    SetDocExampleParameterValue("descmod", "DSFuzzyModel.xml");
-    SetDocExampleParameterValue("out", "VectorDataDSValidation.shp");
-
-    SetOfficialDocLink();
-  }
-
-  void DoUpdateParameters() override
-  {
-    // Nothing to do here : all parameters are independent
-
-
-    // .. //
-
-
-  }
-
-  void DoExecute() override
-  {
-
-    //Read the vector data
-    VectorDataType::Pointer inVectorData = GetParameterVectorData("in");
-    inVectorData->Update();
-
-    // Load the descriptors model
-    std::string descModFile = GetParameterString("descmod");
-    DescriptorsModelType descMod = FuzzyDescriptorsModelManager::Read(descModFile);
-
-    LabelSetType Bhyp, Phyp;
-    int nbSet;
-
-    StringListType stringList = GetParameterStringList("belsup");
-    nbSet = stringList.size();
-
-    for (int i = 0; i < nbSet; i++)
-      {
-      std::string str = stringList[i];
-      Bhyp.insert(str);
-      }
-    stringList = GetParameterStringList("plasup");
-    nbSet = stringList.size();
-    for (int i = 0; i < nbSet; i++)
-      {
-      std::string str = stringList[i];
-      Phyp.insert(str);
-      }
-
-    // Process
-    m_ValidationFilter = VectorDataValidationFilterType::New();
-    m_ValidationFilter->SetInput(inVectorData);
-    m_ValidationFilter->SetDescriptorModels(descMod);
-    m_ValidationFilter->SetBeliefHypothesis(Bhyp);
-    m_ValidationFilter->SetPlausibilityHypothesis(Phyp);
-
-    m_ValidationFilter->SetCriterionFormula(GetParameterString("cri"));
-    m_ValidationFilter->SetCriterionThreshold(GetParameterFloat("thd"));
-
-    // Set the output image
-    SetParameterOutputVectorData("out", m_ValidationFilter->GetOutput());
-
-  };
-
-  VectorDataValidationFilterType::Pointer m_ValidationFilter;
-
-
-};
-}
-}
-
-OTB_APPLICATION_EXPORT(otb::Wrapper::VectorDataDSValidation);
diff --git a/Modules/Applications/AppClassification/include/otbLearningApplicationBase.hxx b/Modules/Applications/AppClassification/include/otbLearningApplicationBase.hxx
index 8d76ee548aff28eb61f5febe1b7b248b96ec47da..0e56b0c6d14ea0c6665461d76ed24b5c2170dc83 100644
--- a/Modules/Applications/AppClassification/include/otbLearningApplicationBase.hxx
+++ b/Modules/Applications/AppClassification/include/otbLearningApplicationBase.hxx
@@ -122,7 +122,10 @@ LearningApplicationBase<TInputValue,TOutputValue>
 ::InitUnsupervisedClassifierParams()
 {
 #ifdef OTB_USE_SHARK
-  InitSharkKMeansParams();
+  if (!m_RegressionFlag)
+  {
+    InitSharkKMeansParams(); // Regression not supported
+  }
 #endif
 }
 
diff --git a/Modules/Applications/AppClassification/include/otbTrainSharkKMeans.hxx b/Modules/Applications/AppClassification/include/otbTrainSharkKMeans.hxx
index a3c43741c70ace5c453ae45212abedb313b30b32..87ff3a948edc75658b5223780aec8e60788e0afa 100644
--- a/Modules/Applications/AppClassification/include/otbTrainSharkKMeans.hxx
+++ b/Modules/Applications/AppClassification/include/otbTrainSharkKMeans.hxx
@@ -22,6 +22,7 @@
 
 #include "otbLearningApplicationBase.h"
 #include "otbSharkKMeansMachineLearningModel.h"
+#include "otbStatisticsXMLFileReader.h"
 
 namespace otb
 {
@@ -44,6 +45,30 @@ void LearningApplicationBase<TInputValue, TOutputValue>::InitSharkKMeansParams()
   SetParameterInt("classifier.sharkkm.k", 2);
   SetParameterDescription("classifier.sharkkm.k", "The number of classes used for the kmeans algorithm. Default set to 2 class");
   SetMinimumParameterIntValue("classifier.sharkkm.k", 2);
+
+  // Centroid IO
+  AddParameter( ParameterType_Group, "classifier.sharkkm.centroids", "Centroids IO parameters" );
+  SetParameterDescription( "classifier.sharkkm.centroids", "Group of parameters for centroids IO." );
+
+  // Input centroids
+  AddParameter(ParameterType_InputFilename, "classifier.sharkkm.centroids.in", "User definied input centroids");
+  SetParameterDescription("classifier.sharkkm.centroids.in", "Input text file containing centroid posistions used to initialize the algorithm. "
+                            "Each centroid must be described by p parameters, p being the number of features in "
+                            "the input vector data, and the number of centroids must be equal to the number of classes "
+                            "(one centroid per line with values separated by spaces).");
+  MandatoryOff("classifier.sharkkm.centroids");
+
+  // Centroid statistics
+  AddParameter(ParameterType_InputFilename, "classifier.sharkkm.centroids.stats", "Statistics file");
+  SetParameterDescription("classifier.sharkkm.centroids.stats", "A XML file containing mean and standard deviation to center"
+    "and reduce the centroids before the KMeans algorithm, produced by ComputeImagesStatistics application.");
+  MandatoryOff("classifier.sharkkm.centroids.stats");
+  
+  // Output centroids
+  AddParameter(ParameterType_OutputFilename, "classifier.sharkkm.centroids.out", "Output centroids text file");
+  SetParameterDescription("classifier.sharkkm.centroids.out", "Output text file containing centroids after the kmean algorithm.");
+  MandatoryOff("classifier.sharkkm.centroids.out");
+  
 }
 
 template<class TInputValue, class TOutputValue>
@@ -60,9 +85,48 @@ void LearningApplicationBase<TInputValue, TOutputValue>::TrainSharkKMeans(
   classifier->SetInputListSample( trainingListSample );
   classifier->SetTargetListSample( trainingLabeledListSample );
   classifier->SetK( k );
+
+  // Initialize centroids from file
+  if(IsParameterEnabled("classifier.sharkkm.centroids.in") && HasValue("classifier.sharkkm.centroids.in"))
+  {
+    shark::Data<shark::RealVector> centroidData;
+    shark::importCSV(centroidData, GetParameterString( "classifier.sharkkm.centroids.in"), ' ');
+    if( HasValue( "classifier.sharkkm.centroids.stats" ) )
+    {
+      auto statisticsReader = otb::StatisticsXMLFileReader< itk::VariableLengthVector<float> >::New();
+      statisticsReader->SetFileName(GetParameterString( "classifier.sharkkm.centroids.stats" ));
+      auto meanMeasurementVector = statisticsReader->GetStatisticVectorByName("mean");
+      auto stddevMeasurementVector = statisticsReader->GetStatisticVectorByName("stddev");
+  
+      // Convert itk Variable Length Vector to shark Real Vector
+      shark::RealVector offsetRV(meanMeasurementVector.Size());
+      shark::RealVector scaleRV(stddevMeasurementVector.Size());
+      
+      assert(meanMeasurementVector.Size()==stddevMeasurementVector.Size());
+      for (unsigned int i = 0; i<meanMeasurementVector.Size(); ++i)
+      {
+        scaleRV[i] = 1/stddevMeasurementVector[i];
+        // Substract the normalized mean
+        offsetRV[i] = - meanMeasurementVector[i]/stddevMeasurementVector[i];
+      }
+      
+      shark::Normalizer<> normalizer(scaleRV, offsetRV);
+      centroidData = normalizer(centroidData);
+    }
+
+    if (centroidData.numberOfElements() != k)
+      otbAppLogWARNING( "The input centroid file will not be used because it contains " << centroidData.numberOfElements() <<
+      " points, which is different than from the requested number of class: " << k <<".");
+    
+    classifier->SetCentroidsFromData( centroidData);
+  }
+  
   classifier->SetMaximumNumberOfIterations( nbMaxIter );
   classifier->Train();
   classifier->Save( modelPath );
+  
+  if( HasValue( "classifier.sharkkm.centroids.out"))
+    classifier->ExportCentroids( GetParameterString( "classifier.sharkkm.centroids.out" ));
 }
 
 } //end namespace wrapper
diff --git a/Modules/Applications/AppClassification/test/CMakeLists.txt b/Modules/Applications/AppClassification/test/CMakeLists.txt
index 9d40b00dd166e3d5230b30cb62792ebceb8ad6a9..2379deb501c3c6233fb1a1a6b34e8fe99a78c6e0 100644
--- a/Modules/Applications/AppClassification/test/CMakeLists.txt
+++ b/Modules/Applications/AppClassification/test/CMakeLists.txt
@@ -179,6 +179,9 @@ foreach(classifier ${classifierList})
     VALID    ${valid}
   )
 
+  set_tests_properties(apTvClTrainMethod${classifier}ImagesClassifierQB1 PROPERTIES
+    RESOURCE_LOCK ${INPUTDATA}/Classification/VectorData_${${lclassifier}_input}QB1_utm31n${vector_input_format})
+
   if(${_classifier_has_baseline} EQUAL -1)
     set(valid ${ascii_confmat_comparison} ${ascii_ref_path}/${OUTCONFMATFILE} ${TEMP}/${OUTCONFMATFILE})
   else()
@@ -560,104 +563,6 @@ otb_test_application(NAME apTvFusionOfClassificationsMV2Inputs
   ${OTBAPP_BASELINE}/apTvFusionOfClassifications2InputsOutput.tif
   ${TEMP}/apTvFusionOfClassificationsMV2InputsOutput.tif)
 
-
-#----------- ComputePolylineFeatureFromImage TESTS ----------------
-otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_wr
-  APP  ComputePolylineFeatureFromImage
-  OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/NDVI.TIF}
-  -vd LARGEINPUT{DEMPSTER-SHAFER/wrongroads.shp}
-  -expr  "(b1 > 0.4)"
-  -field "NONDVI"
-  -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_wr.shp)
-
-# FIXME cascade dependencies to largeinput repository
-if(OTB_DATA_USE_LARGEINPUT)
-  otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication
-    APP  ComputePolylineFeatureFromImage
-    OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/SpectralAngleRoad.TIF}
-    -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_RoadExtractionApplication.shp
-    -expr  "(b1 > 0.25)"
-    -field "ROADSA"
-    -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication.shp)
-
-  set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_RoadExtractionApplication)
-
-  otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr
-    APP  ComputePolylineFeatureFromImage
-    OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/SpectralAngleRoad.TIF}
-    -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_wr.shp
-    -expr  "(b1 > 0.25)"
-    -field "ROADSA"
-    -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr.shp)
-
-  set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_wr)
-
-  otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_wr
-    APP  ComputePolylineFeatureFromImage
-    OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/BUILDINGS.TIF}
-    -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr.shp
-    -expr  "(b1 == 0)"
-    -field "NOBUIL"
-    -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp
-    VALID   --compare-ogr ${EPSILON_9}
-    ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp
-    ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp)
-
-  set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_wr PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr)
-
-  otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_RoadExtractionApplication
-    APP  ComputePolylineFeatureFromImage
-    OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/NDVI.TIF}
-    -vd LARGEINPUT{DEMPSTER-SHAFER/road_extraction.shp}
-    -expr  "(b1 > 0.4)"
-    -field "NONDVI"
-    -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_RoadExtractionApplication.shp)
-
-  otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_gt
-    APP  ComputePolylineFeatureFromImage
-    OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/NDVI.TIF}
-    -vd LARGEINPUT{DEMPSTER-SHAFER/roads_ground_truth.shp}
-    -expr  "(b1 > 0.4)"
-    -field NONDVI
-    -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage.shp)
-
-  otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt
-    APP  ComputePolylineFeatureFromImage
-    OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/SpectralAngleRoad.TIF}
-    -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage.shp
-    -expr  "(b1 > 0.25)"
-    -field "ROADSA"
-    -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt.shp)
-
-  set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_gt)
-
-  otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_gt
-    APP  ComputePolylineFeatureFromImage
-    OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/BUILDINGS.TIF}
-    -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt.shp
-    -expr  "(b1 == 0)"
-    -field "NOBUIL"
-    -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp
-    VALID   --compare-ogr ${EPSILON_9}
-    ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp
-    ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp)
-
-  set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_gt PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt)
-
-  otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication
-    APP  ComputePolylineFeatureFromImage
-    OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/BUILDINGS.TIF}
-    -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication.shp
-    -expr  "(b1 == 0)"
-    -field "NOBUIL"
-    -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp
-    VALID   --compare-ogr ${EPSILON_9}
-    ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp
-    ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp)
-
-  set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication)
-endif()
-
 #----------- KMeansClassification TESTS ----------------
 if(OTB_USE_SHARK)
   otb_test_application(NAME apTvClKMeansImageClassification_composite
@@ -670,7 +575,7 @@ if(OTB_USE_SHARK)
     -sampler periodic
     -rand 121212
     -nodatalabel 255
-    -outmeans ${TEMP}/apTvClKMeansImageClassificationFilterOutMeans.txt
+    -centroids.out ${TEMP}/apTvClKMeansImageClassificationFilterOutMeans.txt
     -out ${TEMP}/apTvClKMeansImageClassificationFilterOutput.tif uint8
     -cleanup 0
     VALID   --compare-image ${NOTOL}
@@ -678,6 +583,25 @@ if(OTB_USE_SHARK)
     ${TEMP}/apTvClKMeansImageClassificationFilterOutput.tif )
 endif()
 
+if(OTB_USE_SHARK)
+  otb_test_application(NAME apTvClKMeansImageClassification_inputCentroids
+    APP  KMeansClassification
+    OPTIONS -in ${INPUTDATA}/qb_RoadExtract.img
+    -ts 30000
+    -nc 5
+    -maxit 10000
+    -sampler periodic
+    -nodatalabel 255
+    -rand 121212
+    -centroids.in ${INPUTDATA}/Classification/KMeansInputCentroids.txt
+    -out ${TEMP}/apTvClKMeansImageClassificationInputCentroids.tif uint8
+    -cleanup 0
+    
+    VALID   --compare-image ${NOTOL}
+    ${OTBAPP_BASELINE}/apTvClKMeansImageClassificationInputCentroids.tif
+    ${TEMP}/apTvClKMeansImageClassificationInputCentroids.tif )
+endif()
+
 #----------- TrainImagesClassifier TESTS ----------------
 if(OTB_USE_LIBSVM)
   otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_allOpt_InXML
@@ -766,30 +690,6 @@ if(OTB_USE_LIBSVM)
     ${TEMP}/clsvmConfMatQB1_allOpt.svm)
 endif()
 
-#----------- DSFuzzyModelEstimation TESTS ----------------
-otb_test_application(NAME apTvCdbDSFuzzyModelEstimation_LI_autoInit
-  APP  DSFuzzyModelEstimation
-  OPTIONS -psin ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp
-  -nsin ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp
-  -belsup "ROADSA"
-  -plasup "NONDVI" "ROADSA" "NOBUIL"
-  -desclist "NONDVI" "ROADSA" "NOBUIL"
-  -maxnbit 4
-  -optobs true
-  -out ${TEMP}/apTvCdbDSFuzzyModelEstimatorOutput_LI_autoInit.xml)
-
-otb_test_application(NAME apTvCdbDSFuzzyModelEstimation_LI
-  APP  DSFuzzyModelEstimation
-  OPTIONS -psin ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp
-  -nsin ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp
-  -belsup "ROADSA"
-  -plasup "NONDVI" "ROADSA" "NOBUIL"
-  -initmod ${OTB_DATA_ROOT}/Input/Dempster-Shafer/DSFuzzyModel_Init.xml
-  -maxnbit 4
-  -optobs true
-  -out ${TEMP}/apTvCdbDSFuzzyModelEstimatorOutput_LI.xml)
-
-
 #----------- ClassificationMapRegularization TESTS ----------------
 otb_test_application(NAME apTvClassificationMapRegularization
   APP  ClassificationMapRegularization
@@ -850,38 +750,6 @@ otb_test_application(NAME apTvClComputeImagesStatisticsQB123
   ${OTBAPP_BASELINE_FILES}/clImageStatisticsQB123.xml
   ${TEMP}/apTvClEstimateImageStatisticsQB123.xml)
 
-
-#----------- VectorDataDSValidation TESTS ----------------
-otb_test_application(NAME cdbTvVectorDataDSValidationGroundTruth_LI
-  APP  VectorDataDSValidation
-  OPTIONS -in ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp
-  -belsup "ROADSA"
-  -plasup "NONDVI" "ROADSA" "NOBUIL"
-  -descmod ${OTB_DATA_ROOT}/Input/Dempster-Shafer/DSFuzzyModel.xml
-  -out ${TEMP}/cdbTvVectorDataDSValidationOutpout_LI_gt.shp
-  VALID    --compare-ogr 0.0
-  ${OTBAPP_BASELINE_FILES}/cdbTvVectorDataDSValidationOutpout_LI_gt.shp
-  ${TEMP}/cdbTvVectorDataDSValidationOutpout_LI_gt.shp)
-
-otb_test_application(NAME apTvCdbVectorDataDSValidationRoadExtractionApplication_LI
-  APP  VectorDataDSValidation
-  OPTIONS -in ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp
-  -belsup "ROADSA"
-  -plasup "NONDVI" "ROADSA" "NOBUIL"
-  -descmod ${OTB_DATA_ROOT}/Input/Dempster-Shafer/DSFuzzyModel.xml
-  -out ${TEMP}/apTvCdbVectorDataDSValidationOutpout_LI_RoadExtractionApplication.shp)
-
-otb_test_application(NAME cdbTvVectorDataDSValidationWrongRoads_LI
-  APP  VectorDataDSValidation
-  OPTIONS -in ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp
-  -belsup "ROADSA"
-  -plasup "NONDVI" "ROADSA" "NOBUIL"
-  -descmod ${OTB_DATA_ROOT}/Input/Dempster-Shafer/DSFuzzyModel.xml
-  -out ${TEMP}/cdbTvVectorDataDSValidationOutpout_LI_wr.shp
-  VALID    --compare-ogr 0.0
-  ${OTBAPP_BASELINE_FILES}/cdbTvVectorDataDSValidationOutpout_LI_wr.shp
-  ${TEMP}/cdbTvVectorDataDSValidationOutpout_LI_wr.shp)
-
 if(OTB_USE_OPENCV)
   #----------- TrainRegression TESTS ----------------
   # y = 0.01*x^2 + 1.5*x - 300
diff --git a/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx b/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx
index 561131caab6a86f6d21c50695838fb4ba0821fe2..4cd2b5f917dfdf22963006931c5bcd91b583bee8 100644
--- a/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx
@@ -50,7 +50,7 @@ public:
   /** Filters typedef */
   typedef otb::ImageToNoDataMaskFilter<FloatVectorImageType,UInt8ImageType> FilterType;
   typedef otb::ChangeNoDataValueFilter<FloatVectorImageType,FloatVectorImageType> ChangeNoDataFilterType;
-  
+
   typedef otb::ImageList<FloatImageType> ImageListType;
   typedef otb::VectorImageToImageListFilter<FloatVectorImageType,ImageListType> VectorToListFilterType;
   typedef otb::ImageListToVectorImageFilter<ImageListType,FloatVectorImageType> ListToVectorFilterType;
@@ -81,12 +81,12 @@ private:
 
     AddParameter(ParameterType_Bool,"usenan", "Consider NaN as no-data");
     SetParameterDescription("usenan","If active, the application will consider NaN as no-data values as well");
-   
+
     AddParameter(ParameterType_Choice,"mode","No-data handling mode");
     SetParameterDescription("mode","Allows choosing between different no-data handling options");
 
     AddChoice("mode.buildmask","Build a no-data Mask");
-    
+
     AddParameter(ParameterType_Float,"mode.buildmask.inv","Inside Value");
     SetParameterDescription("mode.buildmask.inv","Value given in the output mask to pixels that are not no data pixels");
     SetDefaultParameterInt("mode.buildmask.inv",1);
@@ -132,7 +132,7 @@ private:
  void DoExecute() override
   {
     FloatVectorImageType::Pointer inputPtr = this->GetParameterImage("in");
-    
+
     m_Filter = FilterType::New();
     m_Filter->SetInsideValue(this->GetParameterFloat("mode.buildmask.inv"));
     m_Filter->SetOutsideValue(this->GetParameterFloat("mode.buildmask.outv"));
@@ -146,7 +146,7 @@ private:
     std::vector<double> newNoData(inputPtr->GetNumberOfComponentsPerPixel(),GetParameterFloat("mode.changevalue.newv"));
 
     m_ChangeNoDataFilter->SetNewNoDataValues(newNoData);
-    
+
     if(GetParameterString("mode") == "buildmask")
       {
       SetParameterOutputImage("out",m_Filter->GetOutput());
@@ -158,7 +158,7 @@ private:
     else if (GetParameterString("mode") == "apply")
       {
       m_MaskFilters.clear();
-      UInt8ImageType::Pointer maskPtr = this->GetParameterImage<UInt8ImageType>("mode.apply.mask");
+      UInt8ImageType::Pointer  maskPtr = this->GetParameterUInt8Image("mode.apply.mask");
       unsigned int nbBands = inputPtr->GetNumberOfComponentsPerPixel();
       itk::MetaDataDictionary &dict = inputPtr->GetMetaDataDictionary();
       std::vector<bool> flags;
@@ -221,4 +221,3 @@ private:
 }
 
 OTB_APPLICATION_EXPORT(otb::Wrapper::ManageNoData)
-
diff --git a/Modules/Applications/AppImageUtils/test/CMakeLists.txt b/Modules/Applications/AppImageUtils/test/CMakeLists.txt
index 182db8fca0cb7815d17a54ffd4cb56aa00211cdc..0e3ed23abab8aa8a3d47d71e9e0c1fd5d28a079d 100644
--- a/Modules/Applications/AppImageUtils/test/CMakeLists.txt
+++ b/Modules/Applications/AppImageUtils/test/CMakeLists.txt
@@ -44,7 +44,7 @@ otb_test_application(NAME apTvUtDynamicConvertBasic
 otb_test_application(NAME apTuUtDynamicConvertExtendedFilename_writer
                      APP  DynamicConvert
                      OPTIONS -in ${INPUTDATA}/ToulouseExtract_WithGeom.tif
-                             -out ${TEMP}/apTvUtGeomExtendedFilename.tif?&gdal:co:TILED=YES&writegeom=false
+                             -out ${TEMP}/apTvUtNoGeomExtendedFilename.tif?&gdal:co:TILED=YES&writegeom=false
                      )
 
 otb_test_application(NAME apTvUtDynamicConvertExtendedFilename_readerGEOM
diff --git a/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx b/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx
index 4d13ff7279378f64dcc20f7e5175b5e005900751..082106fd43fca3df6e443e7cea0009cfc873cd8e 100644
--- a/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx
+++ b/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx
@@ -20,16 +20,14 @@
 
 #include "otbWrapperApplication.h"
 #include "otbWrapperApplicationFactory.h"
+#include "otbWrapperNumericalParameter.h"
 
-#include "itkUnaryFunctorImageFilter.h"
+#include "otbVegetationIndicesFunctor.h"
 #include "otbWaterIndicesFunctor.h"
 #include "otbBuiltUpIndicesFunctor.h"
 #include "otbSoilIndicesFunctor.h"
-
-#include "otbImageList.h"
-#include "otbImageListToVectorImageFilter.h"
-
-#include "otbWrapperNumericalParameter.h"
+#include "otbIndicesStackFunctor.h"
+#include "otbFunctorImageFilter.h"
 
 namespace otb
 {
@@ -50,78 +48,21 @@ public:
 
   itkTypeMacro(RadiometricIndices, otb::Wrapper::Application);
 
-  /** Output  containers typedef */
-  typedef ObjectList<itk::ProcessObject>                                    FilterListType;
-  typedef ImageList<FloatImageType>                                         ImageListType;
-  typedef ImageListToVectorImageFilter<ImageListType, FloatVectorImageType> ImageListToVectorImageFilterType;
-
-  /** Radiometric water indices functors typedef */
-  typedef Functor::SRWI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType>  SRWIFunctorType;
-  typedef Functor::NDWI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType>  NDWIFunctorType;
-  typedef Functor::NDWI2<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> NDWI2FunctorType;
-  typedef Functor::MNDWI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> MNDWIFunctorType;
-  typedef Functor::NDPI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType>  NDPIFunctorType;
-  typedef Functor::NDTI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType>  NDTIFunctorType;
-  //typedef Functor::WaterSqrtSpectralAngleFunctor<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> WaterSqrtSpectralAngleFunctor;
-
-  /** Radiometric vegetation indices functors typedef */
-  typedef Functor::NDVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> NDVIFunctor;
-  typedef Functor::TNDVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> TNDVIFunctor;
-  typedef Functor::RVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> RVIFunctor;
-  typedef Functor::SAVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> SAVIFunctor;
-  typedef Functor::TSAVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> TSAVIFunctor;
-  typedef Functor::MSAVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> MSAVIFunctor;
-  typedef Functor::MSAVI2<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> MSAVI2Functor;
-  typedef Functor::GEMI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> GEMIFunctor;
-  typedef Functor::IPVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> IPVIFunctor;
-  typedef Functor::LAIFromNDVILogarithmic<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> LAIFromNDVILogFunctor;
-  typedef Functor::LAIFromReflectancesLinear<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> LAIFromReflLinearFunctor;
-  typedef Functor::LAIFromNDVIFormosat2Functor<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> LAIFromNDVIFormoFunctor;
-
-  /** Radiometric soil indices functors typedef */
-  typedef Functor::IR<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> IRFunctor;
-  typedef Functor::IC<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> ICFunctor;
-  typedef Functor::IB<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> IBFunctor;
-  typedef Functor::IB2<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType, FloatImageType::PixelType> IB2Functor;
-
-  /** Radiometric built up indices functors typedef */
-  typedef Functor::NDBI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> NDBIFunctor;
-
-  /** Radiometric indices filters typedef */
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDWIFunctorType>  NDWIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDWI2FunctorType> NDWI2FilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, MNDWIFunctorType> MNDWIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDPIFunctorType>  NDPIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDTIFunctorType>  NDTIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, SRWIFunctorType>  SRWIFilterType;
-
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDVIFunctor>              NDVIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, TNDVIFunctor>             TNDVIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, RVIFunctor>               RVIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, SAVIFunctor>              SAVIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, TSAVIFunctor>             TSAVIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, MSAVIFunctor>             MSAVIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, MSAVI2Functor>            MSAVI2FilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, GEMIFunctor>              GEMIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, IPVIFunctor>              IPVIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, LAIFromNDVILogFunctor>    LAIFromNDVILogFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, LAIFromReflLinearFunctor> LAIFromReflLinearFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, LAIFromNDVIFormoFunctor>  LAIFromNDVIFormoFilterType;
-
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, IRFunctor>                  RIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, ICFunctor>                  CIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, IBFunctor>                  BIFilterType;
-  typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, IB2Functor>                 BI2FilterType;
-
-  struct indiceSpec
+  using InputType  = FloatVectorImageType::InternalPixelType;
+  using OutputType = FloatImageType::PixelType;
+
+  using RadiometricIndexType    = otb::Functor::RadiometricIndex<InputType, OutputType>;
+  using IndicesStackFunctorType = otb::Functor::IndicesStackFunctor<RadiometricIndexType>;
+
+  class indiceSpec
   {
+  public:
+    indiceSpec(std::string k, std::string i, RadiometricIndexType* ind) : key(k), item(i), indice(ind)
+    {
+    }
     std::string key;
     std::string item;
-    std::string description;
-    std::string type;
-    std::string chan1;
-    std::string chan2;
-    std::string chan3;
+    std::unique_ptr<RadiometricIndexType> indice;
   };
 
 
@@ -153,46 +94,52 @@ private:
     AddParameter(ParameterType_Int,  "channels.blue",  "Blue Channel");
     SetParameterDescription("channels.blue", "Blue channel index");
     SetDefaultParameterInt("channels.blue", 1);
+    SetMinimumParameterIntValue("channels.blue", 1);
+
     AddParameter(ParameterType_Int,  "channels.green",  "Green Channel");
     SetParameterDescription("channels.green", "Green channel index");
     SetDefaultParameterInt("channels.green", 1);
+    SetMinimumParameterIntValue("channels.green", 1);
+
     AddParameter(ParameterType_Int,  "channels.red",  "Red Channel");
     SetParameterDescription("channels.red", "Red channel index");
     SetDefaultParameterInt("channels.red", 1);
+    SetMinimumParameterIntValue("channels.red", 1);
+
     AddParameter(ParameterType_Int,  "channels.nir",  "NIR Channel");
     SetParameterDescription("channels.nir", "NIR channel index");
     SetDefaultParameterInt("channels.nir", 1);
+    SetMinimumParameterIntValue("channels.nir", 1);
+
     AddParameter(ParameterType_Int,  "channels.mir",  "Mir Channel");
     SetParameterDescription("channels.mir", "Mir channel index");
     SetDefaultParameterInt("channels.mir", 1);
-    //AddParameter(ParameterType_Int,  "channels.rho860",  "Rho860 Channel");
-    //SetParameterDescription("channels.rho860", "860nm band channel index");
-    //SetDefaultParameterInt("channels.rho860", 1);
-    //AddParameter(ParameterType_Int,  "channels.rho1240",  "Rho1240 Channel");
-    //SetParameterDescription("channels.rho1240", "1240nm band channel index");
-    //SetDefaultParameterInt("channels.rho1240", 1);
+    SetMinimumParameterIntValue("channels.mir", 1);
 
     AddParameter(ParameterType_ListView,  "list", "Available Radiometric Indices");
     SetParameterDescription("list",
-        "List of available radiometric indices with their relevant channels in brackets:\n\n"
-        "* Vegetation:NDVI - Normalized difference vegetation index (Red, NIR)\n"
-        "* Vegetation:TNDVI - Transformed normalized difference vegetation index (Red, NIR)\n"
-        "* Vegetation:RVI - Ratio vegetation index (Red, NIR)\n"
-        "* Vegetation:SAVI - Soil adjusted vegetation index (Red, NIR)\n"
-        "* Vegetation:TSAVI - Transformed soil adjusted vegetation index (Red, NIR)\n"
-        "* Vegetation:MSAVI - Modified soil adjusted vegetation index (Red, NIR)\n"
-        "* Vegetation:MSAVI2 - Modified soil adjusted vegetation index 2 (Red, NIR)\n"
-        "* Vegetation:GEMI - Global environment monitoring index (Red, NIR)\n"
-        "* Vegetation:IPVI - Infrared percentage vegetation index (Red, NIR)\n"
-        "* Water:NDWI - Normalized difference water index (Gao 1996) (NIR, MIR)\n"
-        "* Water:NDWI2 - Normalized difference water index (Mc Feeters 1996) (Green, NIR)\n"
-        "* Water:MNDWI - Modified normalized difference water index (Xu 2006) (Green, MIR)\n"
-        "* Water:NDPI - Normalized difference pond index (Lacaux et al.) (MIR, Green)\n"
-        "* Water:NDTI - Normalized difference turbidity index (Lacaux et al.) (Red, Green)\n"
-        "* Soil:RI - Redness index (Red, Green)\n"
-        "* Soil:CI - Color index (Red, Green)\n"
-        "* Soil:BI - Brightness index (Red, Green)\n"
-        "* Soil:BI2 - Brightness index 2 (NIR, Red, Green)");
+                            "List of available radiometric indices with their relevant channels in brackets:\n\n"
+                            "* Vegetation:NDVI - Normalized difference vegetation index (Red, NIR)\n"
+                            "* Vegetation:TNDVI - Transformed normalized difference vegetation index (Red, NIR)\n"
+                            "* Vegetation:RVI - Ratio vegetation index (Red, NIR)\n"
+                            "* Vegetation:SAVI - Soil adjusted vegetation index (Red, NIR)\n"
+                            "* Vegetation:TSAVI - Transformed soil adjusted vegetation index (Red, NIR)\n"
+                            "* Vegetation:MSAVI - Modified soil adjusted vegetation index (Red, NIR)\n"
+                            "* Vegetation:MSAVI2 - Modified soil adjusted vegetation index 2 (Red, NIR)\n"
+                            "* Vegetation:GEMI - Global environment monitoring index (Red, NIR)\n"
+                            "* Vegetation:IPVI - Infrared percentage vegetation index (Red, NIR)\n"
+                            "* Vegetation:LAIFromNDVILog - Leaf Area Index from log NDVI (Red, NIR)\n"
+                            "* Vegetation::LAIFromReflLinear - Leaf Area Index from reflectances with linear combination (Red, NIR)\n"
+                            "* Vegetation::LAIFromNDVIFormo - Leaf Area Index from Formosat 2  TOC (Red, NIR)\n"
+                            "* Water:NDWI - Normalized difference water index (Gao 1996) (NIR, MIR)\n"
+                            "* Water:NDWI2 - Normalized difference water index (Mc Feeters 1996) (Green, NIR)\n"
+                            "* Water:MNDWI - Modified normalized difference water index (Xu 2006) (Green, MIR)\n"
+                            "* Water:NDTI - Normalized difference turbidity index (Lacaux et al.) (Red, Green)\n"
+                            "* Soil:RI - Redness index (Red, Green)\n"
+                            "* Soil:CI - Color index (Red, Green)\n"
+                            "* Soil:BI - Brightness index (Red, Green)\n"
+                            "* Soil:BI2 - Brightness index 2 (NIR, Red, Green)\n"
+                            "* BuiltUp:ISU - Built Surfaces Index (NIR,Red) ");
 
     AddRAMParameter();
 
@@ -205,392 +152,118 @@ private:
 
     m_Map.clear();
 
-    // Add Available choices
-    indiceSpec s_NDVI;
-    s_NDVI.key   = "list.ndvi";
-    s_NDVI.item  = "Vegetation:NDVI";
-    s_NDVI.description = "";
-    s_NDVI.type  = "NDVI";
-    s_NDVI.chan1 = "red";
-    s_NDVI.chan2 = "nir";
-    s_NDVI.chan3 = "";
-    m_Map.push_back(s_NDVI);
-
-    indiceSpec s_TNDVI;
-    s_TNDVI.key   = "list.tndvi";
-    s_TNDVI.item  = "Vegetation:TNDVI";
-    s_TNDVI.description = "";
-    s_TNDVI.type  = "TNDVI";
-    s_TNDVI.chan1 = "red";
-    s_TNDVI.chan2 = "nir";
-    s_TNDVI.chan3 = "";
-    m_Map.push_back(s_TNDVI);
-
-    indiceSpec s_RVI;
-    s_RVI.key   = "list.rvi";
-    s_RVI.item  = "Vegetation:RVI";
-    s_RVI.description = "";
-    s_RVI.type  = "RVI";
-    s_RVI.chan1 = "red";
-    s_RVI.chan2 = "nir";
-    s_RVI.chan3 = "";
-    m_Map.push_back(s_RVI);
-
-    indiceSpec s_SAVI;
-    s_SAVI.key   = "list.savi";
-    s_SAVI.item  = "Vegetation:SAVI";
-    s_SAVI.description = "";
-    s_SAVI.type  = "SAVI";
-    s_SAVI.chan1 = "red";
-    s_SAVI.chan2 = "nir";
-    s_SAVI.chan3 = "";
-    m_Map.push_back(s_SAVI);
-
-    indiceSpec s_TSAVI;
-    s_TSAVI.key   = "list.tsavi";
-    s_TSAVI.item  = "Vegetation:TSAVI";
-    s_TSAVI.description = "";
-    s_TSAVI.type  = "TSAVI";
-    s_TSAVI.chan1 = "red";
-    s_TSAVI.chan2 = "nir";
-    s_TSAVI.chan3 = "";
-    m_Map.push_back(s_TSAVI);
-
-    indiceSpec s_MSAVI;
-    s_MSAVI.key   = "list.msavi";
-    s_MSAVI.item  = "Vegetation:MSAVI";
-    s_MSAVI.description = "";
-    s_MSAVI.type  = "MSAVI";
-    s_MSAVI.chan1 = "red";
-    s_MSAVI.chan2 = "nir";
-    s_MSAVI.chan3 = "";
-    m_Map.push_back(s_MSAVI);
-
-    indiceSpec s_MSAVI2;
-    s_MSAVI2.key   = "list.msavi2";
-    s_MSAVI2.item  = "Vegetation:MSAVI2";
-    s_MSAVI2.description = "";
-    s_MSAVI2.type  = "MSAVI2";
-    s_MSAVI2.chan1 = "red";
-    s_MSAVI2.chan2 = "nir";
-    s_MSAVI2.chan3 = "";
-    m_Map.push_back(s_MSAVI2);
-
-    indiceSpec s_GEMI;
-    s_GEMI.key   = "list.gemi";
-    s_GEMI.item  = "Vegetation:GEMI";
-    s_GEMI.description = "";
-    s_GEMI.type  = "GEMI";
-    s_GEMI.chan1 = "red";
-    s_GEMI.chan2 = "nir";
-    s_GEMI.chan3 = "";
-    m_Map.push_back(s_GEMI);
-
-    indiceSpec s_IPVI;
-    s_IPVI.key   = "list.ipvi";
-    s_IPVI.item  = "Vegetation:IPVI";
-    s_IPVI.description = "";
-    s_IPVI.type  = "IPVI";
-    s_IPVI.chan1 = "red";
-    s_IPVI.chan2 = "nir";
-    s_IPVI.chan3 = "";
-    m_Map.push_back(s_IPVI);
-
-    indiceSpec s_LAIFromNDVILog;
-    s_LAIFromNDVILog.key   = "list.laindvilog";
-    s_LAIFromNDVILog.item  = "Vegetation:LAIFromNDVILog";
-    s_LAIFromNDVILog.description = "";
-    s_LAIFromNDVILog.type  = "LAIFromNDVILog";
-    s_LAIFromNDVILog.chan1 = "red";
-    s_LAIFromNDVILog.chan2 = "nir";
-    s_LAIFromNDVILog.chan3 = "";
-    m_Map.push_back(s_LAIFromNDVILog);
-
-    indiceSpec s_LAIFromReflLinear;
-    s_LAIFromReflLinear.key   = "list.lairefl";
-    s_LAIFromReflLinear.item  = "Vegetation:LAIFromReflLinear";
-    s_LAIFromReflLinear.description = "";
-    s_LAIFromReflLinear.type  = "LAIFromReflLinear";
-    s_LAIFromReflLinear.chan1 = "red";
-    s_LAIFromReflLinear.chan2 = "nir";
-    s_LAIFromReflLinear.chan3 = "";
-    m_Map.push_back(s_LAIFromReflLinear);
-
-    indiceSpec s_LAIFromNDVIFormo;
-    s_LAIFromNDVIFormo.key   = "list.laindviformo";
-    s_LAIFromNDVIFormo.item  = "Vegetation:LAIFromNDVIFormo";
-    s_LAIFromNDVIFormo.description = "";
-    s_LAIFromNDVIFormo.type  = "LAIFromNDVIFormo";
-    s_LAIFromNDVIFormo.chan1 = "red";
-    s_LAIFromNDVIFormo.chan2 = "nir";
-    s_LAIFromNDVIFormo.chan3 = "";
-    m_Map.push_back(s_LAIFromNDVIFormo);
-
-    indiceSpec s_NDWI;
-    s_NDWI.key   = "list.ndwi";
-    s_NDWI.item  = "Water:NDWI";
-    s_NDWI.description = "";
-    s_NDWI.type  = "NDWI";
-    s_NDWI.chan1 = "nir";
-    s_NDWI.chan2 = "mir";
-    s_NDWI.chan3 = "";
-    m_Map.push_back(s_NDWI);
-
-    indiceSpec s_NDWI2;
-    s_NDWI2.key   = "list.ndwi2";
-    s_NDWI2.item  = "Water:NDWI2";
-    s_NDWI2.description = "";
-    s_NDWI2.type  = "NDWI2";
-    s_NDWI2.chan1 = "green";
-    s_NDWI2.chan2 = "nir";
-    s_NDWI2.chan3 = "";
-    m_Map.push_back(s_NDWI2);
-
-    indiceSpec s_MNDWI;
-    s_MNDWI.key   = "list.mndwi";
-    s_MNDWI.item  = "Water:MNDWI";
-    s_MNDWI.description = "";
-    s_MNDWI.type  = "MNDWI";
-    s_MNDWI.chan1 = "green";
-    s_MNDWI.chan2 = "mir";
-    s_MNDWI.chan3 = "";
-    m_Map.push_back(s_MNDWI);
-
-    indiceSpec s_NDPI;
-    s_NDPI.key   = "list.ndpi";
-    s_NDPI.item  = "Water:NDPI";
-    s_NDPI.description = "";
-    s_NDPI.type  = "NDPI";
-    s_NDPI.chan1 = "mir";
-    s_NDPI.chan2 = "green";
-    s_NDPI.chan3 = "";
-    m_Map.push_back(s_NDPI);
-
-    indiceSpec s_NDTI;
-    s_NDTI.key   = "list.ndti";
-    s_NDTI.item  = "Water:NDTI";
-    s_NDTI.description = "";
-    s_NDTI.type  = "NDTI";
-    s_NDTI.chan1 = "red";
-    s_NDTI.chan2 = "green";
-    s_NDTI.chan3 = "";
-    m_Map.push_back(s_NDTI);
-
-    indiceSpec s_SRWI;
-    s_SRWI.key   = "list.srwi";
-    s_SRWI.item  = "Water:SRWI";
-    s_SRWI.description = "";
-    s_SRWI.type  = "SRWI";
-    s_SRWI.chan1 = "rho860";
-    s_SRWI.chan2 = "rho1240";
-    s_SRWI.chan3 = "";
-    //m_Map.push_back(s_SRWI);
-
-    indiceSpec s_RI;
-    s_RI.key   = "list.ri";
-    s_RI.item  = "Soil:RI";
-    s_RI.description = "";
-    s_RI.type  = "RI";
-    s_RI.chan1 = "red";
-    s_RI.chan2 = "green";
-    s_RI.chan3 = "";
-    m_Map.push_back(s_RI);
-
-    indiceSpec s_CI;
-    s_CI.key   = "list.ci";
-    s_CI.item  = "Soil:CI";
-    s_CI.description = "";
-    s_CI.type  = "CI";
-    s_CI.chan1 = "red";
-    s_CI.chan2 = "green";
-    s_CI.chan3 = "";
-    m_Map.push_back(s_CI);
-
-    indiceSpec s_BI;
-    s_BI.key   = "list.bi";
-    s_BI.item  = "Soil:BI";
-    s_BI.description = "";
-    s_BI.type  = "BI";
-    s_BI.chan1 = "red";
-    s_BI.chan2 = "green";
-    s_BI.chan3 = "";
-    m_Map.push_back(s_BI);
-
-    indiceSpec s_BI2;
-    s_BI2.key   = "list.bi2";
-    s_BI2.item  = "Soil:BI2";
-    s_BI2.description = "";
-    s_BI2.type  = "BI2";
-    s_BI2.chan1 = "nir";
-    s_BI2.chan2 = "red";
-    s_BI2.chan3 = "green";
-    m_Map.push_back(s_BI2);
+    m_Map.push_back({"list.ndvi", "Vegetation:NDVI", new otb::Functor::NDVI<InputType, OutputType>()});
+    m_Map.push_back({"list.tndvi", "Vegetation:TNDVI", new otb::Functor::TNDVI<InputType, OutputType>()});
+    m_Map.push_back({"list.rdvi", "Vegetation:RVI", new otb::Functor::RVI<InputType, OutputType>()});
+    m_Map.push_back({"list.savi", "Vegetation:SAVI", new otb::Functor::SAVI<InputType, OutputType>()});
+    m_Map.push_back({"list.tsavi", "Vegetation:TSAVI", new otb::Functor::TSAVI<InputType, OutputType>()});
+    m_Map.push_back({"list.msavi", "Vegetation:MSAVI", new otb::Functor::MSAVI<InputType, OutputType>()});
+    m_Map.push_back({"list.msavi2", "Vegetation:MSAVI2", new otb::Functor::MSAVI2<InputType, OutputType>()});
+    m_Map.push_back({"list.gemi", "Vegetation:GEMI", new otb::Functor::GEMI<InputType, OutputType>()});
+    m_Map.push_back({"list.ipvi", "Vegetation:IPVI", new otb::Functor::IPVI<InputType, OutputType>()});
+    m_Map.push_back({"list.laindvilog", "Vegetation:LAIFromNDVILog", new otb::Functor::LAIFromNDVILogarithmic<InputType, OutputType>()});
+    m_Map.push_back({"list.lairefl", "Vegetation:LAIFromReflLinear", new otb::Functor::LAIFromReflectancesLinear<InputType, OutputType>()});
+    m_Map.push_back({"list.laindviformo", "Vegetation:LAIFromNDVIFormo", new otb::Functor::LAIFromNDVIFormosat2Functor<InputType, OutputType>()});
+    m_Map.push_back({"list.ndwi", "Water:NDWI", new otb::Functor::NDWI<InputType, OutputType>()});
+    m_Map.push_back({"list.ndwi2", "Water:NDWI2", new otb::Functor::NDWI2<InputType, OutputType>()});
+    m_Map.push_back({"list.mndwi", "Water:MNDWI", new otb::Functor::MNDWI<InputType, OutputType>()});
+    m_Map.push_back({"list.ndti", "Water:NDTI", new otb::Functor::NDTI<InputType, OutputType>()});
+    m_Map.push_back({"list.ri", "Soil:RI", new otb::Functor::RI<InputType, OutputType>()});
+    m_Map.push_back({"list.ci", "Soil:CI", new otb::Functor::CI<InputType, OutputType>()});
+    m_Map.push_back({"list.bi", "Soil:BI", new otb::Functor::BI<InputType, OutputType>()});
+    m_Map.push_back({"list.bi2", "Soil:BI2", new otb::Functor::BI2<InputType, OutputType>()});
+    m_Map.push_back({"list.isu", "BuiltUp:ISU", new otb::Functor::ISU<InputType, OutputType>()});
 
     ClearChoices("list");
+
     for ( unsigned int i=0; i<m_Map.size(); i++ )
       {
       AddChoice(m_Map[i].key, m_Map[i].item);
-      //SetParameterDescription(m_Map[i].item, m_Map[i].description);
       }
   }
 
-  void DoUpdateParameters() override
+  // Compute required bands for selected indices
+  std::set<CommonBandNames> GetRequiredBands()
   {
-    //Nothing to do here
-  }
+    std::set<CommonBandNames> required;
 
-#define otbRadiometricWaterIndicesMacro( type )                           \
-    {                                                                     \
-    type##FilterType::Pointer l_##type##Filter = type##FilterType::New(); \
-    std::ostringstream oss;                                               \
-    oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan1;         \
-    l_##type##Filter->GetFunctor().SetIndex1(this->GetParameterInt(oss.str()));\
-    oss.str("");                                                          \
-    oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan2;         \
-    l_##type##Filter->GetFunctor().SetIndex2(this->GetParameterInt(oss.str()));\
-    l_##type##Filter->SetInput(inImage);                                  \
-    m_FilterList->PushBack( l_##type##Filter );                           \
-    m_ImageList->PushBack( l_##type##Filter->GetOutput() );               \
-    otbAppLogINFO(<< m_Map[GetSelectedItems("list")[idx]].item << " added.");\
-    }
-
-#define otbRadiometricVegetationIndicesMacro( type )                      \
-    {                                                                     \
-    type##FilterType::Pointer l_##type##Filter = type##FilterType::New(); \
-    std::ostringstream oss;                                               \
-    oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan1;         \
-    l_##type##Filter->GetFunctor().SetRedIndex(this->GetParameterInt(oss.str())); \
-    oss.str("");                                                          \
-    oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan2;         \
-    l_##type##Filter->GetFunctor().SetNIRIndex(this->GetParameterInt(oss.str())); \
-    l_##type##Filter->SetInput(inImage);                                  \
-    m_FilterList->PushBack( l_##type##Filter );                           \
-    m_ImageList->PushBack( l_##type##Filter->GetOutput() );               \
-    otbAppLogINFO(<<m_Map[GetSelectedItems("list")[idx]].item<<" added.");\
+    for (unsigned int idx = 0; idx < GetSelectedItems("list").size(); ++idx)
+    {
+      auto requiredForCurrentIndice = m_Map[GetSelectedItems("list")[idx]].indice->GetRequiredBands();
+      required.insert(requiredForCurrentIndice.begin(), requiredForCurrentIndice.end());
     }
+    return required;
+  }
 
-#define otbRadiometricSoilIndicesMacro( type )                            \
-    {                                                                     \
-    type##FilterType::Pointer l_##type##Filter = type##FilterType::New(); \
-    std::ostringstream oss;                                               \
-    oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan1;         \
-    l_##type##Filter->GetFunctor().SetRedIndex(this->GetParameterInt(oss.str()));\
-    oss.str("");                                                          \
-    oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan2;         \
-    l_##type##Filter->GetFunctor().SetGreenIndex(this->GetParameterInt(oss.str()));\
-    l_##type##Filter->SetInput(inImage);                                  \
-    m_FilterList->PushBack( l_##type##Filter );                           \
-    m_ImageList->PushBack( l_##type##Filter->GetOutput() );               \
-    otbAppLogINFO(<< m_Map[GetSelectedItems("list")[idx]].item << " added.");\
-    }
+  void DoUpdateParameters() override
+  {
+    //Nothing to do here
+  }
 
   void DoExecute() override
   {
+    // Retrieve number of bands of input image
+    unsigned int nbChan = GetParameterImage("in")->GetNumberOfComponentsPerPixel();
 
-    int nbChan = GetParameterImage("in")->GetNumberOfComponentsPerPixel();
+    // Derive required bands from selected indices
+    auto requiredBands = GetRequiredBands();
 
-    if (   (this->GetParameterInt("channels.blue")  <= nbChan)
-        && (this->GetParameterInt("channels.green") <= nbChan)
-        && (this->GetParameterInt("channels.red")   <= nbChan)
-        && (this->GetParameterInt("channels.nir")   <= nbChan)
-        && (this->GetParameterInt("channels.mir")   <= nbChan))
-      {
+    // Map to store association between bands and indices
+    std::map<CommonBandNames, size_t> bandIndicesMap;
 
-      m_FilterList = FilterListType::New();
-      m_ImageList  = ImageListType::New();
-      m_Concatener = ImageListToVectorImageFilterType::New();
-
-      FloatVectorImageType* inImage = GetParameterImage("in");
+    // Lambda that will:
+    // - Check if band is required,
+    // - Check band index range,
+    // - Populate the bandIndicesMap
+    auto bandChecker = [this, requiredBands, nbChan](std::map<CommonBandNames, size_t>& indicesMap, const CommonBandNames& band, const std::string& key) {
+      if (requiredBands.find(band) != requiredBands.end())
+      {
+        unsigned int idx = this->GetParameterInt(key);
 
-      for (unsigned int idx = 0; idx < GetSelectedItems("list").size(); ++idx)
+        if (idx > nbChan)
         {
-
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:NDVI")
-          otbRadiometricVegetationIndicesMacro(NDVI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:TNDVI")
-          otbRadiometricVegetationIndicesMacro(TNDVI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:RVI")
-          otbRadiometricVegetationIndicesMacro(RVI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:SAVI")
-          otbRadiometricVegetationIndicesMacro(SAVI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:TSAVI")
-          otbRadiometricVegetationIndicesMacro(TSAVI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:MSAVI")
-          otbRadiometricVegetationIndicesMacro(MSAVI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:MSAVI2")
-          otbRadiometricVegetationIndicesMacro(MSAVI2);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:GEMI")
-          otbRadiometricVegetationIndicesMacro(GEMI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:IPVI")
-          otbRadiometricVegetationIndicesMacro(IPVI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:LAIFromNDVILog")
-          otbRadiometricVegetationIndicesMacro(LAIFromNDVILog);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:LAIFromReflLinear")
-          otbRadiometricVegetationIndicesMacro(LAIFromReflLinear);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:LAIFromNDVIFormo")
-          otbRadiometricVegetationIndicesMacro(LAIFromNDVIFormo);
-
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Water:NDWI")
-          otbRadiometricWaterIndicesMacro(NDWI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Water:NDWI2")
-          otbRadiometricWaterIndicesMacro(NDWI2);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Water:MNDWI")
-          otbRadiometricWaterIndicesMacro(MNDWI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Water:NDPI")
-          otbRadiometricWaterIndicesMacro(NDPI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Water:NDTI")
-          otbRadiometricWaterIndicesMacro(NDTI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Water:SRWI")
-          otbRadiometricWaterIndicesMacro(SRWI);
-
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Soil:RI")
-          otbRadiometricSoilIndicesMacro(RI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Soil:CI")
-          otbRadiometricSoilIndicesMacro(CI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Soil:BI")
-          otbRadiometricSoilIndicesMacro(BI);
-        if (m_Map[GetSelectedItems("list")[idx]].item == "Soil:BI2")
-          {
-          BI2FilterType::Pointer l_BI2Filter = BI2FilterType::New();
-          std::ostringstream oss;
-          oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan1;
-          l_BI2Filter->GetFunctor().SetNIRIndex(this->GetParameterInt(oss.str()));
-          oss.str("");
-          oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan2;
-          l_BI2Filter->GetFunctor().SetRedIndex(this->GetParameterInt(oss.str()));
-          oss.str("");
-          oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan3;
-          l_BI2Filter->GetFunctor().SetGreenIndex(this->GetParameterInt(oss.str()));
-          l_BI2Filter->SetInput(inImage);
-          m_FilterList->PushBack( l_BI2Filter );
-          m_ImageList->PushBack( l_BI2Filter->GetOutput() );
-          otbAppLogINFO(<< m_Map[GetSelectedItems("list")[idx]].item << " added.");
-          }
-
+          otbAppLogFATAL(<< "Index for band " << key << " exceeds the number of channels in image (" << nbChan << ")");
         }
-
-      if( m_ImageList->Size() == 0 )
+        else
         {
-        itkExceptionMacro(<< "No indices selected...");
+          indicesMap[band] = idx;
         }
+      }
+    };
 
-      m_Concatener->SetInput( m_ImageList );
-      m_Concatener->UpdateOutputInformation();
+    // Call lambda for each possible band
+    bandChecker(bandIndicesMap, CommonBandNames::BLUE, "channels.blue");
+    bandChecker(bandIndicesMap, CommonBandNames::GREEN, "channels.green");
+    bandChecker(bandIndicesMap, CommonBandNames::RED, "channels.red");
+    bandChecker(bandIndicesMap, CommonBandNames::NIR, "channels.nir");
+    bandChecker(bandIndicesMap, CommonBandNames::MIR, "channels.mir");
 
-      SetParameterOutputImage("out", m_Concatener->GetOutput());
-      }
-    else
-      {
-      itkExceptionMacro(<< "At least one needed channel has an invalid index");
+    std::vector<RadiometricIndexType*> indices;
+
+    // Find selected indices
+    for (unsigned int idx = 0; idx < GetSelectedItems("list").size(); ++idx)
+    {
+      // Retrieve the indice instance
+      indices.push_back(m_Map[GetSelectedItems("list")[idx]].indice.get());
+
+      // And set bands using the band map
+      indices.back()->SetBandsIndices(bandIndicesMap);
       }
 
-  }
+      // Build a composite indices functor to compute all indices at
+      // once
+      auto compositeFunctor = IndicesStackFunctorType(indices);
 
-  FilterListType::Pointer                   m_FilterList;
-  ImageListType::Pointer                    m_ImageList;
-  ImageListToVectorImageFilterType::Pointer m_Concatener;
-  std::vector<indiceSpec>                   m_Map;
+      // Build and plug functor filter
+      auto filter = NewFunctorFilter(compositeFunctor);
+      filter->SetInputs(GetParameterImage("in"));
+      SetParameterOutputImage("out", filter->GetOutput());
+
+      // Call register pipeline to allow streaming and garbage collection
+      RegisterPipeline();
+  }
 
+  std::vector<indiceSpec> m_Map;
 };
 
 }
diff --git a/Modules/Applications/AppIndices/otb-module.cmake b/Modules/Applications/AppIndices/otb-module.cmake
index 6133056e60beb13dd6e2f8ed203274ab1ae3a751..3c100b67faa40cd069df1c1ae1064023ddcc74f4 100644
--- a/Modules/Applications/AppIndices/otb-module.cmake
+++ b/Modules/Applications/AppIndices/otb-module.cmake
@@ -24,7 +24,7 @@ otb_module(OTBAppIndices
   DEPENDS
     OTBIndices
     OTBApplicationEngine
-    OTBObjectList
+    OTBFunctor
   TEST_DEPENDS
     OTBTestKernel
     OTBCommandLine
diff --git a/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx
index 36ff3a27e097f3791324f94f9aad7cab588518cf..e604e8e4b656317f9c8eb2d2233aefe4b5e54e6b 100644
--- a/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx
+++ b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx
@@ -140,7 +140,7 @@ private:
       iss >> x >> y >> lon >> lat;
       z = otb::DEMHandler::Instance()->GetHeightAboveEllipsoid(lon,lat);
 
-      otbAppLogINFO("Adding tie point x="<<x<<", y="<<y<<", z="<<z<<", lon="<<lon<<", lat="<<lat);
+      otbAppLogDEBUG("Adding tie point x="<<x<<", y="<<y<<", z="<<z<<", lon="<<lon<<", lat="<<lat);
 
       Point2DType p1;
       Point3DType p2;
diff --git a/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx b/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx
index 4d3b243cf57f2137d2317f3299659702e7fd0d29..6c1346b288e1423a6bd5e2748c0bff2606c57195 100644
--- a/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx
+++ b/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx
@@ -118,9 +118,12 @@ private:
     otb::SensorModelAdapter::Pointer sm_ref = otb::SensorModelAdapter::New();
 
     // Read the geom file
-    sm->ReadGeomFile(GetParameterString("ingeom"));
+    bool isRead = sm->ReadGeomFile(GetParameterString("ingeom"));
     sm_ref->ReadGeomFile(GetParameterString("ingeom"));
 
+    if (!isRead)
+      otbAppLogFATAL("Can't read the input geom file!");
+
     // Setup the DEM Handler
     otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev");
 
@@ -156,7 +159,7 @@ private:
 
       z = otb::DEMHandler::Instance()->GetHeightAboveEllipsoid(lon,lat);
 
-      otbAppLogINFO("Adding tie point x="<<x<<", y="<<y<<", z="<<z<<", lon="<<lon<<", lat="<<lat);
+      otbAppLogDEBUG("Adding tie point x="<<x<<", y="<<y<<", z="<<z<<", lon="<<lon<<", lat="<<lat);
 
       sm->AddTiePoint(x,y,z,lon,lat);
 
@@ -210,6 +213,7 @@ private:
     ofs<<"#ref_lon ref_lat elevation predicted_lon predicted_lat predicted_elev x_error_ref(meters) y_error_ref(meters) global_error_ref(meters) x_error(meters) y_error(meters) global_error(meters)"<<std::endl;
     }
 
+  size_t validPoints=0;
   for(TiePointsType::const_iterator it = tiepoints.begin();
       it!=tiepoints.end(); ++it)
     {
@@ -217,6 +221,22 @@ private:
     sm->ForwardTransformPoint(it->first[0],it->first[1],it->first[2],tmpPoint[0],tmpPoint[1],tmpPoint[2]);
     sm_ref->ForwardTransformPoint(it->first[0],it->first[1],it->first[2],tmpPoint_ref[0],tmpPoint_ref[1],tmpPoint_ref[2]);
 
+    if (!(std::isfinite(tmpPoint[0]) &&
+          std::isfinite(tmpPoint[1]) &&
+          std::isfinite(tmpPoint[2])))
+      {
+      otbAppLogWARNING("Can't project tie point at ["<<it->first[0]<<","<<it->first[1]<<","<<it->first[2]<<"] with optimized model!");
+      continue;
+      }
+
+    if (!(std::isfinite(tmpPoint_ref[0]) &&
+          std::isfinite(tmpPoint_ref[1]) &&
+          std::isfinite(tmpPoint_ref[2])))
+      {
+      otbAppLogWARNING("Can't project tie point at ["<<it->first[0]<<","<<it->first[1]<<","<<it->first[2]<<"] with original model!");
+      continue;
+      }
+
     tmpPoint = rsTransform->TransformPoint(tmpPoint);
     tmpPoint_ref = rsTransform->TransformPoint(tmpPoint_ref);
 
@@ -257,29 +277,34 @@ private:
     meanx_ref += xerror_ref;
     meany_ref += yerror_ref;
 
+    validPoints++;
+    }
 
+  if (!validPoints)
+    {
+    otbAppLogFATAL("No valid points to compute RMSE !");
     }
 
-  rmse/=tiepoints.size();
+  rmse/=validPoints;
 
-  rmsex/=tiepoints.size();
+  rmsex/=validPoints;
 
-  rmsey/=tiepoints.size();
+  rmsey/=validPoints;
 
 
-  meanx/=tiepoints.size();
-  meany/=tiepoints.size();
+  meanx/=validPoints;
+  meany/=validPoints;
 
 
-  rmse_ref/=tiepoints.size();
+  rmse_ref/=validPoints;
 
-  rmsex_ref/=tiepoints.size();
+  rmsex_ref/=validPoints;
 
-  rmsey_ref/=tiepoints.size();
+  rmsey_ref/=validPoints;
 
 
-  meanx_ref/=tiepoints.size();
-  meany_ref/=tiepoints.size();
+  meanx_ref/=validPoints;
+  meany_ref/=validPoints;
 
 
   double stdevx = std::sqrt(rmsex - meanx * meanx);
diff --git a/Modules/Applications/AppProjection/test/CMakeLists.txt b/Modules/Applications/AppProjection/test/CMakeLists.txt
index 7672754ad00584ffbc094193154d58f52e1fecdd..28b843b2157b84c32720f2a218302b9e36942f2b 100644
--- a/Modules/Applications/AppProjection/test/CMakeLists.txt
+++ b/Modules/Applications/AppProjection/test/CMakeLists.txt
@@ -151,6 +151,14 @@ otb_test_application(NAME  apTvPrConvertCartoToGeoPoint
 
 
 #----------- GenerateRPCSensorModel TESTS ----------------
+# Remove baseline for OSSIM >= 2.2, as ossimRPCProjection.optimizeFit() is broken
+set(VALID_CONDITION)
+if(OTB_OSSIM_VERSION LESS 20200)
+set(VALID_CONDITION
+  VALID --compare-ascii ${EPSILON_3}
+        ${BASELINE_FILES}/apTvPrGenerateRPCSensorModelGeomOutput.geom
+        ${TEMP}/apTvPrGenerateRPCSensorModelGeomOutput.geom)
+endif()
 otb_test_application(NAME  apTvPrGenerateRPCSensorModel
                      APP  GenerateRPCSensorModel
                      OPTIONS -inpoints  ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500_in_tie_points.txt
@@ -160,9 +168,7 @@ otb_test_application(NAME  apTvPrGenerateRPCSensorModel
                              -map utm -map.utm.zone 31 -map.utm.northhem 1
                              -elev.dem ${INPUTDATA}/DEM/srtm_directory
                              -elev.geoid ${INPUTDATA}/DEM/egm96.grd
-                     VALID   --compare-ascii ${EPSILON_3}
-                             ${BASELINE_FILES}/apTvPrGenerateRPCSensorModelGeomOutput.geom
-                             ${TEMP}/apTvPrGenerateRPCSensorModelGeomOutput.geom)
+                     ${VALID_CONDITION})
 
 
 #----------- GridBasedImageResampling TESTS ----------------
@@ -281,17 +287,24 @@ otb_test_application(NAME  apTvPrRefineSensorModel
                              -elev.geoid ${INPUTDATA}/DEM/egm96.grd
                      VALID   --compare-ascii 0.1
                              ${BASELINE_FILES}/apTvPrRefineSensorModelGeomOutput.geom
-                             ${TEMP}/apTvPrRefineSensorModelGeomOutput.geom)
+                             ${TEMP}/apTvPrRefineSensorModelGeomOutput.geom
+                             --ignore-lines-with 1 support_data.)
+
+# Remove baseline for OSSIM >= 2, as ossimRPCProjection.optimizeFit() is broken
+set(VALID_CONDITION)
+if(OTB_OSSIM_VERSION LESS 20200)
+set(VALID_CONDITION
+  VALID --compare-ascii 0.1
+        ${BASELINE_FILES}/apTvPrRefineSensorModelGeomOutput2.geom
+        ${TEMP}/apTvPrRefineSensorModelGeomOutput2.geom)
+endif()
 
-                			  
 otb_test_application(NAME  apTvPrRefineSensorModel2
                      APP  RefineSensorModel
                      OPTIONS -ingeom    ${INPUTDATA}/s1a-iw-grd-vh-20150210t060009-20150210t060034-004557-0059a3-002.geom 
                              -inpoints  ${INPUTDATA}/pts_idV5.txt
                  	         -outgeom   ${TEMP}/apTvPrRefineSensorModelGeomOutput2.geom
-                     VALID   --compare-ascii 0.1
-                             ${BASELINE_FILES}/apTvPrRefineSensorModelGeomOutput2.geom
-                             ${TEMP}/apTvPrRefineSensorModelGeomOutput2.geom)
+                     ${VALID_CONDITION})
                              
 
 
@@ -330,7 +343,8 @@ otb_test_application(NAME apTvPrConvertSensorToGeoPoint
                      TESTENVOPTIONS ${TEMP}/apTvPrConvertSensorToGeoPoint.txt
                      VALID  --compare-ascii ${EPSILON_7}
                         ${BASELINE_FILES}/apTvPrConvertSensorToGeoPoint.txt
-                        ${TEMP}/apTvPrConvertSensorToGeoPoint.txt)
+                        ${TEMP}/apTvPrConvertSensorToGeoPoint.txt
+                        --ignore-lines-with 2 town country)
 
 
 #----------- Superimpose TESTS ----------------
diff --git a/Modules/Applications/AppSARPolarMatrixConvert/test/CMakeLists.txt b/Modules/Applications/AppSARPolarMatrixConvert/test/CMakeLists.txt
index 9f5b23cdeeca105cd7fe4205cc13441ca2b5bc04..56ed2b28b458a3aa7c4ec61797481798cae4beb6 100644
--- a/Modules/Applications/AppSARPolarMatrixConvert/test/CMakeLists.txt
+++ b/Modules/Applications/AppSARPolarMatrixConvert/test/CMakeLists.txt
@@ -95,7 +95,7 @@ otb_test_application(NAME  apTvSARPolarMatrixConvertRecLinCovToRecCirCov
                      OPTIONS 
 							 -inc ${BASELINE}/saTvSinclairImageFilter_SinclairToReciprocalCovariance.tif
 							 -conv mlinearcovariancetocircularcovariance
-							 -outc ${TEMP}/apTvSARPolarMatrixConvertRecCovToRecCoh.tif
+							 -outc ${TEMP}/apTvSARPolarMatrixConvertRecLinCovToRecCirCov.tif
 							 
                      )
                              
diff --git a/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx b/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx
index 8f09d36adf5f74b938dfe1e838e49aa8fbf233a5..bc414d0f2081c4d6d9a7951ea079b24318838cea 100644
--- a/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx
@@ -33,7 +33,7 @@ namespace Wrapper
  *
  * This application gathers the 4 steps of the large-scale MeanShift
  * segmentation framework.
- * 
+ *
  */
 class LargeScaleMeanShift : public CompositeApplication
 {
@@ -191,13 +191,11 @@ private:
       if (IsParameterEnabled("mode.vector.imfield") &&
           HasValue("mode.vector.imfield"))
         {
-        GetInternalApplication("vectorization")->SetParameterInputImage("in",
-          GetParameterImage<ImageBaseType>("mode.vector.imfield"));
+          GetInternalApplication("vectorization")->SetParameterInputImage("in", GetParameterImageBase("mode.vector.imfield"));
         }
       else
         {
-        GetInternalApplication("vectorization")->SetParameterInputImage("in",
-          GetParameterImage<ImageBaseType>("in"));
+          GetInternalApplication("vectorization")->SetParameterInputImage("in", GetParameterImageBase("in"));
         }
       GetInternalApplication("vectorization")->SetParameterString("inseg",
         tmpFilenames[2]);
diff --git a/Modules/Core/LabelMap/test/CMakeLists.txt b/Modules/Core/LabelMap/test/CMakeLists.txt
index 068325e08e42cce455f0d61cd27a8d1764ede388..be4639ecdd26f58a333f08f6164bb8c54c8b4992 100644
--- a/Modules/Core/LabelMap/test/CMakeLists.txt
+++ b/Modules/Core/LabelMap/test/CMakeLists.txt
@@ -41,8 +41,8 @@ otb_module_target_label(otbLabelMapTestDriver)
 
 otb_add_test(NAME obTvLabelObjectMapVectorizer COMMAND otbLabelMapTestDriver
   otbLabelObjectMapVectorizer
-  ${INPUTDATA}/rcc8_mire1.png
-  rcc8_mire1_label_vectorizer.gml)
+  ${INPUTDATA}/labelImage_UnsignedChar.tif
+  otbLabelObjectMapVectorizerOutput.gml)
 
 otb_add_test(NAME obTvLabelImageToLabelMapWithAdjacencyFilter COMMAND otbLabelMapTestDriver
   --compare-ascii ${NOTOL}
@@ -64,13 +64,13 @@ otb_add_test(NAME obTvKMeansAttributesLabelMapFilter COMMAND otbLabelMapTestDriv
   ${TEMP}/obTvKMeansAttributesLabelMapFilter.txt)
 otb_add_test(NAME obTvLabelMapToSampleListFilter COMMAND otbLabelMapTestDriver
   otbLabelMapToSampleListFilter
-  ${OTB_DATA_ROOT}/Input/rcc8_mire1.png
+  ${OTB_DATA_ROOT}/Input/labelImage_UnsignedChar.tif
   SHAPE::Flusser01 SHAPE::Flusser02 SHAPE::Flusser03 SHAPE::Flusser04
   SHAPE::Flusser05 SHAPE::Flusser06 SHAPE::Flusser07 SHAPE::Flusser08
   SHAPE::Flusser09 SHAPE::Flusser10 SHAPE::Flusser11)
 otb_add_test(NAME obTvLabelMapWithClassLabelToLabeledSampleListFilter COMMAND otbLabelMapTestDriver
   otbLabelMapWithClassLabelToLabeledSampleListFilter
-  ${OTB_DATA_ROOT}/Input/rcc8_mire1.png
+  ${OTB_DATA_ROOT}/Input/labelImage_UnsignedChar.tif
   SHAPE::Flusser01  SHAPE::Flusser02  SHAPE::Flusser03 SHAPE::Flusser04
   SHAPE::Flusser05  SHAPE::Flusser06  SHAPE::Flusser07 SHAPE::Flusser08
   SHAPE::Flusser09 SHAPE::Flusser10  SHAPE::Flusser11)
diff --git a/Modules/Core/LabelMap/test/otbLabelMapWithClassLabelToLabeledSampleListFilter.cxx b/Modules/Core/LabelMap/test/otbLabelMapWithClassLabelToLabeledSampleListFilter.cxx
index 695a24f06d7db8c3dc9d71871ab38b78d4d9f525..31d6b9a066c0e57d9f111e7173699d4d0bd146b6 100644
--- a/Modules/Core/LabelMap/test/otbLabelMapWithClassLabelToLabeledSampleListFilter.cxx
+++ b/Modules/Core/LabelMap/test/otbLabelMapWithClassLabelToLabeledSampleListFilter.cxx
@@ -62,7 +62,7 @@ int otbLabelMapWithClassLabelToLabeledSampleListFilter(int argc, char* argv[])
 
    LabelMapFilterType::Pointer labelMapFilter = LabelMapFilterType::New();
    labelMapFilter->SetInput(lreader->GetOutput());
-   labelMapFilter->SetInputForegroundValue(255);
+   labelMapFilter->SetInputForegroundValue(1);
 
    ShapeLabelMapFilterType::Pointer shapeLabelMapFilter = ShapeLabelMapFilterType::New();
    shapeLabelMapFilter->SetInput(labelMapFilter->GetOutput());
diff --git a/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.h b/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.h
deleted file mode 100644
index 4406a107fb9c43269b30bffa577d9e5a73de37c4..0000000000000000000000000000000000000000
--- a/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbDataNodeImageFunction_h
-#define otbDataNodeImageFunction_h
-
-#include "otbDataNodeFunctionBase.h"
-#include "otbDataNode.h"
-#include "itkContinuousIndex.h"
-#include "itkImageBase.h"
-
-namespace otb
-{
-/** \class DataNodeImageFunction
-  * \brief TODO
-  *
-  *
-  *
-  * \ingroup Functions
-  * \sa NDVIDataNodeFeatureFunction
- *
- * \ingroup OTBVectorDataBase
- */
-
-template <
-class TImage,
-class TOutput,
-class TCoordRep = double,
-class TPrecision = double
->
-class ITK_EXPORT DataNodeImageFunction :
-    public DataNodeFunctionBase<DataNode<TCoordRep,
-                                         TImage::ImageDimension,
-                                         TPrecision>,
-                                TOutput>
-{
-public:
-  /** Dimension underlying input image. */
-  itkStaticConstMacro(ImageDimension, unsigned int,
-                      TImage::ImageDimension);
-
-  /** Standard class typedefs. */
-  typedef DataNodeImageFunction                    Self;
-  typedef DataNodeFunctionBase<DataNode<TCoordRep,
-                                        itkGetStaticConstMacro(ImageDimension),
-                                        TPrecision>,
-                               TOutput>            Superclass;
-  typedef itk::SmartPointer<Self>                  Pointer;
-  typedef itk::SmartPointer<const Self>            ConstPointer;
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(DataNodeImageFunction, DataNodeFunctionBase);
-
-  /** Some typedefs. */
-  typedef TImage                                  InputImageType;
-  typedef typename InputImageType::PixelType      InputPixelType;
-  typedef typename InputImageType::ConstPointer   InputImageConstPointer;
-
-  typedef TOutput                                 OutputType;
-
-  /** CoordRepType typedef support. */
-  typedef TCoordRep CoordRepType;
-
-  /** PrecisionType typedef support. */
-  typedef TPrecision PrecisionType;
-
-  /** Index Type. */
-  typedef typename InputImageType::IndexType      IndexType;
-  typedef typename InputImageType::IndexValueType IndexValueType;
-
-  /** ContinuousIndex Type. */
-  typedef itk::ContinuousIndex<CoordRepType, itkGetStaticConstMacro(ImageDimension)>
-                                                  ContinuousIndexType;
-
-  /** DataNode Type */
-  typedef typename Superclass::DataNodeType       DataNodeType;
-
-  /** Point Type */
-  typedef typename DataNodeType::PointType        PointType;
-
-  /** Set the input image.
-   * \warning this method caches BufferedRegion information.
-   * If the BufferedRegion has changed, user must call
-   * SetInputImage again to update cached values. */
-  virtual void SetInputImage( const InputImageType * ptr );
-
-  /** Get the input image. */
-  const InputImageType * GetInputImage() const
-    { return m_Image.GetPointer(); }
-
-  /** Evaluate the function at specified DataNode position.
-   * Subclasses must provide this method. */
-  TOutput Evaluate( const DataNodeType& node ) const override = 0;
-
-  /** Check if an index is inside the image buffer.
-   * we take into account the fact that each voxel has its
-   * center at the integer coordinate and extends half way
-   * to the next integer coordinate.
-   * \warning For efficiency, no validity checking of
-   * the input image is done. */
-  virtual bool IsInsideBuffer( const IndexType & index ) const
-    {
-    for( unsigned int j = 0; j < ImageDimension; ++j )
-      {
-      if( index[j] < m_StartIndex[j] )
-        {
-        return false;
-        }
-      if( index[j] > m_EndIndex[j] )
-        {
-        return false;
-        }
-      }
-    return true;
-    }
-
-  /** Check if a continuous index is inside the image buffer.
-   * \warning For efficiency, no validity checking of
-   * the input image is done. */
-  virtual bool IsInsideBuffer( const ContinuousIndexType & index ) const
-    {
-    for( unsigned int j = 0; j < ImageDimension; ++j )
-      {
-      if( index[j] < m_StartContinuousIndex[j] )
-        {
-        return false;
-        }
-      if( index[j] >= m_EndContinuousIndex[j] )
-       //Comment this instruction after itkv4 migration (correct
-       //usage of centered-pixel coordinates)
-       //if( index[j] > m_EndContinuousIndex[j] )
-       {
-        return false;
-        }
-      }
-    return true;
-    }
-
-  /** Check if a point is inside the image buffer.
-   * \warning For efficiency, no validity checking of
-   * the input image pointer is done. */
-  virtual bool IsInsideBuffer( const PointType & point ) const
-    {
-    ContinuousIndexType index;
-    m_Image->TransformPhysicalPointToContinuousIndex( point, index );
-    return this->IsInsideBuffer( index );
-    }
-
-  /** Convert point to continuous index */
-  void ConvertPointToContinuousIndex( const PointType & point,
-    ContinuousIndexType & cindex ) const
-    {
-    m_Image->TransformPhysicalPointToContinuousIndex( point, cindex );
-    }
-
-  /** Convert continuous index to nearest index. */
-  inline void ConvertContinuousIndexToNearestIndex( const ContinuousIndexType & cindex,
-    IndexType & index ) const
-    {
-    index.CopyWithRound( cindex );
-    }
-
-  /** Set/Get methods */
-  itkGetConstReferenceMacro(StartIndex, IndexType);
-  itkGetConstReferenceMacro(EndIndex, IndexType);
-
-  itkGetConstReferenceMacro(StartContinuousIndex, ContinuousIndexType);
-  itkGetConstReferenceMacro(EndContinuousIndex, ContinuousIndexType);
-
-protected:
-  DataNodeImageFunction();
-  ~DataNodeImageFunction() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-  /** Const pointer to the input image. */
-  InputImageConstPointer  m_Image;
-
-  /** Cache some values for testing if indices are inside buffered region. */
-  IndexType               m_StartIndex;
-  IndexType               m_EndIndex;
-  ContinuousIndexType     m_StartContinuousIndex;
-  ContinuousIndexType     m_EndContinuousIndex;
-
-private:
-  DataNodeImageFunction(const Self&) = delete;
-  void operator=(const Self&) = delete;
-
-};
-
-}
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbDataNodeImageFunction.hxx"
-#endif
-
-#endif
diff --git a/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.hxx b/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.hxx
deleted file mode 100644
index b06e770312b5cf63b3bc4b59708aa40c5334e706..0000000000000000000000000000000000000000
--- a/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.hxx
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbDataNodeImageFunction_hxx
-#define otbDataNodeImageFunction_hxx
-
-#include "otbDataNodeImageFunction.h"
-
-namespace otb
-{
-
-/**
- * Constructor
- */
-template <class TImage, class TOutput, class TCoordRep, class TPrecision>
-DataNodeImageFunction<TImage, TOutput, TCoordRep, TPrecision>
-::DataNodeImageFunction()
-{
-  m_Image = nullptr;
-  m_StartIndex.Fill(0);
-  m_EndIndex.Fill(0);
-  m_StartContinuousIndex.Fill(0.0f);
-  m_EndContinuousIndex.Fill(0.0f);
-}
-
-
-/**
- * Standard "PrintSelf" method
- */
-template <class TImage, class TOutput, class TCoordRep, class TPrecision>
-void
-DataNodeImageFunction<TImage, TOutput, TCoordRep, TPrecision>
-::PrintSelf(
-  std::ostream& os,
-  itk::Indent indent) const
-{
-  Superclass::PrintSelf( os, indent );
-  os << indent << "InputImage: " << m_Image.GetPointer() << std::endl;
-  os << indent << "StartIndex: " << m_StartIndex << std::endl;
-  os << indent << "EndIndex: " << m_EndIndex << std::endl;
-  os << indent << "StartContinuousIndex: " << m_StartContinuousIndex << std::endl;
-  os << indent << "EndContinuousIndex: " << m_EndContinuousIndex << std::endl;
-}
-
-
-/**
- * Initialize by setting the input image
- */
-template <class TImage, class TOutput, class TCoordRep, class TPrecision>
-void
-DataNodeImageFunction<TImage, TOutput, TCoordRep, TPrecision>
-::SetInputImage(
-  const InputImageType * ptr )
-{
-  // set the input image
-  m_Image = ptr;
-
-  if ( ptr )
-    {
-    typename InputImageType::SizeType size = ptr->GetBufferedRegion().GetSize();
-    m_StartIndex = ptr->GetBufferedRegion().GetIndex();
-
-    for ( unsigned int j = 0; j < ImageDimension; ++j )
-      {
-      m_EndIndex[j] = m_StartIndex[j] + static_cast<IndexValueType>( size[j] ) - 1;
-      m_StartContinuousIndex[j] = static_cast<CoordRepType>( m_StartIndex[j] - 0.5 );
-      m_EndContinuousIndex[j]   = static_cast<CoordRepType>( m_EndIndex[j] + 0.5 );
-
-      //Comment these instructions after migration to ITKv4 where there is a correct
-      //usage of centered-pixel coordinates
-      //(ITK_USE_CENTERED_PIXEL_COORDINATES_CONSISTENTLY always ON)
-      //m_StartContinuousIndex[j] = static_cast<CoordRepType>( m_StartIndex[j] );
-      //m_EndContinuousIndex[j]   = static_cast<CoordRepType>( m_EndIndex[j] );
-      }
-    }
-}
-
-
-} // end namespace itk
-
-#endif
diff --git a/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.h b/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.h
deleted file mode 100644
index c99f15d0b23334b25ec307b7fcb53e93d764ba26..0000000000000000000000000000000000000000
--- a/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbDataNodeVectorDataFunction_h
-#define otbDataNodeVectorDataFunction_h
-
-#include "otbDataNodeFunctionBase.h"
-#include "otbVectorDataProperties.h"
-
-
-namespace otb
-{
-/** \class DataNodeVectorDataFunction
-  * \brief TODO
-  *
-  *
-  *
-  * \ingroup Functions
-  * \sa
- *
- * \ingroup OTBVectorDataBase
- */
-
-template <
-class TOutput,
-class TCoordRep = double,
-class TPrecision = double
->
-class ITK_EXPORT DataNodeVectorDataFunction :
-    public DataNodeFunctionBase<DataNode<TCoordRep,
-                                         2,
-                                         TPrecision>,
-                                TOutput>
-{
-public:
-   /** Standard class typedefs. */
-  typedef DataNodeVectorDataFunction               Self;
-  typedef DataNodeFunctionBase<DataNode<TCoordRep,
-                                        2,
-                                        TPrecision>,
-                               TOutput>            Superclass;
-  typedef itk::SmartPointer<Self>                  Pointer;
-  typedef itk::SmartPointer<const Self>            ConstPointer;
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(DataNodeVetorDataFunction, DataNodeFunctionBase);
-
-  /** Some typedefs. */
-  typedef VectorData<TCoordRep, 2, TPrecision>    VectorDataType;
-  typedef typename VectorDataType::ConstPointer   VectorDataConstPointerType;
-  typedef TOutput                                 OutputType;
-
-  /** CoordRepType typedef support. */
-  typedef TCoordRep CoordRepType;
-
-  /** PrecisionType typedef support. */
-  typedef TPrecision PrecisionType;
-
-  /** DataNode Type */
-  typedef typename Superclass::DataNodeType       DataNodeType;
-
-  /** Point Type */
-  typedef typename DataNodeType::PointType        PointType;
-
-  /** Set the input VetorData. */
-  virtual void SetInputVectorData( const VectorDataType * ptr );
-
-  /** Get the input VectorData. */
-  const VectorDataType * GetInputVectorData() const
-    { return m_VectorData.GetPointer(); }
-
-  /** Evaluate the function at specified DataNode position.
-   * Subclasses must provide this method. */
-  TOutput Evaluate( const DataNodeType& node ) const override = 0;
-
-protected:
-  DataNodeVectorDataFunction();
-  ~DataNodeVectorDataFunction() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-  /** Const pointer to the input VectorData. */
-  VectorDataConstPointerType  m_VectorData;
-
-private:
-  DataNodeVectorDataFunction(const Self&) = delete;
-  void operator=(const Self&) = delete;
-
-};
-
-}
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbDataNodeVectorDataFunction.hxx"
-#endif
-
-#endif
diff --git a/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.hxx b/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.hxx
deleted file mode 100644
index 9ca52e1798d94b391825ca5629ba3e37a35dc1d9..0000000000000000000000000000000000000000
--- a/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.hxx
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbDataNodeVectorDataFunction_hxx
-#define otbDataNodeVectorDataFunction_hxx
-
-#include "otbDataNodeVectorDataFunction.h"
-
-namespace otb
-{
-
-/**
- * Constructor
- */
-template <class TOutput, class TCoordRep, class TPrecision>
-DataNodeVectorDataFunction<TOutput, TCoordRep, TPrecision>
-::DataNodeVectorDataFunction()
-{
-  m_VectorData = nullptr;
-}
-
-
-/**
- * Standard "PrintSelf" method
- */
-template <class TOutput, class TCoordRep, class TPrecision>
-void
-DataNodeVectorDataFunction<TOutput, TCoordRep, TPrecision>
-::PrintSelf(
-  std::ostream& os,
-  itk::Indent indent) const
-{
-  Superclass::PrintSelf( os, indent );
-  os << indent << "VetorData: " << m_VectorData.GetPointer() << std::endl;
-}
-
-
-/**
- * Initialize by setting the input VectorData
- */
-template <class TOutput, class TCoordRep, class TPrecision>
-void
-DataNodeVectorDataFunction<TOutput, TCoordRep, TPrecision>
-::SetInputVectorData(
-  const VectorDataType * ptr )
-{
-  // set the input VectorData
-  m_VectorData = ptr;
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Core/VectorDataBase/include/otbGISConnectionImplementation.h b/Modules/Core/VectorDataBase/include/otbGISConnectionImplementation.h
deleted file mode 100644
index ba09b76b6d314c30615c420b164e74c0588488b5..0000000000000000000000000000000000000000
--- a/Modules/Core/VectorDataBase/include/otbGISConnectionImplementation.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbGISConnectionImplementation_h
-#define otbGISConnectionImplementation_h
-
-#include "itkDataObject.h"
-#include "itkObjectFactory.h"
-#include <string>
-
-namespace otb
-{
-/** \class GISConnectionImplementation
- * \brief Base class for GIS DB connection implementations
- *
- *
- *
- * \ingroup OTBVectorDataBase
- */
-
-template <class TransactorType>
-class ITK_EXPORT GISConnectionImplementation
-  : public itk::DataObject
-{
-public:
-  /** Standard class typedefs */
-  typedef GISConnectionImplementation   Self;
-  typedef itk::DataObject               Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-
-  /** Standard macros */
-  itkNewMacro(Self);
-  itkTypeMacro(GISConnectionImplementation, itk::DataObject);
-
-  /** Acessors */
-  itkGetMacro(Host, std::string);
-  itkSetMacro(Host, std::string);
-
-  itkGetMacro(DBName, std::string);
-  itkSetMacro(DBName, std::string);
-
-  itkGetMacro(User, std::string);
-  itkSetMacro(User, std::string);
-
-  itkGetMacro(Password, std::string);
-  itkSetMacro(Password, std::string);
-
-  itkGetMacro(Port, std::string);
-  itkSetMacro(Port, std::string);
-
-  itkGetMacro(Options, std::string);
-  itkSetMacro(Options, std::string);
-
-  /** Using the connection */
-
-  virtual void ConnectToDB(){}
-
-  virtual void PerformTransaction(const TransactorType& itkNotUsed(theTransaction)) const {}
-
-protected:
-  /** Constructor */
-  GISConnectionImplementation(){};
-  /** Destructor */
-  virtual ~GISConnectionImplementation(){};
-
-private:
-  GISConnectionImplementation(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  std::string m_Host;
-  std::string m_DBName;
-  std::string m_User;
-  std::string m_Password;
-  std::string m_Port;
-  std::string m_Options;
-
-};
-} // end namespace otb
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/CMakeLists.txt b/Modules/Detection/ObjectDetection/CMakeLists.txt
deleted file mode 100644
index e43a781cad9f8f9c4566a125e2023eb9444e3b6f..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-project(OTBObjectDetection)
-otb_module_impl()
diff --git a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.h b/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.h
deleted file mode 100644
index 6432b507d125bbc7c51e331341c884a5da73a6b3..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.h
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbDescriptorsListSampleGenerator_h
-#define otbDescriptorsListSampleGenerator_h
-
-#include <vector>
-
-#include "itkVariableLengthVector.h"
-#include "itkImageRegion.h"
-#include "itkFunctionBase.h"
-#include "itkListSample.h"
-#include "itkSimpleDataObjectDecorator.h"
-
-#include "otbListSampleSource.h"
-#include "otbVectorData.h"
-#include "otbPersistentImageFilter.h"
-#include "otbPersistentFilterStreamingDecorator.h"
-
-namespace otb
-{
-
-template <class TOutputPrecision>
-class DefaultDescriptorsType
-{
-public:
-  typedef itk::VariableLengthVector<TOutputPrecision> Type;
-};
-
-/** \class PersistentDescriptorsListSampleGenerator
- *  \brief [internal] Helper class for the implementation of DescriptorsListSampleGenerator
- *
- *  This class inherits PersistentImageFilter and provides the Reset/Synthesize functions,
- *  plus the ThreadedGenerateData function implementing the image function evaluation
- *
- * \ingroup OTBObjectDetection
- */
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabel>
-class ITK_EXPORT PersistentDescriptorsListSampleGenerator :
-  public PersistentImageFilter<TInputImage, TInputImage>
-{
-public:
-  /** Standard Self typedef */
-  typedef PersistentDescriptorsListSampleGenerator        Self;
-  typedef PersistentImageFilter<TInputImage, TInputImage> Superclass;
-  typedef itk::SmartPointer<Self>                         Pointer;
-  typedef itk::SmartPointer<const Self>                   ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Runtime information support. */
-  itkTypeMacro(PersistentDescriptorsListSampleGenerator, PersistentImageFilter);
-
-  /** Image related typedefs. */
-  typedef TInputImage                      InputImageType;
-  typedef typename TInputImage::Pointer    InputImagePointer;
-  typedef typename TInputImage::RegionType RegionType;
-  typedef typename TInputImage::SizeType   SizeType;
-  typedef typename TInputImage::IndexType  IndexType;
-  typedef typename TInputImage::PixelType  PixelType;
-
-  itkStaticConstMacro(InputImageDimension, unsigned int,
-                      TInputImage::ImageDimension);
-
-  /** Image related typedefs. */
-  itkStaticConstMacro(ImageDimension, unsigned int,
-                      TInputImage::ImageDimension);
-
-  /** Smart Pointer type to a DataObject. */
-  typedef itk::ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType;
-  typedef typename itk::DataObject::Pointer DataObjectPointer;
-
-  /** Input VectorData */
-  typedef TVectorData                                     VectorDataType;
-  typedef typename VectorDataType::Pointer                VectorDataPointerType;
-  typedef typename VectorDataType::DataNodeType           VectorDataNodeType;
-  typedef typename VectorDataType::DataNodePointerType    VectorDataNodePointerType;
-  typedef typename VectorDataType::DataTreeType           VectorDataTreeType;
-  typedef typename VectorDataType::DataTreePointerType    VectorDataTreePointerType;
-  typedef typename VectorDataNodeType::PointType          VectorDataPointType;
-  typedef typename VectorDataNodeType::LineType           VectorDataLineType;
-  typedef typename VectorDataNodeType::PolygonType        VectorDataPolygonType;
-  typedef itk::PreOrderTreeIterator<VectorDataTreeType>   VectorDataTreeIteratorType;
-
-  /** Function type for descriptors extraction */
-  typedef TFunctionType                                   DescriptorsFunctionType;
-  typedef typename DescriptorsFunctionType::Pointer       DescriptorsFunctionPointerType;
-  typedef typename DescriptorsFunctionType::InputType     DescriptorsFunctionPointType;
-
-  typedef itk::ContinuousIndex
-        <typename DescriptorsFunctionPointType::ValueType,
-         itkGetStaticConstMacro(InputImageDimension)>     ContinuousIndexType;
-
-  /** ListSample output */
-  typedef TListSample                                     ListSampleType;
-  typedef typename ListSampleType::Pointer                ListSamplePointerType;
-  typedef typename ListSampleType::MeasurementVectorType  SampleMeasurementVectorType;
-  typedef typename ListSampleType::MeasurementType        SampleMeasurementType;
-
-  /** LabelListSample output */
-  typedef TLabel                                          LabelType;
-  typedef itk::FixedArray<LabelType,1>                    LabelSampleType;
-  typedef itk::Statistics::ListSample<LabelSampleType>    LabelListSampleType;
-  typedef typename LabelListSampleType::Pointer           LabelListSamplePointerType;
-  typedef typename LabelListSampleType::MeasurementVectorType LabelMeasurementVectorType;
-  typedef typename LabelListSampleType::MeasurementType   LabelMeasurementType;
-
-  /** ListSamplePositions output */
-  typedef std::vector<DescriptorsFunctionPointType>               SamplesPositionType;
-  typedef itk::SimpleDataObjectDecorator<SamplesPositionType>     SamplesPositionObjectType;
-  typedef typename SamplesPositionObjectType::Pointer             SamplesPositionObjectPointerType;
-
-  void SetSamplesLocations(VectorDataType * input);
-  VectorDataType * GetSamplesLocations(void);
-
-  /** The function to evaluate */
-  itkSetObjectMacro(DescriptorsFunction,      DescriptorsFunctionType);
-  itkGetObjectMacro(DescriptorsFunction,      DescriptorsFunctionType);
-  itkGetConstObjectMacro(DescriptorsFunction, DescriptorsFunctionType);
-
-  /** Output sample list */
-  ListSampleType*             GetListSample();
-
-  /** Output label list */
-  LabelListSampleType*        GetLabelListSample();
-
-  /** Output sample position list */
-  SamplesPositionType&             GetSamplesPositions();
-  SamplesPositionObjectType*       GetSamplesPositionsObject();
-
-  itkSetMacro( NeighborhoodRadius, unsigned int );
-  itkGetConstReferenceMacro( NeighborhoodRadius, unsigned int );
-
-  /** Make a DataObject of the correct type to be used as the specified
-   * output. */
-  itk::DataObject::Pointer MakeOutput(DataObjectPointerArraySizeType idx) override;
-  using Superclass::MakeOutput;
-
-  void AllocateOutputs() override;
-  void GenerateOutputInformation() override;
-  void Reset(void) override;
-  void Synthetize(void) override;
-
-  void AddInput(itk::DataObject * dataObject) override
-  {
-    Superclass::AddInput(dataObject);
-  }
-
-protected:
-  PersistentDescriptorsListSampleGenerator();
-  ~PersistentDescriptorsListSampleGenerator() override;
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-  void GenerateInputRequestedRegion() override;
-
-  void BeforeThreadedGenerateData() override;
-
-  /** Multi-thread version GenerateData. */
-  void  ThreadedGenerateData(const RegionType& outputRegionForThread,
-                             itk::ThreadIdType threadId) override;
-
-private:
-  PersistentDescriptorsListSampleGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  bool IsInsideWithNeighborhoodRadius(const RegionType& region, const ContinuousIndexType &index) const
-    {
-    typedef typename IndexType::IndexValueType IndexValueType;
-    typedef typename ContinuousIndexType::ValueType ContinuousIndexValueType;
-
-    for(unsigned int i=0; i<ImageDimension; ++i)
-      {
-      if( itk::Math::RoundHalfIntegerUp<IndexValueType>(index[i]) < static_cast<IndexValueType>( region.GetIndex(i) ) + static_cast<IndexValueType>(m_NeighborhoodRadius) )
-       //Comment this instruction after itkv4 migration (correct
-       //usage of centered-pixel coordinates)
-       //if( index[i] < static_cast<IndexValueType>( region.GetIndex(i) ) + m_NeighborhoodRadius )
-        {
-        return false;
-        }
-      // bound is the last valid pixel location
-      const ContinuousIndexValueType bound = static_cast<ContinuousIndexValueType>(
-          region.GetIndex(i) + region.GetSize(i) - 0.5);
-      //Comment this instruction after itkv4 migration (correct
-      //usage of centered-pixel coordinates)
-      //const ContinuousIndexValueType bound = static_cast<ContinuousIndexValueType>(
-      //    region.GetIndex(i) + static_cast<IndexValueType>(region.GetSize(i)) - 1);
-
-      if( index[i] > bound - m_NeighborhoodRadius )
-        {
-        return false;
-        }
-      }
-    return true;
-    }
-  typedef std::vector<ListSamplePointerType>      ListSampleArray;
-  typedef std::vector<LabelListSamplePointerType> LabelListSampleArray;
-  typedef std::vector<SamplesPositionType>        SamplesPositionArray;
-
-  ListSampleArray                m_ThreadListSample;
-  LabelListSampleArray           m_ThreadLabelListSample;
-  SamplesPositionArray           m_ThreadSamplesPosition;
-
-  DescriptorsFunctionPointerType m_DescriptorsFunction;
-
-  unsigned int m_NeighborhoodRadius;
-};
-
-
-/** \class DescriptorsListSampleGenerator
- *  \brief This class generates a ListSample by computing local descriptors
- *  on an image at specified positions.
- *
- *  Given an image (by SetInputImage()) and a vector data containing points (by SetSamplesLocations()),
- *  this class evaluates an ImageFunction (set by SetDescriptorsFunction()) at each point of the vector data
- *  over the image.
- *  It generates a ListSample containing the descriptors values for each sample,
- *  along with a label ListSample containing the label associated with each sample.
- *  The label is read from the vector data using the data field "Class", read as an int
- *
- *  This class is streaming capable and multithreaded
- *
- * \ingroup OTBObjectDetection
- */
-template <class TInputImage, class TVectorData, class TListSample, class TLabel, class TOutputPrecision = double, class TCoordRep = double>
-class ITK_EXPORT DescriptorsListSampleGenerator :
-    public PersistentFilterStreamingDecorator<
-              PersistentDescriptorsListSampleGenerator< TInputImage,
-                                                        TVectorData,
-                                                        itk::FunctionBase< itk::Point<TCoordRep, 2>,
-                                                                           typename DefaultDescriptorsType<TOutputPrecision>::Type >,
-                                                        TListSample,
-                                                        TLabel > >
-{
-public:
-    /** Standard Self typedef */
-    typedef DescriptorsListSampleGenerator      Self;
-    typedef PersistentFilterStreamingDecorator
-              < PersistentDescriptorsListSampleGenerator
-                  <TInputImage,
-                   TVectorData,
-                   itk::FunctionBase< itk::Point<TCoordRep, 2>, typename DefaultDescriptorsType<TOutputPrecision>::Type >,
-                   TListSample,
-                   TLabel> >          Superclass;
-    typedef itk::SmartPointer<Self>             Pointer;
-    typedef itk::SmartPointer<const Self>       ConstPointer;
-
-    /** Type macro */
-    itkNewMacro(Self);
-
-    /** Creation through object factory macro */
-    itkTypeMacro(DescriptorsListSampleGenerator, PersistentFilterStreamingDecorator);
-
-    typedef TInputImage                              InputImageType;
-    typedef TVectorData                              InputVectorDataType;
-    typedef TListSample                              ListSampleType;
-    typedef TCoordRep                                CoordRepType;
-    typedef TOutputPrecision                         OutputPrecision;
-
-    /** The coordinates used when evaluating function */
-    typedef itk::Point<TCoordRep, 2> PointType;
-
-    /** The return value of the function */
-    typedef typename DefaultDescriptorsType<TOutputPrecision>::Type DescriptorType;
-
-    /** The function evaluated on the input image at locations specified by the vector data */
-    typedef itk::FunctionBase<PointType, DescriptorType> DescriptorsFunctionType;
-    typedef typename DescriptorsFunctionType::Pointer    DescriptorsFunctionPointerType;
-
-    typedef typename Superclass::FilterType                           PersistentFilterType;
-    typedef typename PersistentFilterType::LabelListSampleType        LabelListSampleType;
-    typedef typename PersistentFilterType::SamplesPositionObjectType  SamplesPositionObjectType;
-    typedef typename PersistentFilterType::SamplesPositionType        SamplesPositionType;
-
-
-    /** Input image to extract feature */
-    void SetInputImage(InputImageType * input)
-    {
-      this->GetFilter()->SetInput(input);
-    }
-
-    /** Input image to extract feature */
-    InputImageType * GetInputImage()
-    {
-      return this->GetFilter()->GetInput();
-    }
-
-    void AddInput(itk::DataObject * dataObject) override
-      {
-        this->GetFilter()->AddInput(dataObject);
-      }
-
-    /** Sample locations as a VectorData of points. The label is in the ClassKey feature */
-    void SetSamplesLocations(InputVectorDataType * input)
-    {
-      this->GetFilter()->SetSamplesLocations(input);
-    }
-
-    /** Sample locations as a VectorData of points. The label is in the ClassKey feature  */
-    InputImageType * GetSamplesLocations()
-    {
-      return this->GetFilter()->GetSamplesLocations();
-    }
-
-    /** The function to evaluate */
-    void SetDescriptorsFunction(DescriptorsFunctionType * input)
-    {
-      this->GetFilter()->SetDescriptorsFunction(input);
-    }
-
-    /** The function to evaluate */
-    DescriptorsFunctionType * GetDescriptorsFunction()
-    {
-      return this->GetFilter()->GetDescriptorsFunction();
-    }
-
-    /** Final sample list */
-    ListSampleType*       GetListSample()
-    {
-      return this->GetFilter()->GetListSample();
-    }
-
-    /** Final label list */
-    LabelListSampleType*        GetLabelListSample()
-    {
-      return this->GetFilter()->GetLabelListSample();
-    }
-
-    /** Final label list */
-    SamplesPositionType&        GetSamplesPositions()
-    {
-      return this->GetFilter()->GetSamplesPositions();
-    }
-
-    SamplesPositionObjectType*  GetSamplesPositionsObject()
-    {
-      return this->GetFilter()->GetSamplesPositionsObject();
-    }
-
-    otbSetObjectMemberMacro(Filter, NeighborhoodRadius, unsigned int);
-    otbGetObjectMemberMacro(Filter, NeighborhoodRadius, unsigned int);
-
-  protected:
-    /** Constructor */
-    DescriptorsListSampleGenerator();
-
-    /** Destructor */
-    ~DescriptorsListSampleGenerator() override;
-
-  private:
-    DescriptorsListSampleGenerator(const Self &) = delete;
-    void operator =(const Self&) = delete;
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbDescriptorsListSampleGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.hxx b/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.hxx
deleted file mode 100644
index 7fb7b6f55ec2d70ed30d592b63fba40da9513e0a..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.hxx
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbDescriptorsListSampleGenerator_hxx
-#define otbDescriptorsListSampleGenerator_hxx
-
-#include "otbDescriptorsListSampleGenerator.h"
-
-#include "itkContinuousIndex.h"
-
-namespace otb
-{
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::PersistentDescriptorsListSampleGenerator()
-  : m_NeighborhoodRadius(0)
-{
-  // Need 2 inputs : a vector image and a vectordata
-  this->SetNumberOfRequiredInputs(2);
-
-  // Have 4 outputs : the image created by Superclass,
-  // the sample list, the label sample list, the positions of the samples
-  this->SetNumberOfRequiredOutputs(3);
-  this->itk::ProcessObject::SetNthOutput(1, this->MakeOutput(1).GetPointer());
-  this->itk::ProcessObject::SetNthOutput(2, this->MakeOutput(2).GetPointer());
-  this->itk::ProcessObject::SetNthOutput(3, this->MakeOutput(3).GetPointer());
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::~PersistentDescriptorsListSampleGenerator()
-{
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-void
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::AllocateOutputs()
-{
-  // This is commented to prevent the streaming of the whole image for the first stream strip
-  // It shall not cause any problem because the output image of this filter is not intended to be used.
-  //InputImagePointer image = const_cast< TInputImage * >( this->GetInput() );
-  //this->GraftOutput( image );
-  // Nothing that needs to be allocated for the remaining outputs
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-void
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::GenerateOutputInformation()
-{
-  Superclass::GenerateOutputInformation();
-  if (this->GetInput())
-    {
-    this->GetOutput()->CopyInformation(this->GetInput());
-    this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion());
-
-    if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
-      {
-      this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
-      }
-    }
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-void
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::SetSamplesLocations(VectorDataType* location)
-{
-  this->SetNthInput(1, location);
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::VectorDataType*
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::GetSamplesLocations()
-{
-
-  return static_cast<VectorDataType*>(this->itk::ProcessObject::GetInput(1));
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::ListSampleType*
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::GetListSample()
-{
-  return dynamic_cast<ListSampleType*>(this->itk::ProcessObject::GetOutput(1));
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::LabelListSampleType*
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::GetLabelListSample()
-{
-  return dynamic_cast<LabelListSampleType*>( this->itk::ProcessObject::GetOutput(2) );
-}
-
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::SamplesPositionType&
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::GetSamplesPositions()
-{
-  return this->GetSamplesPositionsObject()->Get();
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::SamplesPositionObjectType*
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::GetSamplesPositionsObject()
-{
-  return dynamic_cast<SamplesPositionObjectType*>(this->itk::ProcessObject::GetOutput(3));
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-itk::DataObject::Pointer
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::MakeOutput(DataObjectPointerArraySizeType idx)
-{
-  itk::DataObject::Pointer output;
-  switch (idx)
-    {
-    case 0:
-      output = static_cast<itk::DataObject*>(InputImageType::New().GetPointer());
-      break;
-    case 1:
-      {
-      ListSamplePointerType listSample = ListSampleType::New();
-      output = static_cast<itk::DataObject*>(listSample.GetPointer());
-      break;
-      }
-    case 2:
-      {
-      LabelListSamplePointerType labelListSample = LabelListSampleType::New();
-      output = static_cast<itk::DataObject*>(labelListSample.GetPointer());
-      break;
-      }
-    case 3:
-      {
-      SamplesPositionObjectPointerType samplesPositions = SamplesPositionObjectType::New();
-      output = static_cast<itk::DataObject*>(samplesPositions.GetPointer());
-      break;
-      }
-    default:
-      output = static_cast<itk::DataObject*>(InputImageType::New().GetPointer());
-      break;
-    }
-  return output;
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-void
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::Reset()
-{
-  m_ThreadListSample = ListSampleArray(this->GetNumberOfThreads());
-  for (unsigned int i = 0; i < this->GetNumberOfThreads(); ++i)
-    {
-    m_ThreadListSample[i] = ListSampleType::New();
-    }
-
-  m_ThreadLabelListSample = LabelListSampleArray(this->GetNumberOfThreads());
-  for (unsigned int i = 0; i < this->GetNumberOfThreads(); ++i)
-    {
-    m_ThreadLabelListSample[i] = LabelListSampleType::New();
-    }
-
-  m_ThreadSamplesPosition = SamplesPositionArray(this->GetNumberOfThreads());
-
-  this->GetListSample()->Clear();
-  this->GetLabelListSample()->Clear();
-  this->GetSamplesPositions().clear();
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-void
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::Synthetize()
-{
-  // Merge the ListSample from all the threads
-  ListSampleType* listSample = this->GetListSample();
-  LabelListSampleType* labelListSample = this->GetLabelListSample();
-  SamplesPositionType& samplesPosition = this->GetSamplesPositions();
-  VectorDataPointType ref;
-
-  // Get the output list measurement vector sample sizes once
-  listSample->SetMeasurementVectorSize(m_ThreadListSample[0]->GetMeasurementVectorSize());
-  labelListSample->SetMeasurementVectorSize(m_ThreadLabelListSample[0]->GetMeasurementVectorSize());
-
-  // Copy the first thread elements into lists
-  ListSampleType* threadListSample = m_ThreadListSample[0];
-  LabelListSampleType* threadLabelListSample = m_ThreadLabelListSample[0];
-  SamplesPositionType& threadSamplesPosition = m_ThreadSamplesPosition[0];
-  for (unsigned int i = 0; i < threadListSample->Size(); ++i)
-    {
-    listSample->PushBack( threadListSample->GetMeasurementVector(i) );
-    labelListSample->PushBack( threadLabelListSample->GetMeasurementVector(i) );
-    samplesPosition.push_back( threadSamplesPosition[i] );
-    }
-
-  // Add the other thread element checking if the point dosn't already exist
-  for (itk::ThreadIdType threadId = 1; threadId < this->GetNumberOfThreads(); ++threadId )
-    {
-    threadListSample = m_ThreadListSample[threadId];
-    threadLabelListSample = m_ThreadLabelListSample[threadId];
-    threadSamplesPosition = m_ThreadSamplesPosition[threadId];
-
-    for (unsigned int i = 0; i < threadListSample->Size(); ++i)
-      {
-        const DescriptorsFunctionPointType & curSamplesPosition = threadSamplesPosition[i];
-        if( std::find(samplesPosition.begin(), samplesPosition.end(), curSamplesPosition) == samplesPosition.end() )
-          {
-            listSample->PushBack( threadListSample->GetMeasurementVector(i) );
-            labelListSample->PushBack( threadLabelListSample->GetMeasurementVector(i) );
-            samplesPosition.push_back( curSamplesPosition );
-          }
-      }
-    }
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-void
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-void
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::GenerateInputRequestedRegion()
-{
-  Superclass::GenerateInputRequestedRegion();
-
-  // get pointers to the input and output
-  typename Superclass::InputImagePointer inputPtr =
-    const_cast< TInputImage * >( this->GetInput() );
-  typename Superclass::OutputImagePointer outputPtr = this->GetOutput();
-
-  if ( !inputPtr || !outputPtr )
-    {
-    return;
-    }
-
-  // get a copy of the input requested region (should equal the output
-  // requested region)
-  typename TInputImage::RegionType inputRequestedRegion;
-  inputRequestedRegion = inputPtr->GetRequestedRegion();
-
-  // pad the input requested region by the operator radius
-  inputRequestedRegion.PadByRadius( m_NeighborhoodRadius + 5 );
-
-  // crop the input requested region at the input's largest possible region
-  if ( inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()) )
-    {
-    inputPtr->SetRequestedRegion( inputRequestedRegion );
-    return;
-    }
-  else
-    {
-    // Couldn't crop the region (requested region is outside the largest
-    // possible region).  Throw an exception.
-
-    // store what we tried to request (prior to trying to crop)
-    inputPtr->SetRequestedRegion( inputRequestedRegion );
-    }
-}
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-void
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::BeforeThreadedGenerateData()
-{}
-
-
-template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample>
-void
-PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>
-::ThreadedGenerateData(const RegionType&  outputRegionForThread,
-                       itk::ThreadIdType threadId)
-{
-  ListSampleType* listSample = m_ThreadListSample[threadId];
-  LabelListSampleType* labelListSample = m_ThreadLabelListSample[threadId];
-  SamplesPositionType& samplesPosition = m_ThreadSamplesPosition[threadId];
-
-  VectorDataTreeIteratorType vectorDataIt(this->GetSamplesLocations()->GetDataTree());
-  bool isInitialized = false;
-
-  for (vectorDataIt.GoToBegin(); !vectorDataIt.IsAtEnd(); ++vectorDataIt)
-    {
-    if (vectorDataIt.Get()->IsPointFeature())
-      {
-      VectorDataPointType point = vectorDataIt.Get()->GetPoint();
-      ContinuousIndexType cidx;
-      this->GetInput()->TransformPhysicalPointToContinuousIndex(point, cidx);
-
-      RegionType paddedRegion = outputRegionForThread;
-      paddedRegion.PadByRadius(m_NeighborhoodRadius);
-      if (this->IsInsideWithNeighborhoodRadius(paddedRegion, cidx))
-        {
-        // Set the Measurement Vector Size of the samplelists, once
-        if(!isInitialized)
-          {
-          // output list sample
-          listSample->SetMeasurementVectorSize(m_DescriptorsFunction->Evaluate(point).Size());
-          labelListSample->SetMeasurementVectorSize(LabelMeasurementVectorType::Length);
-          isInitialized = true;
-          }
-
-        SampleMeasurementVectorType sample(m_DescriptorsFunction->Evaluate(point));
-        listSample->PushBack( sample );
-
-        LabelMeasurementVectorType label;
-        label[0] = static_cast<LabelMeasurementType>(vectorDataIt.Get()->GetFieldAsInt("Class"));
-        labelListSample->PushBack( label );
-
-        samplesPosition.push_back(point);
-        }
-      }
-    }
-}
-
-
-template <class TInputImage, class TVectorData, class TListSample, class TLabelListSample, class TOutputPrecision, class TCoordRep>
-DescriptorsListSampleGenerator<TInputImage, TVectorData, TListSample, TLabelListSample, TOutputPrecision, TCoordRep>
-::DescriptorsListSampleGenerator()
-{
-
-
-}
-
-template <class TInputImage, class TVectorData, class TListSample, class TLabelListSample, class TOutputPrecision, class TCoordRep>
-DescriptorsListSampleGenerator<TInputImage, TVectorData, TListSample, TLabelListSample, TOutputPrecision, TCoordRep>
-::~DescriptorsListSampleGenerator()
-{
-
-}
-
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.h b/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.h
deleted file mode 100644
index f4c79f003f9b7a1c7e5c3841720e9b9979bac03e..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbFlusserMomentsIFFactory_h
-#define otbFlusserMomentsIFFactory_h
-
-#include "itkLightObject.h"
-
-#include "otbMetaImageFunction.h"
-#include "itkDataObject.h"
-#include "otbImage.h"
-#include "otbImageFunctionAdaptor.h"
-#include "otbFlusserMomentsImageFunction.h"
-
-
-namespace otb
-{
-/** \class FlusserMomentsFFactory
- *  \brief add a FlusserMoments image function to a
- *  MetaImageFunction
- *
- *  This class aims at adding an adapted
- *  FlusserMomentsImageFunction to an existing
- *  MetaImageFunction through the method Create.
- *
- *
- * \ingroup OTBObjectDetection
- */
-
-template <class TImageType, class TCoordRep = double, class TPrecision = double>
-class ITK_EXPORT FlusserMomentsIFFactory :
-    public itk::LightObject
-{
-public:
-  /** Standard class typedefs. */
-  typedef FlusserMomentsIFFactory                                         Self;
-  typedef itk::LightObject                                                Superclass;
-  typedef itk::SmartPointer<Self>                                         Pointer;
-  typedef itk::SmartPointer<const Self>                                   ConstPointer;
-
-  // New macro
-  itkNewMacro(Self);
-
-  // RTTI typeinfo
-  itkTypeMacro(FlusserMomentsIFFactory, itk::LightObject);
-
-  // Input and output typedef
-  typedef TImageType              InputImageType;
-  typedef TCoordRep               CoordRepType;
-  typedef TPrecision              PrecisionType;
-
-  // Other typedef
-  typedef typename MetaImageFunction<TPrecision>::Pointer  MetaImageFunctionPointerType;
-  typedef typename std::vector<itk::DataObject::Pointer>   DataObjectContainerType;
-  typedef typename std::vector<PrecisionType>         ParamContainerType;
-  typedef FlusserMomentsImageFunction<InputImageType, CoordRepType>
-                                                      FlusserMomentsIF;
-  typedef ImageFunctionAdaptor<FlusserMomentsIF, TPrecision>
-                                                      AdaptedFlusserMomentsIF;
-
-  void Create(InputImageType * image,
-              ParamContainerType param,
-              MetaImageFunctionPointerType metaIF,
-              DataObjectContainerType * container);
-
-protected:
-  FlusserMomentsIFFactory(){}
-  ~FlusserMomentsIFFactory() override{}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  FlusserMomentsIFFactory(const Self& ) = delete;
-  void operator=(const Self& ) = delete;
-
-};
-
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbFlusserMomentsIFFactory.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.hxx
deleted file mode 100644
index 6aa08394d2145baf8474c072587f9b2757430419..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.hxx
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbFlusserMomentsIFFactory_hxx
-#define otbFlusserMomentsIFFactory_hxx
-
-#include "otbFlusserMomentsIFFactory.h"
-
-
-namespace otb
-{
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-FlusserMomentsIFFactory<TImageType, TCoordRep, TPrecision>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-FlusserMomentsIFFactory<TImageType, TCoordRep, TPrecision>
-::Create(InputImageType * image,
-         ParamContainerType param,
-         MetaImageFunctionPointerType metaIF,
-         DataObjectContainerType * container)
-{
-  typename AdaptedFlusserMomentsIF::Pointer function = AdaptedFlusserMomentsIF::New();
-
-  function->SetInputImage(image);
-  function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]);
-
-  metaIF->AddFunction(function);
-  container->push_back(image);
-}
-
-}//end namespace
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.h b/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.h
deleted file mode 100644
index e89dbcf376b2d11fc590b07ce0012e6045c35cab..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbFourierMellinDescriptorsIFFactory_h
-#define otbFourierMellinDescriptorsIFFactory_h
-
-#include "itkLightObject.h"
-
-#include "otbMetaImageFunction.h"
-#include "itkDataObject.h"
-#include "otbImageFunctionAdaptor.h"
-#include "otbFourierMellinDescriptorsImageFunction.h"
-
-
-namespace otb
-{
-/** \class FourierMellinDescriptorsFFactory
- *  \brief add a FourierMellinDescriptors image function to a
- *  MetaImageFunction
- *
- *  This class aims at adding an adapted
- *  FourierMellinDescriptorsImageFunction to an existing
- *  MetaImageFunction through the method Create.
- *
- *
- * \ingroup OTBObjectDetection
- */
-
-template <class TImageType, class TCoordRep = double, class TPrecision = double>
-class ITK_EXPORT FourierMellinDescriptorsIFFactory :
-    public itk::LightObject
-{
-public:
-  /** Standard class typedefs. */
-  typedef FourierMellinDescriptorsIFFactory                               Self;
-  typedef itk::LightObject                                                Superclass;
-  typedef itk::SmartPointer<Self>                                         Pointer;
-  typedef itk::SmartPointer<const Self>                                   ConstPointer;
-
-  // New macro
-  itkNewMacro(Self);
-
-  // RTTI typeinfo
-  itkTypeMacro(FourierMellinDescriptorsIFFactory, itk::LightObject);
-
-  // Input and output typedef
-  typedef TImageType              InputImageType;
-  typedef TCoordRep               CoordRepType;
-  typedef TPrecision              PrecisionType;
-
-  // Other typedef
-  typedef typename MetaImageFunction<TPrecision>::Pointer  MetaImageFunctionPointerType;
-  typedef typename std::vector<itk::DataObject::Pointer>   DataObjectContainerType;
-  typedef typename std::vector<PrecisionType>         ParamContainerType;
-  typedef FourierMellinDescriptorsImageFunction<InputImageType, CoordRepType>
-                                                      FourierMellinDescriptorsIF;
-  typedef ImageFunctionAdaptor<FourierMellinDescriptorsIF, TPrecision>
-                                                      AdaptedFourierMellinDescriptorsIF;
-
-  void Create(InputImageType * image,
-              ParamContainerType param,
-              MetaImageFunctionPointerType metaIF,
-              DataObjectContainerType * container);
-
-protected:
-  FourierMellinDescriptorsIFFactory(){}
-  ~FourierMellinDescriptorsIFFactory() override{}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  FourierMellinDescriptorsIFFactory(const Self& ) = delete;
-  void operator=(const Self& ) = delete;
-
-};
-
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbFourierMellinDescriptorsIFFactory.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.hxx
deleted file mode 100644
index bb19f36cf7a608203ca02e2fffd12a8bbb729951..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.hxx
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbFourierMellinDescriptorsIFFactory_hxx
-#define otbFourierMellinDescriptorsIFFactory_hxx
-
-#include "otbFourierMellinDescriptorsIFFactory.h"
-
-
-namespace otb
-{
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-FourierMellinDescriptorsIFFactory<TImageType, TCoordRep, TPrecision>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-FourierMellinDescriptorsIFFactory<TImageType, TCoordRep, TPrecision>
-::Create(InputImageType * image,
-         ParamContainerType param,
-         MetaImageFunctionPointerType metaIF,
-         DataObjectContainerType * container)
-{
-  typename AdaptedFourierMellinDescriptorsIF::Pointer function = AdaptedFourierMellinDescriptorsIF::New();
-
-  function->SetInputImage(image);
-  function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]);
-  function->GetInternalImageFunction()->SetPmax(param[1]);
-  function->GetInternalImageFunction()->SetQmax(param[2]);
-
-  metaIF->AddFunction(function);
-  container->push_back(image);
-}
-
-}//end namespace
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.h b/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.h
deleted file mode 100644
index b00367a73b0b655ddfc57f2305cc15e18922636e..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbHaralickTexturesIFFactory_h
-#define otbHaralickTexturesIFFactory_h
-
-#include "itkLightObject.h"
-
-#include "otbMetaImageFunction.h"
-#include "itkDataObject.h"
-#include "otbImage.h"
-#include "otbImageFunctionAdaptor.h"
-#include "otbHaralickTexturesImageFunction.h"
-
-
-namespace otb
-{
-/** \class HaralickTexturesFFactory
- *  \brief add a HaralickTextures image function to a
- *  MetaImageFunction
- *
- *  This class aims at adding an adapted
- *  HaralickTexturesImageFunction to an existing
- *  MetaImageFunction through the method Create.
- *
- *
- * \ingroup OTBObjectDetection
- */
-
-template <class TImageType, class TCoordRep = double, class TPrecision = double>
-class ITK_EXPORT HaralickTexturesIFFactory :
-    public itk::LightObject
-{
-public:
-  /** Standard class typedefs. */
-  typedef HaralickTexturesIFFactory                                       Self;
-  typedef itk::LightObject                                                Superclass;
-  typedef itk::SmartPointer<Self>                                         Pointer;
-  typedef itk::SmartPointer<const Self>                                   ConstPointer;
-
-  // New macro
-  itkNewMacro(Self);
-
-  // RTTI typeinfo
-  itkTypeMacro(haralickTexturesIFFactory, itk::LightObject);
-
-  // Input and output typedef
-  typedef TImageType              InputImageType;
-  typedef TCoordRep               CoordRepType;
-  typedef TPrecision              PrecisionType;
-
-  // Other typedef
-  typedef typename MetaImageFunction<TPrecision>::Pointer  MetaImageFunctionPointerType;
-  typedef typename std::vector<itk::DataObject::Pointer>   DataObjectContainerType;
-  typedef typename std::vector<PrecisionType>              ParamContainerType;
-  typedef HaralickTexturesImageFunction<InputImageType, CoordRepType>
-                                                           HaralickTexturesIF;
-  typedef typename HaralickTexturesIF::OffsetType          OffsetType;
-  typedef ImageFunctionAdaptor<HaralickTexturesIF, TPrecision>
-                                                           AdaptedHaralickTexturesIF;
-
-  void Create(InputImageType * image,
-              ParamContainerType param,
-              MetaImageFunctionPointerType metaIF,
-              DataObjectContainerType * container);
-
-protected:
-  HaralickTexturesIFFactory(){}
-  ~HaralickTexturesIFFactory() override{}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  HaralickTexturesIFFactory(const Self& ) = delete;
-  void operator=(const Self& ) = delete;
-
-};
-
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbHaralickTexturesIFFactory.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.hxx
deleted file mode 100644
index fe1d2934f0fce071bc89d7bd8d7f66964c21a8a7..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.hxx
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbHaralickTexturesIFFactory_hxx
-#define otbHaralickTexturesIFFactory_hxx
-
-#include "otbHaralickTexturesIFFactory.h"
-
-
-namespace otb
-{
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-HaralickTexturesIFFactory<TImageType, TCoordRep, TPrecision>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-HaralickTexturesIFFactory<TImageType, TCoordRep, TPrecision>
-::Create(InputImageType * image,
-         ParamContainerType param,
-         MetaImageFunctionPointerType metaIF,
-         DataObjectContainerType * container)
-{
-  typename AdaptedHaralickTexturesIF::Pointer function = AdaptedHaralickTexturesIF::New();
-
-  function->SetInputImage(image);
-  function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]);
-  function->SetInputImageMinimum(param[1]);
-  function->SetInputImageMaximum(param[2]);
-  function->SetNumberOfBinsPerAxis(param[3]);
-
-  OffsetType offset;
-  offset.Fill(param[4]);
-  function->GetInternalImageFunction()->SetOffset(offset);
-
-  metaIF->AddFunction(function);
-  container->push_back(image);
-}
-
-}//end namespace
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.h b/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.h
deleted file mode 100644
index 9dd970997cbdc27a374e2fd22f6a8c59070f01eb..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbLabeledSampleLocalizationGenerator_h
-#define otbLabeledSampleLocalizationGenerator_h
-
-#include "otbVectorDataSource.h"
-#include "otbVectorData.h"
-#include "itkPreOrderTreeIterator.h"
-#include "itkMersenneTwisterRandomVariateGenerator.h"
-#include "itkEuclideanDistanceMetric.h"
-#include <string>
-
-
-namespace otb
-{
-/** \class LabeledSampleLocalizationGenerator
- *  \brief Produces a VectorData from potentialy multiple VectorData
- *
- *  This generator produces a unique vector data containing labeled positions
- *  extracted from inputs.
- *
- *  Input points are transmitted to the output. In addition, 'no class'
- *  points are randomly picked inside input polygons making sure
- *  they are at least at a given distance (InhibitionRadius) of every
- *  known points.
- *
- *  Classes are specified by the VectorData with a metadata field identified by
- *  a specific key. This key can be provided by the SetClassKey() method
- *  (using "Class" as a default key).
- *  The field is retrieved by GetFieldAsInt(), thus must be int-compatible
- *
- *
- * \ingroup OTBObjectDetection
- */
-template <class TVectorData>
-class ITK_EXPORT LabeledSampleLocalizationGenerator :
-    public VectorDataSource<TVectorData>
-{
-public:
-  /** Standard class typedefs */
-  typedef LabeledSampleLocalizationGenerator           Self;
-  typedef VectorDataSource<TVectorData>                Superclass;
-  typedef itk::SmartPointer<Self>                      Pointer;
-  typedef itk::SmartPointer<const Self>                ConstPointer;
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(LabeledSampleLocalizationGenerator, VectorDataSource);
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  typedef TVectorData                                           VectorDataType;
-  typedef typename VectorDataType::Pointer                      VectorDataPointerType;
-  typedef typename VectorDataType::DataNodeType                 DataNodeType;
-  typedef typename DataNodeType::PolygonType::RegionType        RegionType;
-  typedef typename DataNodeType::PointType                      PointType;
-  typedef typename DataNodeType::PolygonType::VertexType        VertexType;
-  typedef typename std::vector<PointType>                       PointVectorType;
-
-  typedef itk::PreOrderTreeIterator<typename VectorDataType::DataTreeType> TreeIteratorType;
-
-  typedef itk::Statistics::MersenneTwisterRandomVariateGenerator RandomGeneratorType;
-  typedef itk::Statistics::EuclideanDistanceMetric<PointType>    EuclideanDistanceMetricType;
-
-  /** Connects the VectorDatas from which the localizations are going to be extracted. */
-  using Superclass::PushBackInput;
-  void PushBackInput(const VectorDataType *);
-  const VectorDataType * GetInput(unsigned int idx) const;
-
-  /** Field name containing the class identifier */
-  itkGetConstMacro(ClassKey, std::string);
-  itkSetMacro(ClassKey, std::string);
-
-  /** Identifier for the negative samples class */
-  itkGetConstMacro(NoClassIdentifier, int);
-  itkSetMacro(NoClassIdentifier, int);
-
-  /** The density of auto-generated negative samples inside the polygons */
-  itkGetConstMacro(RandomLocalizationDensity, double);
-  itkSetMacro(RandomLocalizationDensity, double);
-
-  /** The minimum distance between a generated negative sample and positive samples */
-  itkGetConstMacro(InhibitionRadius, double);
-  itkSetMacro(InhibitionRadius, double);
-
-  /** The maximum iteration number during negative sample positions */
-  itkGetConstMacro(NbMaxIteration, unsigned long int);
-  itkSetMacro(NbMaxIteration, unsigned long int);
-
-  /** Set the number of samples position to generate inside the inhibition radius window around a positive point */
-  itkGetConstMacro(NumberOfPositiveSamplesPerPoint, unsigned int);
-  itkSetMacro(NumberOfPositiveSamplesPerPoint, unsigned int);
-
-  /** Set the seed for random number generator */
-  void SetSeed(unsigned int seed)
-  {
-    m_RandomGenerator->SetSeed(seed);
-  }
-
-protected:
-  LabeledSampleLocalizationGenerator();
-  ~LabeledSampleLocalizationGenerator() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-  /** Triggers the Computation of the sample list */
-  void GenerateData(void) override;
-
-  PointVectorType RandomPointsGenerator(DataNodeType * node);
-
-  PointVectorType PointDensification(DataNodeType * node);
-
-private:
-  LabeledSampleLocalizationGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  std::string GetNextID()
-  {
-    std::ostringstream oss;
-    oss << m_CurrentID++;
-    return oss.str();
-  }
-
-  RandomGeneratorType::Pointer m_RandomGenerator;
-
-  std::string               m_ClassKey;
-  int                       m_NoClassIdentifier;
-  double                    m_RandomLocalizationDensity;
-  double                    m_InhibitionRadius;
-  unsigned long int         m_NbMaxIteration;
-  unsigned int              m_NumberOfPositiveSamplesPerPoint;
-  unsigned int              m_CurrentID;
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbLabeledSampleLocalizationGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.hxx b/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.hxx
deleted file mode 100644
index dc0869fc214e889a64dc9f410a6b106545e14574..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.hxx
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbLabeledSampleLocalizationGenerator_hxx
-#define otbLabeledSampleLocalizationGenerator_hxx
-
-#include "otbLabeledSampleLocalizationGenerator.h"
-
-#include "otbMath.h"
-
-namespace otb
-{
-template<class TVectorData>
-LabeledSampleLocalizationGenerator<TVectorData>
-::LabeledSampleLocalizationGenerator() :
-  m_ClassKey("Class"),
-  m_NoClassIdentifier(0),
-  m_RandomLocalizationDensity(.005),
-  m_InhibitionRadius(5.0),
-  m_NbMaxIteration(10000),
-  m_NumberOfPositiveSamplesPerPoint(50),
-  m_CurrentID(0)
-{
-  this->SetNumberOfRequiredInputs(1);
-  this->SetNumberOfRequiredOutputs(1);
-
-  m_RandomGenerator = RandomGeneratorType::GetInstance();
-}
-
-template <class TVectorData>
-void
-LabeledSampleLocalizationGenerator<TVectorData>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  this->Superclass::PrintSelf(os, indent);
-  os << indent << "Class Key: " << m_ClassKey << std::endl;
-  os << indent << "Negative Class Identifier: " << m_NoClassIdentifier << std::endl;
-  os << indent << "Sampling Density: " << m_RandomLocalizationDensity << std::endl;
-  os << indent << "Inhibition Radius: " << m_InhibitionRadius << std::endl;
-}
-
-
-template <class TVectorData>
-void
-LabeledSampleLocalizationGenerator<TVectorData>
-::PushBackInput(const VectorDataType * vectorData)
-{
-  this->Superclass::SetNthInput(this->GetNumberOfIndexedInputs(), const_cast<VectorDataType *>(vectorData));
-}
-
-template <class TVectorData>
-const TVectorData *
-LabeledSampleLocalizationGenerator<TVectorData>
-::GetInput(unsigned int idx) const
-{
-  if (this->GetNumberOfInputs() < idx)
-    {
-    return nullptr;
-    }
-
-  return static_cast<const VectorDataType *>(this->Superclass::GetInput(idx));
-}
-
-template <class TVectorData>
-typename LabeledSampleLocalizationGenerator<TVectorData>
-::PointVectorType
-LabeledSampleLocalizationGenerator<TVectorData>
-::PointDensification(DataNodeType * node)
-{
-
-  PointVectorType pPoint;
-  PointType centerPoint = node->GetPoint();
-
-  for(unsigned int i = 0; i < m_NumberOfPositiveSamplesPerPoint; ++i)
-    {
-    PointType point;
-    for(unsigned int dim = 0; dim < 2; ++dim)
-      {
-      point[dim] = centerPoint[dim]+this->m_RandomGenerator->GetUniformVariate(-m_InhibitionRadius, m_InhibitionRadius);
-      }
-    pPoint.push_back(point);
-    }
-  return pPoint;
-}
-
-template <class TVectorData>
-typename LabeledSampleLocalizationGenerator<TVectorData>
-::PointVectorType
-LabeledSampleLocalizationGenerator<TVectorData>
-::RandomPointsGenerator(DataNodeType * node)
-{
-  // Output
-  PointVectorType vPoint;
-
-  // Euclidean distance
-  typename EuclideanDistanceMetricType::Pointer euclideanDistanceMetric = EuclideanDistanceMetricType::New();
-
-  // Gathering Information
-  RegionType generatorRegion = node->GetPolygonExteriorRing()->GetBoundingRegion();
-  typename RegionType::SizeType generatorRegionSize = generatorRegion.GetSize();
-  typename RegionType::IndexType generatorRegionIndex = generatorRegion.GetIndex();
-  //typename RegionType::IndexType generatorRegionOrigin = generatorRegion.GetOrigin();
-
-  // Identify inside known points
-  std::vector<PointType> insiders;
-  typename VectorDataType::ConstPointer vectorData = static_cast<const VectorDataType *>(this->GetOutput(0));
-  TreeIteratorType itVector(vectorData->GetDataTree());
-  itVector.GoToBegin();
-  while (!itVector.IsAtEnd())
-    {
-    if (itVector.Get()->IsPointFeature() && itVector.Get()->GetFieldAsInt(m_ClassKey) != m_NoClassIdentifier)
-      {
-      VertexType vertex;
-      vertex[0] = itVector.Get()->GetPoint()[0];
-      vertex[1] = itVector.Get()->GetPoint()[1];
-
-      if(node->GetPolygonExteriorRing()->IsInside(vertex))
-        {
-        insiders.push_back(itVector.Get()->GetPoint());
-        }
-      }
-    ++itVector;
-    }
-
-  // Generation
-  unsigned int nbMaxPosition = (unsigned int)(node->GetPolygonExteriorRing()->GetArea()
-                                              * this->GetRandomLocalizationDensity());
-  unsigned long int nbIter =  this->GetNbMaxIteration();
-  unsigned int nbPosition = nbMaxPosition;
-
-  PointType rangeMin, rangeMax;
-
-  for(unsigned int dim = 0; dim < 2; ++dim)
-    {
-    rangeMin[dim] = generatorRegionIndex[dim];
-    rangeMax[dim] = generatorRegionIndex[dim] + generatorRegionSize[dim];
-    }
-
-  while(nbIter > 0 && nbPosition > 0)
-    {
-    VertexType candidate;
-    for(unsigned int dim = 0; dim < 2; ++dim)
-      {
-      candidate[dim] = this->m_RandomGenerator->GetUniformVariate(rangeMin[dim], rangeMax[dim]);
-      }
-
-    if(node->GetPolygonExteriorRing()->IsInside(candidate))
-      {
-      typename PointVectorType::const_iterator pit = insiders.begin();
-      bool valid = true;
-
-      while(valid && pit!=insiders.end())
-        {
-        valid = (euclideanDistanceMetric->Evaluate(candidate, *pit) > this->GetInhibitionRadius());
-        ++pit;
-        }
-      PointType point;
-      point[0] = candidate[0];
-      point[1] = candidate[1];
-      if(valid)
-        {
-        vPoint.push_back(point);
-        }
-      nbPosition --;
-      }
-    nbIter --;
-    }
-  return vPoint;
-}
-
-template <class TVectorData>
-void
-LabeledSampleLocalizationGenerator<TVectorData>
-::GenerateData()
-{
-  unsigned int nbInputs = this->GetNumberOfInputs();
-
-  this->GetOutput(0)->SetMetaDataDictionary(this->GetInput(0)->GetMetaDataDictionary());
-
-  // Retrieving root node
-  typename DataNodeType::Pointer root = this->GetOutput(0)->GetDataTree()->GetRoot()->Get();
-  // Create the document node
-  typename DataNodeType::Pointer document = DataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  // Adding the layer to the data tree
-  this->GetOutput(0)->GetDataTree()->Add(document, root);
-
-  std::string positiveClassIdentifier;
-  bool firstFeature = true;
-  // Copy all point feature in output VectorData
-  for (unsigned int i=0; i<nbInputs; ++i)
-    {
-    typename VectorDataType::ConstPointer vectorData = static_cast<const VectorDataType *>(this->GetInput(i));
-
-    TreeIteratorType itVector(vectorData->GetDataTree());
-    itVector.GoToBegin();
-    while (!itVector.IsAtEnd())
-      {
-      if (itVector.Get()->IsPointFeature())
-        {
-        //Get the value of the positive value of
-        if (firstFeature)
-          {
-          positiveClassIdentifier = itVector.Get()->GetFieldAsString(m_ClassKey);
-          firstFeature = false;
-          }
-        // Duplicate input feature
-        typename DataNodeType::Pointer currentGeometry = DataNodeType::New();
-        currentGeometry->SetNodeId(this->GetNextID());
-        currentGeometry->SetNodeType(otb::FEATURE_POINT);
-        currentGeometry->SetPoint(itVector.Get()->GetPoint());
-
-        std::vector<std::string> fields = itVector.Get()->GetFieldList();
-        for (std::vector<std::string>::const_iterator it = fields.begin(); it != fields.end(); ++it)
-          {
-          currentGeometry->SetFieldAsString( *it, itVector.Get()->GetFieldAsString(*it) );
-          // The PositiveClass identifier must be an attribute of the class
-
-          }
-
-        this->GetOutput(0)->GetDataTree()->Add(currentGeometry, document);
-        }
-      ++itVector;
-      }
-    }
-
-  // Iterates through the polygon features and generates random point inside the polygon with
-  // the "NoClass" identifier
-  for (unsigned int i=0; i<nbInputs; ++i)
-    {
-    typename VectorDataType::ConstPointer vectorData = static_cast<const VectorDataType *>(this->GetInput(i));
-
-    TreeIteratorType itVector(vectorData->GetDataTree());
-    itVector.GoToBegin();
-    while (!itVector.IsAtEnd())
-      {
-      if (itVector.Get()->IsPolygonFeature())
-        {
-        PointVectorType vPoints = RandomPointsGenerator(itVector.Get());
-
-        for (typename PointVectorType::const_iterator it = vPoints.begin(); it != vPoints.end(); ++it)
-          {
-          typename DataNodeType::Pointer currentGeometry = DataNodeType::New();
-          currentGeometry->SetNodeId(this->GetNextID());
-          currentGeometry->SetNodeType(otb::FEATURE_POINT);
-          currentGeometry->SetPoint(*it);
-          currentGeometry->SetFieldAsInt(this->GetClassKey(), this->GetNoClassIdentifier());
-          this->GetOutput(0)->GetDataTree()->Add(currentGeometry, document);
-          }
-        }
-      ++itVector;
-      }
-    }
-  // Densify positive points
-  for (unsigned int i=0; i<nbInputs; ++i)
-    {
-    typename VectorDataType::ConstPointer vectorData = static_cast<const VectorDataType *>(this->GetInput(i));
-
-    TreeIteratorType itVector(vectorData->GetDataTree());
-    itVector.GoToBegin();
-    while (!itVector.IsAtEnd())
-      {
-      if (itVector.Get()->IsPointFeature())
-        {
-        PointVectorType pPoints = PointDensification(itVector.Get());
-
-        for (typename PointVectorType::const_iterator it = pPoints.begin(); it != pPoints.end(); ++it)
-          {
-          typename DataNodeType::Pointer currentGeometry = DataNodeType::New();
-          currentGeometry->SetNodeId(this->GetNextID());
-          currentGeometry->SetNodeType(otb::FEATURE_POINT);
-          currentGeometry->SetPoint(*it);
-          currentGeometry->SetFieldAsInt(this->GetClassKey(), atoi(positiveClassIdentifier.c_str()) );
-          this->GetOutput(0)->GetDataTree()->Add(currentGeometry, document);
-          }
-        }
-      ++itVector;
-      }
-    }
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.h b/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.h
deleted file mode 100644
index 1747e5912b28fce922d3a4a04633ac461138b703..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbLocalHistogramIFFactory_h
-#define otbLocalHistogramIFFactory_h
-
-#include "itkLightObject.h"
-
-#include "otbMetaImageFunction.h"
-#include "itkDataObject.h"
-#include "otbImage.h"
-#include "otbImageFunctionAdaptor.h"
-#include "otbLocalHistogramImageFunction.h"
-
-
-namespace otb
-{
-/** \class LocalHistogramIFFactory
- *  \brief add a LocalHistogram image function to a
- *  MetaImageFunction
- *
- *  This class aims at adding an adapted
- *  LocalHistogramImageFunction to an existing MetaImageFunction
- *  through the method Create.
- *
- *
- * \ingroup OTBObjectDetection
- */
-
-template <class TImageType, class TCoordRep = double, class TPrecision = double>
-class ITK_EXPORT LocalHistogramIFFactory :
-    public itk::LightObject
-{
-public:
-  /** Standard class typedefs. */
-  typedef LocalHistogramIFFactory                                         Self;
-  typedef itk::LightObject                                                Superclass;
-  typedef itk::SmartPointer<Self>                                         Pointer;
-  typedef itk::SmartPointer<const Self>                                   ConstPointer;
-
-  // New macro
-  itkNewMacro(Self);
-
-  // RTTI typeinfo
-  itkTypeMacro(LocalHistogramIFFactory, itk::LightObject);
-
-  // Input and output typedef
-  typedef TImageType              InputImageType;
-  typedef TCoordRep               CoordRepType;
-  typedef TPrecision              PrecisionType;
-
-  // Other typedef
-  typedef typename MetaImageFunction<TPrecision>::Pointer  MetaImageFunctionPointerType;
-  typedef typename std::vector<itk::DataObject::Pointer>   DataObjectContainerType;
-  typedef typename std::vector<PrecisionType>              ParamContainerType;
-  typedef LocalHistogramImageFunction<InputImageType, CoordRepType>
-                                                      LocalHistogramIF;
-  typedef ImageFunctionAdaptor<LocalHistogramIF, TPrecision>
-                                                      AdaptedLocalHistogramIF;
-
-  void Create(InputImageType * image,
-              ParamContainerType param,
-              MetaImageFunctionPointerType metaIF,
-              DataObjectContainerType * container);
-
-protected:
-  LocalHistogramIFFactory(){}
-  ~LocalHistogramIFFactory() override{}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  LocalHistogramIFFactory(const Self& ) = delete;
-  void operator=(const Self& ) = delete;
-
-};
-
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbLocalHistogramIFFactory.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.hxx
deleted file mode 100644
index c3c8d27695fc7d38089f79700f988ef4b7a1ccda..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.hxx
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbLocalHistogramIFFactory_hxx
-#define otbLocalHistogramIFFactory_hxx
-
-#include "otbLocalHistogramIFFactory.h"
-
-
-namespace otb
-{
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-LocalHistogramIFFactory<TImageType, TCoordRep, TPrecision>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-LocalHistogramIFFactory<TImageType, TCoordRep, TPrecision>
-::Create(InputImageType * image,
-         ParamContainerType param,
-         MetaImageFunctionPointerType metaIF,
-         DataObjectContainerType * container)
-{
-  typename AdaptedLocalHistogramIF::Pointer function = AdaptedLocalHistogramIF::New();
-
-  function->SetInputImage(image);
-  function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]);
-  function->GetInternalImageFunction()->SetNumberOfHistogramBins(param[1]);
-  function->GetInternalImageFunction()->SetHistogramMin(param[2]);
-  function->GetInternalImageFunction()->SetHistogramMax(param[3]);
-
-  metaIF->AddFunction(function);
-  container->push_back(image);
-}
-
-}//end namespace
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbMultiChannelIFFactory.h b/Modules/Detection/ObjectDetection/include/otbMultiChannelIFFactory.h
deleted file mode 100644
index a99de90d24b8365f194f87f2966e227d4b7abb3e..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbMultiChannelIFFactory.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMultiChannelIFFactory_h
-#define otbMultiChannelIFFactory_h
-
-#include "otbVectorImageToImageListFilter.h"
-#include "otbVectorImage.h"
-#include "otbImage.h"
-#include "otbImageList.h"
-#include "itkDataObject.h"
-#include "otbMetaImageFunction.h"
-
-
-namespace otb
-{
-/** \class MultiChannelIFFactory
- *  \brief Yhis class handle the image type before the use of an
- *  image function factory
- *
- *  According to the image type, the Create method of this class can
- *  call an ImageFunctionFactory for each band of the input image or
- *  once if the image type is otb::Image.
- *
- *
- * \ingroup OTBObjectDetection
- */
-
-template <class TIFFactory, class TInputImage>
-class MultiChannelIFFactory
-{
-public:
-  typedef TIFFactory                                    IFFactoryType;
-  typedef TInputImage                                   InputImageType;
-  typedef typename IFFactoryType::Pointer               IFFactoryPointerType;
-  typedef typename IFFactoryType::InputImageType        ImageType;
-  typedef typename IFFactoryType::CoordRepType          CoordRepType;
-  typedef typename IFFactoryType::PrecisionType         PrecisionType;
-  typedef typename std::vector<PrecisionType>           ParameterContainerType;
-  typedef typename std::vector<itk::DataObject::Pointer>   ImageContainer;
-  typedef typename MetaImageFunction<PrecisionType>::Pointer  MetaIFPointerType;
-
-  typedef ImageList<ImageType>                             ImageListType;
-  typedef VectorImageToImageListFilter<InputImageType,
-                                                ImageListType>      VIToILFilterType;
-
-  void Create(InputImageType * image,
-              ParameterContainerType param,
-              MetaIFPointerType metaIF,
-              ImageContainer * container)
-  {
-    m_Factory->Create(image, param, metaIF, container);
-  }
-
-  MultiChannelIFFactory()
-  {
-    m_Factory = IFFactoryType::New();
-  }
-
-  virtual ~MultiChannelIFFactory(){};
-
-private:
-  IFFactoryPointerType   m_Factory;
-
-};
-
-
-template <class TIFFactory, typename TPixel, unsigned int VImageDimension>
-class MultiChannelIFFactory<TIFFactory, otb::VectorImage<TPixel, VImageDimension> >
-{
-public:
-  typedef TIFFactory                                    IFFactoryType;
-  typedef typename IFFactoryType::Pointer               IFFactoryPointerType;
-  typedef typename IFFactoryType::InputImageType        ImageType;
-  typedef typename IFFactoryType::CoordRepType          CoordRepType;
-  typedef typename IFFactoryType::PrecisionType         PrecisionType;
-  typedef VectorImage<TPixel, 2>                        InputImageType;
-
-  typedef typename std::vector<PrecisionType>           ParameterContainerType;
-  typedef typename std::vector<itk::DataObject::Pointer>       ImageContainer;
-  typedef typename MetaImageFunction<PrecisionType>::Pointer     MetaIFPointerType;
-
-  typedef ImageList<ImageType>                             ImageListType;
-  typedef VectorImageToImageListFilter<InputImageType,
-                                                ImageListType>      VIToILFilterType;
-
-  void Create(InputImageType * image,
-              ParameterContainerType param,
-              MetaIFPointerType metaIF,
-              ImageContainer * container)
-  {
-    unsigned int nbBand;
-    typename VIToILFilterType::Pointer filter = VIToILFilterType::New();
-
-    filter->SetInput(image);
-    filter->UpdateOutputInformation();
-    nbBand = filter->GetOutput()->Size();
-
-    for (unsigned int i=0; i<nbBand; ++i)
-      {
-      filter->GetOutput()->GetNthElement(i)->UpdateOutputInformation();
-      m_Factory->Create(filter->GetOutput()->GetNthElement(i), param, metaIF, container);
-      }
-  }
-
-  MultiChannelIFFactory()
-  {
-    m_Factory = IFFactoryType::New();
-  }
-
-  virtual ~MultiChannelIFFactory(){};
-
-private:
-  IFFactoryPointerType   m_Factory;
-
-};
-} //end namespace
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.h b/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.h
deleted file mode 100644
index 01d371d964df9245b8c225f546f4c09429cf1730..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.h
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbObjectDetectionClassifier_h
-#define otbObjectDetectionClassifier_h
-
-#include <vector>
-#include <string>
-
-#include "itkImageRegion.h"
-#include "itkFixedArray.h"
-#include "itkVariableLengthVector.h"
-#include "itkListSample.h"
-#include "itkDataObjectDecorator.h"
-#include "itkSimpleDataObjectDecorator.h"
-#include "itkFunctionBase.h"
-
-#include "otbVectorData.h"
-#include "otbMachineLearningModel.h"
-#include "otbPersistentImageFilter.h"
-#include "otbPersistentFilterStreamingDecorator.h"
-
-namespace otb
-{
-
-template <class TFunctionPrecision>
-class DefaultDescriptorType
-{
-public:
-  typedef itk::VariableLengthVector<TFunctionPrecision> Type;
-};
-
-/** \class PersistentObjectDetectionClassifier
- *  \brief [internal] Helper class for the implementation of ObjectDetectionClassifier
- *  with streaming capabilities
- *
- *  This class inherits PersistentImageFilter and provides the Reset/Synthesize functions,
- *  plus the ThreadedGenerateData function implementing the image function evaluation
- *
- *
- * \ingroup OTBObjectDetection
- */
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-class ITK_EXPORT PersistentObjectDetectionClassifier :
-  public PersistentImageFilter<TInputImage, TInputImage>
-{
-public:
-  /** Standard Self typedef */
-  typedef PersistentObjectDetectionClassifier        Self;
-  typedef PersistentImageFilter<TInputImage, TInputImage> Superclass;
-  typedef itk::SmartPointer<Self>                         Pointer;
-  typedef itk::SmartPointer<const Self>                   ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Runtime information support. */
-  itkTypeMacro(PersistentObjectDetectionClassifier, PersistentImageFilter);
-
-  /** Image related typedefs. */
-  typedef TInputImage                      InputImageType;
-  typedef typename TInputImage::Pointer    InputImagePointer;
-  typedef typename TInputImage::RegionType RegionType;
-  typedef typename TInputImage::SizeType   SizeType;
-  typedef typename TInputImage::IndexType  IndexType;
-  typedef typename TInputImage::PixelType  PixelType;
-
-  itkStaticConstMacro(InputImageDimension, unsigned int,
-                      TInputImage::ImageDimension);
-
-  /** Image related typedefs. */
-  itkStaticConstMacro(ImageDimension, unsigned int,
-                      TInputImage::ImageDimension);
-
-  /** Smart Pointer type to a DataObject. */
-  typedef typename itk::DataObject::Pointer DataObjectPointer;
-  typedef itk::ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType;
-
-  /** Input VectorData */
-  typedef TOutputVectorData                               VectorDataType;
-  typedef typename VectorDataType::Pointer                VectorDataObjectType;
-  typedef typename VectorDataType::DataNodeType           VectorDataNodeType;
-  typedef typename VectorDataType::DataNodePointerType    VectorDataNodePointerType;
-  typedef typename VectorDataType::DataTreeType           VectorDataTreeType;
-  typedef typename VectorDataType::DataTreePointerType    VectorDataTreePointerType;
-  typedef typename VectorDataNodeType::PointType          VectorDataPointType;
-  typedef typename VectorDataNodeType::LineType           VectorDataLineType;
-  typedef typename VectorDataNodeType::PolygonType        VectorDataPolygonType;
-  typedef itk::PreOrderTreeIterator<VectorDataTreeType>   VectorDataTreeIteratorType;
-
-  /** Function type for descriptors extraction */
-  typedef TFunctionType                                   DescriptorsFunctionType;
-  typedef typename DescriptorsFunctionType::Pointer       DescriptorsFunctionPointerType;
-  typedef typename DescriptorsFunctionType::InputType     DescriptorsFunctionPointType;
-  typedef typename DescriptorsFunctionType::OutputType    DescriptorType;
-  typedef typename DescriptorType::ValueType              DescriptorPrecision;
-
-  typedef itk::ContinuousIndex
-        <typename DescriptorsFunctionPointType::ValueType,
-         itkGetStaticConstMacro(InputImageDimension)>     ContinuousIndexType;
-
-  /** TLabel output */
-  typedef TLabel                                             LabelType;
-  typedef MachineLearningModel<DescriptorPrecision, LabelType> ModelType;
-  typedef typename ModelType::Pointer                     ModelPointerType;
-  typedef typename ModelType::InputSampleType             ModelMeasurementType;
-
-  typedef itk::Statistics::ListSample<DescriptorType>        ListSampleType;
-
-  void AddInput(itk::DataObject * dataObject) override
-  {
-    this->Superclass::AddInput(dataObject);
-  }
-
-  /** learning model used for classification */
-  void SetModel(ModelType * model);
-
-  const ModelType* GetModel(void) const;
-
-  VectorDataType* GetOutputVectorData(void);
-
-  /** The function to evaluate */
-  itkSetObjectMacro(DescriptorsFunction,      DescriptorsFunctionType);
-  itkGetObjectMacro(DescriptorsFunction,      DescriptorsFunctionType);
-  itkGetConstObjectMacro(DescriptorsFunction, DescriptorsFunctionType);
-
-  itkSetMacro( NeighborhoodRadius, unsigned int );
-  itkGetConstReferenceMacro( NeighborhoodRadius, unsigned int );
-
-  itkGetConstMacro(ClassKey, std::string);
-  itkSetMacro(ClassKey, std::string);
-
-  itkGetMacro(NoClassLabel, LabelType);
-  itkSetMacro(NoClassLabel, LabelType);
-
-  /** Set/Get the Shifts for this sample list */
-  itkGetMacro(Shifts, DescriptorType);
-  itkSetMacro(Shifts, DescriptorType);
-  itkGetMacro(Scales, DescriptorType);
-  itkSetMacro(Scales, DescriptorType);
-
-  /** Set/Get the grid step for detection */
-  itkSetMacro(GridStep, unsigned int);
-  itkGetMacro(GridStep, unsigned int);
-
-  /** Make a DataObject of the correct type to be used as the specified
-   * output. */
-  itk::DataObject::Pointer MakeOutput(DataObjectPointerArraySizeType idx) override;
-  using Superclass::MakeOutput;
-
-  void AllocateOutputs() override;
-
-  void GenerateOutputInformation() override;
-
-  void Reset(void) override;
-
-  void Synthetize(void) override;
-
-protected:
-  PersistentObjectDetectionClassifier();
-  ~PersistentObjectDetectionClassifier() override;
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-  void GenerateInputRequestedRegion() override;
-
-  void BeforeThreadedGenerateData() override;
-
-  /** Multi-thread version GenerateData. */
-  void  ThreadedGenerateData(const RegionType& outputRegionForThread,
-                             itk::ThreadIdType threadId) override;
-
-private:
-  PersistentObjectDetectionClassifier(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  template <typename TCoordRepType>
-  bool
-  IsInsideWithNeighborhoodRadius(const RegionType& region, const ContinuousIndexType &index) const
-    {
-    typedef typename IndexType::IndexValueType IndexValueType;
-
-    for(unsigned int i=0; i<ImageDimension; ++i)
-      {
-      if( itk::Math::RoundHalfIntegerUp<IndexValueType>(index[i]) < static_cast<IndexValueType>( region.GetIndex(i) ) + m_NeighborhoodRadius  + 1 )
-       //Comment this instruction after itkv4 migration (correct
-       //usage of centered-pixel coordinates)
-       //if( index[i] < static_cast<TCoordRepType>( region.GetIndex(i) ) + m_NeighborhoodRadius )
-        {
-        return false;
-        }
-      // bound is the last valid pixel location
-      const TCoordRepType bound = static_cast<TCoordRepType>(
-          region.GetIndex(i) + region.GetSize(i) - 0.5);
-      //Comment this instruction after itkv4 migration (correct
-      //usage of centered-pixel coordinates)
-      //const TCoordRepType bound = static_cast<TCoordRepType>(
-      //    region.GetIndex(i) + static_cast<IndexValueType>(region.GetSize(i)) - 1);
-      if( index[i] > bound - m_NeighborhoodRadius - 1 )
-        {
-        return false;
-        }
-      }
-    return true;
-    }
-
-  typedef std::pair<DescriptorsFunctionPointType, LabelType> DetectedPoint;
-  typedef std::vector<DetectedPoint>                         PointArray;
-  typedef std::vector<PointArray>                            PointArrayContainer;
-  PointArrayContainer            m_ThreadPointArray;
-
-  DescriptorsFunctionPointerType m_DescriptorsFunction;
-
-  unsigned int   m_NeighborhoodRadius;
-  std::string    m_ClassKey;
-  LabelType      m_NoClassLabel;
-  DescriptorType m_Shifts;
-  DescriptorType m_Scales;
-  DescriptorType m_InvertedScales;
-
-  /** Step of the detection grid */
-  unsigned int m_GridStep;
-
-  /** classification model */
-  ModelPointerType m_Model;
-
-};
-
-
-/** \class ObjectDetectionClassifier
- *  \brief This class detects object in an image, given a ML model and a local descriptors function
- *
- *  Given an image (by SetInputImage()), a ML model (by SetModel) and an local descriptors ImageFunction
- *  (set by SetDescriptorsFunction()), this class computes the local descriptors on a regular grid
- *  over the image, and evaluates the class label of the corresponding sample.
- *  It outputs a vector data with the points for which the descriptors are not classified as "negative",
- *  the negative class label being given by SetNoClassLabel()
- *
- *  This class is streaming capable and multithreaded
- *
- * \ingroup OTBObjectDetection
- */
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionPrecision = double, class TCoordRep = double>
-class ITK_EXPORT ObjectDetectionClassifier :
-    public PersistentFilterStreamingDecorator<
-              PersistentObjectDetectionClassifier< TInputImage,
-                                                   TOutputVectorData,
-                                                   TLabel,
-                                                   itk::FunctionBase< itk::Point<TCoordRep, 2>,
-                                                                      typename DefaultDescriptorType<TFunctionPrecision>::Type> >
-                                                 >
-{
-public:
-    /** Standard Self typedef */
-    typedef ObjectDetectionClassifier           Self;
-    typedef PersistentFilterStreamingDecorator
-              < PersistentObjectDetectionClassifier
-                  <TInputImage,
-                  TOutputVectorData,
-                  TLabel,
-                  itk::FunctionBase< itk::Point<TCoordRep, 2>,
-                                     typename DefaultDescriptorType<TFunctionPrecision>::Type> >
-              >                                 Superclass;
-    typedef itk::SmartPointer<Self>             Pointer;
-    typedef itk::SmartPointer<const Self>       ConstPointer;
-
-    /** Type macro */
-    itkNewMacro(Self);
-
-    /** Creation through object factory macro */
-    itkTypeMacro(ObjectDetectionClassifier, PersistentFilterStreamingDecorator);
-
-    typedef TInputImage                              InputImageType;
-    typedef TOutputVectorData                        OutputVectorDataType;
-    typedef TLabel                                   LabelType;
-    typedef TCoordRep                                CoordRepType;
-    typedef TFunctionPrecision                       FunctionPrecision;
-
-    /** The coordinates used when evaluating function */
-    typedef itk::Point<TCoordRep, 2> PointType;
-
-    /** The return value of the function */
-    typedef typename DefaultDescriptorType<FunctionPrecision>::Type DescriptorType;
-
-    /** The function evaluated on the input image at locations specified by the vector data */
-    typedef itk::FunctionBase<PointType, DescriptorType> DescriptorsFunctionType;
-    typedef typename DescriptorsFunctionType::Pointer    DescriptorsFunctionPointerType;
-
-    typedef typename Superclass::FilterType                           PersistentFilterType;
-
-    typedef typename PersistentFilterType::ModelType                  ModelType;
-    typedef typename PersistentFilterType::ModelPointerType           ModelPointerType;
-
-    /** Input image to extract feature */
-    void SetInputImage(InputImageType* input)
-    {
-      this->GetFilter()->SetInput(input);
-    }
-
-    /** Sample locations as a VectorData of points. The label is in the ClassKey feature */
-    OutputVectorDataType* GetOutputVectorData()
-    {
-      return this->GetFilter()->GetOutputVectorData();
-    }
-
-    void AddInput(itk::DataObject * dataObject) override
-    {
-      this->GetFilter()->AddInput(dataObject);
-    }
-
-    /** The function to evaluate */
-    void SetDescriptorsFunction(DescriptorsFunctionType * input)
-    {
-      this->GetFilter()->SetDescriptorsFunction(input);
-    }
-
-    /** The function to evaluate */
-    DescriptorsFunctionType * GetDescriptorsFunction()
-    {
-      return this->GetFilter()->GetDescriptorsFunction();
-    }
-
-    /** The function to evaluate */
-    void SetModel(ModelType* model)
-    {
-      this->GetFilter()->SetModel(model);
-    }
-
-    /** The classification model */
-    const ModelType* GetModel()
-    {
-      return this->GetFilter()->GetModel();
-    }
-
-    otbSetObjectMemberMacro(Filter, NeighborhoodRadius, unsigned int);
-    otbGetObjectMemberMacro(Filter, NeighborhoodRadius, unsigned int);
-
-    /** Set/Get the name of the field containing the class information */
-    otbGetObjectMemberMacro(Filter, ClassKey, std::string);
-    otbSetObjectMemberMacro(Filter, ClassKey, std::string);
-
-    /** Set/Get the  label of the negative samples */
-    otbGetObjectMemberMacro(Filter, NoClassLabel, LabelType);
-    otbSetObjectMemberMacro(Filter, NoClassLabel, LabelType);
-
-    /** Set/Get the Shifts for this sample list */
-    otbGetObjectMemberMacro(Filter, Shifts, DescriptorType);
-    otbSetObjectMemberMacro(Filter, Shifts, DescriptorType);
-
-    /** Set/Get the Scales for this sample list */
-    otbGetObjectMemberMacro(Filter, Scales, DescriptorType);
-    otbSetObjectMemberMacro(Filter, Scales, DescriptorType);
-
-    /** Set/Get the grid step for detection */
-    otbSetObjectMemberMacro(Filter, GridStep, unsigned int);
-    otbGetObjectMemberMacro(Filter, GridStep, unsigned int);
-
-
-  protected:
-    /** Constructor */
-    ObjectDetectionClassifier();
-
-    /** Destructor */
-    ~ObjectDetectionClassifier() override;
-
-  private:
-    ObjectDetectionClassifier(const Self &) = delete;
-    void operator =(const Self&) = delete;
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbObjectDetectionClassifier.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.hxx b/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.hxx
deleted file mode 100644
index 97781629e68ef470e1f35b8aeac6ccb1d273f1dd..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.hxx
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbObjectDetectionClassifier_hxx
-#define otbObjectDetectionClassifier_hxx
-
-#include "otbObjectDetectionClassifier.h"
-
-#include "itkContinuousIndex.h"
-
-namespace otb
-{
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::PersistentObjectDetectionClassifier()
-  : m_NeighborhoodRadius(0),
-    m_ClassKey("Class"),
-    m_NoClassLabel(0),
-    m_GridStep(10)
-{
-  this->SetNumberOfRequiredInputs(1);
-
-  // Have 2 outputs : the image created by Superclass, a vector data with points
-  this->SetNumberOfRequiredOutputs(3);
-  this->itk::ProcessObject::SetNthOutput(1, this->MakeOutput(1).GetPointer());
-  this->itk::ProcessObject::SetNthOutput(2, this->MakeOutput(2).GetPointer());
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::~PersistentObjectDetectionClassifier()
-{
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-void
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::AllocateOutputs()
-{
-  // This is commented to prevent the streaming of the whole image for the first stream strip
-  // It shall not cause any problem because the output image of this filter is not intended to be used.
-  //InputImagePointer image = const_cast< TInputImage * >( this->GetInput() );
-  //this->GraftOutput( image );
-  // Nothing that needs to be allocated for the remaining outputs
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-void
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::GenerateOutputInformation()
-{
-  Superclass::GenerateOutputInformation();
-  if (this->GetInput())
-    {
-    this->GetOutput()->CopyInformation(this->GetInput());
-    this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion());
-
-    if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
-      {
-      this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
-      }
-    }
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-void
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::SetModel(ModelType* model)
-{
-  if (model != m_Model)
-    {
-    m_Model = model;
-    this->Modified();
-    }
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-const typename PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>::ModelType*
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::GetModel(void) const
-{
-  return m_Model;
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-typename PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>::VectorDataType*
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::GetOutputVectorData()
-{
-  return static_cast<VectorDataType*>(this->itk::ProcessObject::GetOutput(1));
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-itk::DataObject::Pointer
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::MakeOutput(DataObjectPointerArraySizeType idx)
-{
-  itk::DataObject::Pointer output;
-  switch (idx)
-    {
-    case 0:
-      output = static_cast<itk::DataObject*>(InputImageType::New().GetPointer());
-      break;
-    case 1:
-      {
-      output = static_cast<itk::DataObject*>(VectorDataType::New().GetPointer());
-      break;
-      }
-    default:
-      output = static_cast<itk::DataObject*>(InputImageType::New().GetPointer());
-      break;
-    }
-  return output;
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-void
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::Reset()
-{
-  m_ThreadPointArray = PointArrayContainer(this->GetNumberOfThreads());
-
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-void
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::Synthetize()
-{
-  // merge all points in a single vector data
-  //std::copy(m_ThreadPointArray[0].begin(), m_ThreadPointArray[0].end(),
-  //std::ostream_iterator<DescriptorsFunctionPointType>(std::cout, "\n") );
-
-  VectorDataType* vdata = this->GetOutputVectorData();
-
-  // Retrieving root node
-  VectorDataNodePointerType root = vdata->GetDataTree()->GetRoot()->Get();
-  // Create the document node
-  VectorDataNodePointerType document = VectorDataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  VectorDataNodePointerType folder = VectorDataNodeType::New();
-  folder->SetNodeType(otb::FOLDER);
-  // Adding the layer to the data tree
-  vdata->GetDataTree()->Add(document, root);
-  vdata->GetDataTree()->Add(folder, document);
-
-  for (itk::ThreadIdType threadId = 0; threadId < m_ThreadPointArray.size(); ++threadId)
-    {
-    PointArray& pointArray = m_ThreadPointArray[threadId];
-    typename PointArray::const_iterator it = pointArray.begin();
-    typename PointArray::const_iterator end = pointArray.end();
-
-    for (; it != end; ++it)
-      {
-      VectorDataNodePointerType currentGeometry = VectorDataNodeType::New();
-      currentGeometry->SetNodeId("FEATURE_POINT");
-      currentGeometry->SetNodeType(otb::FEATURE_POINT);
-      VectorDataPointType p;
-      p[0] = it->first[0];
-      p[1] = it->first[1];
-      currentGeometry->SetPoint(p);
-      currentGeometry->SetFieldAsInt(m_ClassKey, it->second);
-      vdata->GetDataTree()->Add(currentGeometry, folder);
-      }
-    }
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-void
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-void
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::GenerateInputRequestedRegion()
-{
-  Superclass::GenerateInputRequestedRegion();
-
-  // get pointers to the input and output
-  typename Superclass::InputImagePointer inputPtr =
-    const_cast< TInputImage * >( this->GetInput() );
-  typename Superclass::OutputImagePointer outputPtr = this->GetOutput();
-
-  if ( !inputPtr || !outputPtr )
-    {
-    return;
-    }
-
-  // get a copy of the input requested region (should equal the output
-  // requested region)
-  typename TInputImage::RegionType inputRequestedRegion;
-  inputRequestedRegion = inputPtr->GetRequestedRegion();
-
-  // pad the input requested region by the operator radius
-  inputRequestedRegion.PadByRadius( m_NeighborhoodRadius + 1 );
-
-  // crop the input requested region at the input's largest possible region
-  if ( inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()) )
-    {
-    inputPtr->SetRequestedRegion( inputRequestedRegion );
-    return;
-    }
-  else
-    {
-    // Couldn't crop the region (requested region is outside the largest
-    // possible region).  Throw an exception.
-
-    // store what we tried to request (prior to trying to crop)
-    inputPtr->SetRequestedRegion( inputRequestedRegion );
-    }
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-void
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::BeforeThreadedGenerateData()
-{
-  // Compute the 1/(sigma) vector
-  m_InvertedScales = m_Scales;
-  for(unsigned int idx = 0; idx < m_Scales.Size(); ++idx)
-    {
-    if(m_Scales[idx]-1e-10 < 0.)
-      m_InvertedScales[idx] = 0.;
-    else
-      m_InvertedScales[idx] = 1 / m_Scales[idx];
-    }
-
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType>
-void
-PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>
-::ThreadedGenerateData(const RegionType& outputRegionForThread,
-                       itk::ThreadIdType threadId)
-{
-  InputImageType* input = static_cast<InputImageType*>(this->itk::ProcessObject::GetInput(0));
-  const ModelType*   model = this->GetModel();
-
-  IndexType begin = outputRegionForThread.GetIndex();
-  IndexType end = begin;
-  end[0] += outputRegionForThread.GetSize(0);
-  end[1] += outputRegionForThread.GetSize(1);
-
-  IndexType current = begin;
-  for (; current[1] != end[1]; current[1]++)
-    {
-    if (current[1] % m_GridStep == 0)
-      {
-      for(current[0] = begin[0]; current[0] != end[0]; current[0]++)
-        {
-        if (current[0] % m_GridStep == 0)
-          {
-          DescriptorsFunctionPointType point;
-          input->TransformIndexToPhysicalPoint(current, point);
-
-          DescriptorType descriptor = m_DescriptorsFunction->Evaluate(point);
-          ModelMeasurementType modelMeasurement(descriptor.GetSize());
-          for (unsigned int i = 0; i < descriptor.GetSize(); ++i)
-            {
-            modelMeasurement[i] = (descriptor[i] - m_Shifts[i]) * m_InvertedScales[i];
-            }
-          LabelType label = (model->Predict(modelMeasurement))[0];
-
-          if (label != m_NoClassLabel)
-            {
-            m_ThreadPointArray[threadId].push_back(std::make_pair(point, label));
-            }
-          }
-        }
-      }
-    }
-}
-
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionPrecision, class TCoordRep>
-ObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionPrecision, TCoordRep>
-::ObjectDetectionClassifier()
-{
-
-}
-
-template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionPrecision, class TCoordRep>
-ObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionPrecision, TCoordRep>
-::~ObjectDetectionClassifier()
-{
-
-}
-
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.h b/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.h
deleted file mode 100644
index a40dfbed7341939bc664d29410bebf526de9d640..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRadiometricMomentsIFFactory_h
-#define otbRadiometricMomentsIFFactory_h
-
-#include "itkLightObject.h"
-
-#include "otbMetaImageFunction.h"
-#include "itkDataObject.h"
-#include "otbImage.h"
-#include "otbImageFunctionAdaptor.h"
-#include "otbRadiometricMomentsImageFunction.h"
-
-
-namespace otb
-{
-/** \class RadiometricMomentsIFFactory
- *  \brief add a RadiometricMoments image function to a
- *  MetaImageFunction
- *
- *  This class aims at adding an adapted
- *  RadiometricMomentsImageFunction to an existing MetaImageFunction
- *  through the method Create.
- *
- *
- * \ingroup OTBObjectDetection
- */
-
-template <class TImageType, class TCoordRep = double, class TPrecision = double>
-class ITK_EXPORT RadiometricMomentsIFFactory :
-    public itk::LightObject
-{
-public:
-  /** Standard class typedefs. */
-  typedef RadiometricMomentsIFFactory                                    Self;
-  typedef itk::LightObject                                                Superclass;
-  typedef itk::SmartPointer<Self>                                         Pointer;
-  typedef itk::SmartPointer<const Self>                                   ConstPointer;
-
-  // New macro
-  itkNewMacro(Self);
-
-  // RTTI typeinfo
-  itkTypeMacro(RadiometricMomentsIFFactory, itk::LightObject);
-
-  // Input and output typedef
-  typedef TImageType              InputImageType;
-  typedef TCoordRep               CoordRepType;
-  typedef TPrecision              PrecisionType;
-
-  // Other typedef
-  typedef typename MetaImageFunction<TPrecision>::Pointer  MetaImageFunctionPointerType;
-  typedef typename std::vector<itk::DataObject::Pointer>   DataObjectContainerType;
-  typedef typename std::vector<PrecisionType>              ParamContainerType;
-  typedef RadiometricMomentsImageFunction<InputImageType, CoordRepType>
-                                                           RadiometricMomentsIF;
-  typedef ImageFunctionAdaptor<RadiometricMomentsIF, TPrecision>
-                                                           AdaptedRadiometricMomentsIF;
-
-  void Create(InputImageType * image,
-              ParamContainerType param,
-              MetaImageFunctionPointerType metaIF,
-              DataObjectContainerType * container);
-
-protected:
-  RadiometricMomentsIFFactory(){}
-  ~RadiometricMomentsIFFactory() override{}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  RadiometricMomentsIFFactory(const Self& ) = delete;
-  void operator=(const Self& ) = delete;
-
-};
-
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRadiometricMomentsIFFactory.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.hxx
deleted file mode 100644
index 18f0bc730a5b998d856e8052d63a289075c1e2d9..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.hxx
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRadiometricMomentsIFFactory_hxx
-#define otbRadiometricMomentsIFFactory_hxx
-
-#include "otbRadiometricMomentsIFFactory.h"
-
-
-namespace otb
-{
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-RadiometricMomentsIFFactory<TImageType, TCoordRep, TPrecision>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-template <class TImageType, class TCoordRep, class TPrecision>
-void
-RadiometricMomentsIFFactory<TImageType, TCoordRep, TPrecision>
-::Create(InputImageType * image,
-         ParamContainerType param,
-         MetaImageFunctionPointerType metaIF,
-         DataObjectContainerType * container)
-{
-  typename AdaptedRadiometricMomentsIF::Pointer function = AdaptedRadiometricMomentsIF::New();
-
-  function->SetInputImage(image);
-  function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]);
-
-  metaIF->AddFunction(function);
-  container->push_back(image);
-}
-
-}//end namespace
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.h b/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.h
deleted file mode 100644
index 4ff7757898791d4a8a4324f3ecbce7f1429868d4..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbStandardMetaImageFunctionBuilder_h
-#define otbStandardMetaImageFunctionBuilder_h
-
-
-#include "itkVariableLengthVector.h"
-
-#include "otbMultiChannelIFFactory.h"
-
-#include "otbLocalHistogramIFFactory.h"
-#include "otbFlusserMomentsIFFactory.h"
-#include "otbRadiometricMomentsIFFactory.h"
-#include "otbFourierMellinDescriptorsIFFactory.h"
-#include "otbHaralickTexturesIFFactory.h"
-
-
-namespace otb
-{
-/** \class StandardMetaImageFunctionBuilder
- *  \brief Build a Standard MetaImageFunction
- *
- *  The StandardMetaImageFunctionBuilder class allows calling multiple
- *  ImageFunctions:
- *    - otbRadiometricMomentsImageFunction
- *    - otbFlusserMomentsImageFunction
- *    - otbFourierMellinDescriptorsImageFunction
- *    - otbLocalHistogramImageFunction
- *  On Multiple Images (and VectorImages Processed as ImageList).
- *
- *  Each ImageFunction can be parametrized. The only thing to do to
- *  complete the MetaImageFunction is to AddImages.
- *
- *
- *
- *
- * \ingroup OTBObjectDetection
- */
-
-template <class TPrecision = double, class TCoordRep = double>
-class ITK_EXPORT StandardMetaImageFunctionBuilder :
-    public itk::LightObject
-{
-public:
-  /** Standard class typedefs. */
-  typedef StandardMetaImageFunctionBuilder                                Self;
-  typedef itk::LightObject                                                Superclass;
-  typedef itk::SmartPointer<Self>                                         Pointer;
-  typedef itk::SmartPointer<const Self>                                   ConstPointer;
-
-  // New macro
-  itkNewMacro(Self);
-
-  // RTTI typeinfo
-  itkTypeMacro(StandardMetaImageFunctionBuilder, itk::LightObject);
-
-  // Input and output typedef
-  typedef TPrecision                                                ValueType;
-  typedef TCoordRep                                                 CoordRepType;
-
-  // Other typedef
-  typedef MetaImageFunction<TPrecision, CoordRepType>               MetaImageFunctionType;
-  typedef typename MetaImageFunctionType::Pointer                   MetaImageFunctionPointerType;
-  typedef typename std::vector<itk::DataObject::Pointer>            DataObjectContainerType;
-  typedef typename std::vector<ValueType>                           ParamContainerType;
-
-  //Accessors
-  unsigned int GetNeighborhoodRadius();
-  void SetNeighborhoodRadius(unsigned int radius);
-
-  ParamContainerType GetFlusserMomentsIFParameters();
-  void SetFlusserMomentsIFParameters(ParamContainerType Param);
-
-  ParamContainerType GetLocalHistogramIFParameters();
-  void SetLocalHistogramIFParameters(ParamContainerType Param);
-
-  ParamContainerType GetRadiometricMomentsIFParameters();
-  void SetRadiometricMomentsIFParameters(ParamContainerType Param);
-
-  ParamContainerType GetFourierMellinDescriptorsIFParameters();
-  void SetFourierMellinDescriptorsIFParameters(ParamContainerType Param);
-
-  ParamContainerType GetHaralickTexturesIFParameters();
-  void SetHaralickTexturesIFParameters(ParamContainerType Param);
-
-  MetaImageFunctionPointerType GetMetaImageFunction();
-  DataObjectContainerType GetDataObjectContainer();
-
-  // Adding Image
-  template <class TInputImage>
-  void AddImage(TInputImage * image)
-  {
-    typedef TInputImage                                   InputImageType;
-    typedef typename InputImageType::InternalPixelType    InternalPixelType;
-    typedef Image<InternalPixelType, 2>                   ImageType;
-
-    //Mono-Channel Factories
-    typedef LocalHistogramIFFactory<ImageType,
-      CoordRepType, TPrecision>               LocalHistogramIFFactoryType;
-    typedef FlusserMomentsIFFactory<ImageType,
-      CoordRepType, TPrecision>               FlusserMomentsIFFactoryType;
-    typedef RadiometricMomentsIFFactory<ImageType,
-      CoordRepType, TPrecision>               RadiometricMomentsIFFactoryType;
-    typedef FourierMellinDescriptorsIFFactory<ImageType,
-      CoordRepType, TPrecision>               FourierMellinDescriptorsIFFactoryType;
-    typedef HaralickTexturesIFFactory<ImageType,
-      CoordRepType, TPrecision>               HaralickTexturesIFFactoryType;
-
-    //Multi-Channel Factories
-    typedef MultiChannelIFFactory<LocalHistogramIFFactoryType, InputImageType>
-                                                            MCLocalHistogramIFFactoryType;
-    typedef MultiChannelIFFactory<FlusserMomentsIFFactoryType, InputImageType>
-                                                            MCFlusserMomentsIFFactoryType;
-    typedef MultiChannelIFFactory<RadiometricMomentsIFFactoryType, InputImageType>
-                                                            MCRadiometricMomentsIFFactoryType;
-    typedef MultiChannelIFFactory<FourierMellinDescriptorsIFFactoryType, InputImageType>
-                                                            MCFourierMellinDescriptorsIFFactoryType;
-    typedef MultiChannelIFFactory<HaralickTexturesIFFactoryType, InputImageType>
-                                                            MCHaralickTexturesIFFactoryType;
-
-    MCLocalHistogramIFFactoryType MCLocalHistogramIFFactory;
-    MCFlusserMomentsIFFactoryType MCFlusserMomentsIFFactory;
-    MCRadiometricMomentsIFFactoryType MCRadiometricMomentsIFFactory;
-    MCFourierMellinDescriptorsIFFactoryType MCFourierMellinDescriptorsIFFactory;
-    MCHaralickTexturesIFFactoryType MCHaralickTexturesIFFactory;
-
-
-    MCRadiometricMomentsIFFactory.Create(image,
-                                         this->GetRadiometricMomentsIFParameters(),
-                                         m_MetaImageFunction,
-                                         &m_DataObjectContainer);
-    MCFlusserMomentsIFFactory.Create(image,
-                                     this->GetFlusserMomentsIFParameters(),
-                                     m_MetaImageFunction,
-                                     &m_DataObjectContainer);
-
-    MCFourierMellinDescriptorsIFFactory.Create(image,
-                                               this->GetFourierMellinDescriptorsIFParameters(),
-                                               m_MetaImageFunction,
-                                               &m_DataObjectContainer);
-
-    //MCLocalHistogramIFFactory.Create(image,
-    //                                 m_LocalHistogramParam,
-    //                                 m_MetaImageFunction,
-    //                                 &m_DataObjectContainer);
-
-    //MCHaralickTexturesIFFactory.Create(image,
-    //                                   m_HaralickTexturesParam,
-    //                                   m_MetaImageFunction,
-    //                                   &m_DataObjectContainer);
-  }
-
-protected:
-  StandardMetaImageFunctionBuilder();
-  ~StandardMetaImageFunctionBuilder() override;
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  StandardMetaImageFunctionBuilder(const Self& ) = delete;
-  void operator=(const Self& ) = delete;
-
-  MetaImageFunctionPointerType    m_MetaImageFunction;
-  DataObjectContainerType         m_DataObjectContainer;
-  unsigned int                    m_NeighborhoodRadius;
-  ParamContainerType              m_FlusserMomentsParam;              //[NeighborhoodRadius]
-  ParamContainerType              m_RadiometricMomentsParam;          //[NeighborhoodRadius]
-  ParamContainerType              m_LocalHistogramParam;              //[NeighborhoodRadius; nbBins; minHistogram; maxHistogram]
-  ParamContainerType              m_FourierMellinDescriptorsParam;    //[NeighborhoodRadius; PMax; QMax]
-  ParamContainerType              m_HaralickTexturesParam;            //[NeighborhoodRadius; ImageMin; ImageMax; NbBinPerAxis; Offset]
-
-};
-
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbStandardMetaImageFunctionBuilder.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.hxx b/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.hxx
deleted file mode 100644
index 27313af0c10e0cc27a1b56e0915ba747c374a79f..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.hxx
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbStandardMetaImageFunctionBuilder_hxx
-#define otbStandardMetaImageFunctionBuilder_hxx
-
-#include "otbStandardMetaImageFunctionBuilder.h"
-
-
-namespace otb
-{
-template <class TPrecision, class TCoordRep>
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::StandardMetaImageFunctionBuilder()
-{
-  m_NeighborhoodRadius = 4;
-
-  m_MetaImageFunction = MetaImageFunctionType::New();
-
-  m_FlusserMomentsParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius()));
-
-  m_RadiometricMomentsParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius()));
-
-  m_LocalHistogramParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius()));
-  m_LocalHistogramParam.push_back(16);
-  m_LocalHistogramParam.push_back(0);
-  m_LocalHistogramParam.push_back(4096);
-
-  m_FourierMellinDescriptorsParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius()));
-  m_FourierMellinDescriptorsParam.push_back(3);
-  m_FourierMellinDescriptorsParam.push_back(3);
-
-  m_HaralickTexturesParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius()));
-  m_HaralickTexturesParam.push_back(0);
-  m_HaralickTexturesParam.push_back(4096);
-  m_HaralickTexturesParam.push_back(30);
-  m_HaralickTexturesParam.push_back(2);
-}
-
-template <class TPrecision, class TCoordRep>
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::~StandardMetaImageFunctionBuilder()
-{
-
-}
-
-template <class TPrecision, class TCoordRep>
-void
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-template <class TPrecision, class TCoordRep>
-unsigned int
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::GetNeighborhoodRadius()
-{
-  return m_NeighborhoodRadius;
-}
-
-template <class TPrecision, class TCoordRep>
-void
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::SetNeighborhoodRadius(unsigned int radius)
-{
-  if (radius>0)
-    {
-    m_NeighborhoodRadius = radius;
-
-    m_FlusserMomentsParam[0]           = static_cast<ValueType>(radius);
-    m_RadiometricMomentsParam[0]       = static_cast<ValueType>(radius);
-    m_LocalHistogramParam[0]           = static_cast<ValueType>(radius);
-    m_FourierMellinDescriptorsParam[0] = static_cast<ValueType>(radius);
-    m_HaralickTexturesParam[0]         = static_cast<ValueType>(radius);
-    }
-}
-
-template <class TPrecision, class TCoordRep>
-typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::GetFlusserMomentsIFParameters()
-{
-  return m_FlusserMomentsParam;
-}
-
-template <class TPrecision, class TCoordRep>
-void
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::SetFlusserMomentsIFParameters(ParamContainerType Param)
-{
-  if (Param.size()==1)
-    {
-    m_FlusserMomentsParam[0] = Param[0];
-    }
-}
-
-
-template <class TPrecision, class TCoordRep>
-typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::GetLocalHistogramIFParameters()
-{
-  return m_LocalHistogramParam;
-}
-
-template <class TPrecision, class TCoordRep>
-void
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::SetLocalHistogramIFParameters(ParamContainerType Param)
-{
-  if (Param.size()==4)
-    {
-    m_LocalHistogramParam[0] = Param[0];
-    m_LocalHistogramParam[1] = Param[1];
-    m_LocalHistogramParam[2] = Param[2];
-    m_LocalHistogramParam[3] = Param[3];
-    }
-}
-
-template <class TPrecision, class TCoordRep>
-typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::GetRadiometricMomentsIFParameters()
-{
-  return m_RadiometricMomentsParam;
-}
-
-template <class TPrecision, class TCoordRep>
-void
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::SetRadiometricMomentsIFParameters(ParamContainerType Param)
-{
-  if (Param.size()==1)
-    {
-    m_RadiometricMomentsParam[0] = Param[0];
-    }
-}
-
-template <class TPrecision, class TCoordRep>
-typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::GetFourierMellinDescriptorsIFParameters()
-{
-  return m_FourierMellinDescriptorsParam;
-}
-
-template <class TPrecision, class TCoordRep>
-void
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::SetFourierMellinDescriptorsIFParameters(ParamContainerType Param)
-{
-  if (Param.size()==3)
-    {
-    m_FourierMellinDescriptorsParam[0] = Param[0];
-    m_FourierMellinDescriptorsParam[1] = Param[1];
-    m_FourierMellinDescriptorsParam[2] = Param[2];
-    }
-}
-
-template <class TPrecision, class TCoordRep>
-typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::GetHaralickTexturesIFParameters()
-{
-  return m_HaralickTexturesParam;
-}
-
-template <class TPrecision, class TCoordRep>
-void
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::SetHaralickTexturesIFParameters(ParamContainerType Param)
-{
-  if (Param.size()==5)
-    {
-    m_HaralickTexturesParam[0] = Param[0];
-    m_HaralickTexturesParam[1] = Param[1];
-    m_HaralickTexturesParam[2] = Param[2];
-    m_HaralickTexturesParam[3] = Param[3];
-    m_HaralickTexturesParam[4] = Param[4];
-    }
-}
-
-template <class TPrecision, class TCoordRep>
-typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::MetaImageFunctionPointerType
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::GetMetaImageFunction()
-{
-  return  m_MetaImageFunction;
-}
-
-template <class TPrecision, class TCoordRep>
-typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::DataObjectContainerType
-StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>
-::GetDataObjectContainer()
-{
-  return  m_DataObjectContainer;
-}
-
-}//end namespace
-#endif
diff --git a/Modules/Detection/ObjectDetection/otb-module.cmake b/Modules/Detection/ObjectDetection/otb-module.cmake
deleted file mode 100644
index 5033f185dab2dc5e272c9fa280517f193a8cacfe..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/otb-module.cmake
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-set(DOCUMENTATION "This module contains useful classes for object detection.")
-
-otb_module(OTBObjectDetection
-  DEPENDS
-    OTBCommon
-    OTBDescriptors
-    OTBITK
-    OTBImageBase
-    OTBMoments
-    OTBObjectList
-    OTBStatistics
-    OTBStreaming
-    OTBSupervised
-    OTBTextures
-    OTBVectorDataBase
-
-  TEST_DEPENDS
-    OTBIOXML
-    OTBImageIO
-    OTBLibSVM
-    OTBTestKernel
-    OTBVectorDataIO
-
-  DESCRIPTION
-    "${DOCUMENTATION}"
-)
diff --git a/Modules/Detection/ObjectDetection/test/CMakeLists.txt b/Modules/Detection/ObjectDetection/test/CMakeLists.txt
deleted file mode 100644
index 14989ab892c009f4f2ddbc0a61ac0d650ad74509..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/test/CMakeLists.txt
+++ /dev/null
@@ -1,117 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-otb_module_test()
-
-set(OTBObjectDetectionTests
-otbObjectDetectionTestDriver.cxx
-otbLabeledSampleLocalizationGenerator.cxx
-otbStandardMetaImageFunctionBuilder.cxx
-otbDescriptorsListSampleGenerator.cxx
-otbObjectDetectionClassifier.cxx
-)
-
-add_executable(otbObjectDetectionTestDriver ${OTBObjectDetectionTests})
-target_link_libraries(otbObjectDetectionTestDriver ${OTBObjectDetection-Test_LIBRARIES})
-otb_module_target_label(otbObjectDetectionTestDriver)
-
-# Tests Declaration
-
-
-otb_add_test(NAME odTvLabeledSampleLocalizationGenerator COMMAND otbObjectDetectionTestDriver
-  --compare-ogr ${NOTOL}
-  ${BASELINE_FILES}/TvLabeledSampleLocalizationGeneratorOutput.shp
-  ${TEMP}/TvLabeledSampleLocalizationGeneratorOutput.shp
-  otbLabeledSampleLocalizationGenerator
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01LabeledPoints.shp
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Polygons.shp
-  ${TEMP}/TvLabeledSampleLocalizationGeneratorOutput.shp
-  )
-
-
-otb_add_test(NAME odTvStandardMetaImageFunctionBuilder COMMAND otbObjectDetectionTestDriver
-  otbStandardMetaImageFunctionBuilder
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01.tif
-  )
-
-otb_add_test(NAME odTvDescriptorsListSampleGeneratorStreaming COMMAND otbObjectDetectionTestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt
-  ${TEMP}/TvDescriptorsListSampleGeneratorStreamingOutput.txt
-  otbDescriptorsListSampleGenerator
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_amplitude.tif
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Samples.shp
-  ${TEMP}/TvDescriptorsListSampleGeneratorStreamingOutput.txt
-  50 # streaming
-  5 # neighborhood radius
-  )
-
-#otb_add_test(NAME odTvDescriptorsSVMModelCreation COMMAND otbObjectDetectionTestDriver
-  #--compare-ascii ${NOTOL}
-  #${BASELINE_FILES}/TvDescriptorsSVMModelCreation.svm
-  #${TEMP}/TvDescriptorsSVMModelCreation.svm
-  #otbDescriptorsSVMModelCreation
-  #${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_amplitude.tif
-  #${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Samples.shp
-  #${INPUTDATA}/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml
-  #${TEMP}/TvDescriptorsSVMModelCreation.svm
-  #0 # streaming
-  #5 # neighborhood radius
-  #)
-
-otb_add_test(NAME odTvDescriptorsListSampleGeneratorNoStreaming COMMAND otbObjectDetectionTestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt
-  ${TEMP}/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt
-  otbDescriptorsListSampleGenerator
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_amplitude.tif
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Samples.shp
-  ${TEMP}/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt
-  0 # streaming
-  5 # neighborhood radius
-  )
-
-
-
-otb_add_test(NAME odTvObjectDetectionClassifierStreaming COMMAND otbObjectDetectionTestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/TvObjectDetectionClassifierOutput.txt
-  ${TEMP}/TvObjectDetectionClassifierOutputStreaming.txt
-  otbObjectDetectionClassifier
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif
-  ${INPUTDATA}/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml
-  ${BASELINE_FILES}/TvDescriptorsSVMModelCreation.svm
-  ${TEMP}/TvObjectDetectionClassifierOutputStreaming.txt
-  50 # streaming
-  5 # neighborhood radius
-  )
-
-otb_add_test(NAME odTvObjectDetectionClassifier COMMAND otbObjectDetectionTestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/TvObjectDetectionClassifierOutput.txt
-  ${TEMP}/TvObjectDetectionClassifierOutput.txt
-  otbObjectDetectionClassifier
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif
-  ${INPUTDATA}/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml
-  ${BASELINE_FILES}/TvDescriptorsSVMModelCreation.svm
-  ${TEMP}/TvObjectDetectionClassifierOutput.txt
-  0 # streaming
-  5 # neighborhood radius
-  )
diff --git a/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx b/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx
deleted file mode 100644
index ac0e7c21549ee6a301db2fddd7a745d51b00ce38..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-#include <iterator>
-
-#include "otbImage.h"
-#include "otbRadiometricMomentsImageFunction.h"
-#include "otbDescriptorsListSampleGenerator.h"
-#include "otbImageFileReader.h"
-#include "otbVectorDataFileReader.h"
-#include "otbImageFunctionAdaptor.h"
-
-#include "otbStatisticsXMLFileReader.h"
-#include "otbShiftScaleSampleListFilter.h"
-#include "otbLibSVMMachineLearningModel.h"
-
-const unsigned int Dimension = 2;
-typedef int        LabelType;
-typedef double     PixelType;
-typedef double     FunctionPrecisionType;
-typedef double     CoordRepType;
-
-typedef otb::Image<PixelType, Dimension>                               ImageType;
-typedef otb::VectorData<>                                              VectorDataType;
-typedef otb::RadiometricMomentsImageFunction<ImageType, CoordRepType>  FunctionType;
-typedef otb::ImageFunctionAdaptor<FunctionType, FunctionPrecisionType> AdaptedFunctionType;
-
-typedef itk::VariableLengthVector<FunctionPrecisionType> SampleType;
-typedef itk::Statistics::ListSample<SampleType>          ListSampleType;
-typedef itk::FixedArray<LabelType, 1>                    LabelSampleType;
-typedef itk::Statistics::ListSample<LabelSampleType>     LabelListSampleType;
-
-typedef otb::DescriptorsListSampleGenerator
-           < ImageType,
-             VectorDataType,
-             ListSampleType,
-             LabelType,
-             FunctionPrecisionType,
-             CoordRepType > DescriptorsListSampleGeneratorType;
-
-typedef otb::ImageFileReader<ImageType>           ImageReaderType;
-typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType;
-
-typedef otb::StatisticsXMLFileReader<SampleType>   StatisticsReader;
-typedef otb::Statistics::ShiftScaleSampleListFilter<ListSampleType> ShiftScaleListSampleFilterType;
-
-typedef otb::LibSVMMachineLearningModel<FunctionPrecisionType, LabelType> SVMType;
-
-typedef FunctionType::PointType PointType;
-typedef DescriptorsListSampleGeneratorType::SamplesPositionType SamplesPositionType;
-
-struct SampleEntry
-{
-  PointType  position;
-  LabelType  label;
-  SampleType measurement;
-};
-
-struct CompareSampleEntry
-{
-  bool operator () (SampleEntry p, SampleEntry q)
-  {
-    // order with the y axis position
-    if (p.position[1] < q.position[1])
-      return true;
-    if (p.position[1] > q.position[1])
-      return false;
-
-    // If one the same line,
-    // order with the x axis position
-    if (p.position[0] < q.position[0])
-      return true;
-
-    return false;
-  }
-};
-
-std::ostream &operator<<(std::ostream &stream, SampleEntry entry)
-{
-  stream << "---" << std::endl
-         << "Label        : " << entry.label << std::endl
-         << "Position     : " << entry.position << std::endl
-         << "Measurements : " << entry.measurement;
-  return stream;
-}
-
-
-int otbDescriptorsListSampleGenerator(int argc, char* argv[])
-{
-  if (argc != 6)
-    {
-    std::cerr << "Wrong number of arguments" << std::endl;
-    return EXIT_FAILURE;
-    }
-
-  const char* inputImageFileName = argv[1];
-  const char* inputSamplesLocation = argv[2];
-  const char* outputFileName = argv[3];
-  int streaming = atoi(argv[4]);
-  int neighborhood = atoi(argv[5]);
-
-  ImageReaderType::Pointer imageReader = ImageReaderType::New();
-  imageReader->SetFileName(inputImageFileName);
-
-  VectorDataReaderType::Pointer vectorDataReader = VectorDataReaderType::New();
-  vectorDataReader->SetFileName(inputSamplesLocation);
-
-  //imageReader->Update();
-  //vectorDataReader->Update();
-
-  AdaptedFunctionType::Pointer descriptorsFunction = AdaptedFunctionType::New();
-  descriptorsFunction->SetInputImage(imageReader->GetOutput());
-  descriptorsFunction->GetInternalImageFunction()->SetNeighborhoodRadius(5);
-
-  DescriptorsListSampleGeneratorType::Pointer descriptorsGenerator = DescriptorsListSampleGeneratorType::New();
-  descriptorsGenerator->SetInputImage(imageReader->GetOutput());
-  descriptorsGenerator->SetSamplesLocations(vectorDataReader->GetOutput());
-  descriptorsGenerator->SetDescriptorsFunction(descriptorsFunction.GetPointer());
-  descriptorsGenerator->SetNeighborhoodRadius(neighborhood);
-  descriptorsGenerator->GetStreamer()->SetNumberOfLinesStrippedStreaming( streaming );
-  descriptorsGenerator->Update();
-
-  ListSampleType::Pointer      samples = descriptorsGenerator->GetListSample();
-  LabelListSampleType::Pointer labels  = descriptorsGenerator->GetLabelListSample();
-  SamplesPositionType&         positions = descriptorsGenerator->GetSamplesPositions();
-
-  ListSampleType::Iterator sampleIt = samples->Begin();
-  LabelListSampleType::Iterator labelIt = labels->Begin();
-  SamplesPositionType::const_iterator posIt = positions.begin();
-
-  ListSampleType::Iterator sampleEnd = samples->End();
-  LabelListSampleType::Iterator labelEnd = labels->End();
-  SamplesPositionType::const_iterator posEnd = positions.end();
-
-  std::vector<SampleEntry> entries;
-
-  while (sampleIt != sampleEnd && labelIt != labelEnd && posIt != posEnd)
-    {
-    SampleEntry entry;
-    entry.position = *posIt;
-    entry.label = labelIt.GetMeasurementVector()[0];
-    entry.measurement = sampleIt.GetMeasurementVector();
-
-    entries.push_back(entry);
-
-    ++sampleIt;
-    ++labelIt;
-    ++posIt;
-    }
-
-  std::sort(entries.begin(), entries.end(), CompareSampleEntry());
-  std::ofstream file(outputFileName);
-  std::copy(entries.begin(), entries.end(), std::ostream_iterator<SampleEntry>(file, "\n"));
-  file.close();
-
-  return EXIT_SUCCESS;
-}
-
-
-
-int otbDescriptorsSVMModelCreation(int argc, char* argv[])
-{
-  if (argc != 7)
-    {
-    std::cerr << "Wrong number of arguments" << std::endl;
-    return EXIT_FAILURE;
-    }
-
-  const char* inputImageFileName = argv[1];
-  const char* inputSamplesLocation = argv[2];
-  const char* featureStatisticsFileName = argv[3];
-  const char* outputFileName = argv[4];
-  int streaming = atoi(argv[5]);
-  int neighborhood = atoi(argv[6]);
-
-  ImageReaderType::Pointer imageReader = ImageReaderType::New();
-  imageReader->SetFileName(inputImageFileName);
-
-  VectorDataReaderType::Pointer vectorDataReader = VectorDataReaderType::New();
-  vectorDataReader->SetFileName(inputSamplesLocation);
-
-  //imageReader->Update();
-  //vectorDataReader->Update();
-
-  AdaptedFunctionType::Pointer descriptorsFunction = AdaptedFunctionType::New();
-  descriptorsFunction->SetInputImage(imageReader->GetOutput());
-  descriptorsFunction->GetInternalImageFunction()->SetNeighborhoodRadius(neighborhood);
-
-  DescriptorsListSampleGeneratorType::Pointer descriptorsGenerator = DescriptorsListSampleGeneratorType::New();
-  descriptorsGenerator->SetInputImage(imageReader->GetOutput());
-  descriptorsGenerator->SetSamplesLocations(vectorDataReader->GetOutput());
-  descriptorsGenerator->SetDescriptorsFunction(descriptorsFunction.GetPointer());
-  descriptorsGenerator->SetNeighborhoodRadius(5);
-  descriptorsGenerator->GetStreamer()->SetNumberOfLinesStrippedStreaming( streaming );
-  descriptorsGenerator->Update();
-
-  // Normalize the samples
-  // Read the mean and variance form the XML file
-  StatisticsReader::Pointer  statisticsReader = StatisticsReader::New();
-  statisticsReader->SetFileName(featureStatisticsFileName);
-  SampleType meanMeasurentVector     = statisticsReader->GetStatisticVectorByName("mean");
-  SampleType varianceMeasurentVector = statisticsReader->GetStatisticVectorByName("stddev");
-
-  // Shift scale the samples
-  ShiftScaleListSampleFilterType::Pointer shiftscaleFilter = ShiftScaleListSampleFilterType::New();
-  shiftscaleFilter->SetInput(descriptorsGenerator->GetListSample());
-  shiftscaleFilter->SetShifts(meanMeasurentVector);
-  shiftscaleFilter->SetScales(varianceMeasurentVector);
-  shiftscaleFilter->Update();
-
-  SVMType::Pointer svmEstimator = SVMType::New();
-  svmEstimator->SetInputListSample(shiftscaleFilter->GetOutput());
-  svmEstimator->SetTargetListSample(descriptorsGenerator->GetLabelListSample());
-  svmEstimator->Train();
-  svmEstimator->Save(outputFileName);
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/ObjectDetection/test/otbLabeledSampleLocalizationGenerator.cxx b/Modules/Detection/ObjectDetection/test/otbLabeledSampleLocalizationGenerator.cxx
deleted file mode 100644
index 5497da01d457c7889ac52c691c5e59cdd535201f..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/test/otbLabeledSampleLocalizationGenerator.cxx
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-#include "otbVectorDataFileReader.h"
-#include "otbVectorDataFileWriter.h"
-#include "otbLabeledSampleLocalizationGenerator.h"
-
-
-int otbLabeledSampleLocalizationGenerator(int itkNotUsed(argc), char* argv[])
-{
-  const char * inputVD1  = argv[1];
-  const char * inputVD2  = argv[2];
-  const char * outputVD  = argv[3];
-
-  typedef otb::VectorData<>                                        VectorDataType;
-  typedef otb::VectorDataFileReader<VectorDataType>                VectorDataReaderType;
-  typedef otb::VectorDataFileWriter<VectorDataType>                VectorDataWriterType;
-  typedef otb::LabeledSampleLocalizationGenerator<VectorDataType>  GeneratorType;
-
-  // instantiation
-  VectorDataReaderType::Pointer  reader1    = VectorDataReaderType::New();
-  VectorDataReaderType::Pointer  reader2    = VectorDataReaderType::New();
-  VectorDataWriterType::Pointer  writer     = VectorDataWriterType::New();
-  GeneratorType::Pointer         generator  = GeneratorType::New();
-
-  reader1->SetFileName(inputVD1);
-  //reader1->Update();
-
-  reader2->SetFileName(inputVD2);
-  //reader2->Update();
-
-  generator->PushBackInput(reader1->GetOutput());
-  generator->PushBackInput(reader2->GetOutput());
-
-  generator->SetSeed(0); // enable reproducible random number sequence
-  generator->SetClassKey("Class");
-  generator->SetNoClassIdentifier(0);
-  generator->SetInhibitionRadius(5);
-  generator->SetRandomLocalizationDensity(0.004);
-  generator->SetNbMaxIteration(1000);
-  generator->SetNumberOfPositiveSamplesPerPoint(2);
-
-  //generator->Update();
-
-  writer->SetFileName(outputVD);
-  writer->SetInput(generator->GetOutput());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/ObjectDetection/test/otbObjectDetectionClassifier.cxx b/Modules/Detection/ObjectDetection/test/otbObjectDetectionClassifier.cxx
deleted file mode 100644
index ee37856db93074bef43637baea584286c4b2959a..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/test/otbObjectDetectionClassifier.cxx
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-#include <iostream>
-#include <iterator>
-
-#include "otbImage.h"
-#include "otbRadiometricMomentsImageFunction.h"
-#include "itkListSample.h"
-#include "itkVariableLengthVector.h"
-#include "otbObjectDetectionClassifier.h"
-#include "otbImageFileReader.h"
-#include "otbImageFunctionAdaptor.h"
-#include "otbStatisticsXMLFileReader.h"
-#include "itkPreOrderTreeIterator.h"
-#include "otbLibSVMMachineLearningModel.h"
-
-const unsigned int Dimension = 2;
-typedef int        LabelType;
-typedef double     PixelType;
-typedef double     FunctionPrecisionType;
-typedef double     CoordRepType;
-
-typedef otb::Image<PixelType, Dimension>                              ImageType;
-typedef otb::VectorData<>                                             VectorDataType;
-typedef VectorDataType::PointType                                     PointType;
-typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType>       TreeIteratorType;
-
-typedef otb::ObjectDetectionClassifier
-           < ImageType,
-             VectorDataType,
-             LabelType,
-             FunctionPrecisionType,
-             CoordRepType > ObjectDetectionClassifierType;
-
-typedef otb::RadiometricMomentsImageFunction<ImageType, CoordRepType>   FunctionType;
-typedef otb::ImageFunctionAdaptor<FunctionType, FunctionPrecisionType>  AdaptedFunctionType;
-
-typedef otb::ImageFileReader<ImageType>           ImageReaderType;
-
-typedef otb::LibSVMMachineLearningModel<PixelType,LabelType> SVMModelType;
-typedef SVMModelType::Pointer SVMModelPointerType;
-
-typedef otb::StatisticsXMLFileReader<AdaptedFunctionType::OutputType> StatisticsXMLFileReaderType;
-
-
-struct ComparePoint
-{
-  bool operator () (PointType p, PointType q)
-  {
-    // order with the y axis position
-    if (p[1] < q[1])
-      return true;
-    if (p[1] > q[1])
-      return false;
-
-    // If one the same line,
-    // order with the x axis position
-    if (p[0] < q[0])
-      return true;
-
-    return false;
-  }
-};
-
-std::ostream &operator<<(std::ostream &stream, PointType p)
-{
-  stream << p[0] << " " << p[1];
-  return stream;
-}
-
-
-
-int otbObjectDetectionClassifier(int argc, char* argv[])
-{
-  if (argc != 7)
-    {
-    std::cerr << "Wrong number of arguments" << std::endl;
-    return EXIT_FAILURE;
-    }
-
-  const char* inputImageFileName = argv[1];
-  const char* inputFeatureStats = argv[2];
-  const char* inputSVMModel = argv[3];
-  const char* outputVectorDataFileName = argv[4];
-  int streaming = atoi(argv[5]);
-  int neighborhood = atoi(argv[6]);
-
-  ImageReaderType::Pointer imageReader = ImageReaderType::New();
-  imageReader->SetFileName(inputImageFileName);
-
-  StatisticsXMLFileReaderType::Pointer statisticsReader = StatisticsXMLFileReaderType::New();
-  statisticsReader->SetFileName(inputFeatureStats);
-
-
-  SVMModelPointerType svmModel = SVMModelType::New();
-  svmModel->Load(inputSVMModel);
-
-  AdaptedFunctionType::Pointer descriptorsFunction = AdaptedFunctionType::New();
-  descriptorsFunction->SetInputImage(imageReader->GetOutput());
-  descriptorsFunction->GetInternalImageFunction()->SetNeighborhoodRadius(neighborhood);
-
-  ObjectDetectionClassifierType::Pointer classifier = ObjectDetectionClassifierType::New();
-  classifier->SetInputImage(imageReader->GetOutput());
-  classifier->SetNeighborhoodRadius(neighborhood);
-  classifier->SetModel(svmModel);
-  classifier->SetDescriptorsFunction(descriptorsFunction);
-  classifier->SetNoClassLabel(0);
-  classifier->SetClassKey("Class");
-  classifier->SetShifts(statisticsReader->GetStatisticVectorByName("mean"));
-  classifier->SetScales(statisticsReader->GetStatisticVectorByName("stddev"));
-  classifier->GetStreamer()->SetNumberOfLinesStrippedStreaming( streaming );
-  classifier->SetGridStep(neighborhood/2);
-  classifier->Update();
-
-  std::vector<ObjectDetectionClassifierType::PointType> points;
-  VectorDataType::Pointer vectorData = classifier->GetOutputVectorData();
-
-  TreeIteratorType itVector(vectorData->GetDataTree());
-  itVector.GoToBegin();
-  while (!itVector.IsAtEnd())
-    {
-    if (itVector.Get()->IsPointFeature())
-      {
-      points.push_back(itVector.Get()->GetPoint());
-      }
-    ++itVector;
-    }
-
-  std::sort(points.begin(), points.end(), ComparePoint());
-  std::ofstream file(outputVectorDataFileName);
-  std::copy(points.begin(), points.end(), std::ostream_iterator<PointType>(file, "\n"));
-  file.close();
-
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/ObjectDetection/test/otbObjectDetectionTestDriver.cxx b/Modules/Detection/ObjectDetection/test/otbObjectDetectionTestDriver.cxx
deleted file mode 100644
index 3d7686897dff2f713650bcf46755b97571e1b22a..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/test/otbObjectDetectionTestDriver.cxx
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbTestMain.h"
-
-void RegisterTests()
-{
-  REGISTER_TEST(otbLabeledSampleLocalizationGenerator);
-  REGISTER_TEST(otbStandardMetaImageFunctionBuilder);
-  REGISTER_TEST(otbDescriptorsListSampleGenerator);
-  REGISTER_TEST(otbDescriptorsSVMModelCreation);
-  REGISTER_TEST(otbObjectDetectionClassifier);
-}
diff --git a/Modules/Detection/ObjectDetection/test/otbStandardMetaImageFunctionBuilder.cxx b/Modules/Detection/ObjectDetection/test/otbStandardMetaImageFunctionBuilder.cxx
deleted file mode 100644
index 5ac5d938059ae6671036b2e206ca820c3d17ebf2..0000000000000000000000000000000000000000
--- a/Modules/Detection/ObjectDetection/test/otbStandardMetaImageFunctionBuilder.cxx
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-#include "otbStandardMetaImageFunctionBuilder.h"
-#include "otbVectorImage.h"
-#include "otbImageFileReader.h"
-
-#include "otbImageFunctionAdaptor.h"
-#include "otbFlusserMomentsImageFunction.h"
-#include "otbRadiometricMomentsImageFunction.h"
-#include "otbFourierMellinDescriptorsImageFunction.h"
-#include "otbLocalHistogramImageFunction.h"
-#include "otbHaralickTexturesImageFunction.h"
-
-
-
-int otbStandardMetaImageFunctionBuilder(int itkNotUsed(argc), char* argv[])
-{
-  const char * inputFilename  = argv[1];
-
-  std::vector<double> p1, p2, p3, p4, p5;
-
-  typedef double                                                PrecisionType;
-  typedef double                                                CoordRepType;
-  typedef otb::StandardMetaImageFunctionBuilder<PrecisionType,
-    CoordRepType>                                               BuilderType;
-
-  typedef otb::Image<PrecisionType, 2>                          ImageType;
-  typedef otb::VectorImage<PrecisionType, 2>                    VectorImageType;
-  typedef otb::ImageFileReader<ImageType>                       ImageReaderType;
-  typedef otb::ImageFileReader<VectorImageType>                 VectorImageReaderType;
-
-  typedef BuilderType::MetaImageFunctionType                    MetaImageFunctionType;
-  typedef BuilderType::DataObjectContainerType                  DataObjectContainerType;
-
-  typedef otb::FlusserMomentsImageFunction<ImageType, CoordRepType>  FlusserMomentsIF;
-  typedef otb::ImageFunctionAdaptor<FlusserMomentsIF, PrecisionType> AdaptedFlusserMomentsIF;
-
-  typedef otb::RadiometricMomentsImageFunction<ImageType, CoordRepType>  RadiometricMomentsIF;
-  typedef otb::ImageFunctionAdaptor<RadiometricMomentsIF, PrecisionType>                AdaptedRadiometricMomentsIF;
-  typedef otb::FourierMellinDescriptorsImageFunction<ImageType, CoordRepType>  FourierMellinDescriptorsIF;
-  typedef otb::ImageFunctionAdaptor<FourierMellinDescriptorsIF, PrecisionType> AdaptedFourierMellinDescriptorsIF;
-
-  p1.push_back(7);
-  p1.push_back(128);
-  p1.push_back(0);
-  p1.push_back(1500);
-
-  p2.push_back(6);
-
-  p3.push_back(5);
-
-  p4.push_back(9);
-  p4.push_back(5);
-  p4.push_back(5);
-
-  p5.push_back(10);
-  p5.push_back(1);
-  p5.push_back(1500);
-  p5.push_back(16);
-  p5.push_back(4);
-
-  // instantiation
-  ImageReaderType::Pointer       Ireader  = ImageReaderType::New();
-  VectorImageReaderType::Pointer VIreader = VectorImageReaderType::New();
-
-  BuilderType::Pointer builder = BuilderType::New();
-
-  Ireader->SetFileName(inputFilename);
-  VIreader->SetFileName(inputFilename);
-
-  builder->AddImage(Ireader->GetOutput());
-  builder->SetNeighborhoodRadius(8);
-
-  builder->SetLocalHistogramIFParameters(p1);
-  builder->SetFlusserMomentsIFParameters(p2);
-  builder->SetRadiometricMomentsIFParameters(p3);
-  builder->SetFourierMellinDescriptorsIFParameters(p4);
-  builder->SetHaralickTexturesIFParameters(p5);
-
-  builder->AddImage(VIreader->GetOutput());
-
-  MetaImageFunctionType::Pointer MIF = builder->GetMetaImageFunction();
-  std::cout << MIF << std::endl;
-
-  DataObjectContainerType DOC = builder->GetDataObjectContainer();
-  std::cout << "DataObjectContainer.size(): " << DOC.size() << std::endl;
-
-  std::cout << static_cast<AdaptedRadiometricMomentsIF *>(MIF->GetNthFunction(0))->GetInternalImageFunction()
-            << std::endl;
-  std::cout << static_cast<AdaptedRadiometricMomentsIF *>(MIF->GetNthFunction(3))->GetInternalImageFunction()
-            << std::endl;
-
-
-  std::cout << static_cast<AdaptedFlusserMomentsIF *>(MIF->GetNthFunction(1))->GetInternalImageFunction()
-            << std::endl;
-  std::cout << static_cast<AdaptedFlusserMomentsIF *>(MIF->GetNthFunction(7))->GetInternalImageFunction()
-            << std::endl;
-
-  std::cout << static_cast<AdaptedFourierMellinDescriptorsIF *>(MIF->GetNthFunction(2))->GetInternalImageFunction()
-            << std::endl;
-  std::cout << static_cast<AdaptedFourierMellinDescriptorsIF *>(MIF->GetNthFunction(11))->GetInternalImageFunction()
-            << std::endl;
-
-/*
-  std::cout << static_cast<AdaptedLocalHistogramIF *>(MIF->GetNthFunction())->GetInternalImageFunction()
-            << std::endl;
-  std::cout << static_cast<AdaptedLocalHistogramIF *>(MIF->GetNthFunction(5))->GetInternalImageFunction()
-            << std::endl;
-
-  std::cout << static_cast<AdaptedHaralickTexturesIF *>(MIF->GetNthFunction(4))->GetInternalImageFunction()
-            << std::endl;
-  std::cout << static_cast<AdaptedHaralickTexturesIF *>(MIF->GetNthFunction(21))->GetInternalImageFunction()
-            << std::endl;
-*/
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/CMakeLists.txt b/Modules/Detection/RoadExtraction/CMakeLists.txt
deleted file mode 100644
index 7bb7b02fa9cc2361802ec609782cd7bb9488749b..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-project(OTBRoadExtraction)
-otb_module_impl()
diff --git a/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.h
deleted file mode 100644
index fda5cfa3c111a11ce9354629dee45f43d47137e4..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbBreakAngularPathListFilter_h
-#define otbBreakAngularPathListFilter_h
-
-#include "otbPathListToPathListFilter.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/** \class BreakAngularPathListFilter
- *  \brief CBase class for breaking angulars the input PathList, returning a PathList.
-   *
-   * \example FeatureExtraction/ExtractRoadByStepsExample.cxx
-   *
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TPath>
-class ITK_EXPORT BreakAngularPathListFilter
-  : public PathListToPathListFilter<TPath>
-{
-public:
-  /** Standard typedefs */
-  typedef BreakAngularPathListFilter      Self;
-  typedef PathListToPathListFilter<TPath> Superclass;
-  typedef itk::SmartPointer<Self>         Pointer;
-  typedef itk::SmartPointer<const Self>   ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(BreakAngularPathListFilter, PathListToPathListFilter);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PathType        PathType;
-  typedef typename Superclass::PathListType    PathListType;
-  typedef typename Superclass::PathPointerType PathPointerType;
-  typedef typename PathListType::Pointer       PathListPointerType;
-
-  typedef double MaxAngleType;
-
-  /** Set/Get the max angle */
-  itkSetMacro(MaxAngle, MaxAngleType);
-  itkGetConstMacro(MaxAngle, MaxAngleType);
-
-protected:
-  /** Constructor */
-  BreakAngularPathListFilter();
-  /** Destructor */
-  ~BreakAngularPathListFilter() override {}
-  /** GenerateData method */
-  void GenerateData() override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  BreakAngularPathListFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  /** Calculate break angular for a path */
-  void BreakAngularPath(const MaxAngleType maxAngle,
-                        const PathPointerType inputPath,
-                        PathListPointerType outputPathList);
-
-  /** Max angle value */
-  MaxAngleType m_MaxAngle;
-
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbBreakAngularPathListFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.hxx b/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.hxx
deleted file mode 100644
index 5fcec599fd55dc345d293a089f3d070f24dddf8e..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.hxx
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbBreakAngularPathListFilter_hxx
-#define otbBreakAngularPathListFilter_hxx
-
-#include "otbBreakAngularPathListFilter.h"
-#include "otbMath.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TPath>
-BreakAngularPathListFilter<TPath>
-::BreakAngularPathListFilter()
-{
-}
-
-template <class TPath>
-void
-BreakAngularPathListFilter<TPath>
-::BreakAngularPath(const MaxAngleType maxAngle, const PathPointerType inputPath, PathListPointerType outputPathList)
-{
-  typename PathType::VertexListType::ConstPointer  vertexList = inputPath->GetVertexList();
-  typename PathType::VertexListType::ConstIterator pathIt = vertexList->Begin();
-
-  typename PathType::VertexType pixel1, pixel2, pixel3;
-
-  // Initialization
-  PathPointerType newPath = PathType::New();
-  newPath->Initialize();
-
-  double alpha1(0.), alpha2(0.);
-
-  while (pathIt != vertexList->End())
-    {
-    // Add Pixel 1
-    newPath->AddVertex(pathIt.Value());
-    pixel1 = pathIt.Value();
-    ++pathIt;
-    if (pathIt != vertexList->End())
-      {
-      pixel2 = pathIt.Value();
-      ++pathIt;
-      if (pathIt != vertexList->End())
-        {
-        pixel3 = pathIt.Value();
-
-        alpha1 = std::atan2((pixel1[1] - pixel2[1]), (pixel1[0] - pixel2[0]));
-        alpha2 = std::atan2((pixel2[1] - pixel3[1]), (pixel2[0] - pixel3[0]));
-        alpha1 = (alpha1 >= 0) ? alpha1 : (alpha1 + CONST_2PI);
-        alpha2 = (alpha2 >= 0) ? alpha2 : (alpha2 + CONST_2PI);
-        if (std::abs(alpha1 - alpha2) > static_cast<double>(maxAngle))
-          {
-          // Add Pixel 2
-          newPath->AddVertex(pixel2);
-          //Create new PathType in the out path list
-          outputPathList->PushBack(newPath);
-          // Reinit
-          newPath = PathType::New();
-
-          }
-        --pathIt; // Return previous pixel
-        }
-      else
-        {
-        // Add last Pixel (Pixel 2)
-        newPath->AddVertex(pixel2);
-        }
-      }
-    }
-  //Create new PathType in the out list
-  outputPathList->PushBack(newPath);
-}
-
-template <class TPath>
-void
-BreakAngularPathListFilter<TPath>
-::GenerateData()
-{
-  const PathListType * inputPathList  = this->GetInput();
-  PathListType *       outputPathList = this->GetOutput();
-
-  typename PathListType::ConstIterator listIt = inputPathList->Begin();
-  outputPathList->Clear();
-
-  PathListPointerType newTempPathList = PathListType::New();
-  while (listIt != inputPathList->End())
-    {
-    (void) BreakAngularPath(m_MaxAngle, listIt.Get(), outputPathList);
-    ++listIt;
-    }
-}
-
-/**
- * PrintSelf Method
- */
-template <class TPath>
-void
-BreakAngularPathListFilter<TPath>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "Angular max value : " << m_MaxAngle << std::endl;
-}
-
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h b/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h
deleted file mode 100644
index 6c57fa13c9c52783693e4e699eaf689fbaf2ff7d..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbGenericRoadExtractionFilter_h
-#define otbGenericRoadExtractionFilter_h
-
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkGradientRecursiveGaussianImageFilter.h"
-
-#include "otbVectorImage.h"
-#include "otbImageToPathListFilter.h"
-#include "itkSqrtImageFilter.h"
-#include "otbNeighborhoodScalarProductFilter.h"
-#include "otbNonMaxRemovalByDirectionFilter.h"
-#include "otbVectorizationPathListFilter.h"
-#include "otbSimplifyPathListFilter.h"
-#include "otbBreakAngularPathListFilter.h"
-#include "otbRemoveTortuousPathListFilter.h"
-#include "otbLinkPathListFilter.h"
-#include "otbRemoveIsolatedByDirectionFilter.h"
-#include "otbRemoveWrongDirectionFilter.h"
-#include "otbLikelihoodPathListFilter.h"
-
-namespace otb
-{
-/**
- * \class GenericRoadExtractionFilter
- * \brief This class performs the extraction of roads from an image.
- *
- * This composite filter implements a fast and robust road extraction
- * for high resolution satellite images. The line
- * detection is done using a Gaussian gradient with a scalar product to find
- * the road directions. Finally, extracted roads are vectorized and
- * processed to improve the results removing some occultations and false
- * detections.
- *
- * The full method is detailed in E. Christophe and J. Inglada, "Robust Road
- * Extraction for High Resolution Satellite Images," in IEEE International
- * Conference on Image Processing, ICIP'07, 2007.
- *
- * This filter is fast, as the detection typically takes 3 seconds for a
- * 1000 \f$ \times \f$ 1000 images with four spectral bands. Results can be
- * used as an initialization for more complex algorithms.
- *
- * \sa itk::SqrtImageFilter
- * \sa itk::GradientRecursiveGaussianImageFilter
- * \sa NeighborhoodScalarProductFilter
- * \sa RemoveIsolatedByDirectionFilter
- * \sa RemoveWrongDirectionFilter
- * \sa NonMaxRemovalByDirectionFilter
- * \sa VectorizationPathListFilter
- * \sa SimplifyPathListFilter
- * \sa BreakAngularPathListFilter
- * \sa RemoveTortuousPathListFilter
- * \sa LinkPathListFilter
- * \sa LikelihoodPathListFilter
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInputImage, class TOutputPath>
-class ITK_EXPORT GenericRoadExtractionFilter
-  : public ImageToPathListFilter<TInputImage, TOutputPath>
-{
-public:
-  /** Standard typedefs */
-  typedef GenericRoadExtractionFilter                     Self;
-  typedef ImageToPathListFilter<TInputImage, TOutputPath> Superclass;
-  typedef itk::SmartPointer<Self>                         Pointer;
-  typedef itk::SmartPointer<const Self>                   ConstPointer;
-  /** Creation through object factory macro */
-  itkNewMacro(Self);
-  /** Type macro */
-  itkTypeMacro(GenericRoadExtractionFilter, ImageToPathListFilter);
-  /** Template parameters typedefs */
-  typedef typename Superclass::InputImageType     InputImageType;
-  typedef typename Superclass::OutputPathType     OutputPathType;
-  typedef typename Superclass::OutputPathListType OutputPathListType;
-  typedef typename InputImageType::PixelType      InputPixelType;
-  typedef double                                  InternalPixelType;
-
-  typedef otb::VectorImage<InternalPixelType, InputImageType::ImageDimension> VectorImageType;
-  typedef otb::Image<InternalPixelType, InputImageType::ImageDimension>       ModulusType;
-  typedef otb::Image<InternalPixelType, InputImageType::ImageDimension>       DirectionType;
-
-  typedef itk::CovariantVector<InternalPixelType, InputImageType::ImageDimension>
-  VectorPixelType;
-  typedef otb::Image<VectorPixelType, InputImageType::ImageDimension> CovariantVectorImageType;
-
-  typedef itk::SqrtImageFilter<
-      InputImageType,
-      InputImageType>                      SquareRootImageFilterType;
-
-  typedef itk::GradientRecursiveGaussianImageFilter<
-      InputImageType,
-      CovariantVectorImageType>               GradientFilterType;
-
-  typedef NeighborhoodScalarProductFilter<
-      CovariantVectorImageType,
-      ModulusType,
-      DirectionType>                          NeighborhoodScalarProductFilterType;
-
-  typedef RemoveIsolatedByDirectionFilter<
-      ModulusType,
-      DirectionType,
-      ModulusType>                           RemoveIsolatedByDirectionFilterType;
-
-  typedef RemoveWrongDirectionFilter<
-      ModulusType,
-      DirectionType,
-      ModulusType>                            RemoveWrongDirectionFilterType;
-
-  typedef NonMaxRemovalByDirectionFilter<
-      ModulusType,
-      DirectionType,
-      ModulusType>                           NonMaxRemovalByDirectionFilterType;
-
-  typedef VectorizationPathListFilter<
-      ModulusType,
-      DirectionType,
-      OutputPathType>                        VectorizationPathListFilterType;
-
-  typedef SimplifyPathListFilter<OutputPathType>                SimplifyPathListFilterType;
-  typedef BreakAngularPathListFilter<OutputPathType>            BreakAngularPathListFilterType;
-  typedef RemoveTortuousPathListFilter<OutputPathType>          RemoveTortuousPathListFilterType;
-  typedef LinkPathListFilter<OutputPathType>                    LinkPathListFilterType;
-  typedef LikelihoodPathListFilter<OutputPathType, ModulusType> LikelihoodPathListFilterType;
-
-  /** Template parameters typedefs for internals filters */
-  typedef typename GradientFilterType::RealType                    SigmaType;
-  typedef typename VectorizationPathListFilterType::InputPixelType AmplitudeThresholdType;
-//     typedef typename SimplifyPathListFilterType::ToleranceType ToleranceType;
-  typedef double                                                ToleranceType;
-  typedef typename BreakAngularPathListFilterType::MaxAngleType MaxAngleType;
-//     typedef typename RemoveTortuousPathListFilterType::MeanDistanceThresholdType MeanDistanceThresholdType;
-  typedef double                                    MeanDistanceThresholdType;
-  typedef typename LinkPathListFilterType::RealType LinkRealType;
-
-  /** Get/Set the alpha value */
-  itkGetConstReferenceMacro(Alpha, double);
-  itkSetMacro(Alpha, double);
-
-  /** Get/Set the amplitude threshold to start following a path (use by the VectorizationPathListFilter)*/
-  itkSetMacro(AmplitudeThreshold, AmplitudeThresholdType);
-  itkGetMacro(AmplitudeThreshold, AmplitudeThresholdType);
-
-  /** Get/Set  the tolerance for segment consistency (tolerance in terms of distance) (use by the SimplifyPathListFilter)*/
-  itkGetMacro(Tolerance, ToleranceType);
-  itkSetMacro(Tolerance, ToleranceType);
-
-  /** Get/Set  the resolution */
-  itkGetMacro(Resolution, double);
-  itkSetMacro(Resolution, double);
-
-  /** Set/Get the max angle (use bye the BreakAngularPathListFilter)*/
-  itkSetMacro(MaxAngle, MaxAngleType);
-  itkGetConstMacro(MaxAngle, MaxAngleType);
-
-  /** Get/Set the tolerance for segment consistency (tolerance in terms of distance) (use by RemoveTortuousPathListFilter)*/
-  itkGetMacro(FirstMeanDistanceThreshold, MeanDistanceThresholdType);
-  itkSetMacro(FirstMeanDistanceThreshold, MeanDistanceThresholdType);
-  itkGetMacro(SecondMeanDistanceThreshold, MeanDistanceThresholdType);
-  itkSetMacro(SecondMeanDistanceThreshold, MeanDistanceThresholdType);
-
-  /** Get/Set the angular threshold (use by LinkPathFilter)*/
-  itkSetMacro(AngularThreshold, LinkRealType);
-  itkGetMacro(AngularThreshold, LinkRealType);
-  /** Get/Set the distance threshold (use by LinkPathFilter)*/
-  itkSetMacro(DistanceThreshold, LinkRealType);
-  itkGetMacro(DistanceThreshold, LinkRealType);
-
-protected:
-  /** Constructor */
-  GenericRoadExtractionFilter();
-  /** Destructor */
-  ~GenericRoadExtractionFilter() override {}
-
-  /** Prepare main computation method
-   *  Note : this function isn't called
-   */
-  void BeforeGenerateData(void);
-
-  /** Main computation method */
-  void GenerateData(void) override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-
-  GenericRoadExtractionFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  typename SquareRootImageFilterType::Pointer m_SquareRootImageFilter;
-  typename GradientFilterType::Pointer m_GradientFilter;
-  typename NeighborhoodScalarProductFilterType::Pointer m_NeighborhoodScalarProductFilter;
-  typename RemoveIsolatedByDirectionFilterType::Pointer m_RemoveIsolatedByDirectionFilter;
-  typename RemoveWrongDirectionFilterType::Pointer m_RemoveWrongDirectionFilter;
-  typename NonMaxRemovalByDirectionFilterType::Pointer m_NonMaxRemovalByDirectionFilter;
-  typename VectorizationPathListFilterType::Pointer m_VectorizationPathListFilter;
-  typename SimplifyPathListFilterType::Pointer m_FirstSimplifyPathListFilter;
-  typename SimplifyPathListFilterType::Pointer m_SecondSimplifyPathListFilter;
-  typename BreakAngularPathListFilterType::Pointer m_BreakAngularPathListFilter;
-  typename RemoveTortuousPathListFilterType::Pointer m_FirstRemoveTortuousPathListFilter;
-  typename RemoveTortuousPathListFilterType::Pointer m_SecondRemoveTortuousPathListFilter;
-  typename LinkPathListFilterType::Pointer m_LinkPathListFilter;
-  typename LikelihoodPathListFilterType::Pointer m_LikelihoodPathListFilter;
-
-  /** Amplitude threshold to start following a path (use by the VectorizationPathListFilter)*/
-  AmplitudeThresholdType m_AmplitudeThreshold;
-  /** Tolerance for segment consistency (tolerance in terms of distance) (use by the SimplifyPathListFilter)*/
-  ToleranceType m_Tolerance;
-  /** Max angle (use bye the BreakAngularPathListFilter)*/
-  MaxAngleType m_MaxAngle;
-  /** Tolerance for segment consistency (tolerance in terms of distance) (use by RemoveTortuousPathListFilter)*/
-  MeanDistanceThresholdType m_FirstMeanDistanceThreshold;
-  MeanDistanceThresholdType m_SecondMeanDistanceThreshold;
-  /** The angular threshold (use by LinkPathListFilter) */
-  LinkRealType m_AngularThreshold;
-
-  /** The distance threshold (use by LinkPathListFilter) */
-  double m_DistanceThreshold;
-
-  /** Alpha. Use to calculate the sigma value used by the GradientRecursiveGaussianImageFilter */
-  double m_Alpha;
-
-  /** Resolution of the image. Use to calculate the sigma value used by the GradientRecursiveGaussianImageFilter
-  and the m_DistanceThreshold value used by the LinkPathListFilter
-  This value is set bye the image's spacing.*/
-  double m_Resolution;
-
-};
-
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbGenericRoadExtractionFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.hxx b/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.hxx
deleted file mode 100644
index fe69fd3c7894a61ffd07e7a942c54a78e7ef8f14..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.hxx
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbGenericRoadExtractionFilter_hxx
-#define otbGenericRoadExtractionFilter_hxx
-
-#include "otbGenericRoadExtractionFilter.h"
-#include "otbMath.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputPath>
-GenericRoadExtractionFilter<TInputImage, TOutputPath>
-::GenericRoadExtractionFilter()
-{
-  this->SetNumberOfRequiredInputs(1);
-  this->SetNumberOfRequiredOutputs(1);
-
-  m_SquareRootImageFilter = SquareRootImageFilterType::New();
-  m_GradientFilter = GradientFilterType::New();
-  m_NeighborhoodScalarProductFilter = NeighborhoodScalarProductFilterType::New();
-  m_RemoveIsolatedByDirectionFilter = RemoveIsolatedByDirectionFilterType::New();
-  m_RemoveWrongDirectionFilter = RemoveWrongDirectionFilterType::New();
-  m_NonMaxRemovalByDirectionFilter = NonMaxRemovalByDirectionFilterType::New();
-  m_VectorizationPathListFilter = VectorizationPathListFilterType::New();
-  m_FirstSimplifyPathListFilter = SimplifyPathListFilterType::New();
-  m_SecondSimplifyPathListFilter = SimplifyPathListFilterType::New();
-  m_BreakAngularPathListFilter = BreakAngularPathListFilterType::New();
-  m_FirstRemoveTortuousPathListFilter = RemoveTortuousPathListFilterType::New();
-  m_SecondRemoveTortuousPathListFilter = RemoveTortuousPathListFilterType::New();
-  m_LinkPathListFilter = LinkPathListFilterType::New();
-  m_LikelihoodPathListFilter = LikelihoodPathListFilterType::New();
-
-  /** Amplitude threshold to start following a path (use by the VectorizationPathListFilter)*/
-  m_AmplitudeThreshold = static_cast<AmplitudeThresholdType>(0.00005);
-  /** Tolerance for segment consistency (tolerance in terms of distance) (use by the SimplifyPathFilter)*/
-  m_Tolerance = static_cast<ToleranceType>(1.);
-  /** Max angle (use bye the BreakAngularPathListFilter)*/
-  m_MaxAngle = static_cast<MaxAngleType>(CONST_PI_8);
-  /** Tolerance for segment consistency (tolerance in terms of distance) (use by RemoveTortuousPathFilter)*/
-  m_FirstMeanDistanceThreshold = static_cast<MeanDistanceThresholdType>(1.);
-  m_SecondMeanDistanceThreshold = static_cast<MeanDistanceThresholdType>(10.);
-  /** The angular threshold (use by LinkPathFilter) */
-  m_AngularThreshold = static_cast<LinkRealType>(CONST_PI_8);
-
-  /** The distance threshold (use by LinkPathFilter) */
-  m_DistanceThreshold = 25.;
-
-  /** Alpha value */
-  /** Use to calculate the sigma value use by the GradientRecursiveGaussianImageFilter */
-  m_Alpha = 1.0;
-
-  /** Resolution of the image */
-  m_Resolution = 1.;
-}
-/**
- * Prepare main computation method
- */
-template <class TInputImage, class TOutputPath>
-void
-GenericRoadExtractionFilter<TInputImage, TOutputPath>
-::BeforeGenerateData()
-{
-  /** Calculation of resolution value */
-  typename InputImageType::SpacingType spacing = this->GetInput()->GetSignedSpacing();
-  // Getting x Spacing for the resolution
-  m_Resolution = static_cast<double>(spacing[0]);
-  if (m_Resolution == 0.)
-    {
-    itkWarningMacro(<< "The image spacing is zero. So the resolution used in the filter is forced to 1.");
-    m_Resolution = 1.;
-    }
-
-}
-
-/**
- * Main computation method
- */
-template <class TInputImage, class TOutputPath>
-void
-GenericRoadExtractionFilter<TInputImage, TOutputPath>
-::GenerateData()
-{
-  // // Input images pointers
-  typename InputImageType::ConstPointer inputImage     = this->GetInput();
-  typename OutputPathListType::Pointer  outputPathList  = this->GetOutput();
-
-  ///////////////////////////////////////
-  //// Algorithm for road extraction ////
-  ///////////////////////////////////////
-
-  //
-
-  m_SquareRootImageFilter->SetInput(inputImage);
-
-  m_GradientFilter->SetInput(m_SquareRootImageFilter->GetOutput());
-  /** Sigma calculated with the alpha and image resolution parameters */
-  m_GradientFilter->SetSigma(static_cast<SigmaType>(m_Alpha * (1.2 / m_Resolution + 1.)));
-  m_GradientFilter->SetUseImageDirection(false);
-
-  m_NeighborhoodScalarProductFilter->SetInput(m_GradientFilter->GetOutput());
-
-  m_RemoveIsolatedByDirectionFilter->SetInput(m_NeighborhoodScalarProductFilter->GetOutput());
-  m_RemoveIsolatedByDirectionFilter->SetInputDirection(m_NeighborhoodScalarProductFilter->GetOutputDirection());
-
-  m_RemoveWrongDirectionFilter->SetInput(m_RemoveIsolatedByDirectionFilter->GetOutput());
-  m_RemoveWrongDirectionFilter->SetInputDirection(m_NeighborhoodScalarProductFilter->GetOutputDirection());
-
-  m_NonMaxRemovalByDirectionFilter->SetInput(m_RemoveWrongDirectionFilter->GetOutput());
-  m_NonMaxRemovalByDirectionFilter->SetInputDirection(m_NeighborhoodScalarProductFilter->GetOutputDirection());
-
-  m_VectorizationPathListFilter->SetInput(m_NonMaxRemovalByDirectionFilter->GetOutput());
-  m_VectorizationPathListFilter->SetInputDirection(m_NeighborhoodScalarProductFilter->GetOutputDirection());
-  m_VectorizationPathListFilter->SetAmplitudeThreshold(m_AmplitudeThreshold);
-
-  m_FirstSimplifyPathListFilter->SetInput(m_VectorizationPathListFilter->GetOutput());
-  m_FirstSimplifyPathListFilter->GetFunctor().SetTolerance(m_Tolerance);
-
-  m_BreakAngularPathListFilter->SetInput(m_FirstSimplifyPathListFilter->GetOutput());
-  m_BreakAngularPathListFilter->SetMaxAngle(m_MaxAngle);
-
-  m_FirstRemoveTortuousPathListFilter->SetInput(m_BreakAngularPathListFilter->GetOutput());
-  m_FirstRemoveTortuousPathListFilter->GetFunctor().SetThreshold(m_FirstMeanDistanceThreshold);
-
-  m_LinkPathListFilter->SetInput(m_FirstRemoveTortuousPathListFilter->GetOutput());
-  m_LinkPathListFilter->SetAngularThreshold(m_AngularThreshold);
-  m_LinkPathListFilter->SetDistanceThreshold(static_cast<LinkRealType>(m_DistanceThreshold / m_Resolution));
-
-  m_SecondSimplifyPathListFilter->SetInput(m_LinkPathListFilter->GetOutput());
-  m_SecondSimplifyPathListFilter->GetFunctor().SetTolerance(m_Tolerance);
-
-  m_SecondRemoveTortuousPathListFilter->SetInput(m_SecondSimplifyPathListFilter->GetOutput());
-  m_SecondRemoveTortuousPathListFilter->GetFunctor().SetThreshold(m_SecondMeanDistanceThreshold);
-
-  m_LikelihoodPathListFilter->SetInput(m_SecondRemoveTortuousPathListFilter->GetOutput());
-  m_LikelihoodPathListFilter->SetInputImage(m_NonMaxRemovalByDirectionFilter->GetOutput());
-
-  // Graft output seems to be broken for PolylineParametricPath
-  // So we use update, and copy the path to the output path list.
-  // m_LikelihoodPathListFilter->GraftOutput(this->GetOutput());
-  m_LikelihoodPathListFilter->Update();
-  // outputPathList =  m_LikelihoodPathListFilter->GetOutput();
-  for (typename LikelihoodPathListFilterType::PathListType::ConstIterator it
-         = m_LikelihoodPathListFilter->GetOutput()->Begin();
-       it != m_LikelihoodPathListFilter->GetOutput()->End();
-       ++it)
-    {
-    outputPathList->PushBack(it.Get());
-    }
-}
-/**
- * PrintSelf method
- */
-template <class TInputImage, class TOutputPath>
-void
-GenericRoadExtractionFilter<TInputImage, TOutputPath>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "m_Alpha:" << m_Alpha << std::endl;
-  os << indent << "m_Resolution:" << m_Resolution << std::endl;
-  os << indent << "m_AmplitudeThreshold: " << m_AmplitudeThreshold << std::endl;
-  os << indent << "m_Tolerance: " << m_Tolerance << std::endl;
-  os << indent << "m_MaxAngle: " << m_MaxAngle << std::endl;
-  os << indent << "m_FirstMeanDistanceThreshold: " << m_FirstMeanDistanceThreshold << std::endl;
-  os << indent << "m_SecondMeanDistanceThreshold: " << m_SecondMeanDistanceThreshold << std::endl;
-  os << indent << "m_DistanceThreshold: " << m_DistanceThreshold << std::endl;
-  os << indent << "m_AngularThreshold: " << m_AngularThreshold << std::endl;
-
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.h b/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.h
deleted file mode 100644
index bdb44cf1f065d6f29f879f5e6da32b08fea2ca2b..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageToPathListAlignFilter_h
-#define otbImageToPathListAlignFilter_h
-
-#include "itkImageSource.h"
-#include "itkConceptChecking.h"
-#include "otbImage.h"
-#include "otbImageToPathListFilter.h"
-#include <vector>
-
-namespace otb
-{
-
-/** \class ImageToPathListAlignFilter
- * \brief Base class used to implement filter to extract align points or group of points and give the coordinates.
- *
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInputImage, class TOutputPath>
-class ITK_EXPORT ImageToPathListAlignFilter : public ImageToPathListFilter<TInputImage, TOutputPath>
-{
-public:
-  /** Standard class typedefs. */
-  typedef ImageToPathListAlignFilter                      Self;
-  typedef ImageToPathListFilter<TInputImage, TOutputPath> Superclass;
-  typedef itk::SmartPointer<Self>                         Pointer;
-  typedef itk::SmartPointer<const Self>                   ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(ImageToPathListAlignFilter, ImageToPathListFilter);
-//  itkTypeMacro(ImageToPathListAlignFilter, itk::ImageSource);
-
-  /** ImageDimension constants */
-  itkStaticConstMacro(InputImageDimension, unsigned int,
-                      TInputImage::ImageDimension);
-
-  /** Some convenient typedefs. */
-  typedef typename Superclass::OutputPathListType OutputPathListType;
-
-  typedef typename Superclass::InputImageType       InputImageType;
-  typedef typename Superclass::InputImageRegionType InputImageRegionType;
-  typedef typename InputImageType::Pointer          InputImagePointer;
-  typedef typename InputImageType::ConstPointer     InputImageConstPointer;
-
-  typedef typename InputImageType::SizeType  SizeType;
-  typedef typename InputImageType::ValueType ValueType;
-  typedef typename InputImageType::PixelType PixelType;
-
-  typedef typename Superclass::OutputPathType OutputPathType;
-  // typedef typename Superclass::OutputPathListType     OutputPathListType;
-  typedef typename Superclass::OutputPathPointerType OutputPathPointerType;
-
-//  typedef          float                                        RealType;
-//typedef typename itk::NumericTraits<PixelType>::RealType       RealType;
-  typedef double RealType;
-//  typedef typename itk::Image<RealType, InputImageDimension>      RealImageType;
-  typedef typename otb::Image<RealType, InputImageDimension> RealImageType;
-  typedef typename RealImageType::Pointer                    RealImageTypePointer;
-  typedef typename RealImageType::IndexType                  RealImageTypeIndexType;
-
-  /** Spacing (size of a pixel) of the output image. The
-   * spacing is the geometric distance between image samples.
-   * It is stored internally as double, but may be set from
-   * float. \sa GetSpacing() */
-  virtual void SetSpacing(const double* spacing);
-  virtual void SetSpacing(const float* spacing);
-  virtual const double* GetSpacing() const;
-
-  /** Set/Get the value for pixels on and off the path.
-  * By default, this filter will return a "0" image with path pixels set to 1 */
-  itkSetMacro(PathValue, ValueType);
-  itkGetMacro(PathValue, ValueType);
-  itkSetMacro(BackgroundValue, ValueType);
-  itkGetMacro(BackgroundValue, ValueType);
-
-  /** The origin of the output image. The origin is the geometric
-   * coordinates of the index (0, 0, ..., 0).  It is stored internally
-   * as double but may be set from float.
-   * \sa GetOrigin() */
-  virtual void SetOrigin(const double* origin);
-  virtual void SetOrigin(const float* origin);
-  virtual const double * GetOrigin() const;
-
-  /** Set/Get Size */
-  itkSetMacro(Size, SizeType);
-  itkGetMacro(Size, SizeType);
-
-  itkSetMacro(isMeaningfulSegment, bool);
-  itkSetMacro(NbGradDirection, int);
-  itkSetMacro(NbLineDirection, int);
-  itkSetMacro(MinGradNorm, double);
-  itkSetMacro(Eps, double);
-  itkGetConstReferenceMacro(isMeaningfulSegment, bool);
-  itkGetConstReferenceMacro(NbGradDirection, int);
-  itkGetConstReferenceMacro(NbLineDirection, int);
-  itkGetConstReferenceMacro(MinGradNorm, double);
-  itkGetConstReferenceMacro(Eps, double);
-
-protected:
-  ImageToPathListAlignFilter();
-  ~ImageToPathListAlignFilter() override;
-
-  void GenerateOutputInformation() override {}  // do nothing
-  void GenerateData() override;
-  virtual std::vector<double> tab(int n, double p, double m);
-  virtual void AngleCalculate(const InputImageType*  InputImageIn);
-
-  SizeType  m_Size;
-  double    m_Spacing[InputImageDimension];
-  double    m_Origin[InputImageDimension];
-  ValueType m_PathValue;
-  ValueType m_BackgroundValue;
-
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  ImageToPathListAlignFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-  bool                m_isMeaningfulSegment; /// to get all meaningful segments (maximal or not
-  int                 m_NbGradDirection; /// Number of allowed gradient direction, default 16
-  int                 m_NbLineDirection; /// Number of line directions to scan, default 96)
-  double              m_MinGradNorm; /// Minimum gradient norm to define a direction, default 2.
-  double              m_Eps; /// -log10(max. number of false alarms), default 0
-  std::vector<double> m_seglist;
-
-  RealImageType * m_AngleImage; //Angle image use by GenerateData and AngleCalculate methods
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbImageToPathListAlignFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.hxx b/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.hxx
deleted file mode 100644
index 3ba3ef83d435c64c28995b047ffcfe72a7316c79..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.hxx
+++ /dev/null
@@ -1,585 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageToPathListAlignFilter_hxx
-#define otbImageToPathListAlignFilter_hxx
-
-#include "otbImageToPathListAlignFilter.h"
-#include "itkImageRegionIteratorWithIndex.h"
-#include "itkConstNeighborhoodIterator.h"
-#include "itkPathIterator.h"
-#include "itkNumericTraits.h"
-#include "itkImageLinearIteratorWithIndex.h"
-#include "otbMath.h"
-
-namespace otb
-{
-
-struct one_segment
-{
-  short start;    /* starting position (distance from border) */
-  short end;      /* ending position (hence, length is end-start+1) */
-  double nfa;     /* number of false alarms */
-  char ok;
-};
-
-/** Constructor */
-template <class TInputImage, class TOutputPath>
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::ImageToPathListAlignFilter()
-{
-  this->SetNumberOfRequiredInputs(1);
-  m_Size.Fill(0);
-  m_isMeaningfulSegment = false;
-  m_NbGradDirection = 16;
-  m_NbLineDirection = 96;
-  m_MinGradNorm = 2.0;
-  m_Eps = 0.0;
-
-  for (unsigned int i = 0; i < InputImageDimension; ++i)
-    {
-    // Set an image spacing for the user
-    m_Spacing[i] = 1.0;
-    m_Origin[i] = 0;
-    }
-
-  m_PathValue = itk::NumericTraits<ValueType>::One;
-  m_BackgroundValue = itk::NumericTraits<ValueType>::Zero;
-}
-
-/** Destructor */
-template <class TInputImage, class TOutputPath>
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::~ImageToPathListAlignFilter()
-{
-}
-
-//----------------------------------------------------------------------------
-template <class TInputImage, class TOutputPath>
-void
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::SetSpacing(const double* spacing)
-{
-  unsigned int i;
-  for (i = 0; i < InputImageDimension; ++i)
-    {
-    if (spacing[i] != m_Spacing[i])
-      {
-      break;
-      }
-    }
-  if (i < InputImageDimension)
-    {
-    for (i = 0; i < InputImageDimension; ++i)
-      {
-      m_Spacing[i] = spacing[i];
-      }
-    this->Modified();
-    }
-}
-
-template <class TInputImage, class TOutputPath>
-void
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::SetSpacing(const float* spacing)
-{
-  unsigned int i;
-  for (i = 0; i < InputImageDimension; ++i)
-    {
-    if ((double) spacing[i] != m_Spacing[i])
-      {
-      break;
-      }
-    }
-  if (i < InputImageDimension)
-    {
-    for (i = 0; i < InputImageDimension; ++i)
-      {
-      m_Spacing[i] = spacing[i];
-      }
-    this->Modified();
-    }
-}
-
-template <class TInputImage, class TOutputPath>
-const double *
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::GetSpacing() const
-{
-  return m_Spacing;
-}
-
-//----------------------------------------------------------------------------
-template <class TInputImage, class TOutputPath>
-void
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::SetOrigin(const double* origin)
-{
-  unsigned int i;
-  for (i = 0; i < InputImageDimension; ++i)
-    {
-    if (origin[i] != m_Origin[i])
-      {
-      break;
-      }
-    }
-  if (i < InputImageDimension)
-    {
-    for (i = 0; i < InputImageDimension; ++i)
-      {
-      m_Origin[i] = origin[i];
-      }
-    }
-}
-
-template <class TInputImage, class TOutputPath>
-void
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::SetOrigin(const float* origin)
-{
-  unsigned int i;
-  for (i = 0; i < InputImageDimension; ++i)
-    {
-    if ((double) origin[i] != m_Origin[i])
-      {
-      break;
-      }
-    }
-  if (i < InputImageDimension)
-    {
-    for (i = 0; i < InputImageDimension; ++i)
-      {
-      m_Origin[i] = origin[i];
-      }
-    }
-}
-
-template <class TInputImage, class TOutputPath>
-const double *
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::GetOrigin() const
-{
-  return m_Origin;
-}
-
-//----------------------------------------------------------------------------
-/* Algorithm */
-template <class TInputImage, class TOutputPath>
-std::vector<double>
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::tab(int n, double p, double m)
-{
-  std::vector<double> out;
-  int                 adr1, adr2, x, y;
-//  double lambda;
-  double q;
-
-  q = 1.0 - p;
-  out.resize((n + 1) * (n + 1));
-  adr1 = 0;
-
-  /*** compute proba (=x among y) ***/
-  out[0] = 1.0;
-  for (y = 1, adr2 = 0; y <= n; ++y)
-    {
-    adr1 = adr2;
-    adr2 += n + 1;
-    out[adr2] = q * out[adr1];
-    for (x = 1; x <= y; ++x)
-      out[adr2 + x] = p * out[adr1 + x - 1] + q * out[adr1 + x];
-    }
-
-  /*** sum to obtain proba (>=k among y) ***/
-  for (y = 1, adr1 = n + 1; y <= n; ++y, adr1 += n + 1)
-    for (x = y - 1; x >= 0; x--)
-      out[adr1 + x] += out[adr1 + x + 1];
-
-  /*** multiply by m (number of segments) to obtain expectation***/
-  for (adr1 = (n + 1) * (n + 1); --adr1 >= 0; )
-    out[adr1] *= m;
-
-  return out;
-}
-
-template <class TInputImage, class TOutputPath>
-void
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::AngleCalculate(const InputImageType* InputImage)
-{
-  double threshold;
-  int    n, p, x, y;
-
-  typename InputImageType::SizeType Taille;
-  typename RealImageType::IndexType IndexOut;
-
-  Taille = InputImage->GetLargestPossibleRegion().GetSize();
-
-  typename RealImageType::RegionType region;
-  region.SetSize(InputImage->GetLargestPossibleRegion().GetSize());
-  IndexOut[0] = 0;
-  IndexOut[1] = 0;
-//  region.SetIndex(InputImage->GetLargestPossibleRegion().GetIndex());
-  region.SetIndex(IndexOut);
-  m_AngleImage->SetRegions(region);
-  m_AngleImage->SetOrigin(InputImage->GetOrigin());
-  m_AngleImage->SetSignedSpacing(InputImage->GetSignedSpacing());
-  m_AngleImage->Allocate();
-
-  n = Taille[0];
-  p = Taille[1];
-
-  threshold = m_MinGradNorm;
-  threshold *= threshold;
-
-  typename InputImageType::IndexType idx;
-
-  for (x = 0; x < p; ++x)
-    {
-    idx[0] = (n - 1);
-    idx[1] = x;
-//     indice = (n-1)*p +x
-    m_AngleImage->SetPixel(idx, static_cast<RealType>(-1000.0));
-    }
-  for (y = 0; y < n; ++y)
-    {
-    idx[0] = y;
-    idx[1] = p - 1;
-//     indice = p*y+p-1
-    m_AngleImage->SetPixel(idx, static_cast<RealType>(-1000.0));
-    }
-
-  typename InputImageType::IndexType adr;
-  RealType                           PixelA, PixelB, PixelC, PixelD;
-  RealType                           com1, com2, gx, gy, norm;
-
-  for (x = 0; x < p - 1; ++x)
-    for (y = 0; y < n - 1; ++y)
-      {
-// indice = y*p+x
-      adr[0] = y;
-      adr[1] = x;
-      idx[0] = adr[0] + 1;
-      idx[1] = adr[1] + 1;
-      PixelA = static_cast<RealType>(InputImage->GetPixel(idx));
-      idx[0] = adr[0];
-      idx[1] = adr[1];
-      assert(idx[0] < n);
-      assert(idx[1] < p);
-      assert(idx[0] >= 0);
-      assert(idx[1] >= 0);
-      PixelB = static_cast<RealType>(InputImage->GetPixel(idx));
-      idx[0] = adr[0] + 1;
-      idx[1] = adr[1];
-      assert(idx[0] < n);
-      assert(idx[1] < p);
-      assert(idx[0] >= 0);
-      assert(idx[1] >= 0);
-      PixelC = static_cast<RealType>(InputImage->GetPixel(idx));
-      idx[0] = adr[0];
-      idx[1] = adr[1] + 1;
-      assert(idx[0] < n);
-      assert(idx[1] < p);
-      assert(idx[0] >= 0);
-      assert(idx[1] >= 0);
-      PixelD = static_cast<RealType>(InputImage->GetPixel(idx));
-      com1 = PixelA - PixelB;
-      com2 = PixelC - PixelD;
-      gx = 0.5 * (com1 + com2);
-      gy = 0.5 * (com1 - com2);
-      norm = gx * gx + gy * gy;
-
-      if (norm <= threshold) m_AngleImage->SetPixel(adr, static_cast<RealType>(-1000.0));
-      else m_AngleImage->SetPixel(adr, static_cast<RealType>(std::atan2(gx, -gy)));
-      }
-}
-
-template <class TInputImage, class TOutputPath>
-void
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::GenerateData(void)
-{
-//  SizeType size;
-//  double origin[InputImageDimension];
-  typename InputImageType::SizeType Taille;
-  RealImageTypeIndexType            indexAngle;
-//  Flist result;
-  int                      iseglist, size_seglist; /* associated counter and dynamic size */
-  int                      iseg, size_seg;
-  double                   nfa, max_nfa;
-  std::vector<double>      test;
-  std::vector<int>         count, startbloc, endbloc;
-  std::vector<double>      seglist; /* list of recorded segments */
-  std::vector<one_segment> seg;
-  int                      mx, my, ox, oy, nx, ny, n;
-  int                      xx, yy, pos, posmax, nblocs, inbloc, max_nblocs;
-  int                      cur, i, j, side, l, lphase;
-  // int tmp;
-  int    itheta, ntheta;
-  double theta, theta0, dtheta, dx, dy, prec;
-  double error = 0.0;
-  itkDebugMacro(<< "ImageToPathListAlignFilter::GenerateData() called");
-
-  // Get the input and output pointers
-  const InputImageType * InputImage   = this->GetInput();
-  OutputPathListType *   OutputPath   = this->GetOutput();
-  // Generate the image
-
-  /* Filter algorithm */
-
-  Taille = InputImage->GetLargestPossibleRegion().GetSize();
-  nx = Taille[0];
-  ny = Taille[1];
-  max_nfa = std::pow(10.0, -(m_Eps));
-
-//  typename InputImageType::IndexType adr;
-
-  /*** maximal length for a line */
-  n = (int) std::ceil(hypot((double) nx, (double) ny)) + 1;
-
-  /*** compute angle map of u ***/
-  RealImageTypePointer lAngleImagePointer = RealImageType::New();
-  m_AngleImage = static_cast<RealImageType*>(lAngleImagePointer.GetPointer());
-  this->AngleCalculate(InputImage);
-
-  /*** compute P(k, l) ***/
-  test = tab(n, 1.0 / (double) (m_NbGradDirection), (double) (nx * ny) * (double) (nx * ny));
-
-  /*** initialization ***/
-  prec = CONST_PI / (double) (m_NbGradDirection);
-  ntheta = m_NbLineDirection / 2;  /* i.e. # directions of NON-ORIENTED lines */
-  dtheta = CONST_PI / (double) ntheta;
-
-  /******************** memory allocation ********************/
-
-  max_nblocs = n / 2 + 1; /* maximal number of blocs */
-  count.resize(max_nblocs);
-  startbloc.resize(max_nblocs);
-  endbloc.resize(max_nblocs);
-
-  size_seg = 10000; /* initial allocation (may reallocate later) */
-  seg.resize(size_seg);
-
-  size_seglist = 10000; /* initial allocation (may reallocate later) */
-  seglist.resize(5 * size_seglist);
-
-  /* counter for recorded segments (seglist) */
-  iseglist = 0;
-
-  /******************** first loop : the four sides ********************/
-
-  for (side = 0; side < 4; side++)
-    {
-    printf("side %d/4 ", side + 1);
-
-    theta0 = CONST_PI_2 * (double) side;
-    mx = ((side == 0 || side == 2) ? 1 : 0);
-    my = ((side == 1 || side == 3) ? 1 : 0);
-    ox = ((side == 1) ? nx - 1 : 0);
-    oy = ((side == 2) ? ny - 1 : 0);
-
-    posmax = nx * mx + ny * my;
-
-    /*** second loop : angles ***/
-    for (itheta = 0; itheta < ntheta; itheta++)
-      {
-      printf(".");
-      fflush(stdout);
-      theta = theta0 + (double) (itheta) * dtheta;
-      dx = (double) std::cos((double) theta);
-      dy = (double) std::sin((double) theta);
-
-      /*** third loop : start positions ***/
-      for (pos = 0; pos < posmax; ++pos)
-        {
-
-        /* clear segment array */
-        iseg = 0;
-
-        /*** fourth loop : phase for two-spaced pixels ***/
-        for (lphase = 0; lphase < 2; lphase++)
-          {
-
-          /*** detect aligned points by blocs ***/
-          inbloc = nblocs = cur = l = count[0] = 0;
-          xx = ox + pos * mx + (int) (dx * (double) (l * 2 + lphase));
-          yy = oy + pos * my + (int) (dy * (double) (l * 2 + lphase));
-
-          for (; xx >= 0 && xx < nx && yy >= 0 && yy < ny; )
-            {
-            indexAngle[0] = xx;
-            indexAngle[1] = yy;
-            // indice  = yy*nx+xx
-            assert(indexAngle[0] < nx);
-            assert(indexAngle[1] < ny);
-            assert(indexAngle[0] >= 0);
-            assert(indexAngle[1] >= 0);
-
-            error = static_cast<double>(m_AngleImage->GetPixel(indexAngle));
-            if (error > -100.0)
-              {
-              error -= theta;
-              while (error <= -CONST_PI)
-                error += CONST_2PI;
-              while (error > CONST_PI)
-                error -= CONST_2PI;
-              if (error < 0.0) error = -error;
-              if (error < prec)
-                {
-                ++cur;
-                if (!inbloc)
-                  {
-                  startbloc[nblocs] = l;
-                  inbloc = 1;
-                  }
-                }
-              else
-                {
-                if (inbloc)
-                  {
-                  endbloc[nblocs] = l - 1;
-                  ++nblocs;
-                  count[nblocs] = cur;
-                  }
-                inbloc = 0;
-                }
-              }
-            /* compute next point */
-            ++l;
-            xx = ox + pos * mx + (int) (dx * (double) (l * 2 + lphase));
-            yy = oy + pos * my + (int) (dy * (double) (l * 2 + lphase));
-            }
-
-          /*** detect meaningful segments ***/
-          for (i = 0; i < nblocs; ++i)
-            for (j = i; j < nblocs; ++j)
-              if ((nfa = test[count[j + 1] - count[i]
-                              + (n + 1) * (1 + endbloc[j] - startbloc[i])]) < max_nfa)
-                {
-                seg[iseg].start = startbloc[i] * 2 + lphase;
-                seg[iseg].end = endbloc[j] * 2 + lphase;
-                seg[iseg].nfa = nfa;
-                seg[iseg].ok = 1;
-                iseg++;
-                /* reallocate if necessary */
-                if (iseg == size_seg)
-                  {
-                  size_seg = (size_seg * 3) / 2;
-                  seg.resize(size_seg);
-//      if (!seg)
-//        mwerror(FATAL, 1,"Not enough memory.");
-                  }
-                }
-          }
-        /*** end of phase loop ***/
-
-        /*** remove non-maximal segments ***/
-        if (!m_isMeaningfulSegment)
-          for (i = 0; i < iseg; ++i)
-            for (j = 0; j < iseg; ++j)
-              if (i != j)
-
-                /* seg[i] is included in seg[j] ? */
-                if (seg[i].start >= seg[j].start && seg[i].end <= seg[j].end)
-                  {
-
-                  /* remove the less meaningful of seg[i] and seg[j] */
-                  if (seg[i].nfa < seg[j].nfa) seg[j].ok = 0;
-                  else seg[i].ok = 0;
-
-                  }
-
-        /*** store detected segments ***/
-        for (i = 0; i < iseg; ++i)
-          if (seg[i].ok)
-            {
-            seglist[iseglist * 5] = (double) (ox + pos * mx) + dx * (double) (seg[i].start);
-            seglist[iseglist * 5 + 1] = (double) (oy + pos * my) + dy * (double) (seg[i].start);
-            seglist[iseglist * 5 + 2] = (double) (ox + pos * mx) + dx * (double) (seg[i].end);
-            seglist[iseglist * 5 + 3] = (double) (oy + pos * my) + dy * (double) (seg[i].end);
-            seglist[iseglist * 5 + 4] = -(double) log10(seg[i].nfa);
-            iseglist++;
-            /* reallocate seglist if necessary */
-            if (iseglist == size_seglist)
-              {
-              size_seglist = (size_seglist * 3) / 2;
-              seglist.resize(size_seglist);
-//        if (!seglist)
-//    mwerror(FATAL, 1,"Not enough memory.");
-              }
-            }
-        }
-      }
-    /*** end of second loop ***/
-
-    printf("   nb de segments: %d\n", iseglist);
-    }
-  /******************** end of first loop ********************/
-
-  seg.clear();
-  endbloc.clear();
-  startbloc.clear();
-  count.clear();
-  test.clear();
-
-  /* build segments list */
-  seglist.resize(5 * iseglist);
-
-  /* build segments list */
-  OutputPath->Clear();
-//  OutputPath->Resize(iseglist);
-
-  typedef typename OutputPathType::ContinuousIndexType ContinuousIndexType;
-  typename InputImageType::PointType point;
-
-  ContinuousIndexType cindex;
-  for (i = 0; i < iseglist; ++i)
-    {
-
-    OutputPathPointerType path = OutputPathType::New();
-
-    path->Initialize();
-    point[0] = seglist[i * 5];
-    point[1] = seglist[i * 5 + 1];
-    InputImage->TransformPhysicalPointToContinuousIndex(point, cindex);
-    path->AddVertex(cindex);
-    cindex[0] = seglist[i * 5 + 2];
-    cindex[1] = seglist[i * 5 + 3];
-    path->AddVertex(cindex);
-
-    OutputPath->PushBack(path);
-    }
-  itkDebugMacro(<< "ImageToPathListAlignFilter::GenerateData() finished");
-
-} // end update function
-
-template <class TInputImage, class TOutputPath>
-void
-ImageToPathListAlignFilter<TInputImage, TOutputPath>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-//  os << indent << "Size : " << m_Size << std::endl;
-//  os << indent << "Path Value : " << m_PathValue << std::endl;
-//  os << indent << "Background Value : " << m_BackgroundValue << std::endl;
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.h
deleted file mode 100644
index 26b8f1c84b1ba6ab47644027d48b28e7d124a64f..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbLikelihoodPathListFilter_h
-#define otbLikelihoodPathListFilter_h
-
-#include "otbPathListToPathListFilter.h"
-#include "otbMacro.h"
-#include <string>
-
-namespace otb
-{
-/** \class LikelihoodPathListFilter
- *  \brief Affect a value to each path of the list based on the image
- *
- * PathList and image are given as an input, the filter affect a value to each
- * path: this value is equal to the sum of the pixels crossed by the path
- * (using a PolyLineImageConstIterator) divided by the number of points in the
- * path
- *
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TPath, class TImage>
-class ITK_EXPORT LikelihoodPathListFilter
-  : public PathListToPathListFilter<TPath>
-{
-public:
-  /** Standard typedefs */
-  typedef LikelihoodPathListFilter        Self;
-  typedef PathListToPathListFilter<TPath> Superclass;
-  typedef itk::SmartPointer<Self>         Pointer;
-  typedef itk::SmartPointer<const Self>   ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(LikelihoodPathListFilter, PathListToPathListFilter);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PathType          PathType;
-  typedef typename Superclass::PathListType      PathListType;
-  typedef typename Superclass::PathPointerType   PathPointerType;
-  typedef typename PathListType::Pointer         PathListPointerType;
-  typedef typename PathListType::ConstIterator   IteratorType;
-  typedef typename PathType::VertexType          VertexType;
-  typedef typename PathType::VertexListType      VertexListType;
-  typedef typename VertexListType::ConstIterator VertexIteratorType;
-  typedef double                                 RealType;
-
-  typedef TImage                           ImageType;
-  typedef typename ImageType::Pointer      ImagePointerType;
-  typedef typename ImageType::ConstPointer ImageConstPointerType;
-
-  /**
-   * Set the input Likelihood image.
-   * \param image The Likelihood image.
-   */
-  void SetInputImage(const ImageType * image);
-
-  /**
-   * Get the input Likelihood image.
-   * \return The input Likelihood image.
-   */
-  const ImageType * GetInputImage(void);
-
-protected:
-  /** Constructor */
-  LikelihoodPathListFilter();
-  /** Destructor */
-  ~LikelihoodPathListFilter() override {}
-  /** GenerateData method */
-  void GenerateData() override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  LikelihoodPathListFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  std::string m_Key;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbLikelihoodPathListFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.hxx b/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.hxx
deleted file mode 100644
index f1bcde145d843ae512d228c20b78da49c740f6ad..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.hxx
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbLikelihoodPathListFilter_hxx
-#define otbLikelihoodPathListFilter_hxx
-
-#include "otbLikelihoodPathListFilter.h"
-#include "otbPolyLineImageConstIterator.h"
-#include "itkMetaDataObject.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TPath, class TImage>
-LikelihoodPathListFilter<TPath, TImage>
-::LikelihoodPathListFilter()
-{
-  m_Key = "Value";
-  this->SetNumberOfRequiredInputs(2);
-  this->SetNumberOfRequiredInputs(2);
-}
-template <class TPath, class TImage>
-void
-LikelihoodPathListFilter<TPath, TImage>
-::SetInputImage(const ImageType * image)
-{
-  this->itk::ProcessObject::SetNthInput(1, const_cast<ImageType *>(image));
-}
-template <class TPath, class TImage>
-const typename LikelihoodPathListFilter<TPath, TImage>
-::ImageType *
-LikelihoodPathListFilter<TPath, TImage>
-::GetInputImage(void)
-{
-  if (this->GetNumberOfInputs() < 1)
-    {
-    return nullptr;
-    }
-  return static_cast<const ImageType *>(this->itk::ProcessObject::GetInput(1));
-}
-
-template <class TPath, class TImage>
-void
-LikelihoodPathListFilter<TPath, TImage>
-::GenerateData()
-{
-  // I/O wiring
-  ImageConstPointerType inputImagePtr = this->GetInputImage();
-  const PathListType *  inputPtr  = this->GetInput();
-  PathListType *        outputPtr = this->GetOutput();
-
-  typedef otb::PolyLineImageConstIterator<ImageType, PathType> ImageIteratorType;
-
-  for (IteratorType it = inputPtr->Begin(); it != inputPtr->End(); ++it)
-    {
-    PathPointerType path = it.Get();
-    ImageIteratorType imageIt(inputImagePtr, path);
-    double cumulatedValues = 0.0;
-    double nbPoints = 0.0;
-    for (imageIt.GoToBegin(); !imageIt.IsAtEnd(); ++imageIt, ++nbPoints)
-      {
-      cumulatedValues += static_cast<double>(imageIt.Get());
-      }
-    itk::MetaDataDictionary& dict = path->GetMetaDataDictionary();
-    itk::EncapsulateMetaData<double>(dict, m_Key, cumulatedValues / nbPoints);
-    outputPtr->PushBack(path);
-    }
-}
-/**
- * PrintSelf Method
- */
-template <class TPath, class TImage>
-void
-LikelihoodPathListFilter<TPath, TImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h
deleted file mode 100644
index 6fb1aef06fff2f50bd862718d6a8763357afe71e..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbLinkPathListFilter_h
-#define otbLinkPathListFilter_h
-
-#include "otbPathListToPathListFilter.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/** \class LinkPathListFilter
- *  \brief This filters link path from the input path list according to distance and angular criterions.
- *
- *  This filter examines both ends of each path to link and is able to link several path into one single path.
- *  The two criterions to link a path are :
- *  - The two ends to link must be closer than the user defined threshold in terms of euclidean distance,
- *  - The angle at the link must not be sharp (less than the user defined threshold).
- *
- *  Please note that this filter may invert the order of the vertices in the newly created path.
- *
- *  This filter is part of the road extraction framework.
- *
-   * \sa ParallelLinePathListFilter
- *
-   * \ingroup PathFilters
- *
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TPath>
-class ITK_EXPORT LinkPathListFilter
-  : public PathListToPathListFilter<TPath>
-{
-public:
-  /** Standard typedefs */
-  typedef LinkPathListFilter              Self;
-  typedef PathListToPathListFilter<TPath> Superclass;
-  typedef itk::SmartPointer<Self>         Pointer;
-  typedef itk::SmartPointer<const Self>   ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(LinkPathListFilter, PathListToPathListFilter);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PathType          PathType;
-  typedef typename Superclass::PathListType      PathListType;
-  typedef typename Superclass::PathPointerType   PathPointerType;
-  typedef typename PathListType::Pointer         PathListPointerType;
-  typedef typename PathListType::ConstIterator   IteratorType;
-  typedef typename PathType::VertexType          VertexType;
-  typedef typename PathType::VertexListType      VertexListType;
-  typedef typename VertexListType::ConstIterator VertexIteratorType;
-  typedef double                                 RealType;
-
-  itkSetMacro(AngularThreshold, RealType);
-  itkGetMacro(AngularThreshold, RealType);
-  itkSetMacro(DistanceThreshold, RealType);
-  itkGetMacro(DistanceThreshold, RealType);
-  itkSetMacro(ModuloPI, bool);
-  itkGetMacro(ModuloPI, bool);
-
-protected:
-  /** Constructor */
-  LinkPathListFilter();
-  /** Destructor */
-  ~LinkPathListFilter() override {}
-  /** GenerateData method */
-  void GenerateData() override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-  /**
-   * Verify the angular condition to link a path.
-   * \param v1 First vertex (before first path ending),
-   * \param v2 second vertex (first path ending),
-   * \param v3 third vertex (second path beginning),
-   * \param v4 fourth vertex (second path after beginning),
-   * \return True or false whether the condition is verified or not.
-   **/
-  bool VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4);
-
-  /**
-   * Actually link the end of path p1 to the beginning of path p2.
-   * \param p1 First path to link,
-   * \param revert1 whether p1 need to be reverted or not,
-   * \param p2 second path to link,
-   * \param revert2 whether p2 need to be reverted or not,
-   * \return the linked path.
-   */
-  PathPointerType LinkPath(PathPointerType p1, bool revert1, PathPointerType p2, bool revert2);
-
-private:
-  LinkPathListFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  RealType m_AngularThreshold;
-  RealType m_DistanceThreshold;
-
-  /// Do not use the sign of the orientation of the lines
-  bool m_ModuloPI;
-
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbLinkPathListFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.hxx b/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.hxx
deleted file mode 100644
index 7b2570338264626746d1614b3c6967d9718877b4..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.hxx
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbLinkPathListFilter_hxx
-#define otbLinkPathListFilter_hxx
-
-#include "otbLinkPathListFilter.h"
-#include "otbMath.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TPath>
-LinkPathListFilter<TPath>
-::LinkPathListFilter()
-{
-  m_DistanceThreshold = 10.;
-  m_AngularThreshold = 3.14;
-  m_ModuloPI = false;
-}
-
-template <class TPath>
-void
-LinkPathListFilter<TPath>
-::GenerateData()
-{
-  // IO
-  const PathListType * inputPtr  = this->GetInput();
-  PathListType *       outputPtr = this->GetOutput();
-
-  // Input iterator
-  IteratorType inputIt = inputPtr->Begin();
-
-  std::vector<bool> eraseFlagVector;
-
-  // First we copy all input path to output
-  while (inputIt != inputPtr->End())
-    {
-    outputPtr->PushBack(inputIt.Get());
-    eraseFlagVector.push_back(false);
-    ++inputIt;
-    }
-
-  IteratorType outputIt1 = outputPtr->Begin();
-  unsigned int index1 = 0;
-
-  while (outputIt1 != outputPtr->End())
-    {
-    if (!eraseFlagVector[index1])
-      {
-      IteratorType outputIt2 = outputIt1;
-      ++outputIt2;
-      // indicate if a path was found and wath is its index
-      unsigned int pathToLinkIndex = 0;
-      double       distance = -1.0;
-      unsigned int index2 = index1 + 1;
-      bool         found = false;
-      bool         revert1 = false;
-      bool         revert2 = false;
-      if (!eraseFlagVector[index1])
-        {
-        while (outputIt2 != outputPtr->End())
-          {
-          if (!eraseFlagVector[index2])
-            {
-            //otbMsgDevMacro(<<"Examining links between path "<<index1<<" and path "<<index2);
-            // Examining end of path1 with beginning of path2
-            VertexIteratorType vSourceIt = outputIt1.Get()->GetVertexList()->End();
-            VertexIteratorType vTargetIt = outputIt2.Get()->GetVertexList()->Begin();
-            --vSourceIt;
-            VertexType v2 = vSourceIt.Value();
-            --vSourceIt;
-            VertexType v1 = vSourceIt.Value();
-            VertexType v3 = vTargetIt.Value();
-            ++vTargetIt;
-            VertexType v4 = vTargetIt.Value();
-            double     tmpDistance = std::sqrt(std::pow(v2[0] - v3[0], 2) + std::pow(v2[1] - v3[1], 2));
-            if ((tmpDistance < static_cast<double>(m_DistanceThreshold)) && ((!found) || (tmpDistance < distance)))
-              {
-              if (VerifyAngularCondition(v1, v2, v3, v4))
-                {
-                // we found a better candidate
-                //otbMsgDevMacro(<<"Link between end of path "<<index1<<" and beginning of path "<<index2<<" is currently the best choice");
-                distance = tmpDistance;
-                pathToLinkIndex = index2;
-                revert1 = false;
-                revert2 = false;
-                if (!found)
-                  {
-                  found = true;
-                  }
-                }
-              }
-            // Examining end of path1 with end of path2
-            vTargetIt = outputIt2.Get()->GetVertexList()->End();
-            --vTargetIt;
-            v3 = vTargetIt.Value();
-            --vTargetIt;
-            v4 = vTargetIt.Value();
-            tmpDistance = std::sqrt(std::pow(v2[0] - v3[0], 2) + std::pow(v2[1] - v3[1], 2));
-
-            if ((tmpDistance < static_cast<double>(m_DistanceThreshold)) && ((!found) || (tmpDistance < distance)))
-              {
-              if (VerifyAngularCondition(v1, v2, v3, v4))
-                {
-                // we found a better candidate
-                //otbMsgDevMacro(<<"Link between end of path "<<index1<<" and end of path "<<index2<<" is currently the best choice");
-                distance = tmpDistance;
-                pathToLinkIndex = index2;
-                revert1 = false;
-                revert2 = true;
-                if (!found)
-                  {
-                  found = true;
-                  }
-                }
-              }
-            // Examining beginning of path1 with end of path2
-            vSourceIt = outputIt1.Get()->GetVertexList()->Begin();
-            v2 = vSourceIt.Value();
-            ++vSourceIt;
-            v1 = vSourceIt.Value();
-            tmpDistance = std::sqrt(std::pow(v2[0] - v3[0], 2) + std::pow(v2[1] - v3[1], 2));
-
-            if ((tmpDistance < static_cast<double>(m_DistanceThreshold)) && ((!found) || (tmpDistance < distance)))
-              {
-              if (VerifyAngularCondition(v1, v2, v3, v4))
-                {
-                // we found a better candidate
-                //otbMsgDevMacro(<<"Link between beginning of path "<<index1<<" and end of path "<<index2<<" is currently the best choice");
-                distance = tmpDistance;
-                pathToLinkIndex = index2;
-                revert1 = true;
-                revert2 = true;
-                if (!found)
-                  {
-                  found = true;
-                  }
-                }
-              }
-            // Examining beginning of path1 with beginning of path2
-            vTargetIt = outputIt2.Get()->GetVertexList()->Begin();
-            v3 = vTargetIt.Value();
-            ++vTargetIt;
-            v4 = vTargetIt.Value();
-            tmpDistance = std::sqrt(std::pow(v2[0] - v3[0], 2) + std::pow(v2[1] - v3[1], 2));
-            if ((tmpDistance < static_cast<double>(m_DistanceThreshold)) && ((!found) || (tmpDistance < distance)))
-              {
-              if (VerifyAngularCondition(v1, v2, v3, v4))
-                {
-                // we found a better candidate
-                //otbMsgDevMacro(<<"Link between beginning of path "<<index1<<" and beginning of path "<<index2<<" is currently the best choice");
-                distance = tmpDistance;
-                pathToLinkIndex = index2;
-                revert1 = true;
-                revert2 = false;
-                if (!found)
-                  {
-                  found = true;
-                  }
-                }
-              }
-            }
-          ++index2;
-          ++outputIt2;
-          }
-        if (found)
-          {
-          //otbMsgDevMacro(<<"Search ended, merging path "<<index1<<" and path "<<pathToLinkIndex);
-          // an appropriate path was found
-          outputIt2 = outputPtr->Begin() + pathToLinkIndex;
-          PathPointerType newPath = this->LinkPath(outputIt1.Get(), revert1, outputIt2.Get(), revert2);
-          outputPtr->PushBack(newPath);
-          // add a non erased flag for the new path
-          eraseFlagVector.push_back(false);
-          // mark the old path as erased
-          eraseFlagVector[index1] = true;
-          eraseFlagVector[pathToLinkIndex] = true;
-          }
-        }
-      }
-    ++index1;
-    // This replaces ++outputIt1 because the iterators is somehow invalidated by a pushback.
-    outputIt1 = outputPtr->Begin() + index1;
-    }
-
-  // search ended, now removing the erased path
-  typename std::vector<bool>::reverse_iterator it = eraseFlagVector.rbegin();
-  index1 = eraseFlagVector.size() - 1;
-  while (it != eraseFlagVector.rend())
-    {
-    if (eraseFlagVector[index1])
-      {
-      outputPtr->Erase(index1);
-      }
-    --index1;
-    ++it;
-    }
-}
-/**
- * Verify the angular condition to link a path.
- * \param v1 First vertex (before first path ending),
- * \param v2 second vertex (first path ending),
- * \param v3 third vertex (second path beginning),
- * \param v4 fourth vertex (second path after beginning),
- * \return True or false whether the condition is verified or not.
- **/
-template <class TPath>
-bool
-LinkPathListFilter<TPath>
-::VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4)
-{
-  double alpha1 = std::atan2((v2[1] - v1[1]), (v2[0] - v1[0]));
-  double alpha2 = std::atan2((v4[1] - v3[1]), (v4[0] - v3[0]));
-  double alpha3 = std::atan2((v3[1] - v2[1]), (v3[0] - v2[0]));
-
-  if (m_ModuloPI)
-    {
-    alpha1 = (alpha1 >= 0) ? alpha1 : (alpha1 + CONST_PI);
-    alpha2 = (alpha2 >= 0) ? alpha2 : (alpha2 + CONST_PI);
-    alpha3 = (alpha3 >= 0) ? alpha3 : (alpha3 + CONST_PI);
-    }
-  else
-    {
-    alpha1 = (alpha1 >= 0) ? alpha1 : (alpha1 + CONST_2PI);
-    alpha2 = (alpha2 >= 0) ? alpha2 : (alpha2 + CONST_2PI);
-    alpha3 = (alpha3 >= 0) ? alpha3 : (alpha3 + CONST_2PI);
-    }
-
-  bool resp = (std::abs(alpha1 - alpha2) < static_cast<double>(m_AngularThreshold))
-              && (std::abs(alpha1 - alpha3) < static_cast<double>(m_AngularThreshold))
-              && (std::abs(alpha2 - alpha3) < static_cast<double>(m_AngularThreshold));
-  return resp;
-}
-/**
- * Actually link the end of path p1 to the beginning of path p2.
- * \param p1 First path to link,
- * \param revert1 whether p1 need to be reverted or not,
- * \param p2 second path to link,
- * \param revert2 whether p2 need to be reverted or not,
- * \return the linked path.
- */
-template <class TPath>
-typename LinkPathListFilter<TPath>
-::PathPointerType
-LinkPathListFilter<TPath>
-::LinkPath(PathPointerType p1, bool revert1, PathPointerType p2, bool revert2)
-{
-  PathPointerType resp = PathType::New();
-
-  VertexIteratorType it;
-
-  if (revert1)
-    {
-    for (it = (p1->GetVertexList()->End()); it != p1->GetVertexList()->Begin(); )
-      {
-      --it;
-      resp->AddVertex((it).Value());
-      }
-    }
-  else
-    {
-    for (it = p1->GetVertexList()->Begin(); it != p1->GetVertexList()->End(); ++it)
-      {
-      resp->AddVertex((it).Value());
-      }
-    }
-
-  if (revert2)
-    {
-    for (it = (p2->GetVertexList()->End()); it != p2->GetVertexList()->Begin(); )
-      {
-      --it;
-      resp->AddVertex((it).Value());
-      }
-    }
-  else
-    {
-    for (it = p2->GetVertexList()->Begin(); it != p2->GetVertexList()->End(); ++it)
-      {
-      resp->AddVertex(it.Value());
-      }
-    }
-  return resp;
-}
-/**
- * PrintSelf Method
- */
-template <class TPath>
-void
-LinkPathListFilter<TPath>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.h b/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.h
deleted file mode 100644
index 9406349db143cd333c4ad3359a4196c38667bde8..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbModulusAndDirectionImageToImageFilter_h
-#define otbModulusAndDirectionImageToImageFilter_h
-
-#include "itkImageToImageFilter.h"
-
-namespace otb
-{
-
-/** \class ModulusAndDirectionImageToImageFilter
- *
- * \brief Base class for modulus and direction image filters.
- *
- * This is the base class for alls class' generate an image dulus and
- * by using an modulus and a direction images intputs.
- * SetInput() method set the modulus image input and
- * SetInputDirection() set the image direction input.
- *
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInputImage,
-    class TInputImageDirection,
-    class TOutputImage>
-class ITK_EXPORT ModulusAndDirectionImageToImageFilter :  public itk::ImageToImageFilter<TInputImage, TOutputImage>
-{
-public:
-  /**   Extract dimensions as well of the images of entry of exit. */
-  itkStaticConstMacro(InputImageDimension,
-                      unsigned int,
-                      TInputImage::ImageDimension);
-  itkStaticConstMacro(OutputImageDimension,
-                      unsigned int,
-                      TOutputImage::ImageDimension);
-
-  /** typedef for the classes standards. */
-  typedef ModulusAndDirectionImageToImageFilter              Self;
-  typedef itk::ImageToImageFilter<TInputImage, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                            Pointer;
-  typedef itk::SmartPointer<const Self>                      ConstPointer;
-
-  /** Method for management of the object factory. */
-  itkNewMacro(Self);
-
-  /** Return the name of the class. */
-  itkTypeMacro(ModulusAndDirectionImageToImageFilter, itk::ImageToImageFilter);
-
-  typedef typename Superclass::InputImageType  InputImageType;
-  typedef TInputImageDirection                 InputImageDirectionType;
-  typedef typename Superclass::OutputImageType OutputImageType;
-
-  /** Set/Get the image input of this process object.  */
-  using Superclass::SetInput;
-  void SetInput(const InputImageType *input) override;
-  virtual void SetInputDirection(const InputImageDirectionType *direction);
-  const InputImageType * GetInput(void);
-  const InputImageDirectionType * GetInputDirection(void);
-
-protected:
-  ModulusAndDirectionImageToImageFilter();
-  ~ModulusAndDirectionImageToImageFilter() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  ModulusAndDirectionImageToImageFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-};
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbModulusAndDirectionImageToImageFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.hxx b/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.hxx
deleted file mode 100644
index 159b2b95d789e01d3d855e773007fa7ad30e51e1..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.hxx
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbModulusAndDirectionImageToImageFilter_hxx
-#define otbModulusAndDirectionImageToImageFilter_hxx
-
-#include "otbModulusAndDirectionImageToImageFilter.h"
-#include "itkProcessObject.h"
-
-namespace otb
-{
-
-/**
- *
- */
-template <class TInputImage, class TOutputImage, class TOutputImageDirection>
-ModulusAndDirectionImageToImageFilter<TInputImage, TOutputImage, TOutputImageDirection>::
-ModulusAndDirectionImageToImageFilter()
-{
-  this->SetNumberOfRequiredInputs(2);
-  this->SetNumberOfRequiredInputs(2);
-  this->SetNumberOfRequiredOutputs(1);
-  this->SetNumberOfRequiredOutputs(1);
-
-  this->SetNthOutput(0, OutputImageType::New());
-}
-
-template <class TInputImage, class TInputImageDirection, class TOutputImage>
-void
-ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>::
-SetInput(const InputImageType *input)
-{
-  // Process object is not const-correct so the const_cast is required here
-  this->itk::ProcessObject::SetNthInput(0,
-                                        const_cast<InputImageType *>(input));
-}
-
-template <class TInputImage, class TInputImageDirection, class TOutputImage>
-void
-ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>::
-SetInputDirection(const InputImageDirectionType *direction)
-{
-  // Process object is not const-correct so the const_cast is required here
-  this->itk::ProcessObject::SetNthInput(1,
-                                        const_cast<InputImageDirectionType *>(direction));
-}
-
-/** Return the input image modulus */
-template <class TInputImage, class TInputImageDirection, class TOutputImage>
-const typename ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>::InputImageType *
-ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>::
-GetInput(void)
-{
-  if (this->GetNumberOfInputs() < 1)
-    {
-    return nullptr;
-    }
-
-  return static_cast<const TInputImage *>
-           (this->itk::ProcessObject::GetInput(0));
-}
-
-/** Return the intput image direction */
-template <class TInputImage, class TInputImageDirection, class TOutputImage>
-const typename ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection,
-    TOutputImage>::InputImageDirectionType *
-ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>::
-GetInputDirection(void)
-{
-  if (this->GetNumberOfInputs() < 2)
-    {
-    return nullptr;
-    }
-
-  return static_cast<const TInputImageDirection *>
-           (this->itk::ProcessObject::GetInput(1));
-
-}
-
-/**
- * Standard "PrintSelf" method
- */
-template <class TInputImage, class TInputImageDirection, class TOutputImage>
-void
-ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>::
-PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.h b/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.h
deleted file mode 100644
index b5f2ccb57daa26d30ec5aa8ab1137b312f3e8db6..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNeighborhoodScalarProductFilter_h
-#define otbNeighborhoodScalarProductFilter_h
-
-#include "otbImageToModulusAndDirectionImageFilter.h"
-
-namespace otb
-{
-/** \class NeighborhoodScalarProductFilter
- *  \brief This filter is designed to be part of a pipeline aiming at linear feature extraction, such as roads.
- *
- *  This filter takes as input a two-band image resulting from a gradient operator. The first channel contains
- *  the gradient value in the first image direction, the second contains the gradient value in the second image direction.
- *
- *  Assuming that the linear feature we want to detect is darker than its surrounding environnement, we can deduce that
- *  the gradient direction will be opposite on each side of the road. Therefore, we compute for each pixel to compute the scalar
- *  product of the gradient vector for each opposite pixels in the neighborhood of radius 1 of the pixel to compute.
- *
- * The lower negativ scalar product value along these four pairs of pixel gives us the direction in which there is most
- * likely a linear feature.
- *
- * This filters has two outputs :
- * - The first output (from the GetOutput() method) gives the modulus of the lower negativ scalar product value for this pixel.
- * - The second output (from the GetOutputDirection() method) gives the direction in radian of this linear feature.
- *
- * Please note that there are only 8 possible values for the direction image, corresponding to two directions for each pair of opposite
- * pixels. In our conventions, negatives angle values represent opposite gradient vectors, whereas positive angle values represent convergent
- * gradient vectors.
- *  \ingroup Streamed
- *  \ingroup Threaded
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInputImage, class TOutputModulus, class TOutputDirection>
-class ITK_EXPORT NeighborhoodScalarProductFilter
-  : public ImageToModulusAndDirectionImageFilter<TInputImage, TOutputModulus, TOutputDirection>
-{
-public:
-  /** Standard typedefs */
-  typedef NeighborhoodScalarProductFilter                                                      Self;
-  typedef ImageToModulusAndDirectionImageFilter<TInputImage, TOutputModulus, TOutputDirection> Superclass;
-  typedef itk::SmartPointer<Self>                                                              Pointer;
-  typedef itk::SmartPointer<const Self>                                                        ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(NeighborhoodScalarProductFilter, ImageToModulusAndDirectionImageFilter);
-
-  /** Template parameters typedefs */
-  typedef TInputImage                              InputImageType;
-  typedef typename InputImageType::ConstPointer    InputImageConstPointerType;
-  typedef typename InputImageType::PixelType       InputPixelType;
-  typedef TOutputModulus                           OutputModulusType;
-  typedef typename OutputModulusType::Pointer      OutputModulusPointerType;
-  typedef typename OutputModulusType::RegionType   RegionType;
-  typedef typename OutputModulusType::SizeType     SizeType;
-  typedef typename OutputModulusType::IndexType    IndexType;
-  typedef TOutputDirection                         OutputDirectionType;
-  typedef typename OutputDirectionType::Pointer    OutputDirectionPointerType;
-  typedef typename OutputDirectionType::RegionType OutputImageRegionType;
-
-protected:
-  /** Constructor */
-  NeighborhoodScalarProductFilter();
-  /** Destructor */
-  ~NeighborhoodScalarProductFilter() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** NeighborhoodScalarProductImageFilter can be implemented as a multithreaded filter.
-   * Therefore, this implementation provides a ThreadedGenerateData() routine
-   * which is called for each processing thread. The output image data is
-   * allocated automatically by the superclass prior to calling
-   * ThreadedGenerateData().  ThreadedGenerateData can only write to the
-   * portion of the output image specified by the parameter
-   * "outputRegionForThread"
-   *
-   * \sa ImageToImageFilter::ThreadedGenerateData(),
-   *     ImageToImageFilter::GenerateData()  */
-  void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread,
-                            itk::ThreadIdType threadId) override;
-private:
-  NeighborhoodScalarProductFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbNeighborhoodScalarProductFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.hxx b/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.hxx
deleted file mode 100644
index a2f66c9a02e6430f105d371e4ff41002f8b8beba..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.hxx
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNeighborhoodScalarProductFilter_hxx
-#define otbNeighborhoodScalarProductFilter_hxx
-
-#include "otbNeighborhoodScalarProductFilter.h"
-#include "itkImageRegionIterator.h"
-#include "itkConstNeighborhoodIterator.h"
-#include "itkNeighborhoodAlgorithm.h"
-#include "itkProgressReporter.h"
-
-#include "otbMath.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputModulus, class TOutputDirection>
-NeighborhoodScalarProductFilter<TInputImage, TOutputModulus, TOutputDirection>
-::NeighborhoodScalarProductFilter()
-{}
-
-template <class TInputImage, class TOutputModulus, class TOutputDirection>
-void
-NeighborhoodScalarProductFilter<TInputImage, TOutputModulus, TOutputDirection>
-::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId)
-{
-  // some typedefs
-  typedef itk::ConstNeighborhoodIterator<InputImageType>                           NeighborhoodIteratorType;
-  typedef typename NeighborhoodIteratorType::RadiusType                            RadiusType;
-  typedef typename NeighborhoodIteratorType::OffsetType                            OffsetType;
-  typedef itk::ImageRegionIterator<OutputModulusType>                              OutputIteratorType;
-  typedef itk::ImageRegionIterator<OutputDirectionType>                            OutputDirectionIteratorType;
-  typedef itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator<InputImageType> BoundaryFacesCalculatorType;
-  typedef typename BoundaryFacesCalculatorType::FaceListType                       FaceListType;
-  typedef typename FaceListType::iterator                                          FaceListIteratorType;
-
-  // Pointers on inputs/outputs
-  InputImageType *           inputPtr = const_cast<InputImageType *>(this->GetInput());
-  OutputModulusPointerType   outputPtr = this->GetOutput();
-  OutputDirectionPointerType outputDirPtr = this->GetOutputDirection();
-
-  // Neighborhood radius
-  RadiusType r;
-  r.Fill(1);
-
-  // Find the data-set boundary "faces"
-  BoundaryFacesCalculatorType bC;
-  FaceListType                faceList = bC(inputPtr, outputRegionForThread, r);
-  FaceListIteratorType        fit;
-
-  // support progress methods/callbacks
-  itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
-
-  // Process each of the boundary faces.  These are N-d regions which border
-  // the edge of the buffer.
-  for (fit = faceList.begin(); fit != faceList.end(); ++fit)
-    {
-    NeighborhoodIteratorType neighInputIt(r, inputPtr, *fit);
-    OutputIteratorType outputIt(outputPtr, *fit);
-    OutputDirectionIteratorType outputDirIt(outputDirPtr, *fit);
-    neighInputIt.GoToBegin();
-    outputIt.GoToBegin();
-    outputDirIt.GoToBegin();
-
-    while ((!neighInputIt.IsAtEnd()) && (!outputIt.IsAtEnd()) && (!outputDirIt.IsAtEnd()))
-      {
-      // local variable initialization
-      int    neighborhoodNumberMax = 0;
-      double scalarMaxValue = 0;
-      //TODO for a more general algorithm this might be replaced by:
-      //double scalarMaxValue = itk::NumericTraits<double>::NonpositiveMin();
-      int flagPosNegDirection = 0;
-
-      // walk through each case
-      for (int neighborhoodNumber = 0; neighborhoodNumber < 4; ++neighborhoodNumber)
-        {
-        double     scalarCurrentValue = 0.0;
-        OffsetType offset1;
-        OffsetType offset2;
-        switch (neighborhoodNumber)
-          {
-          case 0:
-            offset1[0] = 1;
-            offset1[1] = -1;
-            offset2[0] = -1;
-            offset2[1] = 1;
-            break;
-          case 1:
-            offset1[0] = 1;
-            offset1[1] = 0;
-            offset2[0] = -1;
-            offset2[1] = 0;
-            break;
-          case 2:
-            offset1[0] = 1;
-            offset1[1] = 1;
-            offset2[0] = -1;
-            offset2[1] = -1;
-            break;
-          case 3:
-            offset1[0] = 0;
-            offset1[1] = 1;
-            offset2[0] = 0;
-            offset2[1] = -1;
-            break;
-          }
-        // Get the gradient values
-        InputPixelType pixel1 = neighInputIt.GetPixel(offset1);
-        InputPixelType pixel2 = neighInputIt.GetPixel(offset2);
-
-        // Compute the scalar product
-        scalarCurrentValue = -(pixel1[0] * pixel2[0] + pixel1[1] * pixel2[1]);
-
-        // If the value is higher than the current max value
-        if (scalarCurrentValue > scalarMaxValue)
-          {
-          // keep this configuration
-          scalarMaxValue = scalarCurrentValue;
-          neighborhoodNumberMax = neighborhoodNumber;
-
-          // Also keep the direction
-          if (pixel1[0] < 0)
-            {
-            flagPosNegDirection = 1;
-            }
-          else
-            {
-            flagPosNegDirection = 0;
-            }
-
-          }
-        }
-      // Compute the direction
-      double angle = static_cast<double>((1 + neighborhoodNumberMax)) * static_cast<double>(CONST_PI_4);
-      if (flagPosNegDirection)
-        {
-        angle -= CONST_PI;
-        }
-
-      // Set the output values
-      outputIt.Set(scalarMaxValue);
-      outputDirIt.Set(angle);
-      ++neighInputIt;
-      ++outputIt;
-      ++outputDirIt;
-      progress.CompletedPixel();
-      }
-    }
-}
-/**
- * PrintSelf Method
- */
-template <class TInputImage, class TOutputModulus, class TOutputDirection>
-void
-NeighborhoodScalarProductFilter<TInputImage, TOutputModulus, TOutputDirection>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbNonMaxRemovalByDirectionFilter.h b/Modules/Detection/RoadExtraction/include/otbNonMaxRemovalByDirectionFilter.h
deleted file mode 100644
index 4e6d12cce270fde7ccf6d77c7be4c8e4b55b7ae4..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbNonMaxRemovalByDirectionFilter.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNonMaxRemovalByDirectionFilter_h
-#define otbNonMaxRemovalByDirectionFilter_h
-
-#include "otbModulusAndDirectionImageToImageFilter.h"
-#include "otbBinaryFunctorNeighborhoodImageFilter.h"
-
-#include "otbMath.h"
-
-namespace otb
-{
-namespace Functor
-{
-/** \class NonMaxRemovalByDirectionFunctor
- *  \brief This functor is used by the NonMaxRemovalByDirectionFilter
- *  \sa NonMaxRemovalByDirectionFilter
- *  \ingroup Functor
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInput1, class TInput2, class TOutput>
-class NonMaxRemovalByDirectionFunctor
-{
-public:
-  NonMaxRemovalByDirectionFunctor() {}
-  virtual ~NonMaxRemovalByDirectionFunctor() {}
-  inline TOutput operator ()(const TInput1& itA, const TInput2& itB)
-  {
-    TOutput resp = 0;
-    if (itA.GetCenterPixel() != 0)
-      {
-      typename TInput1::OffsetType offset1, offset2;
-      offset1.Fill(0);
-      offset2.Fill(0);
-      int neighborhoodNumber;
-      if (itB.GetCenterPixel() > 0)
-        {
-        neighborhoodNumber = static_cast<int>(itB.GetCenterPixel() / (CONST_PI_4) -1);
-        }
-      else
-        {
-        neighborhoodNumber = static_cast<int>((itB.GetCenterPixel() + CONST_PI) / (CONST_PI_4) -1);
-        }
-      switch (neighborhoodNumber)
-        {
-        case 0:
-          offset1[0] =  1;
-          offset1[1] = -1;
-          offset2[0] = -1;
-          offset2[1] =  1;
-          break;
-        case 1:
-          offset1[0] =  1;
-          offset1[1] =  0;
-          offset2[0] = -1;
-          offset2[1] =  0;
-          break;
-        case 2:
-          offset1[0] =  1;
-          offset1[1] =  1;
-          offset2[0] = -1;
-          offset2[1] = -1;
-          break;
-        case 3:
-          offset1[0] =  0;
-          offset1[1] =  1;
-          offset2[0] =  0;
-          offset2[1] = -1;
-          break;
-        }
-      if ((itA.GetCenterPixel() > itA.GetPixel(offset1))
-          && (itA.GetCenterPixel() > itA.GetPixel(offset2)))
-        {
-        resp =  itA.GetCenterPixel();
-        }
-      }
-    return resp;
-  }
-};
-}
-/** \class NonMaxRemovalByDirectionFilter
- *  \brief This filters removes (sets to null intensity) pixels which are not the maxima of the
- *  scalar product modulus value in the given direction.
- *
- * \ingroup Streamed
- * \ingroup Threaded
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInputModulus, class TInputDirection, class TOutputImage>
-class ITK_EXPORT NonMaxRemovalByDirectionFilter
-  : public ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef NonMaxRemovalByDirectionFilter                                                      Self;
-  typedef ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                                                             Pointer;
-  typedef itk::SmartPointer<const Self>                                                       ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(NonMaxRemovalByDirectionFilter, ModulusAndDirectionImageToImageFilter);
-
-  /** typedef of the computing filter (this allows us to derive from ModulusAndDirectionToImageFilter as well as
-      using the BinaryFunctorNeighBorhoodImageFilter, which is appropriate here */
-  typedef Functor::NonMaxRemovalByDirectionFunctor<
-      typename itk::ConstNeighborhoodIterator<TInputModulus>,
-      typename itk::ConstNeighborhoodIterator<TInputDirection>,
-      typename TOutputImage::PixelType>  FunctorType;
-  typedef otb::BinaryFunctorNeighborhoodImageFilter<TInputModulus, TInputDirection, TOutputImage,
-      FunctorType> ComputingFilterType;
-
-protected:
-  /** Constructor */
-  NonMaxRemovalByDirectionFilter() {};
-  /** Destructor */
-  ~NonMaxRemovalByDirectionFilter() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override
-  {
-    Superclass::PrintSelf(os, indent);
-  }
-  /** Main computation method */
-  void GenerateData(void) override
-  {
-    typename ComputingFilterType::Pointer filter = ComputingFilterType::New();
-    filter->SetInput1(this->GetInput());
-    filter->SetInput2(this->GetInputDirection());
-    filter->GraftOutput(this->GetOutput());
-    filter->Update();
-    this->GraftOutput(filter->GetOutput());
-  }
-
-private:
-  NonMaxRemovalByDirectionFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h b/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h
deleted file mode 100644
index 3cabe035adffb2aca8f72e1c236dbe930767dcf5..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbParallelLinePathListFilter_h
-#define otbParallelLinePathListFilter_h
-
-#include "otbPathListToPathListFilter.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/** \class ParallelLinePathListFilter
- *  \brief Detects parallel lines in imagery, the required input data are a PathList object.
- *
- * The class consists of three basic functions that determine the angle between two lines,
- * the distance between the lines and the common part of the lines. First, all input lines
- * are checked if there is a second line running in the same direction. Thereafter, all line
- * pairs that already fulfilled the angular criterion are checked whether they are close to
- * each other or not, i.e. the orthogonal distance between them is calculated. Finally, it
- * has to be verified if the two lines have a common part since lines may fulfill the two
- * first criteria but be located in different parts of the image. In order to adapt the
- * detection algorithm to the user's needs, the thresholds AngularThreshold, DistanceThreshold
- * and CommonDistanceThreshold can be set.
- *
- * A possible processing chain would be to extract lines with a line detector, to convert the
- * result to PathList object (an ObjectList of PolyLineParametricPath), to link short line
- * segments with the otbLinkPathListFilter to longer lines and to finally detect all parallel
- * long lines.
- *
-   * \sa LinkPathListFilter
- *
-   * \ingroup PathFilters
- *
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TPath>
-class ITK_EXPORT ParallelLinePathListFilter
-  : public PathListToPathListFilter<TPath>
-{
-public:
-  /** Standard typedefs */
-  typedef ParallelLinePathListFilter      Self;
-  typedef PathListToPathListFilter<TPath> Superclass;
-  typedef itk::SmartPointer<Self>         Pointer;
-  typedef itk::SmartPointer<const Self>   ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(ParallelLinePathListFilter, PathListToPathListFilter);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PathType          PathType;
-  typedef typename Superclass::PathListType      PathListType;
-  typedef typename Superclass::PathPointerType   PathPointerType;
-  typedef typename PathListType::Pointer         PathListPointerType;
-  typedef typename PathListType::ConstIterator   IteratorType;
-  typedef typename PathType::VertexType          VertexType;
-  typedef typename PathType::VertexListType      VertexListType;
-  typedef typename VertexListType::ConstIterator VertexIteratorType;
-  typedef double                                 RealType;
-
-  itkSetMacro(AngularThreshold, RealType);
-  itkGetMacro(AngularThreshold, RealType);
-  itkSetMacro(DistanceThreshold, RealType);
-  itkGetMacro(DistanceThreshold, RealType);
-  itkSetMacro(CommonDistanceThreshold, RealType);
-  itkGetMacro(CommonDistanceThreshold, RealType);
-
-protected:
-  /** Constructor */
-  ParallelLinePathListFilter();
-  /** Destructor */
-  ~ParallelLinePathListFilter() override {}
-  /** GenerateData method */
-  void GenerateData() override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-  /**
-  * Verify the angular condition to find parallel lines.
-  * This function verifies if two lines are parallel by
-  * computing the angle in relation to the y-axis.
-  * First line segment: v1 is the first vertex, v2 the second one
-  * (not necessarily the path ending).
-  * Second line segment: v3 is the first vertex, v4 the second one
-  * (not necessarily the path ending).
-  * Return true if the condition is verified.
-  *
-  * This is the first criteria to be fulfilled.
-  **/
-  bool VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4);
-
-  /**
-  * Verify the maximum distance condition to find parallel lines.
-  * The orthogonal distance between two parallel lines is calculated.
-  * First line segment: v1 is the first vertex, v2 the second one
-  * (not necessarily the path ending).
-  * Second line segment: v3 is the first vertex, v4 the second one
-  * (not necessarily the path ending).
-  * Return true if the condition is verified.
-  *
-  * This is the second criteria to be fulfilled.
-  **/
-  bool VerifyMaxDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4);
-
-  /**
-  * Verify the common distance condition to find parallel lines.
-  * The overlapping part of the parallel lines is computed. In case
-  * no overlapping part exists or the value is below the specified
-  * threshold, false is returned.
-  * First line segment: v1 is the first vertex, v2 the second one
-  * (not necessarily the path ending).
-  * Second line segment: v3 is the first vertex, v4 the second one
-  * (not necessarily the path ending).
-  * Return true if the condition is verified.
-  *
-  * This is the third criteria to be fulfilled.
-  **/
-  bool VerifyCommonDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4);
-
-  /**
-   * Write the first parallel path.
-   * p1: First parallel path (line segment),
-   */
-  PathPointerType WriteParallelPath(PathPointerType p1);
-
-private:
-  ParallelLinePathListFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  RealType m_AngularThreshold;
-  RealType m_DistanceThreshold;
-  RealType m_CommonDistanceThreshold;
-
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbParallelLinePathListFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.hxx b/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.hxx
deleted file mode 100644
index 44eb3c082fa64a768954134cb6fa251f40f6e99f..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.hxx
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbParallelLinePathListFilter_hxx
-#define otbParallelLinePathListFilter_hxx
-
-#include "otbParallelLinePathListFilter.h"
-#include "otbMath.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TPath>
-ParallelLinePathListFilter<TPath>
-::ParallelLinePathListFilter()
-{
-  m_DistanceThreshold = 100.;
-  m_CommonDistanceThreshold = 10.;
-  m_AngularThreshold = 3.14;
-}
-
-template <class TPath>
-void
-ParallelLinePathListFilter<TPath>
-::GenerateData()
-{
-  // IO
-  const PathListType * inputPtr  = this->GetInput();
-  PathListType *       outputPtr = this->GetOutput();
-
-  // Input iterator
-  IteratorType inputIt = inputPtr->Begin();
-
-  std::vector<bool>         eraseFlagVector1;
-  std::vector<unsigned int> parallelLineIndex;
-
-  // First we copy all input path to output
-  while (inputIt != inputPtr->End())
-    {
-    // Write the next input path always to the
-    // last element of the list. This last element is
-    // newly created.
-    outputPtr->PushBack(inputIt.Get());
-
-    // If a new element is copied to the output vector,
-    // "false" is written to the corresponding index of
-    // the vector eraseFlagVector.
-    eraseFlagVector1.push_back(false);
-
-    ++inputIt;
-    }
-
-  unsigned int VectorSize = static_cast<unsigned int>(eraseFlagVector1.size());
-  //std::cout<<" Number of Lines: "<< VectorSize <<std::endl;
-
-  IteratorType outputIt1 = outputPtr->Begin();
-  unsigned int index1 = 0;
-  unsigned int firstLineCounter = 0, parallelLineCounter = 0;
-  unsigned int commonDistCounter = 0, maxDistCounter = 0;
-
-// Iterate through all lines of the pathlist
-  while (firstLineCounter < VectorSize)
-    {
-    if (!eraseFlagVector1[index1])
-      {
-      IteratorType outputIt2 = outputIt1;
-      ++outputIt2;
-      unsigned int index2 = index1 + 1;
-
-      // Check if any of the following lines are parallel
-      while (outputIt2 != outputPtr->End())
-        {
-
-        if (!eraseFlagVector1[index2])
-          { // Read the first and the last vertex of each line pair that is checked
-          VertexIteratorType vSourceIt = outputIt1.Get()->GetVertexList()->Begin();
-          VertexType         v1 = vSourceIt.Value();
-          vSourceIt = outputIt1.Get()->GetVertexList()->End();
-          --vSourceIt;
-          VertexType v2 = vSourceIt.Value();
-
-          VertexIteratorType vTargetIt = outputIt2.Get()->GetVertexList()->Begin();
-          VertexType         v3 = vTargetIt.Value();
-          vTargetIt = outputIt2.Get()->GetVertexList()->End();
-          --vTargetIt;
-          VertexType v4 = vTargetIt.Value();
-
-          // Check for parallel lines
-          if (VerifyAngularCondition(v1, v2, v3, v4))
-            {
-            ++parallelLineCounter;
-            if (VerifyMaxDistanceCondition(v1, v2, v3, v4))
-              {
-              ++maxDistCounter;
-              if (VerifyCommonDistanceCondition(v1, v2, v3, v4))
-                {
-                ++commonDistCounter;
-                // Write index of first parallel path
-                parallelLineIndex.push_back(index1);
-
-                // Write index of second parallel path
-                parallelLineIndex.push_back(index2);
-                }
-              }
-            }
-          }
-
-        ++index2;
-        ++outputIt2;
-        }
-      }
-
-    // mark the old path as erased
-    eraseFlagVector1[index1] = true;
-    ++firstLineCounter;
-    ++index1;
-    ++outputIt1;
-    } // end of for loop
-
-  otbMsgDevMacro( << "Number of line pairs that pass the angular condition:          " << parallelLineCounter );
-  otbMsgDevMacro( << "Number of line pairs that pass the maximum distance condition: " << maxDistCounter );
-  otbMsgDevMacro( << "Number of line pairs that pass the common distance condition:  " << commonDistCounter  );
-
-  // Write all parallel lines and set the non-erase flagg.
-  typename std::vector<unsigned int>::iterator lineIt1 = parallelLineIndex.begin();
-  unsigned int                                 sortLineIndex = 0;
-  while (lineIt1 != parallelLineIndex.end())
-    {
-    IteratorType outputIt3 = outputPtr->Begin() + parallelLineIndex[sortLineIndex];
-
-    PathPointerType newPath1 = this->WriteParallelPath(outputIt3.Get());
-    outputPtr->PushBack(newPath1);
-    // add a non-erase flag for the new path
-    eraseFlagVector1.push_back(false);
-    ++sortLineIndex;
-    otbMsgDevMacro( << "Number of lines written in the path list: " << sortLineIndex );
-    ++lineIt1;
-    }
-
-  // Search ended, now removing the erased path from the first line pointer
-  typename std::vector<bool>::reverse_iterator it1 = eraseFlagVector1.rbegin();
-  index1 = eraseFlagVector1.size() - 1;
-  while (it1 != eraseFlagVector1.rend())
-    {
-    if (eraseFlagVector1[index1])
-      {
-      outputPtr->Erase(index1);
-      }
-
-    --index1;
-    ++it1;
-    }
-
-}
-/**
- * Verify the angular condition to find parallel lines.
- * This function verifies if two lines are parallel by
- * computing the angle in relation to the y-axis.
- * First line segment: v1 is the first vertex, v2 the second one
- * (not necessarily the path ending).
- * Second line segment: v3 is the first vertex, v4 the second one
- * (not necessarily the path ending).
- * Return true if the condition is verified.
- *
- * This is the first criteria to be fulfilled.
- **/
-template <class TPath>
-bool
-ParallelLinePathListFilter<TPath>
-::VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4)
-{
-  double alpha1 = std::atan2((v2[1] - v1[1]), (v2[0] - v1[0]));
-  double alpha2 = std::atan2((v4[1] - v3[1]), (v4[0] - v3[0]));
-
-  alpha1 = (alpha1 >= 0) ? alpha1 : (alpha1 + CONST_PI);
-  alpha2 = (alpha2 >= 0) ? alpha2 : (alpha2 + CONST_PI);
-
-  // Return true if the angle between the two lines is smaller than
-  // the specified threshold.
-  bool angle = (std::abs(alpha1 - alpha2) < static_cast<double>(m_AngularThreshold));
-
-  return angle;
-}
-
-/**
- * Verify the maximum distance condition to find parallel lines.
- * The orthogonal distance between two parallel lines is calculated.
- * First line segment: v1 is the first vertex, v2 the second one
- * (not necessarily the path ending).
- * Second line segment: v3 is the first vertex, v4 the second one
- * (not necessarily the path ending).
- * Return true if the condition is verified.
- *
- * This is the second criteria to be fulfilled.
- **/
-template <class TPath>
-bool
-ParallelLinePathListFilter<TPath>
-::VerifyMaxDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType itkNotUsed(v4))
-{
-  // Compute the direction vector of the first line
-  VertexType vectorDir12;
-
-  vectorDir12[0] = v2[0] - v1[0];
-  vectorDir12[1] = v2[1] - v1[1];
-
-  // Compute the orthogonal distance between the two parallel lines
-  // with equation d = |(v3 - v1)X(v2 - v1)|/|v2 - v1|
-  double distance = 0., denominator = 0., nominator = 0.;
-  denominator = std::abs((v3[0] - v1[0]) * vectorDir12[1] - (v3[1] - v1[1]) * vectorDir12[0]);
-  nominator = sqrt(pow(vectorDir12[0], 2) + pow(vectorDir12[1], 2));
-  distance = denominator / nominator;
-  //std::cout<< "Distance between two parallel lines: " << distance <<std::endl;
-
-  // Check if the orthogonal distance between the lines
-  // is beneath the chosen threshold.
-  bool dist = (distance <= static_cast<double>(m_DistanceThreshold));
-
-  return dist;
-}
-
-/**
- * Verify the common distance condition to find parallel lines.
- * The overlapping part of the parallel lines is computed. In case
- * no overlapping part exists or the value is below the specified
- * threshold, false is returned.
- * First line segment: v1 is the first vertex, v2 the second one
- * (not necessarily the path ending).
- * Second line segment: v3 is the first vertex, v4 the second one
- * (not necessarily the path ending).
- * Return true if the condition is verified.
- *
- * This is the third criteria to be fulfilled.
- **/
-template <class TPath>
-bool
-ParallelLinePathListFilter<TPath>
-::VerifyCommonDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4)
-{
-// Compute the length of each line
-  double length12 = 0.;
-  // double length34 = 0.;
-  length12 = sqrt(pow((v2[0] - v1[0]), 2) + pow((v2[1] - v1[1]), 2));
-  //length34 = sqrt(pow((v4[0] - v3[0]), 2) + pow((v4[1] - v3[1]), 2));
-
-  // Set v1[0] to zero and align the y-axis of
-  // the new coordinate system with line one (v1 and v2).
-  // Compute the coordinates of the first and of the
-  // second line in the new coordinate system.
-  VertexType tempv1, tempv2, tempv3, tempv4;
-
-  //Initialization
-  tempv1.Fill(0.);
-  tempv2.Fill(0.);
-  tempv3.Fill(0.);
-  tempv4.Fill(0.);
-
-  if (v1[1] == v2[1])
-    {
-    if (v1[0] < v2[0])
-      {
-      tempv1[0] = 0., tempv1[1] = 0.;
-      tempv2[0] = 0., tempv2[1] = length12;
-      tempv3[0] = v3[0] - v1[0], tempv3[1] = v3[1] - v1[1];
-      tempv4[0] = v4[0] - v1[0], tempv4[1] = v4[1] - v1[1];
-      }
-    else
-      {
-      tempv2[0] = 0., tempv2[1] = 0.;
-      tempv1[0] = 0., tempv1[1] = length12;
-      tempv3[0] = v3[0] - v2[0], tempv3[1] = v3[1] - v2[1];
-      tempv4[0] = v4[0] - v2[0], tempv4[1] = v4[1] - v2[1];
-      }
-    }
-  // Check the direction of the line (vector).
-  // The origin of the new coordinate system is
-  // set to the smaller of the two vertices.
-  // Then, a rotation and translation of the vertices
-  // of the second line (v3 and v4) to the new coordinate
-  // system is performed.
-
-  VertexType temptransv3, temptransv4;
-
-  if (v1[1] < v2[1])
-    {
-    if (v1[0] == v2[0])
-      {
-      tempv1[0] = 0., tempv1[1] = 0.;
-      tempv2[0] = 0., tempv2[1] = length12;
-      tempv3[0] = v3[0] - v1[0], tempv3[1] = v3[1] - v1[1];
-      tempv4[0] = v4[0] - v1[0], tempv4[1] = v4[1] - v1[1];
-      }
-
-    else
-      {
-      // Coordinates of the first line in the new coordinate system
-      tempv1[0] = 0.;
-      tempv1[1] = 0.;
-      tempv2[0] = 0.;
-      tempv2[1] = length12;
-
-      // Rotate the system clockwise
-      double sinealpha;
-      if (v2[0] > v1[0])
-        {
-        sinealpha = (v2[0] - v1[0]) / length12;
-        }
-      else
-        {
-        sinealpha = (v1[0] - v2[0]) / length12;
-        }
-      double alpha1 = std::asin(sinealpha);
-
-      // Translation
-      temptransv3[0] = v3[0] - v1[0];
-      temptransv3[1] = v3[1] - v1[1];
-      temptransv4[0] = v4[0] - v1[0];
-      temptransv4[1] = v4[1] - v1[1];
-
-      // Rotation
-      tempv3[0] = temptransv3[0] * cos(alpha1) + temptransv3[1] * sin(alpha1);
-      tempv3[1] = temptransv3[1] * cos(alpha1) - temptransv3[0] * sin(alpha1);
-      tempv4[0] = temptransv4[0] * cos(alpha1) + temptransv4[1] * sin(alpha1);
-      tempv4[1] = temptransv4[1] * cos(alpha1) - temptransv4[0] * sin(alpha1);
-
-      otbMsgDevMacro(<< "tempv1[0], tempv1[1], tempv2[0], tempv2[1]: " );
-      otbMsgDevMacro(<< tempv1[0] << ", " << tempv1[1] << ", " << tempv2[0] << ", " << tempv2[1] );
-      otbMsgDevMacro(<< "Alpha: " << alpha1 );
-      otbMsgDevMacro(<< "tempv3[0], tempv3[1], tempv4[0], tempv4[1]: "
-                       << tempv3[0] << ", " << tempv3[1] << ", "
-                       << tempv4[0] << ", " << tempv4[1] );
-      otbMsgDevMacro(<< "Calculated length of the second line: "
-                        << sqrt(pow((tempv4[0] - tempv3[0]), 2) + pow((tempv4[1] - tempv3[1]), 2)) );
-      otbMsgDevMacro(<< "Original length of line 1:       " << length12 );
-      }
-    }
-
-  if (v2[1] < v1[1])
-    {
-
-    if (v1[0] == v2[0])
-      {
-      tempv2[0] = 0., tempv2[1] = 0.;
-      tempv1[0] = 0., tempv1[1] = length12;
-      tempv3[0] = v3[0] - v2[0], tempv3[1] = v3[1] - v2[1];
-      tempv4[0] = v4[0] - v2[0], tempv4[1] = v4[1] - v2[1];
-      }
-    else
-      {
-      tempv1[0] = 0.;
-      tempv1[1] = 0.;
-      tempv2[0] = 0.;
-      tempv2[1] = length12;
-
-      // Rotate the system clockwise
-      double sinealpha;
-      if (v2[0] > v1[0])
-        {
-        sinealpha = (v2[0] - v1[0]) / length12;
-        }
-      else
-        {
-        sinealpha = (v1[0] - v2[0]) / length12;
-        }
-
-      double alpha1 = std::asin(sinealpha);
-
-      // Translation
-      temptransv3[0] = v3[0] - v2[0];
-      temptransv3[1] = v3[1] - v2[1];
-      temptransv4[0] = v4[0] - v2[0];
-      temptransv4[1] = v4[1] - v2[1];
-
-      // Rotation
-      tempv3[0] = temptransv3[0] * cos(alpha1) + temptransv3[1] * sin(alpha1);
-      tempv3[1] = temptransv3[1] * cos(alpha1) - temptransv3[0] * sin(alpha1);
-      tempv4[0] = temptransv4[0] * cos(alpha1) + temptransv4[1] * sin(alpha1);
-      tempv4[1] = temptransv4[1] * cos(alpha1) - temptransv4[0] * sin(alpha1);
-
-      otbMsgDevMacro( << "tempv1[0], tempv1[1], tempv2[0], tempv2[1]: " );
-      otbMsgDevMacro( << tempv1[0] << ", " << tempv1[1] << ", " << tempv2[0] << ", " << tempv2[1] );
-      otbMsgDevMacro( << "Alpha: " << alpha1 );
-      otbMsgDevMacro( << "tempv3[0], tempv3[1], tempv4[0], tempv4[1]: "
-                       << tempv3[0] << ", " << tempv3[1] << ", " << tempv4[0] << ", " << tempv4[1] );
-      otbMsgDevMacro( << "Calculated length of the second line: "
-                       << sqrt(pow((tempv4[0] - tempv3[0]), 2) + pow((tempv4[1] - tempv3[1]), 2)) );
-      otbMsgDevMacro( << "Original length of line 1:       " << length12 );
-      }
-    }
-
-  // Compute the length of the overlapping part
-  // of the two lines. This is done by simply
-  // comparing the y-values of the lines (remember
-  // that both lines are parallel and also parallel
-  // to the new y-axis).
-  double commonDist = 0.;
-
-  if (tempv3[1] >= tempv4[1])
-    {
-    if (tempv3[1] >= 0 && tempv3[1] <= tempv2[1])
-      {
-      if (tempv4[1] >= 0)
-        {
-        commonDist = std::abs(tempv4[1] - tempv3[1]);
-        }
-
-      else if (tempv4[1] < 0)
-        {
-        commonDist = tempv3[1];
-        }
-      }
-    else if (tempv3[1] >= 0 && tempv3[1] >= tempv2[1])
-      {
-      if (tempv4[1] >= 0)
-        {
-        commonDist = tempv2[1] - tempv4[1];
-        }
-
-      else if (tempv4[1] < 0)
-        {
-        commonDist = tempv2[1];
-        }
-
-      }
-    else if (tempv4[1] >= tempv2[1])
-      { // No overlapping parts exist. The (negative) distance
-        // between the two closest endpoints is calculated.
-      commonDist = -std::abs(tempv4[1] - tempv2[1]);
-      }
-    else if (tempv3[1] < 0)
-      { // No overlapping parts exist. The (negative) distance
-        // between the two closest endpoints is calculated.
-      commonDist = tempv3[1];
-      }
-    }
-
-  else
-    {
-    if (tempv4[1] >= 0 && tempv4[1] <= tempv2[1])
-      {
-      if (tempv3[1] >= 0)
-        {
-        commonDist = std::abs(tempv3[1] - tempv4[1]);
-        }
-
-      else if (tempv3[1] < 0)
-        {
-        commonDist = tempv4[1];
-        }
-      }
-    else if (tempv4[1] >= 0 && tempv4[1] >= tempv2[1])
-      {
-      if (tempv3[1] >= 0)
-        {
-        commonDist = tempv2[1] - tempv3[1];
-        }
-
-      else if (tempv3[1] < 0)
-        {
-        commonDist = tempv2[1];
-        }
-
-      }
-    else if (tempv3[1] >= tempv2[1])
-      { // No overlapping parts exist. The (negative) distance
-        // between the two closest endpoints is calculated.
-      commonDist = -std::abs(tempv3[1] - tempv2[1]);
-      }
-    else if (tempv4[1] < 0)
-      { // No overlapping parts exist. The (negative) distance
-        // between the two closest endpoints is calculated.
-      commonDist = tempv4[1];
-      }
-    }
-  // The common parallel parts of the two lines have to be greater than
-  // the provided threshold.
-  otbMsgDevMacro( << "Calculated common distance of the parallel lines: " << commonDist );
-  bool common = (commonDist >= static_cast<double>(m_CommonDistanceThreshold));
-
-  return common;
-}
-
-/**
- * Write parallel line in a new path list.
- * p1: First parallel path (line segment)
- */
-template <class TPath>
-typename ParallelLinePathListFilter<TPath>
-::PathPointerType
-ParallelLinePathListFilter<TPath>
-::WriteParallelPath(PathPointerType p1)
-{
-  PathPointerType resp = PathType::New();
-
-  VertexIteratorType it;
-
-  for (it = p1->GetVertexList()->Begin(); it != p1->GetVertexList()->End(); ++it)
-    {
-    resp->AddVertex((it).Value());
-    }
-
-  return resp;
-}
-
-/**
- * PrintSelf Method
- */
-template <class TPath>
-void
-ParallelLinePathListFilter<TPath>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbRemoveIsolatedByDirectionFilter.h b/Modules/Detection/RoadExtraction/include/otbRemoveIsolatedByDirectionFilter.h
deleted file mode 100644
index cc60ea4b97a1a93fbf256effb390d614bb4e7a82..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbRemoveIsolatedByDirectionFilter.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRemoveIsolatedByDirectionFilter_h
-#define otbRemoveIsolatedByDirectionFilter_h
-
-#include "otbModulusAndDirectionImageToImageFilter.h"
-#include "otbBinaryFunctorNeighborhoodImageFilter.h"
-
-namespace otb
-{
-namespace Functor
-{
-/** \class RemoveIsolatedByDirectionFunctor
- *  \brief Binary neighborhood functor to remove isolated pixels by direction.
- *  Used by the RemoveIsolatedByDirectionFilter.
- *  \sa RemoveIsolatedByDirectionFilter
- *  \ingroup Functor
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInput1, class TInput2, class TOutput>
-class RemoveIsolatedByDirectionFunctor
-{
-public:
-  RemoveIsolatedByDirectionFunctor() {}
-  virtual ~RemoveIsolatedByDirectionFunctor() {}
-  inline TOutput operator ()(const TInput1& itA, const TInput2& itB)
-  {
-    double currentDirection = itB.GetCenterPixel();
-    int    nEqualNeighbors = 0;
-    for (int neighborhoodIndex = 0; neighborhoodIndex < 9; ++neighborhoodIndex)
-      {
-      if (itB.GetPixel(neighborhoodIndex) == currentDirection)
-        {
-        ++nEqualNeighbors;
-        }
-      }
-    if (nEqualNeighbors <= 1)
-      {
-      //should never be 0 as it is at least equal to itself
-      return 0;
-      }
-    else
-      {
-      return static_cast<TOutput>(itA.GetCenterPixel());
-      }
-  }
-};
-}
-/** \class RemoveIsolatedByDirectionFilter
- *  \brief This filter removes (sets to null intensity) pixels isolated by direction.
- *
- *  For a given pixel, the filter walk through its neighborhood in direction image, counting pixels having
- *  the same direction as the center pixel. If there is no such a pixel, the center pixel is considered to be
- *  isolated in direction, and thus will be removed (set to 0). If the pixel is not isolated in direction, the output
- *  value is the value of the pixel in the modulus image.
- *  Of course this filter requires the direction to be discrete, in order to be able to count the directions.
- *
- * \ingroup Streamed
- * \ingroup Threaded
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInputModulus, class TInputDirection, class TOutputImage>
-class ITK_EXPORT RemoveIsolatedByDirectionFilter
-  : public ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef RemoveIsolatedByDirectionFilter                                                     Self;
-  typedef ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                                                             Pointer;
-  typedef itk::SmartPointer<const Self>                                                       ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(RemoveIsolatedByDirectionFilter, ModulusAndDirectionImageToImageFilter);
-
-  /** typedef of the computing filter (this allows us to derive from ModulusAndDirectionToImageFilter as well as
-      using the BinaryFunctorNeighBorhoodImageFilter, which is appropriate here */
-  typedef Functor::RemoveIsolatedByDirectionFunctor<
-      typename itk::ConstNeighborhoodIterator<TInputModulus>,
-      typename itk::ConstNeighborhoodIterator<TInputDirection>,
-      typename TOutputImage::PixelType>  FunctorType;
-  typedef otb::BinaryFunctorNeighborhoodImageFilter<TInputModulus, TInputDirection, TOutputImage,
-      FunctorType> ComputingFilterType;
-
-protected:
-  /** Constructor */
-  RemoveIsolatedByDirectionFilter() {};
-  /** Destructor */
-  ~RemoveIsolatedByDirectionFilter() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override
-  {
-    Superclass::PrintSelf(os, indent);
-  }
-  /** Main computation method */
-  void GenerateData(void) override
-  {
-    typename ComputingFilterType::Pointer filter = ComputingFilterType::New();
-    filter->SetInput1(this->GetInput());
-    filter->SetInput2(this->GetInputDirection());
-    filter->GraftOutput(this->GetOutput());
-    filter->Update();
-    this->GraftOutput(filter->GetOutput());
-  }
-
-private:
-  RemoveIsolatedByDirectionFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h
deleted file mode 100644
index abe69a7b58a8664696e69c5832a6e05102085dea..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRemoveTortuousPathListFilter_h
-#define otbRemoveTortuousPathListFilter_h
-
-#include "otbUnaryFunctorObjectListBooleanFilter.h"
-#include "otbPathMeanDistanceFunctor.h"
-#include "otbObjectList.h"
-
-namespace otb
-{
-/** \class RemoveTortuousPathListFilter
-   *  \brief This filter remove path considered as tortuous.
-   *
-   *  A path is considered to be tortuous if the mean distance between each consecutive vertices
-   *  is strictly lower than the user provided threshold.
-   *
-   * This class is just a shortcut to the UnaryFunctorObjectListBooleanFilter with
-   * the PathMeanDistanceFunctor.
-   *
-   *<b>Recent API changes:</b>
-   * Now part of the UnaryFunctorObjectListBooleanFilter hierarchy, replace call to SetMeanDistanceThreshold()
-   * by GetFunctor().SetThreshold().
-   *
-   * The inequality is now a strict one.
-   *
-   * \sa BreakAngularPathListFilter
-   * \sa SimplifyPathFilter
-   * \sa UnaryFunctorObjectListBooleanFilter
-   * \sa PathMeanDistanceFunctor
-   *
-   * \example FeatureExtraction/ExtractRoadByStepsExample.cxx
-   *
- *
- * \ingroup OTBRoadExtraction
- */
-
-//   template <class TPath>
-template <class TPath>
-class ITK_EXPORT RemoveTortuousPathListFilter :
-  public UnaryFunctorObjectListBooleanFilter<
-      ObjectList<TPath>,
-      ObjectList<TPath>,
-      PathMeanDistanceFunctor<typename TPath::Pointer> >
-{};
-
-} // End namespace otb
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbRemoveWrongDirectionFilter.h b/Modules/Detection/RoadExtraction/include/otbRemoveWrongDirectionFilter.h
deleted file mode 100644
index b0d4fffb991f383be9bbec4f9a51c187e16ab0c6..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbRemoveWrongDirectionFilter.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRemoveWrongDirectionFilter_h
-#define otbRemoveWrongDirectionFilter_h
-
-#include "otbModulusAndDirectionImageToImageFilter.h"
-#include "itkBinaryFunctorImageFilter.h"
-#include "otbMath.h"
-
-namespace otb
-{
-namespace Functor
-{
-/** \class RemoveWrongDirectionFunctor
- *  \brief This functor is used by the RemoveWrongDirectionFilter
- *
- *  \sa RemoveWrongDirectionFilter
- *  \ingroup Functor
- *
- * \example FeatureExtraction/ExtractRoadByStepsExample.cxx
- *
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInput1, class TInput2, class TOutput>
-class RemoveWrongDirectionFunctor
-{
-public:
-  RemoveWrongDirectionFunctor() {}
-  virtual ~RemoveWrongDirectionFunctor() {}
-  inline TOutput operator ()(const TInput1& A, const TInput2& B)
-  {
-    if (B < CONST_PI_8)
-      {
-      return 0;
-      }
-    else
-      {
-      return A;
-      }
-  }
-};
-}
-/** \class RemoveWrongDirectionFilter
- *  \brief This filter removes (sets to null intensity) pixels with wrong direction.
- *
- *  This filter is part of the road extraction framework. By using the Spectral Angle filter,
- *  we can assume that the direction of a road on our scalar product image is positive (greater
- *  than \f$ \pi/8 \f$).
- *  Therefore in the input modulus and direction images, pixels whose direction is lower than
- *  this threshold are suppressed
- *  (in fact, their intensity is set to 0).
- *
- * \sa NeighborhoodScalarProductFilter
- * \ingroup Streamed
- * \ingroup Threaded
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInputModulus, class TInputDirection, class TOutputImage>
-class ITK_EXPORT RemoveWrongDirectionFilter
-  : public ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef RemoveWrongDirectionFilter                                                          Self;
-  typedef ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                                                             Pointer;
-  typedef itk::SmartPointer<const Self>                                                       ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(RemoveWrongDirectionFilter, ModulusAndDirectionImageToImageFilter);
-
-  /** typedef of the computing filter (this allows us to derive from ModulusAndDirectionToImageFilter as well as
-      using the BinaryFunctorImageFilter, which is appropriate here */
-  typedef Functor::RemoveWrongDirectionFunctor<
-      typename TInputModulus::PixelType,
-      typename TInputDirection::PixelType,
-      typename TOutputImage::PixelType>  FunctorType;
-  typedef itk::BinaryFunctorImageFilter<TInputModulus, TInputDirection, TOutputImage, FunctorType> ComputingFilterType;
-
-protected:
-  /** Constructor */
-  RemoveWrongDirectionFilter() {};
-  /** Destructor */
-  ~RemoveWrongDirectionFilter() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override
-  {
-    Superclass::PrintSelf(os, indent);
-  }
-  /** Main computation method */
-  void GenerateData(void) override
-  {
-    typename ComputingFilterType::Pointer filter = ComputingFilterType::New();
-    filter->SetInput1(this->GetInput());
-    filter->SetInput2(this->GetInputDirection());
-    filter->GraftOutput(this->GetOutput());
-    filter->Update();
-    this->GraftOutput(filter->GetOutput());
-  }
-
-private:
-  RemoveWrongDirectionFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.h b/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.h
deleted file mode 100644
index 77c19f0ca336f0300b9d1349bed6951d2608467a..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRoadExtractionFilter_h
-#define otbRoadExtractionFilter_h
-
-
-#include "otbSpectralAngleDistanceImageFilter.h"
-#include "otbGenericRoadExtractionFilter.h"
-
-namespace otb
-{
-/**
- * \class RoadExtractionFilter
- * \brief This class performs the extraction of roads from an image.
- *
- * This composite filter implements a fast and robust road extraction
- * for high resolution satellite images. This is a composite filter using the
- * SpectralAngleDistanceImageFilter and the GenericRoadExtractionFilter and is
- * intended to be used with optical high resolution data. The full method is
- * described in E. Christophe and J. Inglada, "Robust Road Extraction for High
- * Resolution Satellite Images," in IEEE International Conference on
- * Image Processing, ICIP 2007.
- *
- * The algorithm uses all spectral
- * bands based on the spectral angle with a reference pixel. Then, the line
- * detection is done using a Gaussian gradient with a scalar product to find
- * the road directions. Finally, extracted roads are vectorized and
- * processed to improve the results removing some occultations and false
- * detections.
- *
- * This filter is fast, as the detection typically takes 3 seconds for a
- * 1000 \f$ \times \f$ 1000 images with four spectral bands. Results can be
- * used as an initialization for more complex algorithms.
- *
- * \sa SpectralAngleDistanceImageFilter
- * \sa GenericRoadExtractionFilter
- *
- * \example FeatureExtraction/ExtractRoadExample.cxx
- *
- *
- * \ingroup OTBRoadExtraction
- */
-template <class TInputImage, class TOutputPath>
-class ITK_EXPORT RoadExtractionFilter
-  : public ImageToPathListFilter<TInputImage, TOutputPath>
-{
-public:
-  /** Standard typedefs */
-  typedef RoadExtractionFilter                            Self;
-  typedef ImageToPathListFilter<TInputImage, TOutputPath> Superclass;
-  typedef itk::SmartPointer<Self>                         Pointer;
-  typedef itk::SmartPointer<const Self>                   ConstPointer;
-  /** Creation through object factory macro */
-  itkNewMacro(Self);
-  /** Type macro */
-  itkTypeMacro(RoadExtractionFilter, ImageToPathListFilter);
-  /** Template parameters typedefs */
-  typedef typename Superclass::InputImageType     InputImageType;
-  typedef typename Superclass::OutputPathType     OutputPathType;
-  typedef typename Superclass::OutputPathListType OutputPathListType;
-  typedef typename InputImageType::PixelType      InputPixelType;
-  typedef double                                  InternalPixelType;
-
-  typedef otb::VectorImage<InternalPixelType, InputImageType::ImageDimension> VectorImageType;
-  typedef otb::Image<InternalPixelType, InputImageType::ImageDimension>       SpectralAngleType;
-  typedef otb::Image<InternalPixelType, InputImageType::ImageDimension>       ModulusType;
-  typedef otb::Image<InternalPixelType, InputImageType::ImageDimension>       DirectionType;
-
-  typedef itk::CovariantVector<InternalPixelType, InputImageType::ImageDimension>
-  VectorPixelType;
-  typedef otb::Image<VectorPixelType, InputImageType::ImageDimension> CovariantVectorImageType;
-
-  /* Template parameters typedefs for composites filters */
-  typedef SpectralAngleDistanceImageFilter<
-      InputImageType,
-      SpectralAngleType>                      SpectralAngleDistanceImageFilterType;
-
-  typedef GenericRoadExtractionFilter<SpectralAngleType, OutputPathType>
-  GenericRoadExtractionFilterType;
-
-  /** Template parameters typedefs for internals filters */
-  typedef typename GenericRoadExtractionFilterType::SigmaType                 SigmaType;
-  typedef typename GenericRoadExtractionFilterType::AmplitudeThresholdType    AmplitudeThresholdType;
-  typedef typename GenericRoadExtractionFilterType::ToleranceType             ToleranceType;
-  typedef typename GenericRoadExtractionFilterType::MaxAngleType              MaxAngleType;
-  typedef typename GenericRoadExtractionFilterType::MeanDistanceThresholdType MeanDistanceThresholdType;
-  typedef typename GenericRoadExtractionFilterType::LinkRealType              LinkRealType;
-
-  /** Get/Set the reference pixel (use by the SpectralAngleDistanceImageFilter)*/
-  otbGetObjectMemberConstReferenceMacro(SpectralAngleDistanceImageFilter, ReferencePixel, InputPixelType);
-  otbSetObjectMemberMacro(SpectralAngleDistanceImageFilter, ReferencePixel, InputPixelType);
-
-  /** Get/Set the alpha value */
-  otbGetObjectMemberConstReferenceMacro(GenericRoadExtractionFilter, Alpha, double);
-  otbSetObjectMemberMacro(GenericRoadExtractionFilter, Alpha, double);
-
-  /** Get/Set the amplitude threshold to start following a path (use by the VectorizationPathListFilter)*/
-  otbSetObjectMemberMacro(GenericRoadExtractionFilter, AmplitudeThreshold, AmplitudeThresholdType);
-  otbGetObjectMemberMacro(GenericRoadExtractionFilter, AmplitudeThreshold, AmplitudeThresholdType);
-
-  /** Get/Set  the tolerance for segment consistency (tolerance in terms of distance) (use by the SimplifyPathListFilter)*/
-  otbGetObjectMemberMacro(GenericRoadExtractionFilter, Tolerance, ToleranceType);
-  otbSetObjectMemberMacro(GenericRoadExtractionFilter, Tolerance, ToleranceType);
-
-  /** Set/Get the max angle (use bye the BreakAngularPathListFilter)*/
-  otbSetObjectMemberMacro(GenericRoadExtractionFilter, MaxAngle, MaxAngleType);
-  otbGetObjectMemberConstMacro(GenericRoadExtractionFilter, MaxAngle, MaxAngleType);
-
-  /** Get/Set the tolerance for segment consistency (tolerance in terms of distance) (use by RemoveTortuousPathListFilter)*/
-  otbGetObjectMemberMacro(GenericRoadExtractionFilter, FirstMeanDistanceThreshold, MeanDistanceThresholdType);
-  otbSetObjectMemberMacro(GenericRoadExtractionFilter, FirstMeanDistanceThreshold, MeanDistanceThresholdType);
-  otbGetObjectMemberMacro(GenericRoadExtractionFilter, SecondMeanDistanceThreshold, MeanDistanceThresholdType);
-  otbSetObjectMemberMacro(GenericRoadExtractionFilter, SecondMeanDistanceThreshold, MeanDistanceThresholdType);
-
-  /** Get/Set the angular threshold (use by LinkPathFilter)*/
-  otbSetObjectMemberMacro(GenericRoadExtractionFilter, AngularThreshold, LinkRealType);
-  otbGetObjectMemberMacro(GenericRoadExtractionFilter, AngularThreshold, LinkRealType);
-  /** Get/Set the distance threshold (use by LinkPathFilter)*/
-  otbSetObjectMemberMacro(GenericRoadExtractionFilter, DistanceThreshold, LinkRealType);
-  otbGetObjectMemberMacro(GenericRoadExtractionFilter, DistanceThreshold, LinkRealType);
-
-protected:
-  /** Constructor */
-  RoadExtractionFilter();
-  /** Destructor */
-  ~RoadExtractionFilter() override {}
-
-  /** Prepare main computation method */
-  void BeforeGenerateData(void);
-
-  /** Main computation method */
-  void GenerateData(void) override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-
-  RoadExtractionFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  /** SpectralAngleDistanceImageFilter use by the composite filter */
-  typename SpectralAngleDistanceImageFilterType::Pointer m_SpectralAngleDistanceImageFilter;
-  typename GenericRoadExtractionFilterType::Pointer m_GenericRoadExtractionFilter;
-
-};
-
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRoadExtractionFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.hxx b/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.hxx
deleted file mode 100644
index 67ee3a9fbbc7bce8f6aa09f2a87f88995a9e1613..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.hxx
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRoadExtractionFilter_hxx
-#define otbRoadExtractionFilter_hxx
-
-#include "otbRoadExtractionFilter.h"
-#include "otbMath.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputPath>
-RoadExtractionFilter<TInputImage, TOutputPath>
-::RoadExtractionFilter()
-{
-  this->SetNumberOfRequiredInputs(1);
-  this->SetNumberOfRequiredOutputs(1);
-
-  m_SpectralAngleDistanceImageFilter = SpectralAngleDistanceImageFilterType::New();
-  m_GenericRoadExtractionFilter = GenericRoadExtractionFilterType::New();
-
-}
-
-/**
- * Main computation method
- */
-template <class TInputImage, class TOutputPath>
-void
-RoadExtractionFilter<TInputImage, TOutputPath>
-::GenerateData()
-{
-  // Input images pointers
-  typename InputImageType::ConstPointer inputImage     = this->GetInput();
-  typename OutputPathListType::Pointer  outputPathList  = this->GetOutput();
-
-  m_SpectralAngleDistanceImageFilter->SetInput(inputImage);
-
-  m_GenericRoadExtractionFilter->SetInput(m_SpectralAngleDistanceImageFilter->GetOutput());
-
-  m_GenericRoadExtractionFilter->Update();
-  for (typename GenericRoadExtractionFilterType::OutputPathListType::ConstIterator it
-         = m_GenericRoadExtractionFilter->GetOutput()->Begin();
-       it != m_GenericRoadExtractionFilter->GetOutput()->End();
-       ++it)
-    {
-    outputPathList->PushBack(it.Get());
-    }
-}
-/**
- * PrintSelf method
- */
-template <class TInputImage, class TOutputPath>
-void
-RoadExtractionFilter<TInputImage, TOutputPath>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "m_ReferencePixel: " << m_SpectralAngleDistanceImageFilter->GetReferencePixel() << std::endl;
-}
-
-} // End namespace otb
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h
deleted file mode 100644
index 2c0f99fad114390d0c5517ddad580fc5da6f43b0..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbSimplifyPathListFilter_h
-#define otbSimplifyPathListFilter_h
-
-#include "otbUnaryFunctorObjectListFilter.h"
-#include "otbSimplifyPathFunctor.h"
-#include "otbObjectList.h"
-
-namespace otb
-{
-/** \class SimplifyPathListFilter
-   *  \brief This filter performs a simplification of the path in the input list.
-   *
-   *  It reduces the number of vertices in each path, according to a tolerance criterion. It aims at
-   *  removing aligned vertices while keeping sharp angular points.
-   *
-   *  In order to ensure the unicity of its output, each path is considered first from begin to end, then
-   *  from begin to the first vertex before the end. At each step, the consistency of the path is checked :
-   *  the equation of the line passing by the first and last vertices is computed. Then, for each
-   *  vertices between them, the euclidean distance to this line is computed. If for one vertex, this distance
-   *  is upper than the tolerance threshold, the path is considered to be inconsistent and no vertices can be removed.
-   *
-   *  If the path is considered consistent (which will occur at least with a 2 vertices path),
-   * only the beginning and ending
-   *  vertices are kept and a new search iteration begin at its end.
-   *
-   *  This filter is part of the road extraction framework.
-   *
-   * This class is just a shortcut to the UnaryFunctorObjectListFilter with
-   * the SimplifyPathFunctor.
-   *
-   *   <b>Recent API changes:</b>
-   * Now part of the UnaryFunctorObjectListFilter hierarchy, replace call to SetTolerance()
-   * by GetFunctor().SetTolerance().
-   *
-   *
-   * \sa BreakAngularPathListFilter
-   * \sa RemoveTortuousPathFilter.
-   * \sa UnaryFunctorObjectListFilter
-   * \sa SimplifyPathFunctor
-   *
-   * \example FeatureExtraction/ExtractRoadByStepsExample.cxx
-   *
- *
- * \ingroup OTBRoadExtraction
- */
-
-template <class TPath>
-class ITK_EXPORT SimplifyPathListFilter :
-  public UnaryFunctorObjectListFilter<
-      ObjectList<TPath>,
-      ObjectList<TPath>,
-      SimplifyPathFunctor<TPath, TPath> >
-{};
-
-} // End namespace otb
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.h b/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.h
deleted file mode 100644
index 476725d3af8d4261353de5e8a2b61165305d9873..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbVectorDataToRoadDescriptionFilter_h
-#define otbVectorDataToRoadDescriptionFilter_h
-
-#include "otbVectorDataToSpecificDescriptionFilterBase.h"
-#include "otbVectorData.h"
-
-//#include "otbNDVIDataNodeFeatureFunction.h"
-//#include "otbSpectralAngleDataNodeFeatureFunction.h"
-#include "otbParserConditionDataNodeFeatureFunction.h"
-#include "otbDBOverlapDataNodeFeatureFunction.h"
-
-namespace otb
-{
-/** \class VectorDataToRoadDescriptionFilter
-  * \brief VectorDataToRoadDescriptionFilter associates a score to each
-  * adapted input VectorData DataNode.
-  *
-  * VectorDataToRoadDescriptionFilter is dedicated to road description.
-  * Input and output are both VectorDatas in index coordinate.
-  * Each DataNode of the output VectorData contains its scores
-  * regarding to the associated descriptors.
-  * The support is an Optical Image and the descriptor are:
-  * - (NDVI >= threshold) per cent along the tested lines
-  * - mean Spectral Angle regarding a reference pixel along the tested lines
-  * - DB Overlap compute the number of building crossed by the data node in percent
-  *   regarding all the buildings within a data node neighborhood
-  *
-  * \ingroup VectorDataFilter
-  * \sa VectorDataToSpecificDescriptionFilterBase
-  * \sa VectorDataToBuildingDescriptionFilter
- *
- * \ingroup OTBRoadExtraction
- */
-
-template <class TVectorData, class TOpticalImage>
-class ITK_EXPORT VectorDataToRoadDescriptionFilter :
-public otb::VectorDataToSpecificDescriptionFilterBase<TVectorData>
-{
-public:
-  /** Standard class typedefs. */
-  typedef VectorDataToRoadDescriptionFilter            Self;
-  typedef otb::VectorDataToSpecificDescriptionFilterBase<TVectorData>
-                                                       Superclass;
-  typedef itk::SmartPointer<Self>                      Pointer;
-  typedef itk::SmartPointer<const Self>                ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(VectorDataToRoadDescriptionFilter, VectorDataToSpecificDescriptionFilterBase);
-
-  /** Some typedefs. */
-  typedef TVectorData                             VectorDataType;
-  typedef typename TVectorData::Pointer           VectorDataPointer;
-  typedef typename VectorDataType::DataNodeType   DataNodeType;
-  typedef itk::PreOrderTreeIterator<typename VectorDataType::DataTreeType>
-                                                  TreeIteratorType;
-  typedef typename DataNodeType::ValuePrecisionType
-                                                  PrecisionType;
-  typedef typename DataNodeType::PrecisionType
-                                                  CoordRepType;
-
-  typedef TOpticalImage                           OpticalImageType;
-  typedef typename TOpticalImage::Pointer         OpticalImageTypePointer;
-
-  typedef std::vector<std::string>                DescriptorsListType;
-
-  /*
-  typedef otb::NDVIDataNodeFeatureFunction<OpticalImageType, CoordRepType, PrecisionType>
-                                                  NDVIFeatureFunctionType;
-  typedef otb::SpectralAngleDataNodeFeatureFunction<OpticalImageType, CoordRepType, PrecisionType>
-                                                  SpectralAngleFeatureFunctionType;
-  */
-  typedef otb::ParserConditionDataNodeFeatureFunction<OpticalImageType, CoordRepType, PrecisionType>
-                                                  ParserConditionFeatureFunctionType;
-
-  typedef otb::DBOverlapDataNodeFeatureFunction<CoordRepType, PrecisionType>
-                                                  DBOverlapFeatureFunctionType;
-
-  typedef itk::DataObject::Pointer DataObjectPointer;
-  typedef itk::DataObject          DataObject;
-
-  virtual void AddOpticalImage(const OpticalImageType * support);
-  const OpticalImageType * GetOpticalImage();
-
-  virtual void AddBuildingsDB(const VectorDataType * support);
-  const VectorDataType * GetBuildingsDB();
-
-  const DescriptorsListType& GetDescriptorsList() const
-  {
-    return m_DescriptorsList;
-  }
-
-protected:
-  /** Constructor */
-  VectorDataToRoadDescriptionFilter();
-  /** Destructor */
-  ~VectorDataToRoadDescriptionFilter() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** Triggers the Computation of the Descriptors */
-  void GenerateData(void) override;
-
-private:
-  VectorDataToRoadDescriptionFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  typename ParserConditionFeatureFunctionType::Pointer  m_NDVIFeatureFunction;
-  typename ParserConditionFeatureFunctionType::Pointer  m_SpectralAngleFeatureFunction;
-  typename DBOverlapFeatureFunctionType::Pointer        m_DBOverlapFeatureFunction;
-  DescriptorsListType m_DescriptorsList;
-
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbVectorDataToRoadDescriptionFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.hxx b/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.hxx
deleted file mode 100644
index e58488f53621c3e3423510e7b750bd7c4cee54ca..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.hxx
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbVectorDataToRoadDescriptionFilter_hxx
-#define otbVectorDataToRoadDescriptionFilter_hxx
-
-#include "otbVectorDataToRoadDescriptionFilter.h"
-
-namespace otb
-{
-
-// Constructor
-template <class TVectorData, class TOpticalImage>
-VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage>
-::VectorDataToRoadDescriptionFilter()
-{
-  this->SetNumberOfRequiredInputs(3);
-
-  m_NDVIFeatureFunction = ParserConditionFeatureFunctionType::New();
-  m_NDVIFeatureFunction->SetExpression("ndvi(b3, b4) > 0.4");
-
-  m_SpectralAngleFeatureFunction = ParserConditionFeatureFunctionType::New();
-  m_SpectralAngleFeatureFunction->SetExpression("spectralAngle > 0.25");
-
-  //Example for QuickBird images (on a specific image)
-  typename ParserConditionFeatureFunctionType::PixelType refPixel;
-  refPixel.SetSize(4);
-  refPixel[0] = 252;
-  refPixel[1] = 357;
-  refPixel[2] = 232;
-  refPixel[3] = 261;
-  m_SpectralAngleFeatureFunction->SetSpectralAngleReferencePixel(refPixel);
-
-  m_DBOverlapFeatureFunction = DBOverlapFeatureFunctionType::New();
-
-  m_DescriptorsList.push_back("NONDVI");
-  m_DescriptorsList.push_back("ROADSA");
-  m_DescriptorsList.push_back("NOBUIL");
-}
-
-template <class TVectorData, class TOpticalImage>
-void
-VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage>
-::AddOpticalImage(const OpticalImageType * support)
-{
-  this->AddSupport(const_cast<OpticalImageType *>(support), 0);
-}
-
-template <class TVectorData, class TOpticalImage>
-const typename VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage>
-::OpticalImageType *
-VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage>
-::GetOpticalImage()
-{
-  return static_cast<const OpticalImageType *>
-    (this->GetSupport(0));
-}
-
-
-template <class TVectorData, class TOpticalImage>
-void
-VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage>
-::AddBuildingsDB(const VectorDataType * support)
-{
-  this->AddSupport(const_cast<VectorDataType *>(support), 1);
-}
-
-template <class TVectorData, class TOpticalImage>
-const typename VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage>
-::VectorDataType *
-VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage>
-::GetBuildingsDB()
-{
-  return static_cast<const VectorDataType *>
-    (this->GetSupport(1));
-}
-
-template <class TVectorData, class TOpticalImage>
-void
-VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage>
-::GenerateData()
-{
-  m_NDVIFeatureFunction->SetInputImage(const_cast<OpticalImageType *>(this->GetOpticalImage()));
-  m_SpectralAngleFeatureFunction->SetInputImage(const_cast<OpticalImageType *>(this->GetOpticalImage()));
-  m_DBOverlapFeatureFunction->SetInputVectorData(const_cast<VectorDataType *>(this->GetBuildingsDB()));
-
-  // Retrieving root node
-  typename DataNodeType::Pointer root = this->GetOutput(0)->GetDataTree()->GetRoot()->Get();
-  // Create the document node
-  typename DataNodeType::Pointer document = DataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  // Adding the layer to the data tree
-  this->GetOutput(0)->GetDataTree()->Add(document, root);
-  // Create the folder node
-  typename DataNodeType::Pointer folder = DataNodeType::New();
-  folder->SetNodeType(otb::FOLDER);
-  // Adding the layer to the data tree
-  this->GetOutput(0)->GetDataTree()->Add(folder, document);
-
-  TreeIteratorType itVector(this->GetInput()->GetDataTree());
-  itVector.GoToBegin();
-  while (!itVector.IsAtEnd())
-    {
-    if (!itVector.Get()->IsRoot() && !itVector.Get()->IsDocument() && !itVector.Get()->IsFolder())
-      {
-      typename DataNodeType::Pointer currentGeometry = itVector.Get();
-      currentGeometry->SetFieldAsDouble("NONDVI", (double)(m_NDVIFeatureFunction->Evaluate(*(currentGeometry.GetPointer()))[0]));
-      currentGeometry->SetFieldAsDouble("ROADSA", (double)(m_SpectralAngleFeatureFunction->Evaluate(*(currentGeometry.GetPointer()))[0]));
-      currentGeometry->SetFieldAsDouble("NOBUIL", (double)(m_DBOverlapFeatureFunction->Evaluate(*(currentGeometry.GetPointer()))[0]));
-
-      this->GetOutput(0)->GetDataTree()->Add(currentGeometry, folder);
-      }
-    ++itVector;
-    }
-}
-
-// PrintSelf Method
-template <class TVectorData, class TOpticalImage>
-void
-VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Detection/RoadExtraction/otb-module.cmake b/Modules/Detection/RoadExtraction/otb-module.cmake
deleted file mode 100644
index 0af2a5ba034b1c7a2444e4e744eac1921589de45..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/otb-module.cmake
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-set(DOCUMENTATION "Everything users need to extract roads.")
-
-otb_module(OTBRoadExtraction
-  DEPENDS
-    OTBVectorDataBase
-    OTBITK
-    OTBImageBase
-    OTBVectorDataManipulation
-    OTBImageManipulation
-    OTBMathParser
-    OTBPath
-    OTBObjectList
-    OTBCommon
-
-  TEST_DEPENDS
-    OTBTestKernel
-    OTBImageIO
-    OTBProjection
-    OTBVectorDataIO
-
-  DESCRIPTION
-    "${DOCUMENTATION}"
-)
diff --git a/Modules/Detection/RoadExtraction/test/AlignementsQB.cxx b/Modules/Detection/RoadExtraction/test/AlignementsQB.cxx
deleted file mode 100644
index 2188101cb207bdb24ff483f41d4fa3a71cbddd6e..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/AlignementsQB.cxx
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-#include <iostream>
-#include "itkPolyLineParametricPath.h"
-
-#include "otbImageFileWriter.h"
-#include "otbImageFileReader.h"
-#include "otbExtractROI.h"
-#include "otbImageToPathListAlignFilter.h"
-#include "otbDrawPathFilter.h"
-//#include "otbColorImageViewer.h"
-
-#include <stdio.h>
-
-int main(int argc, char ** argv)
-{
-  if (argc != 3)
-    {
-
-    std::cout << "Usage : " << argv[0] << " inputImage outputImage" << std::endl;
-    return 1;
-
-    }
-
-  const char * inputFilename  = argv[1];
-  const char * outputFilename = argv[2];
-
-  typedef unsigned char InputPixelType;
-  typedef unsigned char OutputPixelType;
-
-  const unsigned int Dimension = 2;
-
-  typedef otb::Image<InputPixelType,  Dimension> InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  typedef otb::ImageFileReader<InputImageType>  ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  ReaderType::Pointer reader = ReaderType::New();
-  WriterType::Pointer writer = WriterType::New();
-
-  reader->SetFileName(inputFilename);
-  writer->SetFileName(outputFilename);
-
-  reader->Update();
-
-  std::cout << "Lecture terminee" << std::endl;
-
-  typedef otb::ExtractROI<InputPixelType, InputPixelType> ROIFilterType;
-
-  ROIFilterType::Pointer roiFilter = ROIFilterType::New();
-
-  roiFilter->SetInput(reader->GetOutput());
-  roiFilter->SetStartX(10);
-  roiFilter->SetStartY(0);
-  roiFilter->SetSizeX(256);
-  roiFilter->SetSizeY(256);
-
-  roiFilter->Update();
-
-  std::cout << "Extraction ROI" << std::endl;
-
-  typedef itk::PolyLineParametricPath<Dimension>                    PathType;
-  typedef otb::ImageToPathListAlignFilter<InputImageType, PathType> ListAlignFilterType;
-
-  ListAlignFilterType::Pointer alignFilter = ListAlignFilterType::New();
-
-  alignFilter->SetInput(roiFilter->GetOutput());
-
-  alignFilter->Update();
-
-  std::cout << "Alignements termines" << std::endl;
-
-  typedef ROIFilterType::OutputImageType BackgroundImageType;
-
-  typedef otb::DrawPathFilter<BackgroundImageType, PathType, OutputImageType> DrawPathFilterType;
-
-  DrawPathFilterType::Pointer drawPathFilter = DrawPathFilterType::New();
-
-  typedef ListAlignFilterType::OutputPathListType ListType;
-
-  ListType* listePaths = alignFilter->GetOutput();
-
-  ListType::Iterator listIt = listePaths->Begin();
-
-  BackgroundImageType::Pointer backgroundImage = roiFilter->GetOutput();
-
-  roiFilter->Update();
-
-  unsigned int color = 0;
-
-  while (listIt != listePaths->End())
-    {
-
-    drawPathFilter->SetImageInput(backgroundImage);
-    drawPathFilter->SetInputPath(listIt.Get());
-    //drawPathFilter->SetPathValue( color );
-
-    drawPathFilter->Update();
-
-    backgroundImage = drawPathFilter->GetOutput();
-
-    ++listIt;
-    ++color;
-
-    }
-
-  writer->SetInput(drawPathFilter->GetOutput());
-
-  writer->Update();
-
-/*  typedef otb::ColorImageViewer<unsigned char, double>    ViewerType;
-  ViewerType                      viewer;
-
-  viewer.SetLabel( "Input Image" );
-  viewer.SetImage( drawPathFilter->GetOutput() );
-
-  viewer.Show();
-  Fl::run();
-*/
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/CMakeLists.txt b/Modules/Detection/RoadExtraction/test/CMakeLists.txt
deleted file mode 100644
index 8c99e4420f49ffb44aa1701a95ad0c237988a736..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/CMakeLists.txt
+++ /dev/null
@@ -1,218 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-otb_module_test()
-
-set(OTBRoadExtractionTests
-otbRoadExtractionTestDriver.cxx
-otbLikelihoodPathListFilter.cxx
-otbRemoveWrongDirectionFilter.cxx
-otbSimplifyPathListFilter.cxx
-otbAlignImageToPath.cxx
-otbNonMaxRemovalByDirectionFilter.cxx
-otbRoadExtractionFilter.cxx
-otbLinkPathListFilter.cxx
-otbRemoveTortuousPathListFilter.cxx
-otbParallelLinePathListFilter.cxx
-otbRemoveIsolatedByDirectionFilter.cxx
-otbVectorDataToRoadDescriptionFilter.cxx
-otbSimplifyManyPathListFilter.cxx
-otbNeighborhoodScalarProductFilter.cxx
-otbDrawPathAlign.cxx
-otbBreakAngularPathListFilter.cxx
-)
-
-add_executable(otbRoadExtractionTestDriver ${OTBRoadExtractionTests})
-target_link_libraries(otbRoadExtractionTestDriver ${OTBRoadExtraction-Test_LIBRARIES})
-otb_module_target_label(otbRoadExtractionTestDriver)
-
-# Tests Declaration
-
-otb_add_test(NAME feTvLikelihoodPathListFilter COMMAND otbRoadExtractionTestDriver
-  --compare-ascii ${EPSILON_3}
-  ${BASELINE_FILES}/feTvLikelihoodPathOutput.txt
-  ${TEMP}/feTvLikelihoodPathOutput.txt
-  otbLikelihoodPathListFilter
-  ${INPUTDATA}/InputForRoadDetection_NonMaxRem.raw.hdr
-  ${TEMP}/feTvLikelihoodPathOutput.txt
-  157 335 204 376 |
-  21 305 35 308 77 354 85 358 |
-  73 160 126 173
-  )
-
-otb_add_test(NAME feTvRemoveWrongDirectionFilter COMMAND otbRoadExtractionTestDriver
-  --compare-image ${EPSILON_8}
-  ${BASELINE}/feTvRemoveWrongDirectionOutput.tif
-  ${TEMP}/feTvRemoveWrongDirectionOutput.tif
-  otbRemoveWrongDirectionFilter
-  ${INPUTDATA}/InputForRoadDetection_IsolatedRem.raw.hdr
-  ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr
-  ${TEMP}/feTvRemoveWrongDirectionOutput.tif
-  )
-
-otb_add_test(NAME feTvSimplifyPathListFilter COMMAND otbRoadExtractionTestDriver
-  --compare-ascii ${EPSILON_3}
-  ${BASELINE_FILES}/feTvSimplifyPathOutput.txt
-  ${TEMP}/feTvSimplifyPathOutput.txt
-  otbSimplifyPathListFilter
-  ${TEMP}/feTvSimplifyPathOutput.txt
-  1.0
-  1 1   5  1  7  1  11  1  21  1  31  1 |
-  1 1   5  1  7  1  11  1  21 11  31 11 |
-  1 1   5  5  7  7  11 11  21 21  31 31 41 41 |
-  1 1   5  1  7  1  11  1  21 11  31 11 41 11 58 11 70 11
-  )
-
-otb_add_test(NAME feTvAlignMV2ITK COMMAND otbRoadExtractionTestDriver
-  --compare-ascii ${EPSILON_3}     ${BASELINE_FILES}/feAlign.txt
-  ${TEMP}/feAlign.txt
-  otbAlignImageToPath
-  ${INPUTDATA}/poupees.raw.hdr
-  ${TEMP}/feAlign.txt)
-
-otb_add_test(NAME feTvNonMaxRemovalByDirectionFilter COMMAND otbRoadExtractionTestDriver
-  --compare-image ${EPSILON_8}
-  ${BASELINE}/feTvNonMaxRemovalByDirectionOutput.tif
-  ${TEMP}/feTvNonMaxRemovalByDirectionOutput.tif
-  otbNonMaxRemovalByDirectionFilter
-  ${INPUTDATA}/InputForRoadDetection_WrongRem.raw.hdr
-  ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr
-  ${TEMP}/feTvNonMaxRemovalByDirectionOutput.tif
-  )
-
-otb_add_test(NAME feTvRoadExtractionFilter COMMAND otbRoadExtractionTestDriver
-  --compare-image ${EPSILON_8}
-  ${BASELINE}/feTvOutputRoadDetection.tif
-  ${TEMP}/feTvOutputRoadDetection.tif
-  otbRoadExtractionFilter
-  ${INPUTDATA}/qb_RoadExtract.img.hdr
-  ${TEMP}/feTvOutputRoadDetection.tif
-  337 557 432 859  # ReferencePixel
-  1.0              # Alpha
-  0.00005          # AmplitudeThreshold
-  1.0              # Tolerance
-  22.5             # (degre) MaxAngle (3.14159265358979323846/8.)
-  1.0              # FirstMeanDistanceThreshold
-  10.0             # SecondMeanDistanceThreshold
-  25.           # DistanceThreshold for LinkPathFiler
-  22.5           # AngularThreshold for LinkPathFiler
-  )
-
-otb_add_test(NAME feTvLinkPathListFilter COMMAND otbRoadExtractionTestDriver
-  --compare-ascii ${EPSILON_3}
-  ${BASELINE_FILES}/feTvLinkPathOutput.txt
-  ${TEMP}/feTvLinkPathOutput.txt
-  otbLinkPathListFilter
-  ${TEMP}/feTvLinkPathOutput.txt
-  30  40
-  1 1 51 1 |
-  61 1 91 1 |
-  111 11 211 11 |
-  1 51 51 51 |
-  71 71 71 91 |
-  71 131 71 201 |
-  141 111 101 111 |
-  151 111 191 111 |
-  111  71 141  71 |
-  181  71 151  71 |
-  11 131  11 101 |
-  11 171  11 141
-  )
-
-otb_add_test(NAME feTvRemoveTortuousPathListFilter COMMAND otbRoadExtractionTestDriver
-  --compare-ascii ${EPSILON_3}
-  ${BASELINE_FILES}/feTvRemoveTortuousPathOutput.txt
-  ${TEMP}/feTvRemoveTortuousPathOutput.txt
-  otbRemoveTortuousPathListFilter
-  ${TEMP}/feTvRemoveTortuousPathOutput.txt
-  10.0
-  1 1   1 11  |
-  1 1   5  1  7  1  11  1  |
-  1 1   7  7 21 21  31 31 41 41 |
-  1 1   5  1  7  1  11  1  21 11  31 11 41 11 58 11 70 11
-  )
-
-otb_add_test(NAME feTvParallelLinePathListFilter COMMAND otbRoadExtractionTestDriver
-  otbParallelLinePathListFilter)
-
-otb_add_test(NAME feTvRemoveIsolatedByDirectionFilter COMMAND otbRoadExtractionTestDriver
-  --compare-image ${EPSILON_8}
-  ${BASELINE}/feTvRemoveIsolatedByDirectionOutput.tif
-  ${TEMP}/feTvRemoveIsolatedByDirectionOutput.tif
-  otbRemoveIsolatedByDirectionFilter
-  ${INPUTDATA}/InputForRoadDetectionScalarProductMod.raw.hdr
-  ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr
-  ${TEMP}/feTvRemoveIsolatedByDirectionOutput.tif
-  )
-
-otb_add_test(NAME fzTvVectorDataToRoadDescriptionFilter COMMAND otbRoadExtractionTestDriver
-  --compare-ogr ${EPSILON_9}
-  ${BASELINE_FILES}/fzTvVectorDataToRoadDescriptionFilterOutput.shp
-  ${TEMP}/fzTvVectorDataToRoadDescriptionFilterOutput.shp
-  otbVectorDataToRoadDescriptionFilter
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp
-  ${TEMP}/fzTvVectorDataToRoadDescriptionFilterOutput.shp
-  ${INPUTDATA}/DEM/srtm_directory
-  0
-  )
-
-otb_add_test(NAME feTpSimplifyManyPathListFilter COMMAND otbRoadExtractionTestDriver
-  otbSimplifyManyPathListFilter
-  ${TEMP}/feTvSimplifyManyPathOutput.txt
-  1.0
-  )
-
-otb_add_test(NAME feTvNeighborhoodScalarProductFilter COMMAND otbRoadExtractionTestDriver
-  --compare-n-images ${EPSILON_6} 2
-  ${BASELINE}/feTvNeighborhoodScalarProductModulusOutput.tif
-  ${TEMP}/feTvNeighborhoodScalarProductModulusOutput.tif
-  ${BASELINE}/feTvNeighborhoodScalarProductDirectionOutput.tif
-  ${TEMP}/feTvNeighborhoodScalarProductDirectionOutput.tif
-  otbNeighborhoodScalarProductFilter
-  ${INPUTDATA}/InputForRoadDetection_SpectralAngle.raw.hdr
-  ${TEMP}/feTvNeighborhoodScalarProductModulusOutput.tif
-  ${TEMP}/feTvNeighborhoodScalarProductDirectionOutput.tif
-  1.0
-  )
-
-otb_add_test(NAME feTvDrawPathTestAlign COMMAND otbRoadExtractionTestDriver
-  --compare-image ${NOTOL}  ${BASELINE}/feDrawPathAlignDeuxTraits.png
-  ${TEMP}/feDrawPathAlignDeuxTraits.png
-  otbDrawPathAlign
-  ${INPUTDATA}/DeuxTraits.png
-  ${TEMP}/feDrawPathAlignDeuxTraits.png)
-
-otb_add_test(NAME feTvBreakAngularPathListFilter COMMAND otbRoadExtractionTestDriver
-  --compare-ascii ${NOTOL}  ${BASELINE_FILES}/feBreakAngularPathListOutput.txt
-  ${TEMP}/feBreakAngularPathListOutput.txt
-  otbBreakAngularPathListFilter
-  ${TEMP}/feBreakAngularPathListOutput.txt
-  10 20 30 50 90 140 180 |
-  1 1  5 1  7 1  11 1  21 1  31 1 |
-  1 1  5 1  7 1  11 1  21 11  31 11 |
-  1 1  5 1  7 1  11 1  21 11  31 11 41 11  |
-  1 1  5 1  7 1  11 1  21 11  31 11 41 11 58 11 70 11 |
-  1 11  5 11  7 11  11 11  21 1  31 1 41 1 |
-  1 1  5 1  7 1  11 1  21 11  31 21 41 31  |
-  1 1  5 1  5 11  5 21 |
-  1 1  31 1 41 1
-  )
diff --git a/Modules/Detection/RoadExtraction/test/otbAlignImageToPath.cxx b/Modules/Detection/RoadExtraction/test/otbAlignImageToPath.cxx
deleted file mode 100644
index 567713ab741daf32e26794ade7f4be75cf9c8ffc..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbAlignImageToPath.cxx
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-
-
-#include <iostream>
-#include "itkPolyLineParametricPath.h"
-
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbImageToPathListAlignFilter.h"
-
-#include "itkPathSource.h"
-
-#include <stdio.h>
-
-int otbAlignImageToPath(int itkNotUsed(argc), char * argv[])
-{
-  const char * inputFilename  = argv[1];
-  const char * outputFilename = argv[2];
-
-  typedef double InputPixelType;
-  typedef double OutputPixelType;
-  const unsigned int Dimension = 2;
-
-  typedef otb::Image<InputPixelType,  Dimension> InputImageType;
-
-  typedef itk::PolyLineParametricPath<Dimension> PathType;
-
-  PathType::Pointer ltoto = PathType::New();
-
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  typedef otb::ImageFileReader<InputImageType> ReaderType;
-
-  typedef otb::ImageToPathListAlignFilter<InputImageType, PathType> ListAlignFilterType;
-  typedef ListAlignFilterType::ValueType                            ValueType;
-  typedef ListAlignFilterType::SizeType                             SizeType;
-  typedef otb::ImageFileWriter<OutputImageType>                     WriterType;
-
-  ReaderType::Pointer     reader = ReaderType::New();
-  WriterType::Pointer     writer = WriterType::New();
-  InputImageType::Pointer ImageIn = InputImageType::New();
-
-  ListAlignFilterType::Pointer testList = ListAlignFilterType::New();
-
-  reader->SetFileName(inputFilename);
-
-  //OTB-FA-00010-CS
-  testList->SetInput(reader->GetOutput());
-
-  typedef ListAlignFilterType::OutputPathListType ListAlignFilterOutputPathListType;
-
-  otbGenericMsgDebugMacro(<< "Before update");
-  testList->Update();
-  otbGenericMsgDebugMacro(<< "After update");
-
-  ValueType pathValue;
-  pathValue = testList->GetPathValue();
-  testList->SetPathValue(pathValue);
-
-  ValueType  backgroundValue;
-  backgroundValue = testList->GetBackgroundValue();
-  testList->SetBackgroundValue(backgroundValue);
-
-  SizeType   size;
-  size = testList->GetSize();
-  testList->SetSize(size);
-
-  bool isMeaningfulSegment;
-  isMeaningfulSegment = testList->GetisMeaningfulSegment();
-  testList->SetisMeaningfulSegment(isMeaningfulSegment);
-
-  int NbGradDirection;
-  NbGradDirection = testList->GetNbGradDirection();
-  testList->SetNbGradDirection(NbGradDirection);
-
-  int NbLineDirection;
-  NbLineDirection = testList->GetNbLineDirection();
-  testList->SetNbLineDirection(NbLineDirection);
-
-  double MinGradNorm;
-  MinGradNorm = testList->GetMinGradNorm();
-  testList->SetMinGradNorm(MinGradNorm);
-
-  double Eps;
-  Eps = testList->GetEps();
-  testList->SetEps(Eps);
-
-  ListAlignFilterOutputPathListType * sortiePath = testList->GetOutput();
-
-  otbGenericMsgDebugMacro(<< "Writing :");
-
-  FILE *file = fopen(outputFilename, "w");
-  if (file == nullptr)
-    {
-    fprintf(stderr, "Error, can't open file");
-    exit(-1);
-    }
-  typedef itk::ContinuousIndex<double, 2>            VertexType;
-  typedef itk::VectorContainer<unsigned, VertexType> VertexListType;
-  typedef VertexListType::ConstPointer               VertexListTypePointer;
-  VertexListTypePointer vertexList;
-  VertexType            cindex;
-  double                x1, y1;
-  //double                x2, y2;
-
-  int nbPath = sortiePath->Size();
-  otbGenericMsgDebugMacro(<< "NbSegment: " << nbPath);
-  fprintf(file, "Nb Segment: %d\n", nbPath);
-  for (int i = 0; i < nbPath; ++i)
-    {
-    vertexList = sortiePath->GetNthElement(i)->GetVertexList();
-    cindex = vertexList->GetElement(0);
-    x1 = cindex[0];
-    y1 = cindex[1];
-    cindex = vertexList->GetElement(1);
-    //x2 = cindex[0];
-    //y2 = cindex[1];
-    fprintf(file, "%8.3f %8.3f\n", x1, y1);
-    }
-  fclose(file);
-
-  //        writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbBreakAngularPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbBreakAngularPathListFilter.cxx
deleted file mode 100644
index dde12b6ad8d6082b5ca64fedfa9d9a6bb0b0ab05..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbBreakAngularPathListFilter.cxx
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbBreakAngularPathListFilter.h"
-
-#include "itkPolyLineParametricPath.h"
-#include <fstream>
-#include <vector>
-#include "otbMath.h"
-#include <cstdlib>
-
-int otbBreakAngularPathListFilter(int itkNotUsed(argc), char * argv[])
-{
-  const char * outfname = argv[1];
-
-  typedef std::vector<double>           PointsVectorType;
-  typedef std::vector<PointsVectorType> PointsMatrixType;
-  PointsMatrixType MatricePoints;
-  PointsVectorType ListPoints;
-  PointsVectorType ListMaxAngle;
-
-  int cpt = 2;
-
-  ListMaxAngle.clear();
-  while (argv[cpt][0] != '|')
-    {
-    ListMaxAngle.push_back(static_cast<double>(::atof(argv[cpt])));
-    ++cpt;
-    }
-  ++cpt;
-  ListPoints.clear();
-
-  while (argv[cpt] != nullptr)
-    {
-    if (argv[cpt][0] == '|')
-      {
-      if ((ListPoints.size() % 2) != 0)
-        {
-        itkGenericExceptionMacro(<< "Missing point in parameters !");
-        }
-      MatricePoints.push_back(ListPoints);
-      ListPoints.clear();
-      }
-    else
-      {
-      ListPoints.push_back(static_cast<double>(::atof(argv[cpt])));
-      }
-    ++cpt;
-    }
-  MatricePoints.push_back(ListPoints);
-
-  const unsigned int Dimension = 2;
-  typedef itk::PolyLineParametricPath<Dimension>       PathType;
-  typedef otb::BreakAngularPathListFilter<PathType>    BreakAngularPathListFilterType;
-  typedef BreakAngularPathListFilterType::PathListType PathListType;
-  PathType::ContinuousIndexType cindex;
-
-  PathListType::Pointer InputPathList = PathListType::New();
-
-  //Generate PathList
-  for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos)
-    {
-    PathType::Pointer path = PathType::New();
-    //Generate PathList
-    std::cout << "List " << std::endl;
-    for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it)
-      {
-      cindex[0] = *it;
-      ++it;
-      cindex[1] = *it;
-      std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl;
-      path->AddVertex(cindex);
-      }
-    InputPathList->PushBack(path);
-    }
-
-  // Instantiating object
-  BreakAngularPathListFilterType::Pointer breakAngularFilter = BreakAngularPathListFilterType::New();
-  breakAngularFilter->SetInput(InputPathList);
-
-  std::ofstream file;
-  file.open(outfname);
-
-  for (PointsVectorType::iterator itAngle = ListMaxAngle.begin(); itAngle != ListMaxAngle.end(); ++itAngle)
-    {
-
-    breakAngularFilter->SetMaxAngle((*itAngle) * otb::CONST_PI / 180.);
-    breakAngularFilter->Update();
-
-    PathListType::Pointer OutputPathList = breakAngularFilter->GetOutput();
-
-    typedef PathListType::ConstIterator   PathListIteratorType;
-    typedef PathType::VertexListType      VertexListType;
-    typedef VertexListType::ConstIterator VertexIteratorType;
-
-    unsigned int         counter = 1;
-    PathListIteratorType pathListIt = InputPathList->Begin();
-
-    file << "--------------------------------------------------------------------------" << std::endl;
-    file << "MAX ANGULAR :" << breakAngularFilter->GetMaxAngle() << "(" << (*itAngle) << " deg.)" << std::endl;
-    file << "INPUT list of Path " << ": " << std::endl;
-    while (pathListIt != InputPathList->End())
-      {
-      file << "Path " << counter << ": ";
-      for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-           vIt != pathListIt.Get()->GetVertexList()->End();
-           ++vIt)
-        {
-        if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-          {
-          file << ", ";
-          }
-        file << vIt.Value();
-        }
-      file << std::endl;
-      ++pathListIt;
-      ++counter;
-      }
-
-    counter = 1;
-    pathListIt = OutputPathList->Begin();
-    file << "OUTPUT list of Path " << ": " << std::endl;
-    while (pathListIt != OutputPathList->End())
-      {
-      file << "Path " << counter << ": ";
-      for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-           vIt != pathListIt.Get()->GetVertexList()->End();
-           ++vIt)
-        {
-        if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-          {
-          file << ", ";
-          }
-        file << vIt.Value();
-        }
-      file << std::endl;
-      ++pathListIt;
-      ++counter;
-      }
-
-    } //Enf for angle
-  file.close();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbDrawPathAlign.cxx b/Modules/Detection/RoadExtraction/test/otbDrawPathAlign.cxx
deleted file mode 100644
index c5847cc841ae136d46887fce8fd8b6e2c2d86fc1..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbDrawPathAlign.cxx
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-
-#include "itkMacro.h"
-#include "itkPolyLineParametricPath.h"
-
-#include "otbImageFileReader.h"
-#include "otbPathListSource.h"
-#include "otbImageToPathListAlignFilter.h"
-#include "otbDrawPathListFilter.h"
-#include "otbImageFileWriter.h"
-
-int otbDrawPathAlign(int itkNotUsed(argc), char * argv[])
-{
-  const char * inputFilename  = argv[1];
-  const char * outputFilename = argv[2];
-
-  typedef unsigned char InputPixelType;
-  typedef unsigned char OutputPixelType;
-  const unsigned int Dimension = 2;
-
-  typedef otb::Image<InputPixelType,  Dimension> InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  typedef itk::PolyLineParametricPath<Dimension> PathType;
-
-  typedef otb::ImageFileReader<InputImageType>  ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  typedef otb::ImageToPathListAlignFilter<InputImageType, PathType> PathListType;
-  typedef PathListType::OutputPathListType                          OutputPathListType;
-
-  typedef otb::DrawPathListFilter<InputImageType, PathType, OutputImageType> DrawPathFilterType;
-
-  ReaderType::Pointer reader         = ReaderType::New();
-  WriterType::Pointer writer         = WriterType::New();
-
-  DrawPathFilterType::Pointer DrawPath = DrawPathFilterType::New();
-  PathType::Pointer           VertexList     = PathType::New();
-
-  reader->SetFileName(inputFilename);
-  writer->SetFileName(outputFilename);
-
-  typedef otb::ImageToPathListAlignFilter<InputImageType, PathType> PathListAlignType;
-  PathListAlignType::Pointer testList = PathListAlignType::New();
-
-  //OTB-FA-00010-CS
-  testList->SetInput(reader->GetOutput());
-  testList->Update();
-
-  OutputPathListType * sortiePath = testList->GetOutput();
-  int                  nbPath = sortiePath->Size();
-  std::cout << "NbPath: " << nbPath << std::endl;
-
-  InputImageType::ConstPointer imageIn   = reader->GetOutput();
-
-  DrawPath->SetInput(imageIn);
-  DrawPath->SetInputPath(sortiePath);
-
-  writer->SetInput(DrawPath->GetOutput());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbLikelihoodPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbLikelihoodPathListFilter.cxx
deleted file mode 100644
index a1a7054b0fec3afe46e7d85c3451ad2cb38c598a..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbLikelihoodPathListFilter.cxx
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbLikelihoodPathListFilter.h"
-#include "otbPolyLineParametricPathWithValue.h"
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include <fstream>
-
-int otbLikelihoodPathListFilter(int itkNotUsed(argc), char * argv[])
-{
-
-  std::cout << std::endl;
-
-  const char * infname = argv[1];
-  const char * outfname = argv[2];
-
-  typedef std::vector<double>           PointsVectorType;
-  typedef std::vector<PointsVectorType> PointsMatrixType;
-  PointsMatrixType MatricePoints;
-  PointsVectorType ListPoints;
-
-  int cpt = 3;
-  ListPoints.clear();
-
-  while (argv[cpt] != nullptr)
-    {
-    if (argv[cpt][0] == '|')
-      {
-      if ((ListPoints.size() % 2) != 0)
-        {
-        itkGenericExceptionMacro(<< "Missing point in parameters !");
-        }
-      MatricePoints.push_back(ListPoints);
-      ListPoints.clear();
-      }
-    else
-      {
-      ListPoints.push_back(static_cast<double>(::atof(argv[cpt])));
-      }
-    ++cpt;
-    }
-  MatricePoints.push_back(ListPoints);
-
-  const unsigned int Dimension = 2;
-  typedef double                                                  PixelType;
-  typedef otb::Image<PixelType, Dimension>                        ImageType;
-  typedef otb::ImageFileReader<ImageType>                         ReaderType;
-  typedef otb::PolyLineParametricPathWithValue<double, Dimension> PathType;
-  typedef otb::LikelihoodPathListFilter<PathType, ImageType>      LikelihoodPathListFilterType;
-  typedef LikelihoodPathListFilterType::PathListType              PathListType;
-  PathType::ContinuousIndexType cindex;
-
-  PathListType::Pointer InputPathList = PathListType::New();
-
-  //Generate PathList
-  for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos)
-    {
-    PathType::Pointer path = PathType::New();
-    //Generate PathList
-    std::cout << "List " << std::endl;
-    for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it)
-      {
-      cindex[0] = *it;
-      ++it;
-      cindex[1] = *it;
-      std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl;
-      path->AddVertex(cindex);
-      }
-    InputPathList->PushBack(path);
-    }
-
-  //Instantiating object
-  LikelihoodPathListFilterType::Pointer filter = LikelihoodPathListFilterType::New();
-  ReaderType::Pointer                   reader = ReaderType::New();
-  reader->SetFileName(infname);
-  reader->Update();
-
-  filter->SetInput(InputPathList);
-  filter->SetInputImage(reader->GetOutput());
-  filter->Update();
-
-  std::cout << "Filter execution ended" << std::endl;
-
-  PathListType::Pointer OutputPathList = filter->GetOutput();
-
-  typedef PathListType::ConstIterator   PathListIteratorType;
-  typedef PathType::VertexListType      VertexListType;
-  typedef VertexListType::ConstIterator VertexIteratorType;
-
-  std::ofstream file;
-  file.open(outfname);
-  unsigned int         counter = 1;
-  PathListIteratorType pathListIt = InputPathList->Begin();
-
-  file << "INPUT list of Path " << ": " << std::endl;
-  while (pathListIt != InputPathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  counter = 1;
-  pathListIt = OutputPathList->Begin();
-  file << "OUTPUT list of Path " << ": " << std::endl;
-  while (pathListIt != OutputPathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << " Value: " << pathListIt.Get()->GetValue();
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  file.close();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbLinkPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbLinkPathListFilter.cxx
deleted file mode 100644
index c41995abfaa600794e2e725c52121ea06f1e47bb..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbLinkPathListFilter.cxx
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbLinkPathListFilter.h"
-#include "itkPolyLineParametricPath.h"
-#include "otbMath.h"
-#include <fstream>
-#include <cstdlib>
-
-int otbLinkPathListFilter(int itkNotUsed(argc), char * argv[])
-{
-
-  std::cout << std::endl;
-
-  const char * outfname = argv[1];
-  const double distance = atof(argv[2]);
-  const double angle = ::atof(argv[3]) * otb::CONST_PI / 180.;
-
-  typedef std::vector<double>           PointsVectorType;
-  typedef std::vector<PointsVectorType> PointsMatrixType;
-  PointsMatrixType MatricePoints;
-  PointsVectorType ListPoints;
-
-  int cpt = 4;
-  ListPoints.clear();
-
-  while (argv[cpt] != nullptr)
-    {
-    if (argv[cpt][0] == '|')
-      {
-      if ((ListPoints.size() % 2) != 0)
-        {
-        itkGenericExceptionMacro(<< "Missing point in parameters !");
-        }
-      MatricePoints.push_back(ListPoints);
-      ListPoints.clear();
-      }
-    else
-      {
-      ListPoints.push_back(static_cast<double>(::atof(argv[cpt])));
-      }
-    ++cpt;
-    }
-  MatricePoints.push_back(ListPoints);
-
-  const unsigned int Dimension = 2;
-  typedef itk::PolyLineParametricPath<Dimension> PathType;
-  typedef otb::LinkPathListFilter<PathType>      LinkPathListFilterType;
-  typedef LinkPathListFilterType::PathListType   PathListType;
-  PathType::ContinuousIndexType cindex;
-
-  PathListType::Pointer InputPathList = PathListType::New();
-
-  //Generate PathList
-  for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos)
-    {
-    PathType::Pointer path = PathType::New();
-    //Generate PathList
-    std::cout << "List " << std::endl;
-    for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it)
-      {
-      cindex[0] = *it;
-      ++it;
-      cindex[1] = *it;
-      std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl;
-      path->AddVertex(cindex);
-      }
-    InputPathList->PushBack(path);
-    }
-  //Instantiating object
-  LinkPathListFilterType::Pointer filter = LinkPathListFilterType::New();
-
-  filter->SetInput(InputPathList);
-  filter->SetDistanceThreshold(distance);
-  filter->SetAngularThreshold(angle);
-  filter->Update();
-
-  std::cout << "Filter execution ended" << std::endl;
-
-  PathListType::Pointer OutputPathList = filter->GetOutput();
-
-  typedef PathListType::ConstIterator   PathListIteratorType;
-  typedef PathType::VertexListType      VertexListType;
-  typedef VertexListType::ConstIterator VertexIteratorType;
-
-  std::ofstream file;
-  file.open(outfname);
-  unsigned int         counter = 1;
-  PathListIteratorType pathListIt = InputPathList->Begin();
-
-  file << "Maximum distance threshold: " << filter->GetDistanceThreshold() << " (" << distance << ")" << std::endl;
-  file << "Maximum angle threshold: " << filter->GetAngularThreshold() << " (" << angle * 180 / otb::CONST_PI << ")" <<
-  std::endl;
-  file << "INPUT list of Path " << ": " << std::endl;
-  while (pathListIt != InputPathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  counter = 1;
-  pathListIt = OutputPathList->Begin();
-  file << "OUTPUT list of Path " << ": " << std::endl;
-  while (pathListIt != OutputPathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  file.close();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbNeighborhoodScalarProductFilter.cxx b/Modules/Detection/RoadExtraction/test/otbNeighborhoodScalarProductFilter.cxx
deleted file mode 100644
index 75c62bb6ab0c1f770bdade075f0aabc90ad5cba7..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbNeighborhoodScalarProductFilter.cxx
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbNeighborhoodScalarProductFilter.h"
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "itkGradientRecursiveGaussianImageFilter.h"
-
-int otbNeighborhoodScalarProductFilter(int itkNotUsed(argc), char * argv[])
-{
-
-  const char * infname = argv[1];
-  const char * outfname = argv[2];
-  const char * diroutfname = argv[3];
-  const double sigma = atof(argv[4]);
-
-  const unsigned int Dimension = 2;
-  typedef double                                                                      PixelType;
-  typedef itk::CovariantVector<PixelType, Dimension>                                  VectorPixelType;
-  typedef otb::Image<VectorPixelType, Dimension>                                      VectorImageType;
-  typedef otb::Image<PixelType, Dimension>                                            ImageType;
-  typedef otb::NeighborhoodScalarProductFilter<VectorImageType, ImageType, ImageType> FilterType;
-  typedef otb::ImageFileReader<ImageType>                                             ReaderType;
-  typedef otb::ImageFileWriter<ImageType>                                             WriterType;
-  typedef itk::GradientRecursiveGaussianImageFilter<ImageType, VectorImageType>       GradientFilterType;
-
-  // Instantiating object
-  FilterType::Pointer         filter = FilterType::New();
-  ReaderType::Pointer         reader = ReaderType::New();
-  WriterType::Pointer         writer = WriterType::New();
-  GradientFilterType::Pointer gradient = GradientFilterType::New();
-
-  reader->SetFileName(infname);
-  reader->Update();
-
-  gradient->SetInput(reader->GetOutput());
-  gradient->SetSigma(sigma);
-  filter->SetInput(gradient->GetOutput());
-  writer->SetInput(filter->GetOutput());
-  writer->SetFileName(outfname);
-  writer->Update();
-  writer = WriterType::New();
-  writer->SetFileName(diroutfname);
-  writer->SetInput(filter->GetOutputDirection());
-  writer->Update();
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbNonMaxRemovalByDirectionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbNonMaxRemovalByDirectionFilter.cxx
deleted file mode 100644
index cb8970e5de831bd4818789b586443a52d29d468d..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbNonMaxRemovalByDirectionFilter.cxx
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbNonMaxRemovalByDirectionFilter.h"
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-
-int otbNonMaxRemovalByDirectionFilter(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  typedef double                                                               PixelType;
-  typedef otb::Image<PixelType, Dimension>                                     ImageType;
-  typedef otb::ImageFileReader<ImageType>                                      ReaderType;
-  typedef otb::ImageFileWriter<ImageType>                                      WriterType;
-  typedef otb::NonMaxRemovalByDirectionFilter<ImageType, ImageType, ImageType> NonMaxRemovalByDirectionFilterType;
-
-  // Instantiating object
-  ReaderType::Pointer modReader = ReaderType::New();
-  ReaderType::Pointer dirReader = ReaderType::New();
-  WriterType::Pointer writer = WriterType::New();
-  modReader->SetFileName(argv[1]);
-  dirReader->SetFileName(argv[2]);
-  writer->SetFileName(argv[3]);
-  NonMaxRemovalByDirectionFilterType::Pointer filter = NonMaxRemovalByDirectionFilterType::New();
-  filter->SetInput(modReader->GetOutput());
-  filter->SetInputDirection(dirReader->GetOutput());
-  writer->SetInput(filter->GetOutput());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbParallelLinePathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbParallelLinePathListFilter.cxx
deleted file mode 100644
index f2b67fc6ad757b8e6e93f86608a698e1ed339880..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbParallelLinePathListFilter.cxx
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbParallelLinePathListFilter.h"
-#include "itkPolyLineParametricPath.h"
-#include <cstdlib>
-
-int otbParallelLinePathListFilter(int itkNotUsed(argc), char * itkNotUsed(argv) [])
-{
-
-  // We create some lines
-  const unsigned int Dimension = 2;
-  typedef itk::PolyLineParametricPath<Dimension> PathType;
-  typedef otb::ObjectList<PathType>              PathListType;
-
-  PathListType::Pointer lineList = PathListType::New();
-  PathListType::Pointer parallelList = PathListType::New();
-
-  typedef PathType::ContinuousIndexType ContinuousIndexType;
-  ContinuousIndexType cindex;
-
-  /*-----*/
-  PathType::Pointer aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 1;
-  cindex[1] = 1;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 1;
-  cindex[1] = 100;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-  parallelList->PushBack(aLine);
-
-  /*-----*/
-  aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 10;
-  cindex[1] = 1;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 10;
-  cindex[1] = 100;
-  aLine->AddVertex(cindex);
-  parallelList->PushBack(aLine);
-  lineList->PushBack(aLine);
-
-  /*-----*/
-  aLine = PathType::New();
-  aLine->Initialize();
-  cindex[0] = 174;
-  cindex[1] = 99;
-  aLine->AddVertex(cindex);
-
-  cindex[0] = 281;
-  cindex[1] = 1;
-  aLine->AddVertex(cindex);
-
-  lineList->PushBack(aLine);
-
-  // Parallel lines are detected.
-
-  typedef otb::ParallelLinePathListFilter<PathType> ParallelLinePathType;
-  ParallelLinePathType::Pointer parallelLinePathListFilter = ParallelLinePathType::New();
-  parallelLinePathListFilter->SetDistanceThreshold(10);
-  parallelLinePathListFilter->SetAngularThreshold(10);
-  parallelLinePathListFilter->SetCommonDistanceThreshold(10);
-  parallelLinePathListFilter->SetInput(lineList);
-  parallelLinePathListFilter->Update();
-
-  PathListType::Pointer  pathList = parallelLinePathListFilter->GetOutput();
-  PathListType::Iterator listIt = pathList->Begin();
-
-  PathListType::Iterator parListIt = parallelList->Begin();
-
-  // A path is a line segment in this case.
-  while (listIt != pathList->End() && parListIt != parallelList->End())
-    {
-    PathType::VertexListType::ConstPointer vertexList = (listIt.Get())->GetVertexList();
-
-    PathType::VertexListType::ConstPointer parVertexList = (parListIt.Get())->GetVertexList();
-
-    PathType::VertexListType::ConstIterator pathIt = vertexList->Begin();
-    PathType::VertexListType::ConstIterator parPathIt = parVertexList->Begin();
-    // Loop over all the vertices in one path
-    while (pathIt != vertexList->End() &&
-           parPathIt != parVertexList->End())
-      {
-
-      if (pathIt.Value() != parPathIt.Value())
-        {
-        std::cout << pathIt.Index() << pathIt.Value() << std::endl;
-        return EXIT_FAILURE;
-
-        }
-      ++pathIt;
-      ++parPathIt;
-      }
-    ++listIt;
-    ++parListIt;
-    }
-
-  return EXIT_SUCCESS;
-
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbRemoveIsolatedByDirectionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbRemoveIsolatedByDirectionFilter.cxx
deleted file mode 100644
index a2a9ade45086a8b60e17e1c71ab78a2d5dcc6cb9..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbRemoveIsolatedByDirectionFilter.cxx
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbRemoveIsolatedByDirectionFilter.h"
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-
-int otbRemoveIsolatedByDirectionFilter(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  typedef double                                                                PixelType;
-  typedef otb::Image<PixelType, Dimension>                                      ImageType;
-  typedef otb::ImageFileReader<ImageType>                                       ReaderType;
-  typedef otb::ImageFileWriter<ImageType>                                       WriterType;
-  typedef otb::RemoveIsolatedByDirectionFilter<ImageType, ImageType, ImageType> RemoveIsolatedByDirectionFilterType;
-
-  // Instantiating object
-  ReaderType::Pointer modReader = ReaderType::New();
-  ReaderType::Pointer dirReader = ReaderType::New();
-  WriterType::Pointer writer = WriterType::New();
-  modReader->SetFileName(argv[1]);
-  dirReader->SetFileName(argv[2]);
-  writer->SetFileName(argv[3]);
-  RemoveIsolatedByDirectionFilterType::Pointer filter = RemoveIsolatedByDirectionFilterType::New();
-  filter->SetInput(modReader->GetOutput());
-  filter->SetInputDirection(dirReader->GetOutput());
-  writer->SetInput(filter->GetOutput());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbRemoveTortuousPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbRemoveTortuousPathListFilter.cxx
deleted file mode 100644
index 21b28e0c90ec845d6c0e37887d2876a4fca2b6ee..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbRemoveTortuousPathListFilter.cxx
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbRemoveTortuousPathListFilter.h"
-#include "itkPolyLineParametricPath.h"
-#include <fstream>
-#include <cstdlib>
-
-int otbRemoveTortuousPathListFilter(int itkNotUsed(argc), char * argv[])
-{
-  const char * outfname = argv[1];
-  const double threshold = atof(argv[2]);
-
-  typedef std::vector<double>           PointsVectorType;
-  typedef std::vector<PointsVectorType> PointsMatrixType;
-  PointsMatrixType MatricePoints;
-  PointsVectorType ListPoints;
-
-  int cpt = 3;
-  ListPoints.clear();
-
-  while (argv[cpt] != nullptr)
-    {
-    if (argv[cpt][0] == '|')
-      {
-      if ((ListPoints.size() % 2) != 0)
-        {
-        itkGenericExceptionMacro(<< "Missing point in parameters !");
-        }
-      MatricePoints.push_back(ListPoints);
-      ListPoints.clear();
-      }
-    else
-      {
-      ListPoints.push_back(static_cast<double>(::atof(argv[cpt])));
-      }
-    ++cpt;
-    }
-  MatricePoints.push_back(ListPoints);
-
-  const unsigned int Dimension = 2;
-  typedef itk::PolyLineParametricPath<Dimension>          PathType;
-  typedef otb::RemoveTortuousPathListFilter<PathType>     RemoveTortuousPathListFilterType;
-  typedef RemoveTortuousPathListFilterType::InputListType PathListType;
-  PathType::ContinuousIndexType cindex;
-
-  PathListType::Pointer InputPathList = PathListType::New();
-
-  //Generate PathList
-  for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos)
-    {
-    PathType::Pointer path = PathType::New();
-    //Generate PathList
-    std::cout << "List " << std::endl;
-    for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it)
-      {
-      cindex[0] = *it;
-      ++it;
-      cindex[1] = *it;
-      std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl;
-      path->AddVertex(cindex);
-      }
-    InputPathList->PushBack(path);
-    }
-  // Instantiating object
-  RemoveTortuousPathListFilterType::Pointer filter = RemoveTortuousPathListFilterType::New();
-
-  filter->SetInput(InputPathList);
-  filter->GetFunctor().SetThreshold(threshold);
-  filter->Update();
-
-  PathListType::Pointer OutputPathList = filter->GetOutput();
-
-  typedef PathListType::ConstIterator   PathListIteratorType;
-  typedef PathType::VertexListType      VertexListType;
-  typedef VertexListType::ConstIterator VertexIteratorType;
-
-  std::ofstream file;
-  file.open(outfname);
-  unsigned int         counter = 1;
-  PathListIteratorType pathListIt = InputPathList->Begin();
-
-  file << "Minimum Mean Distance: " << filter->GetFunctor().GetThreshold() << " (" << threshold << ")" << std::endl;
-  file << "INPUT list of Path " << ": " << std::endl;
-  while (pathListIt != InputPathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  counter = 1;
-  pathListIt = OutputPathList->Begin();
-  file << "OUTPUT list of Path " << ": " << std::endl;
-  while (pathListIt != OutputPathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  file.close();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbRemoveWrongDirectionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbRemoveWrongDirectionFilter.cxx
deleted file mode 100644
index 146623060c18a74dc415f0a51f8a939254d7c999..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbRemoveWrongDirectionFilter.cxx
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbRemoveWrongDirectionFilter.h"
-#include "otbImage.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-
-int otbRemoveWrongDirectionFilter(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  typedef double                                                           PixelType;
-  typedef otb::Image<PixelType, Dimension>                                 ImageType;
-  typedef otb::ImageFileReader<ImageType>                                  ReaderType;
-  typedef otb::ImageFileWriter<ImageType>                                  WriterType;
-  typedef otb::RemoveWrongDirectionFilter<ImageType, ImageType, ImageType> RemoveWrongDirectionFilterType;
-
-  // Instantiating object
-  ReaderType::Pointer modReader = ReaderType::New();
-  ReaderType::Pointer dirReader = ReaderType::New();
-  WriterType::Pointer writer = WriterType::New();
-  modReader->SetFileName(argv[1]);
-  dirReader->SetFileName(argv[2]);
-  writer->SetFileName(argv[3]);
-  RemoveWrongDirectionFilterType::Pointer filter = RemoveWrongDirectionFilterType::New();
-  filter->SetInput(modReader->GetOutput());
-  filter->SetInputDirection(dirReader->GetOutput());
-  writer->SetInput(filter->GetOutput());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbRoadExtractionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbRoadExtractionFilter.cxx
deleted file mode 100644
index 80e757ab1b4a624493fbbab5b141e221ff63aff4..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbRoadExtractionFilter.cxx
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbImage.h"
-#include "otbRoadExtractionFilter.h"
-#include "otbDrawPathListFilter.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbPolyLineParametricPathWithValue.h"
-#include "otbMath.h"
-
-int otbRoadExtractionFilter(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  typedef otb::VectorImage<double, Dimension>                     InputImageType;
-  typedef otb::Image<double, Dimension>                           OutputImageType;
-  typedef otb::PolyLineParametricPathWithValue<double, Dimension> PathType;
-
-  typedef otb::ImageFileReader<InputImageType>                                ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType>                               WriterType;
-  typedef otb::RoadExtractionFilter<InputImageType, PathType>                 RoadExtractionFilterType;
-  typedef RoadExtractionFilterType::InputPixelType                            InputPixelType;
-  typedef otb::DrawPathListFilter<OutputImageType, PathType, OutputImageType> DrawPathFilterType;
-
-  //Parameters
-  const char *   inputFileName(argv[1]);
-  const char *   outputFileName(argv[2]);
-  InputPixelType ReferencePixel;
-  ReferencePixel.Reserve(4);
-  ReferencePixel.SetElement(0, ::atof(argv[3]));
-  ReferencePixel.SetElement(1, ::atof(argv[4]));
-  ReferencePixel.SetElement(2, ::atof(argv[5]));
-  ReferencePixel.SetElement(3, ::atof(argv[6]));
-  const double Alpha = ::atof(argv[7]);
-  const double AmplitudeThreshold = ::atof(argv[8]);
-  const double Tolerance = ::atof(argv[9]);
-  const double MaxAngle = ((otb::CONST_PI * ::atof(argv[10])) / 180.);
-  const double FirstMeanDistanceThreshold  = ::atof(argv[11]);
-  const double SecondMeanDistanceThreshold  = ::atof(argv[12]);
-  const double LinkAngularThreshold = ((otb::CONST_PI * ::atof(argv[13])) / 180.);
-  const double LinkDistanceThreshold  = ::atof(argv[14]);
-
-  // Instantiating object
-  ReaderType::Pointer               reader = ReaderType::New();
-  RoadExtractionFilterType::Pointer roadExtraction = RoadExtractionFilterType::New();
-  DrawPathFilterType::Pointer       draw = DrawPathFilterType::New();
-  WriterType::Pointer               writer = WriterType::New();
-
-  //Initialization parameters
-  reader->SetFileName(inputFileName);
-
-  roadExtraction->SetInput(reader->GetOutput());
-  roadExtraction->SetReferencePixel(ReferencePixel);
-  roadExtraction->SetAlpha(Alpha);
-  roadExtraction->SetAmplitudeThreshold(AmplitudeThreshold);
-  roadExtraction->SetTolerance(Tolerance);
-  roadExtraction->SetMaxAngle(MaxAngle);
-  roadExtraction->SetFirstMeanDistanceThreshold(FirstMeanDistanceThreshold);
-  roadExtraction->SetSecondMeanDistanceThreshold(SecondMeanDistanceThreshold);
-  roadExtraction->SetAngularThreshold(LinkAngularThreshold);
-  roadExtraction->SetDistanceThreshold(LinkDistanceThreshold);
-
-  reader->GenerateOutputInformation();
-  OutputImageType::Pointer image = OutputImageType::New();
-  image->CopyInformation(reader->GetOutput());
-  image->SetRegions(image->GetLargestPossibleRegion());
-  image->Allocate();
-  image->FillBuffer(0);
-
-  draw->SetInput(image);
-  //Use internal value of path
-  draw->UseInternalPathValueOn();
-  draw->SetInputPath(roadExtraction->GetOutput());
-
-  writer->SetFileName(outputFileName);
-  writer->SetInput(draw->GetOutput());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbRoadExtractionTestDriver.cxx b/Modules/Detection/RoadExtraction/test/otbRoadExtractionTestDriver.cxx
deleted file mode 100644
index 2765863108877e2fb1ecda2ec2914a4e15316586..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbRoadExtractionTestDriver.cxx
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbTestMain.h"
-
-void RegisterTests()
-{
-  REGISTER_TEST(otbLikelihoodPathListFilter);
-  REGISTER_TEST(otbRemoveWrongDirectionFilter);
-  REGISTER_TEST(otbSimplifyPathListFilter);
-  REGISTER_TEST(otbAlignImageToPath);
-  REGISTER_TEST(otbNonMaxRemovalByDirectionFilter);
-  REGISTER_TEST(otbRoadExtractionFilter);
-  REGISTER_TEST(otbLinkPathListFilter);
-  REGISTER_TEST(otbRemoveTortuousPathListFilter);
-  REGISTER_TEST(otbParallelLinePathListFilter);
-  REGISTER_TEST(otbRemoveIsolatedByDirectionFilter);
-  REGISTER_TEST(otbVectorDataToRoadDescriptionFilter);
-  REGISTER_TEST(otbSimplifyManyPathListFilter);
-  REGISTER_TEST(otbNeighborhoodScalarProductFilter);
-  REGISTER_TEST(otbDrawPathAlign);
-  REGISTER_TEST(otbBreakAngularPathListFilter);
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbSimplifyManyPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbSimplifyManyPathListFilter.cxx
deleted file mode 100644
index 12a79b10a8160ea6d9fb4af08c92acb764607d27..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbSimplifyManyPathListFilter.cxx
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbSimplifyPathListFilter.h"
-#include "itkPolyLineParametricPath.h"
-#include <fstream>
-#include <cstdlib>
-
-/**
- * This filter is intended to test the multithreading capabilities
- * of the otb::UnaryFunctorObjectListFilter
- */
-
-int otbSimplifyManyPathListFilter(int itkNotUsed(argc), char * argv[])
-{
-  const char * outfname = argv[1];
-  const double tolerance = atof(argv[2]);
-
-//   typedef std::vector<double> PointsVectorType;
-//   typedef std::vector< PointsVectorType > PointsMatrixType;
-//   PointsMatrixType MatricePoints;
-//   PointsVectorType ListPoints;
-
-  const unsigned int Dimension = 2;
-  typedef itk::PolyLineParametricPath<Dimension>    PathType;
-  typedef otb::SimplifyPathListFilter<PathType>     SimplifyPathListFilterType;
-  typedef SimplifyPathListFilterType::InputListType PathListType;
-  PathType::ContinuousIndexType cindex;
-
-  PathListType::Pointer InputPathList = PathListType::New();
-
-  //Generate PathList
-  unsigned long int numberOfPaths = 10000;
-  srand(123456);
-
-  for (unsigned long int i = 0; i < numberOfPaths; ++i)
-    {
-    PathType::Pointer path = PathType::New();
-    //Generate PathList
-    unsigned int numberOfPoints = static_cast<int>((rand() / (RAND_MAX + 1.0)) * 90) + 10;
-//     std::cout << "List :" << numberOfPoints << " points" << std::endl;
-    cindex[0] = 0;
-    cindex[1] = 0;
-    for (unsigned int j = 0; j < numberOfPoints; ++j)
-      {
-      cindex[0] += (rand() / (RAND_MAX + 1.0)) * 100 - 50;
-      cindex[1] += (rand() / (RAND_MAX + 1.0)) * 100 - 50;
-//       std::cout << "Point Index :"<<cindex[0]<<", "<<cindex[1]<<std::endl;
-      path->AddVertex(cindex);
-      }
-    InputPathList->PushBack(path);
-    }
-  // Instantiating object
-  SimplifyPathListFilterType::Pointer simplifyFilter = SimplifyPathListFilterType::New();
-
-  simplifyFilter->SetInput(InputPathList);
-  simplifyFilter->GetFunctor().SetTolerance(tolerance);
-  simplifyFilter->Update();
-
-  PathListType::Pointer OutputPathList = simplifyFilter->GetOutput();
-
-  typedef PathListType::ConstIterator   PathListIteratorType;
-  typedef PathType::VertexListType      VertexListType;
-  typedef VertexListType::ConstIterator VertexIteratorType;
-
-  std::ofstream file;
-  file.open(outfname);
-  unsigned int         counter = 1;
-  PathListIteratorType pathListIt = InputPathList->Begin();
-
-  file << "TOLERANCE: " << simplifyFilter->GetFunctor().GetTolerance() << "(" << tolerance << ")" << std::endl;
-
-  pathListIt = OutputPathList->Begin();
-  file << "OUTPUT list of Path " << ": " << std::endl;
-  while (pathListIt != OutputPathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  file.close();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbSimplifyPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbSimplifyPathListFilter.cxx
deleted file mode 100644
index 54095a10ec232ab00a3ac9cc1e55fd27d27a822f..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbSimplifyPathListFilter.cxx
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbSimplifyPathListFilter.h"
-#include "itkPolyLineParametricPath.h"
-#include <fstream>
-#include <cstdlib>
-
-int otbSimplifyPathListFilter(int itkNotUsed(argc), char * argv[])
-{
-  const char * outfname = argv[1];
-  const double tolerance = atof(argv[2]);
-
-  typedef std::vector<double>           PointsVectorType;
-  typedef std::vector<PointsVectorType> PointsMatrixType;
-  PointsMatrixType MatricePoints;
-  PointsVectorType ListPoints;
-
-  int cpt = 3;
-  ListPoints.clear();
-
-  while (argv[cpt] != nullptr)
-    {
-    if (argv[cpt][0] == '|')
-      {
-      if ((ListPoints.size() % 2) != 0)
-        {
-        itkGenericExceptionMacro(<< "Missing point in parameters !");
-        }
-      MatricePoints.push_back(ListPoints);
-      ListPoints.clear();
-      }
-    else
-      {
-      ListPoints.push_back(static_cast<double>(::atof(argv[cpt])));
-      }
-    ++cpt;
-    }
-  MatricePoints.push_back(ListPoints);
-
-  const unsigned int Dimension = 2;
-  typedef itk::PolyLineParametricPath<Dimension>    PathType;
-  typedef otb::SimplifyPathListFilter<PathType>     SimplifyPathListFilterType;
-  typedef SimplifyPathListFilterType::InputListType PathListType;
-  PathType::ContinuousIndexType cindex;
-
-  PathListType::Pointer InputPathList = PathListType::New();
-
-  //Generate PathList
-  for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos)
-    {
-    PathType::Pointer path = PathType::New();
-    //Generate PathList
-    std::cout << "List " << std::endl;
-    for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it)
-      {
-      cindex[0] = *it;
-      ++it;
-      cindex[1] = *it;
-      std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl;
-      path->AddVertex(cindex);
-      }
-    InputPathList->PushBack(path);
-    }
-  // Instantiating object
-  SimplifyPathListFilterType::Pointer simplifyFilter = SimplifyPathListFilterType::New();
-
-  simplifyFilter->SetInput(InputPathList);
-  simplifyFilter->GetFunctor().SetTolerance(tolerance);
-  simplifyFilter->Update();
-
-  PathListType::Pointer OutputPathList = simplifyFilter->GetOutput();
-
-  typedef PathListType::ConstIterator   PathListIteratorType;
-  typedef PathType::VertexListType      VertexListType;
-  typedef VertexListType::ConstIterator VertexIteratorType;
-
-  std::ofstream file;
-  file.open(outfname);
-  unsigned int         counter = 1;
-  PathListIteratorType pathListIt = InputPathList->Begin();
-
-  file << "TOLERANCE: " << simplifyFilter->GetFunctor().GetTolerance() << "(" << tolerance << ")" << std::endl;
-  file << "INPUT list of Path " << ": " << std::endl;
-  while (pathListIt != InputPathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  counter = 1;
-  pathListIt = OutputPathList->Begin();
-  file << "OUTPUT list of Path " << ": " << std::endl;
-  while (pathListIt != OutputPathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  file.close();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/RoadExtraction/test/otbVectorDataToRoadDescriptionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbVectorDataToRoadDescriptionFilter.cxx
deleted file mode 100644
index 98715c2b867184293e7943a188a534c96a928222..0000000000000000000000000000000000000000
--- a/Modules/Detection/RoadExtraction/test/otbVectorDataToRoadDescriptionFilter.cxx
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-#include "otbVectorDataToRoadDescriptionFilter.h"
-
-#include "otbVectorImage.h"
-#include "otbImageFileReader.h"
-#include "otbVectorDataFileReader.h"
-#include "otbVectorDataFileWriter.h"
-#include "otbVectorDataProperties.h"
-#include "otbRemoteSensingRegion.h"
-#include "otbVectorDataIntoImageProjectionFilter.h"
-
-
-
-
-
-int otbVectorDataToRoadDescriptionFilter(int itkNotUsed(argc), char* argv[])
-{
-  const char * inputVD  = argv[1];
-  const char * inputImg = argv[2];
-  const char * inputDB  = argv[3];
-  const char * outputVD = argv[4];
-  const char * DEMDirectory = argv[5];
-  int DisplayWarnings   = atoi(argv[6]);
-
-  typedef double                             PrecisionType;
-  typedef otb::VectorData<PrecisionType, 2>  VectorDataType;
-  typedef otb::VectorImage<PrecisionType>    ImageType;
-
-  typedef otb::VectorDataToRoadDescriptionFilter<VectorDataType, ImageType>
-                                          VectorDataToRoadDescriptionFilterType;
-
-  typedef otb::ImageFileReader<ImageType> ImageReaderType;
-  typedef otb::VectorDataFileReader<VectorDataType>
-                                          VectorDataReaderType;
-  typedef otb::VectorDataFileWriter<VectorDataType>
-                                          VectorDataWriterType;
-  typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType>
-                                          VectorDataReProjFilter;
-
-
-  VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New();
-  VectorDataReaderType::Pointer DBReader = VectorDataReaderType::New();
-  ImageReaderType::Pointer      reader   = ImageReaderType::New();
-  VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New();
-  VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New();
-
-  VectorDataToRoadDescriptionFilterType::Pointer filter =
-    VectorDataToRoadDescriptionFilterType::New();
-
-  if (!DisplayWarnings)
-    {
-    reader->SetGlobalWarningDisplay(0);
-    }
-  otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDirectory);
-
-  reader->SetFileName(inputImg);
-  reader->UpdateOutputInformation();
-
-  DBReader->SetFileName(inputDB);
-  DBReader->Update();
-
-  vdReader->SetFileName(inputVD);
-  vdReader->Update();
-
-  vdReProjFilter->SetInputImage(reader->GetOutput());
-  vdReProjFilter->SetInputVectorData(vdReader->GetOutput());
-  vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true);
-  vdReProjFilter->Update();
-
-  filter->SetInput(vdReProjFilter->GetOutput());
-  filter->AddOpticalImage(reader->GetOutput());
-  filter->AddBuildingsDB(DBReader->GetOutput());
-
-  vdWriter->SetFileName(outputVD);
-  vdWriter->SetInput(filter->GetOutput());
-  vdWriter->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/UrbanArea/CMakeLists.txt b/Modules/Detection/UrbanArea/CMakeLists.txt
deleted file mode 100644
index 3bc279da0f37ffd74bdb90c4814be43d9ee1dec6..0000000000000000000000000000000000000000
--- a/Modules/Detection/UrbanArea/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-project(OTBUrbanArea)
-otb_module_impl()
diff --git a/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.h b/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.h
deleted file mode 100644
index cfee272c5486c76220c4e513ea43b8647e518dbe..0000000000000000000000000000000000000000
--- a/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.h
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbUrbanAreaDetectionImageFilter_h
-#define otbUrbanAreaDetectionImageFilter_h
-
-#include "otbImage.h"
-#include "otbWaterIndicesFunctor.h"
-#include "otbVegetationIndicesFunctor.h"
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkBinaryErodeImageFilter.h"
-#include "itkBinaryDilateImageFilter.h"
-#include "itkBinaryBallStructuringElement.h"
-#include "itkMacro.h"
-#include "itkSobelEdgeDetectionImageFilter.h"
-#include "otbEdgeDetectorImageFilter.h"
-#include "otbEdgeDensityImageFilter.h"
-#include "otbBinaryImageDensityFunction.h"
-#include "otbVectorImageToIntensityImageFilter.h"
-
-namespace otb
-{
-
-namespace Functor
-{
-
-/** \class RadiometricNonWaterNonVegetationIndexFunctor
- *  \brief This functor computes ndwi and ndvi of an image
- *  \brief in order to find urban areas and generate a grayscale image
- *
- * \ingroup OTBUrbanArea
- */
-template<class TInput, class TOutput = double>
-class RadiometricNonWaterNonVegetationIndexFunctor
-{
-public:
-  typedef Functor::NDVI<double, double, double>  VegetationFunctorType;
-  typedef Functor::NDWI2<double, double, double> WaterFunctorType;
-  typedef TOutput                                ValueType;
-
-  VegetationFunctorType GetVegetationFunctor(){ return m_VegetationFunctor; }
-  WaterFunctorType GetWaterFunctor(){ return m_WaterFunctor; }
-
-  void SetRedIndex(int id){ m_VegetationFunctor.SetRedIndex(id); }
-  void SetGreenIndex(int id){ m_WaterFunctor.SetGIndex(id); }
-  void SetNIRIndex(int id)
-  {
-    m_VegetationFunctor.SetNIRIndex(id);
-    m_WaterFunctor.SetNIRIndex(id);
-  }
-
-  RadiometricNonWaterNonVegetationIndexFunctor(){}
-  virtual ~RadiometricNonWaterNonVegetationIndexFunctor(){}
-
-  inline TOutput operator ()(const TInput& pInPix)
-  {
-    TOutput lVIval, lWIval, lOutPix;
-
-    TInput zero = pInPix;
-    zero.Fill(0);
-    if (pInPix != zero)
-      {
-      lVIval = static_cast<ValueType>(std::max(0., m_VegetationFunctor(pInPix)));
-      lWIval = static_cast<ValueType>(std::max(0., m_WaterFunctor(pInPix)));
-
-      lOutPix = std::sqrt(std::abs((1 - lVIval) * (1 - lWIval)));
-      }
-    else lOutPix = 0;
-
-    return lOutPix;
-  }
-
-protected:
-  VegetationFunctorType m_VegetationFunctor;
-  WaterFunctorType      m_WaterFunctor;
-
-};
-
-/** \class RadiometricNonWaterNonVegetationDetectionFunctor
- *  \brief This functor uses computes RadiometricNonWaterNonVegetationIndexFunctor
- *  \brief and appli a threshold to produce a binary image
- *
- * \ingroup OTBUrbanArea
- */
-template<class TInput, class TOutput>
-class RadiometricNonWaterNonVegetationDetectionFunctor
-{
-public:
-  typedef RadiometricNonWaterNonVegetationIndexFunctor<TInput> RadiometricNonWaterNonVegetationIndexFunctorType;
-
-  RadiometricNonWaterNonVegetationDetectionFunctor()
-  {
-    m_LowerThreshold = 0.0;
-    m_UpperThreshold = 1.0;
-  }
-
-  virtual ~RadiometricNonWaterNonVegetationDetectionFunctor() {}
-  inline TOutput operator ()(const TInput& inPix)
-  {
-    // The vegetation and water areas are put to 0.
-    double indexesVal = static_cast<double>(m_RadiometricNonWaterNonVegetationIndexFunctor(inPix));
-
-    if ((indexesVal > m_LowerThreshold) && (indexesVal <= m_UpperThreshold))
-      {
-      return static_cast<TOutput>(1);
-      }
-    else
-      {
-      return static_cast<TOutput>(0);
-      }
-  }
-
-  void SetLowerThreshold(double threshold){ m_LowerThreshold = threshold; }
-  void SetUpperThreshold(double threshold){ m_UpperThreshold = threshold; }
-  double GetLowerThreshold(){ return m_LowerThreshold; }
-  double GetUpperThreshold(){ return m_UpperThreshold; }
-
-  void SetRedIndex(int id){ m_RadiometricNonWaterNonVegetationIndexFunctor.SetRedIndex(id); }
-  void SetGreenIndex(int id){ m_RadiometricNonWaterNonVegetationIndexFunctor.SetGreenIndex(id); }
-  void SetNIRIndex(int id){ m_RadiometricNonWaterNonVegetationIndexFunctor.SetNIRIndex(id); }
-
-protected:
-  RadiometricNonWaterNonVegetationIndexFunctorType m_RadiometricNonWaterNonVegetationIndexFunctor;
-  double                                           m_LowerThreshold;
-  double                                           m_UpperThreshold;
-
-};
-
-} //end namespace functor
-
-/** \class UrbanAreaDetectionImageFilter
- *  \brief This filter uses associated functors to produce a binary or grayscale image
- *  \brief where the white areas represents the urban areas.
- *
- * \ingroup OTBUrbanArea
- */
-template <class TInputImage, class TOutputImage,
-    class TFunction = Functor::RadiometricNonWaterNonVegetationIndexFunctor<
-        typename TInputImage::PixelType,
-        typename TOutputImage::PixelType> >
-class ITK_EXPORT UrbanAreaDetectionImageFilter :
-  public itk::ImageToImageFilter<TInputImage, TOutputImage>
-{
-public:
-  /** Standard class typedefs. */
-  typedef UrbanAreaDetectionImageFilter                      Self;
-  typedef itk::ImageToImageFilter<TInputImage, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                            Pointer;
-  typedef itk::SmartPointer<const Self>                      ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(UrbanAreaDetectionImageFilter, itk::ImageToImageFilter);
-
-  /** Images typedefs */
-  typedef TInputImage                         VectorImageType;
-  typedef TOutputImage                        OutputImageType;
-  typedef double                              SingleImagePixelType;
-  typedef Image<SingleImagePixelType, 2>      SingleImageType;
-  typedef SingleImageType::SizeType           SizeType;
-  typedef typename OutputImageType::PixelType OutputImagePixelType;
-  typedef typename VectorImageType::PixelType VectorImagePixelType;
-
-  /** Filters typedefs */
-  // NonVegetationNonWaterIndexFilter
-  typedef Functor::RadiometricNonWaterNonVegetationDetectionFunctor<VectorImagePixelType,
-      OutputImagePixelType> FunctorType;
-  typedef itk::UnaryFunctorImageFilter <VectorImageType, OutputImageType,
-      FunctorType>                           UrbanAreaExtractionFilterType;
-  typedef typename UrbanAreaExtractionFilterType::Pointer
-  UrbanAreaExtrationFilterPointerType;
-  // Erode/Dilate Filters
-  typedef typename itk::BinaryBallStructuringElement<OutputImagePixelType,
-      2>                 StructuringElementType;
-  typedef typename itk::BinaryErodeImageFilter<OutputImageType, OutputImageType,
-      StructuringElementType>  ErodeFilterType;
-  typedef typename itk::BinaryDilateImageFilter<OutputImageType, OutputImageType,
-      StructuringElementType> DilateFilterType;
-  // Intensity
-  typedef VectorImageToIntensityImageFilter<VectorImageType, SingleImageType> IntensityFilterType;
-  typedef typename IntensityFilterType::Pointer                               IntensityFilterPointerType;
-  // EdgeDensityFilter
-  typedef BinaryImageDensityFunction<SingleImageType>
-  CountFunctionType;
-  typedef itk::SobelEdgeDetectionImageFilter<SingleImageType, SingleImageType> SobelType;
-  typedef EdgeDetectorImageFilter<SingleImageType, SingleImageType,
-      SobelType>                           SobelDetectorType;
-  typedef EdgeDensityImageFilter<SingleImageType, SingleImageType, SobelDetectorType,
-      CountFunctionType> EdgeDensityFilterType;
-  typedef typename EdgeDensityFilterType::Pointer
-  EdgeDensityFilterPointerType;
-  // Threshold
-  typedef itk::BinaryThresholdImageFilter<SingleImageType, OutputImageType> ThresholdFilterType;
-  typedef typename ThresholdFilterType::Pointer                             ThresholdFilterPointerType;
-  // Multiply
-  typedef itk::MultiplyImageFilter<VectorImageType, OutputImageType, VectorImageType> MultiplyImageFilterType;
-  typedef typename MultiplyImageFilterType::Pointer                                   MultiplyImageFilterPointerType;
-
-  /** Get/Set indices */
-  void SetRedIndex(int id){ m_UrbanAreaExtractionFilter->GetFunctor().SetRedIndex(id); }
-  void SetGreenIndex(int id){ m_UrbanAreaExtractionFilter->GetFunctor().SetGreenIndex(id); }
-  void SetNIRIndex(int id){ m_UrbanAreaExtractionFilter->GetFunctor().SetNIRIndex(id); }
-  unsigned int GetRedIndex(){ return m_UrbanAreaExtractionFilter->GetFunctor().GetRedIndex(); }
-  unsigned int GetGreenIndex(){ return m_UrbanAreaExtractionFilter->GetFunctor().GetGreenIndex(); }
-  unsigned int GetNIRIndex(){ return m_UrbanAreaExtractionFilter->GetFunctor().GetNIRIndex(); }
-  /** Get/Set threshold values */
-  itkGetMacro(ThresholdValue, double);
-  itkSetMacro(ThresholdValue, double);
-  itkGetMacro(ThresholdDensity, double);
-  itkSetMacro(ThresholdDensity, double);
-  itkGetMacro(SobelLowerThreshold, double);
-  itkSetMacro(SobelLowerThreshold, double);
-  itkGetMacro(SobelUpperThreshold, double);
-  itkSetMacro(SobelUpperThreshold, double);
-
-  /** Methods */
-  void GenerateData() override;
-
-protected:
-  UrbanAreaDetectionImageFilter();
-  ~UrbanAreaDetectionImageFilter() override{}
-
-private:
-  UrbanAreaDetectionImageFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  /** Filters */
-  IntensityFilterPointerType          m_IntensityFilter;
-  EdgeDensityFilterType::Pointer      m_EdgeDensityFilter;
-  SobelDetectorType::Pointer          m_SobelFilter;
-  ThresholdFilterPointerType          m_Thresholder;
-  UrbanAreaExtrationFilterPointerType m_UrbanAreaExtractionFilter;
-  MultiplyImageFilterPointerType      m_MultiplyFilter;
-
-  /** Thresholds */
-  double m_ThresholdValue;
-  double m_ThresholdDensity;
-
-  double m_SobelLowerThreshold;
-  double m_SobelUpperThreshold;
-
-}; // end class RadiometricNonWaterNonVegetationDetectionImageFilter
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbUrbanAreaDetectionImageFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.hxx b/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.hxx
deleted file mode 100644
index f9cc85fd1fe317ae0122d7185a102200295b964c..0000000000000000000000000000000000000000
--- a/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.hxx
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbUrbanAreaDetectionImageFilter_hxx
-#define otbUrbanAreaDetectionImageFilter_hxx
-
-#include "otbUrbanAreaDetectionImageFilter.h"
-#include "itkProgressAccumulator.h"
-
-namespace otb
-{
-
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputImage, class TFunction>
-UrbanAreaDetectionImageFilter<TInputImage, TOutputImage, TFunction>
-::UrbanAreaDetectionImageFilter()
-{
-
-  m_IntensityFilter = IntensityFilterType::New();
-  m_EdgeDensityFilter = EdgeDensityFilterType::New();
-  m_SobelFilter = SobelDetectorType::New();
-  m_Thresholder = ThresholdFilterType::New();
-  m_UrbanAreaExtractionFilter = UrbanAreaExtractionFilterType::New();
-
-  m_MultiplyFilter = MultiplyImageFilterType::New();
-
-  /** Init the Pipeline */
-  // EdgeDensity
-  m_EdgeDensityFilter->SetInput(m_IntensityFilter->GetOutput());
-  m_EdgeDensityFilter->SetDetector(m_SobelFilter);
-  // Threshold
-  m_Thresholder->SetInput(m_EdgeDensityFilter->GetOutput());
-  // Mask Image
-  m_MultiplyFilter->SetInput2(m_Thresholder->GetOutput());
-  // NonVegetationNonWaterIndex
-  m_UrbanAreaExtractionFilter->SetInput(m_MultiplyFilter->GetOutput());
-
-  m_ThresholdValue = 0.5;
-  m_ThresholdDensity = 0.1;
-  m_SobelLowerThreshold = -100.0;
-  m_SobelUpperThreshold = 200.0;
-}
-
-/**
- * Parameters the filters of the pipeline
- */
-template <class TInputImage, class TOutputImage, class TFunction>
-void
-UrbanAreaDetectionImageFilter<TInputImage, TOutputImage, TFunction>
-::GenerateData()
-{
-
-  // Intensity
-  m_IntensityFilter->SetInput(this->GetInput());
-
-  // Edge Density
-  m_SobelFilter->SetLowerThreshold(m_SobelLowerThreshold);
-  m_SobelFilter->SetUpperThreshold(m_SobelUpperThreshold);
-  SizeType lSize;
-  lSize[0] = static_cast<unsigned int>(10);
-  lSize[1] = static_cast<unsigned int>(10);
-  m_EdgeDensityFilter->SetNeighborhoodRadius(lSize);
-
-  // Threshold
-  m_Thresholder->SetInsideValue(0);
-  m_Thresholder->SetOutsideValue(1);
-  m_Thresholder->SetLowerThreshold(-10.);
-  m_Thresholder->SetUpperThreshold(m_ThresholdDensity);
-
-  // Apply the mask on the input image
-  m_MultiplyFilter->SetInput1(this->GetInput());
-
-  // Give a threshold to urbanAreaFilter
-  m_UrbanAreaExtractionFilter->GetFunctor().SetLowerThreshold(m_ThresholdValue);
-
-  // Progress accumulator
-  itk::ProgressAccumulator::Pointer progress = itk::ProgressAccumulator::New();
-  progress->SetMiniPipelineFilter(this);
-  progress->RegisterInternalFilter(m_UrbanAreaExtractionFilter, 0.5f);
-
-  /** GraftOutput */
-  m_UrbanAreaExtractionFilter->GraftOutput(this->GetOutput());
-  m_UrbanAreaExtractionFilter->Update();
-  this->GraftOutput(m_UrbanAreaExtractionFilter->GetOutput());
-
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Detection/UrbanArea/otb-module.cmake b/Modules/Detection/UrbanArea/otb-module.cmake
deleted file mode 100644
index fdbd78381f39a9606ef054a34b63afe218380753..0000000000000000000000000000000000000000
--- a/Modules/Detection/UrbanArea/otb-module.cmake
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-set(DOCUMENTATION "This module is concerned with the detection of urban area.")
-
-otb_module(OTBUrbanArea
-  DEPENDS
-    OTBStatistics
-    OTBITK
-    OTBImageBase
-    OTBEdge
-    OTBImageManipulation
-    OTBIndices
-
-  TEST_DEPENDS
-    OTBTestKernel
-    OTBImageIO
-
-  DESCRIPTION
-    "${DOCUMENTATION}"
-)
diff --git a/Modules/Detection/UrbanArea/test/CMakeLists.txt b/Modules/Detection/UrbanArea/test/CMakeLists.txt
deleted file mode 100644
index 48c2ed26443e5dd8564dfc84ecd9bceb0de148c8..0000000000000000000000000000000000000000
--- a/Modules/Detection/UrbanArea/test/CMakeLists.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-otb_module_test()
-
-set(OTBUrbanAreaTests
-otbUrbanAreaTestDriver.cxx
-otbUrbanAreaDetectionImageFilter.cxx
-)
-
-add_executable(otbUrbanAreaTestDriver ${OTBUrbanAreaTests})
-target_link_libraries(otbUrbanAreaTestDriver ${OTBUrbanArea-Test_LIBRARIES})
-otb_module_target_label(otbUrbanAreaTestDriver)
-
-# Tests Declaration
-
-
-otb_add_test(NAME raTvUrbanAreaDetectionImageFilter COMMAND otbUrbanAreaTestDriver
-  --compare-image ${EPSILON_8}   ${BASELINE}/raTvUrbanAreaDetection.png
-  ${TEMP}/raTvUrbanAreaDetection.png
-  otbUrbanAreaDetectionImageFilter
-  ${INPUTDATA}/qb_RoadExtract2sub200x200.tif
-  ${TEMP}/raTvUrbanAreaDetection.png
-  3    # red
-  2    # green
-  4    # nir
-  0.8  # threshold NDVI+NDWI
-  0.005 # threshold EdgeDensity
-  )
-
diff --git a/Modules/Detection/UrbanArea/test/otbUrbanAreaDetectionImageFilter.cxx b/Modules/Detection/UrbanArea/test/otbUrbanAreaDetectionImageFilter.cxx
deleted file mode 100644
index cac601a228731321ee4f17e2f45577f310261e5d..0000000000000000000000000000000000000000
--- a/Modules/Detection/UrbanArea/test/otbUrbanAreaDetectionImageFilter.cxx
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbVectorImage.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbUrbanAreaDetectionImageFilter.h"
-
-int otbUrbanAreaDetectionImageFilter(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  typedef double                                 PixelType;
-  typedef otb::VectorImage<PixelType, Dimension> InputVectorImageType;
-  typedef otb::Image<unsigned char, Dimension>   OutputImageType;
-
-  typedef otb::ImageFileReader<InputVectorImageType> ReaderType;
-
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  typedef otb::UrbanAreaDetectionImageFilter<InputVectorImageType,
-      OutputImageType> UrbanAreaDetectionFilterType;
-
-  // Instantiating objects
-  UrbanAreaDetectionFilterType::Pointer filter = UrbanAreaDetectionFilterType::New();
-  ReaderType::Pointer                   reader = ReaderType::New();
-  WriterType::Pointer                   writer = WriterType::New();
-
-  const char * inputFilename  = argv[1];
-  const char * outputFilename = argv[2];
-
-  reader->SetFileName(inputFilename);
-  writer->SetFileName(outputFilename);
-
-  filter->SetInput(reader->GetOutput());
-  filter->SetRedIndex(::atoi(argv[3]));
-  filter->SetGreenIndex(::atoi(argv[4]));
-  filter->SetNIRIndex(::atoi(argv[5]));
-  filter->SetThresholdValue(::atof(argv[6]));
-  filter->SetThresholdDensity(::atof(argv[7]));
-
-  writer->SetInput(filter->GetOutput());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Detection/UrbanArea/test/otbUrbanAreaTestDriver.cxx b/Modules/Detection/UrbanArea/test/otbUrbanAreaTestDriver.cxx
deleted file mode 100644
index 2d035d4ce44de5ef7094525271d5d64fc6603460..0000000000000000000000000000000000000000
--- a/Modules/Detection/UrbanArea/test/otbUrbanAreaTestDriver.cxx
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbTestMain.h"
-
-void RegisterTests()
-{
-  REGISTER_TEST(otbUrbanAreaDetectionImageFilter);
-}
diff --git a/Modules/Feature/Edge/test/CMakeLists.txt b/Modules/Feature/Edge/test/CMakeLists.txt
index 687442cbfefdfdabffaa329e34f29029d1cb5a25..171dbfe4c705dfb54e101cc0c9697fcad5cb3fd7 100644
--- a/Modules/Feature/Edge/test/CMakeLists.txt
+++ b/Modules/Feature/Edge/test/CMakeLists.txt
@@ -120,7 +120,7 @@ otb_add_test(NAME bfTvPersistentVectorizationImageFilter COMMAND otbEdgeTestDriv
   ${BASELINE_FILES}/bfTvPersistentVectorizationImageFilterOutput.txt
   ${TEMP}/bfTvPersistentVectorizationImageFilterOutput.txt
   otbPersistentVectorizationFilter
-  ${INPUTDATA}/Seg1InputForRCC8Graph.tif
+  ${INPUTDATA}/labelImage_UnsignedChar.tif
   ${TEMP}/bfTvPersistentVectorizationImageFilterOutput.txt
   )
 
diff --git a/Modules/Feature/SeamCarving/CMakeLists.txt b/Modules/Feature/SeamCarving/CMakeLists.txt
deleted file mode 100644
index 48e2f8a8d73200ced3943178074537e8688b16ef..0000000000000000000000000000000000000000
--- a/Modules/Feature/SeamCarving/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-project(OTBSeamCarving)
-otb_module_impl()
diff --git a/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.h b/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.h
deleted file mode 100644
index 7066a891f52719b0371d20eb5a13150e7a393def..0000000000000000000000000000000000000000
--- a/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbAddCarvingPathFilter_h
-#define otbAddCarvingPathFilter_h
-
-#include "itkImageAndPathToImageFilter.h"
-#include "itkImageSliceIteratorWithIndex.h"
-
-namespace otb
-{
-/** \class AddCarvingPathFilter
- * \brief This class add pixels given in one path
- *
- * This filter add pixels found by the otb::ImageToCarvingPathFilter
- * thus increasing the image size.
-  * the image (if Direction is set to 0) or from left to right
-  * (if direction is set to 1). Pixel value is computed as the average
- * between the neighborhood pixels.
-  *
-  * This is one component necessary to apply the seam carving algorithm
-  * published by Shai Avidan, Ariel Shamir,
-  * Seam Carving for Content-Aware Image Resizing,
-  * ACM Transactions on Graphics, Volume 26, Number 3,
-  * SIGGRAPH 2007
-  *
-  * \par INPUTS
-   * The first input is an image, usually, the same one provided to the
- * otb::ImageToCarvingPathFilter
-   * The second input is a path, typically the output of otb::ImageToCarvingPathFilter.
-  *
-  * \par OUTPUTS
-  * The output is an image with a bigger size than the input image. There is one more
- * column if direction is 0 and one more line if direction is 1.
-  *
-  * \sa ImageToCarvingPathFilter
-  *
-  *
-  * \ingroup PathFilters
-  * \ingroup ImageFilters
- *
- * \ingroup OTBSeamCarving
-  */
-
-template <class TInputImage, class TInputPath, class TOutputImage>
-class ITK_EXPORT AddCarvingPathFilter : public itk::ImageAndPathToImageFilter<TInputImage, TInputPath, TOutputImage>
-{
-public:
-  /** Standard class typedefs. */
-  typedef AddCarvingPathFilter                                                  Self;
-  typedef itk::ImageAndPathToImageFilter<TInputImage, TInputPath, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                                               Pointer;
-  typedef itk::SmartPointer<const Self>                                         ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(AddCarvingPathFilter, itk::ImageAndPathToImageFilter);
-
-  /** Some convenient typedefs. */
-  typedef          TInputImage                   InputImageType;
-  typedef typename InputImageType::Pointer       InputImagePointer;
-  typedef typename InputImageType::ConstPointer  InputImageConstPointer;
-  typedef typename InputImageType::RegionType    InputImageRegionType;
-  typedef typename InputImageType::PixelType     InputImagePixelType;
-  typedef          TInputPath                    InputPathType;
-  typedef typename InputPathType::Pointer        InputPathPointer;
-  typedef typename InputPathType::ConstPointer   InputPathConstPointer;
-  typedef typename InputPathType::InputType      InputPathInputType;
-  typedef typename InputPathType::OutputType     InputPathOutputType;
-  typedef typename InputPathType::IndexType      InputPathIndexType;
-  typedef typename InputPathType::OffsetType     InputPathOffsetType;
-  typedef          TOutputImage                  OutputImageType;
-  typedef typename OutputImageType::Pointer      OutputImagePointer;
-  typedef typename OutputImageType::ConstPointer OutputImageConstPointer;
-
-  typedef typename OutputImageType::RegionType OutputImageRegionType;
-  typedef typename OutputImageType::PixelType  OutputImagePixelType;
-  typedef typename OutputImageType::ValueType  OutputImageValueType;
-
-//   typedef typename itk::ImageRegionConstIterator<InputImageType> InputIteratorType;
-//   typedef typename itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
-  typedef typename itk::ImageSliceConstIteratorWithIndex<InputImageType> InputIteratorType;
-  typedef typename itk::ImageSliceIteratorWithIndex<OutputImageType>     OutputIteratorType;
-
-  /** Set/Get the path input of this process object.
-    Note: these methods are adding to get the proper name */
-  void SetInputPath(const TInputPath * path);
-
-  const TInputPath * GetInputPath(void);
-
-  itkSetMacro(Value, OutputImagePixelType);
-  itkGetConstReferenceMacro(Value, OutputImagePixelType);
-
-  /** Set and Get direction value */
-  itkSetMacro(Direction, unsigned int);
-  itkGetConstMacro(Direction, unsigned int);
-
-  void GenerateOutputInformation() override;
-  void GenerateInputRequestedRegion() override;
-
-protected:
-  AddCarvingPathFilter();
-  ~AddCarvingPathFilter() override {}
-
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  void GenerateData() override;
-
-private:
-  AddCarvingPathFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  OutputImagePixelType m_Value;
-  unsigned int         m_Direction;
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbAddCarvingPathFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.hxx b/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.hxx
deleted file mode 100644
index 5864bc0917135aa882a10265d23c3d21ed8a57cf..0000000000000000000000000000000000000000
--- a/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.hxx
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-#ifndef otbAddCarvingPathFilter_hxx
-#define otbAddCarvingPathFilter_hxx
-
-#include "otbAddCarvingPathFilter.h"
-#include "itkMacro.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TInputPath, class TOutputImage>
-AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::AddCarvingPathFilter()
-{
-  m_Value = static_cast<OutputImagePixelType>(255.0);
-  m_Direction = 0;
-}
-/**
- * Main computation method.
- */
-template <class TInputImage, class TInputPath, class TOutputImage>
-inline void
-AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::SetInputPath(const TInputPath * path)
-{
-  this->SetPathInput(path);
-}
-template <class TInputImage, class TInputPath, class TOutputImage>
-const TInputPath *
-AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::GetInputPath(void)
-{
-  return this->GetPathInput();
-}
-
-template <class TInputImage, class TInputPath, class TOutputImage>
-void
-AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::GenerateData(void)
-{
-
-  const InputImageType * inputImage = this->GetImageInput();
-  const InputPathType *  inputPath = this->GetPathInput();
-  OutputImageType *      outputImage = this->GetOutput();
-
-  outputImage->SetBufferedRegion(outputImage->GetRequestedRegion());
-  outputImage->Allocate();
-
-  InputIteratorType inputIterator(inputImage,
-                                  inputImage->GetLargestPossibleRegion());
-  OutputIteratorType outputIterator(outputImage,
-                                    outputImage->GetLargestPossibleRegion());
-
-  unsigned int dir0;
-  unsigned int dir1;
-
-  if (m_Direction == 0)
-    {
-    dir0 = 0;
-    dir1 = 1;
-    }
-  else
-    {
-    dir0 = 1;
-    dir1 = 0;
-    }
-
-  inputIterator.SetFirstDirection(dir0);
-  inputIterator.SetSecondDirection(dir1);
-  inputIterator.GoToBegin();
-  outputIterator.SetFirstDirection(dir0);
-  outputIterator.SetSecondDirection(dir1);
-  outputIterator.GoToBegin();
-
-  int                                                   line = -1;
-  typename InputImageType::IndexType                    index;
-  typename InputPathType::VertexListType::ConstPointer  vertexList = inputPath->GetVertexList();
-  typename InputPathType::VertexListType::ConstIterator pathIterator;
-  typename InputImageType::IndexType                    indexToAdd;
-  typedef typename InputImageType::IndexType::IndexValueType IndexValueType;
-
-  typename InputImageType::SizeType inputSize;
-  inputSize = inputImage->GetLargestPossibleRegion().GetSize();
-
-  //go to the end of the path
-  pathIterator = vertexList->Begin();
-  while (pathIterator != vertexList->End())
-    {
-    ++pathIterator;
-    }
-  --pathIterator;
-
-  while (!outputIterator.IsAtEnd())
-    {
-    while (!outputIterator.IsAtEndOfSlice())
-      {
-      bool flag = false;
-      while (!outputIterator.IsAtEndOfLine())
-        {
-        index = outputIterator.GetIndex();
-
-        if (index[dir1] != line)
-          {
-          line = index[dir1];
-          typename InputImageType::PointType tmpIndex;
-          inputImage->TransformContinuousIndexToPhysicalPoint(pathIterator.Value(), tmpIndex);
-          inputImage->TransformPhysicalPointToIndex(tmpIndex, indexToAdd);
-          if (pathIterator != vertexList->Begin())
-            {
-            --pathIterator;
-            }
-          if (index[dir1] != indexToAdd[dir1])
-            {
-            itkExceptionMacro(<< "Error : " << index[dir1] << " , " << indexToAdd[dir1]);
-            }
-          }
-
-        if ((flag == true)
-            || ((index[dir0] != indexToAdd[dir0])
-                && (index[dir0] < static_cast<IndexValueType>(inputSize[dir0]))))
-          {
-          outputIterator.Set(inputIterator.Get());
-          ++inputIterator;
-          }
-        else
-          {
-          flag = true;
-          OutputImagePixelType newValue = itk::NumericTraits<OutputImagePixelType>::Zero;
-          int                  n = 0;
-          InputIteratorType    tmpIterator = inputIterator;
-          --tmpIterator;
-          if (!tmpIterator.IsAtReverseEndOfLine())
-            {
-            newValue = tmpIterator.Get();
-            ++n;
-            }
-          tmpIterator = inputIterator;
-          ++tmpIterator;
-          if (!tmpIterator.IsAtEndOfLine())
-            {
-            newValue += tmpIterator.Get();
-            ++n;
-            }
-          assert(n != 0);
-          newValue /= n;
-          outputIterator.Set(newValue);
-          }
-        ++outputIterator;
-
-        }
-
-      if ((outputIterator.GetIndex())[dir0] != (inputIterator.GetIndex())[dir0] + 1)
-        {
-        itkExceptionMacro(<< "Error 2: " << (outputIterator.GetIndex())[dir0] <<  " , "
-                          << (inputIterator.GetIndex())[dir0]);
-        }
-      inputIterator.NextLine();
-      outputIterator.NextLine();
-      }
-    inputIterator.NextSlice();
-    outputIterator.NextSlice();
-    }
-
-}
-
-/**
- * Printself Method
- */
-template <class TInputImage, class TInputPath, class TOutputImage>
-void
-AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "Path Value: " << m_Value << std::endl;
-}
-
-template <class TInputImage, class TInputPath, class TOutputImage>
-void
-AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::GenerateOutputInformation()
-{
-  // call the superclass' implementation of this method
-  Superclass::GenerateOutputInformation();
-
-  // get pointers to the input and output
-  typename Superclass::InputImageConstPointer inputPtr = this->GetInput();
-  typename Superclass::OutputImagePointer     outputPtr = this->GetOutput();
-
-  unsigned int dir0;
-  //unsigned int dir1;
-
-  if (m_Direction == 0)
-    {
-    dir0 = 0;
-    //dir1 = 1;
-    }
-  else
-    {
-    dir0 = 1;
-    //dir1 = 0;
-    }
-
-  // we need to compute the output spacing, the output image size, and the
-  // output image start index
-  const typename TInputImage::SpacingType&
-                                        inputSpacing = inputPtr->GetSignedSpacing();
-  const typename TInputImage::SizeType& inputSize
-    = inputPtr->GetLargestPossibleRegion().GetSize();
-  const typename TInputImage::IndexType& inputStartIndex
-    = inputPtr->GetLargestPossibleRegion().GetIndex();
-
-  typename TOutputImage::SpacingType outputSpacing;
-  typename TOutputImage::SizeType    outputSize;
-  typename TOutputImage::IndexType   outputStartIndex;
-
-  for (unsigned int i = 0; i < TOutputImage::ImageDimension; ++i)
-    {
-    outputSpacing[i] = inputSpacing[i];
-    outputSize[i] = (unsigned int) (inputSize[i]);
-    outputStartIndex[i] = inputStartIndex[i];
-    }
-  // we remove one column of the image
-  outputSize[dir0] = inputSize[dir0] + 1;
-
-  outputPtr->SetSignedSpacing(outputSpacing);
-
-  typename TOutputImage::RegionType outputLargestPossibleRegion;
-  outputLargestPossibleRegion.SetSize(outputSize);
-  outputLargestPossibleRegion.SetIndex(outputStartIndex);
-
-  outputPtr->SetLargestPossibleRegion(outputLargestPossibleRegion);
-}
-
-template <class TInputImage, class TInputPath, class TOutputImage>
-void
-AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::GenerateInputRequestedRegion()
-{
-  // call the superclass' implementation of this method
-  Superclass::GenerateInputRequestedRegion();
-  // get pointers to the input and output
-  InputImagePointer inputPtr =
-    const_cast<InputImageType *>(this->GetInput());
-  if (!inputPtr)
-    {
-    itkExceptionMacro(<< "Input has not been set.");
-    }
-
-  inputPtr->SetRequestedRegion(inputPtr->GetLargestPossibleRegion());
-
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.h b/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.h
deleted file mode 100644
index ad9142b72266dec5ef435f97e972d8adb24f574e..0000000000000000000000000000000000000000
--- a/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageToCarvingPathFilter_h
-#define otbImageToCarvingPathFilter_h
-
-#include "otbImageToPathFilter.h"
-#include "itkImageSliceConstIteratorWithIndex.h"
-
-namespace otb
-{
-/**
- * \class ImageToCarvingPathFilter
- * \brief This filter find the minimum energy path of an image.
- *
- * This filter find the minimum energy path from top to bottom of
- * the image (if Direction is set to 0) or from left to right
- * (if direction is set to 1).
- *
- * This is one component necessary to apply the seam carving algorithm
- * published by Shai Avidan, Ariel Shamir,
- * Seam Carving for Content-Aware Image Resizing,
- * ACM Transactions on Graphics, Volume 26, Number 3,
- * SIGGRAPH 2007
- *
- * \par INPUTS
- * The input is an image, typically the output of a gradient filter.
- *
- * \par OUTPUTS
- * The output is
- * a polyline parametric path comprising one and only one pixel per line
- * (resp. column) if direction is 0 (resp. 1).
- *
- * \sa RemoveCarvingPathFilter
- *
- * \ingroup PathFilters
- * \ingroup ImageFilters
- *
- * \ingroup OTBSeamCarving
- */
-
-template <class TInputImage, class TOutputPath>
-class ITK_EXPORT ImageToCarvingPathFilter
-  : public ImageToPathFilter<TInputImage, TOutputPath>
-{
-public:
-  /** standards typedefs */
-  typedef ImageToCarvingPathFilter                    Self;
-  typedef ImageToPathFilter<TInputImage, TOutputPath> Superclass;
-  typedef itk::SmartPointer<Self>                     Pointer;
-  typedef itk::SmartPointer<const Self>               ConstPointer;
-
-  /// Creation through the object factory
-  itkNewMacro(Self);
-  /// Runtime information
-  itkTypeMacro(ImageToCarvingPathFilter, ImageToPathFilter);
-
-  /// Template parameters typedef
-  typedef typename Superclass::InputImageType        InputImageType;
-  typedef typename Superclass::InputImagePointerType InputImagePointerType;
-  typedef typename Superclass::OutputPathType        OutputPathType;
-  typedef typename Superclass::OutputPathPointerType OutputPathPointerType;
-
-  typedef typename InputImageType::PixelType PixelType;
-
-  /** Set and Get foreground value */
-  itkSetMacro(ForegroundValue, PixelType);
-  itkGetConstMacro(ForegroundValue, PixelType);
-
-  /** Set and Get direction value */
-  itkSetMacro(Direction, unsigned int);
-  itkGetConstMacro(Direction, unsigned int);
-
-  /** Get EnergyPerPix value */
-  itkGetConstMacro(EnergyPerPix, double);
-
-protected:
-  ImageToCarvingPathFilter();
-  ~ImageToCarvingPathFilter() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  void GenerateOutputInformation() override {}  //does nothing
-  void GenerateData() override;
-
-private:
-  ImageToCarvingPathFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  PixelType    m_ForegroundValue;
-  unsigned int m_Direction;
-  double       m_EnergyPerPix;
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbImageToCarvingPathFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.hxx b/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.hxx
deleted file mode 100644
index 11123630270d2e508b792d13397913d0b4c84bc3..0000000000000000000000000000000000000000
--- a/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.hxx
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageToCarvingPathFilter_hxx
-#define otbImageToCarvingPathFilter_hxx
-
-#include "otbImageToCarvingPathFilter.h"
-#include "otbMacro.h"
-#include "itkConstantPadImageFilter.h"
-#include "itkConstShapedNeighborhoodIterator.h"
-#include "itkImageRegionConstIterator.h"
-#include "itkNumericTraits.h"
-#include "itkImageLinearConstIteratorWithIndex.h"
-
-namespace otb
-{
-/*
- * Constructor.
- */
-template <class TInputImage, class TOutputPath>
-ImageToCarvingPathFilter<TInputImage, TOutputPath>
-::ImageToCarvingPathFilter()
-{
-  m_ForegroundValue = PixelType(255);
-  m_Direction = 0;
-  m_EnergyPerPix = 0.0;
-}
-
-/**
- * Main computation method.
- */
-template <class TInputImage, class TOutputPath>
-void
-ImageToCarvingPathFilter<TInputImage, TOutputPath>
-::GenerateData(void)
-{
-
-  const InputImageType * inputImage = this->GetInput();
-  OutputPathType *       outputPath       = this->GetOutput();
-
-  typedef itk::ImageSliceConstIteratorWithIndex
-  <InputImageType> IteratorType;
-  typedef itk::NeighborhoodIterator<InputImageType>
-  NeighborhoodIteratorType;
-
-  IteratorType it(inputImage,
-                  inputImage->GetLargestPossibleRegion());
-  it.GoToBegin();
-
-  PixelType maxValue = itk::NumericTraits<PixelType>::max();
-
-  typename InputImageType::Pointer energyImage = InputImageType::New();
-  energyImage->SetRegions(inputImage->GetLargestPossibleRegion());
-  energyImage->Allocate();
-
-  typename NeighborhoodIteratorType::RadiusType radius;
-  radius.Fill(1);
-  NeighborhoodIteratorType neighIt(radius, energyImage,
-                                   energyImage->GetLargestPossibleRegion());
-  neighIt.GoToBegin();
-
-  unsigned int dir0;
-  unsigned int dir1;
-
-  typename IteratorType::OffsetType UP0;
-  typename IteratorType::OffsetType UP1;
-  typename IteratorType::OffsetType UP2;
-  typename IteratorType::OffsetType NEXT;
-
-  const typename IteratorType::OffsetType LEFT   = {{-1, 0}};
-  const typename IteratorType::OffsetType RIGHT  = {{1, 0}};
-  const typename IteratorType::OffsetType UP     = {{0, -1}};
-  const typename IteratorType::OffsetType DOWN   = {{0, 1}};
-  const typename IteratorType::OffsetType LEFTUP   = {{-1, -1}};
-//    const typename IteratorType::OffsetType RIGHTDOWN ={{1, 1}};
-  const typename IteratorType::OffsetType RIGHTUP  = {{1, -1}};
-  const typename IteratorType::OffsetType LEFTDOWN = {{-1, 1}};
-//    const typename IteratorType::OffsetType CENTER ={{0, 0}};
-
-  if (m_Direction == 0)
-    {
-    dir0 = 0;
-    dir1 = 1;
-    UP0 = LEFTUP;
-    UP1 = UP;
-    UP2 = RIGHTUP;
-    NEXT = DOWN;
-    }
-  else
-    {
-    dir0 = 1;
-    dir1 = 0;
-    UP0 = LEFTUP;
-    UP1 = LEFT;
-    UP2 = LEFTDOWN;
-    NEXT = RIGHT;
-    }
-
-  /** Compute the energy image top-down or left-right
-   * with cumulative energy (dynamic programming first step) */
-  it.SetFirstDirection(dir0);
-  it.SetSecondDirection(dir1);
-  it.GoToBegin();
-  neighIt.GoToBegin();
-  while (!it.IsAtEnd())
-    {
-    while (!it.IsAtEndOfSlice())
-      {
-      while (!it.IsAtEndOfLine())
-        {
-        neighIt.SetLocation(it.GetIndex()); //TODO bad for performances... find a better option
-        // this is really about 20% of total processing time !!!
-
-        PixelType min = maxValue;
-        bool      isInside = false;
-        bool      flag = false;
-        if (neighIt.GetPixel(UP0, isInside) < min)
-          {
-          if (isInside)
-            {
-            min = neighIt.GetPixel(UP0);
-            flag = true;
-            }
-          }
-        if (neighIt.GetPixel(UP1, isInside) < min)
-          {
-          if (isInside)
-            {
-            min = neighIt.GetPixel(UP1);
-            flag = true;
-            }
-          }
-        if (neighIt.GetPixel(UP2, isInside) < min)
-          {
-          if (isInside)
-            {
-            min = neighIt.GetPixel(UP2);
-            flag = true;
-            }
-          }
-
-        if (!flag) //no previous value
-          {
-          min = 0;
-          }
-
-        PixelType newValue = it.Get() + min;
-        neighIt.SetCenterPixel(newValue);
-
-        ++it;
-
-        }
-      it.NextLine();
-      }
-    it.NextSlice();
-    }
-
-  /** Follow the minima bottom-up or right-left
-   * (dynamic programming second step) */
-
-  //find the starting point to follow on the last line
-  typedef itk::ImageLinearConstIteratorWithIndex<InputImageType>
-  LinearIteratorType;
-
-  LinearIteratorType LinIt(energyImage,
-                           energyImage->GetLargestPossibleRegion());
-  LinIt.SetDirection(dir0);
-  LinIt.GoToReverseBegin();
-  typedef typename InputImageType::IndexType IndexType;
-
-  PixelType min = maxValue;
-  IndexType indexToAdd;
-  while (!LinIt.IsAtReverseEndOfLine())
-    {
-    if (LinIt.Get() < min)
-      {
-      min = LinIt.Get();
-      indexToAdd = LinIt.GetIndex();
-      }
-    --LinIt;
-    }
-  outputPath->AddVertex(indexToAdd);
-  m_EnergyPerPix = ((double) min) / (inputImage->GetLargestPossibleRegion().GetSize())[dir1];
-
-  //follow the min
-  neighIt.SetLocation(indexToAdd);
-  bool flag = true;
-  while (flag)
-    {
-    flag = false;
-    PixelType minValue = maxValue;
-    IndexType indexToAdd2;
-    bool      isInside = false;
-
-    if (neighIt.GetPixel(UP0, isInside) < min)
-      {
-      if (isInside)
-        {
-        minValue = neighIt.GetPixel(UP0);
-        indexToAdd2 = neighIt.GetIndex(UP0);
-        flag = true;
-        }
-      }
-
-    if (neighIt.GetPixel(UP1, isInside) < minValue)
-      {
-      if (isInside)
-        {
-        minValue = neighIt.GetPixel(UP1);
-        indexToAdd2 = neighIt.GetIndex(UP1);
-        flag = true;
-        }
-      }
-
-    if (neighIt.GetPixel(UP2, isInside) < minValue)
-      {
-      if (isInside)
-        {
-        minValue = neighIt.GetPixel(UP2);
-        indexToAdd2 = neighIt.GetIndex(UP2);
-        flag = true;
-        }
-      }
-
-    if (flag)
-      {
-      outputPath->AddVertex(indexToAdd2);
-      neighIt.SetLocation(indexToAdd2);
-      }
-
-    }
-
-}
-
-template <class TInputImage, class TOutputPath>
-void
-ImageToCarvingPathFilter<TInputImage, TOutputPath>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << "Foreground value : " << m_ForegroundValue << std::endl;
-}
-} // end namespace otb
-
-#endif
diff --git a/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.h b/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.h
deleted file mode 100644
index c503944f713ee8a93ea76f5eb209557ee829ea45..0000000000000000000000000000000000000000
--- a/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRemoveCarvingPathFilter_h
-#define otbRemoveCarvingPathFilter_h
-
-#include "itkImageAndPathToImageFilter.h"
-#include "itkImageSliceIteratorWithIndex.h"
-
-namespace otb
-{
-/** \class RemoveCarvingPathFilter
- * \brief This class remove pixels given in one path
- *
- *
- *
- * This filter remove pixels found by the otb::ImageToCarvingPathFilter
- * thus decreasing the image size.
-  * the image (if Direction is set to 0) or from left to right
-  * (if direction is set to 1).
-  *
-  * This is one component necessary to apply the seam carving algorithm
-  * published by Shai Avidan, Ariel Shamir,
-  * Seam Carving for Content-Aware Image Resizing,
-  * ACM Transactions on Graphics, Volume 26, Number 3,
-  * SIGGRAPH 2007
-  *
-  * \par INPUTS
-   * The first input is an image, usually, the same one provided to the
- * otb::ImageToCarvingPathFilter
-   * The second input is a path, typically the output of otb::ImageToCarvingPathFilter.
-  *
-  * \par OUTPUTS
-  * The output is an image with a smaller size than the input image. There is one less
- * column if direction is 0 and one less line if direction is 1.
-  *
-  * \sa ImageToCarvingPathFilter
-  *
-  *
-  * \ingroup PathFilters
-  * \ingroup ImageFilters
- *
- * \ingroup OTBSeamCarving
-  */
-
-template <class TInputImage, class TInputPath, class TOutputImage>
-class ITK_EXPORT RemoveCarvingPathFilter : public itk::ImageAndPathToImageFilter<TInputImage, TInputPath, TOutputImage>
-{
-public:
-  /** Standard class typedefs. */
-  typedef RemoveCarvingPathFilter                                               Self;
-  typedef itk::ImageAndPathToImageFilter<TInputImage, TInputPath, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                                               Pointer;
-  typedef itk::SmartPointer<const Self>                                         ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(RemoveCarvingPathFilter, itk::ImageAndPathToImageFilter);
-
-  /** Some convenient typedefs. */
-  typedef          TInputImage                   InputImageType;
-  typedef typename InputImageType::Pointer       InputImagePointer;
-  typedef typename InputImageType::ConstPointer  InputImageConstPointer;
-  typedef typename InputImageType::RegionType    InputImageRegionType;
-  typedef typename InputImageType::PixelType     InputImagePixelType;
-  typedef          TInputPath                    InputPathType;
-  typedef typename InputPathType::Pointer        InputPathPointer;
-  typedef typename InputPathType::ConstPointer   InputPathConstPointer;
-  typedef typename InputPathType::InputType      InputPathInputType;
-  typedef typename InputPathType::OutputType     InputPathOutputType;
-  typedef typename InputPathType::IndexType      InputPathIndexType;
-  typedef typename InputPathType::OffsetType     InputPathOffsetType;
-  typedef          TOutputImage                  OutputImageType;
-  typedef typename OutputImageType::Pointer      OutputImagePointer;
-  typedef typename OutputImageType::ConstPointer OutputImageConstPointer;
-
-  typedef typename OutputImageType::RegionType OutputImageRegionType;
-  typedef typename OutputImageType::PixelType  OutputImagePixelType;
-  typedef typename OutputImageType::ValueType  OutputImageValueType;
-
-//   typedef typename itk::ImageRegionConstIterator<InputImageType> InputIteratorType;
-//   typedef typename itk::ImageRegionIterator<OutputImageType> OutputIteratorType;
-  typedef typename itk::ImageSliceConstIteratorWithIndex<InputImageType> InputIteratorType;
-  typedef typename itk::ImageSliceIteratorWithIndex<OutputImageType>     OutputIteratorType;
-
-  /** Set/Get the path input of this process object.
-      Note: these methods are adding to get the proper name */
-  void SetInputPath(const TInputPath * path);
-
-  const TInputPath * GetInputPath(void);
-
-  itkSetMacro(Value, OutputImagePixelType);
-  itkGetConstReferenceMacro(Value, OutputImagePixelType);
-
-  /** Set and Get direction value */
-  itkSetMacro(Direction, unsigned int);
-  itkGetConstMacro(Direction, unsigned int);
-
-  void GenerateOutputInformation() override;
-
-protected:
-  RemoveCarvingPathFilter();
-  ~RemoveCarvingPathFilter() override {}
-
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  void GenerateData() override;
-
-private:
-  RemoveCarvingPathFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  OutputImagePixelType m_Value;
-  unsigned int         m_Direction;
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRemoveCarvingPathFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.hxx b/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.hxx
deleted file mode 100644
index 46640119ef2d1a78837cc0d9ab133ba0fb6a137e..0000000000000000000000000000000000000000
--- a/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.hxx
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-#ifndef otbRemoveCarvingPathFilter_hxx
-#define otbRemoveCarvingPathFilter_hxx
-
-#include "otbRemoveCarvingPathFilter.h"
-#include "itkMacro.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TInputPath, class TOutputImage>
-RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::RemoveCarvingPathFilter()
-{
-  m_Value = static_cast<OutputImagePixelType>(255.0);
-  m_Direction = 0;
-}
-
-template <class TInputImage, class TInputPath, class TOutputImage>
-inline void
-RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::SetInputPath(const TInputPath * path)
-{
-  this->SetPathInput(path);
-}
-
-template <class TInputImage, class TInputPath, class TOutputImage>
-const TInputPath *
-RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::GetInputPath(void)
-{
-  return this->GetPathInput();
-}
-
-/**
- * Main computation method.
- */
-template <class TInputImage, class TInputPath, class TOutputImage>
-void
-RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::GenerateData(void)
-{
-
-  const InputImageType * inputImage = this->GetImageInput();
-  const InputPathType *  inputPath = this->GetPathInput();
-  OutputImageType *      outputImage = this->GetOutput();
-
-  outputImage->SetBufferedRegion(outputImage->GetRequestedRegion());
-  outputImage->Allocate();
-
-  InputIteratorType inputIterator(inputImage,
-                                  inputImage->GetLargestPossibleRegion());
-  OutputIteratorType outputIterator(outputImage,
-                                    outputImage->GetLargestPossibleRegion());
-
-  unsigned int dir0;
-  unsigned int dir1;
-
-  if (m_Direction == 0)
-    {
-    dir0 = 0;
-    dir1 = 1;
-    }
-  else
-    {
-    dir0 = 1;
-    dir1 = 0;
-    }
-
-  inputIterator.SetFirstDirection(dir0);
-  inputIterator.SetSecondDirection(dir1);
-  inputIterator.GoToBegin();
-  outputIterator.SetFirstDirection(dir0);
-  outputIterator.SetSecondDirection(dir1);
-  outputIterator.GoToBegin();
-
-  int                                                   line = -1;
-  typename InputImageType::IndexType                    index;
-  typename InputPathType::VertexListType::ConstPointer  vertexList = inputPath->GetVertexList();
-  typename InputPathType::VertexListType::ConstIterator pathIterator;
-  typename InputImageType::IndexType                    indexToRemove;
-
-  //go to the end of the path
-  pathIterator = vertexList->Begin();
-  while (pathIterator != vertexList->End())
-    {
-    ++pathIterator;
-    }
-  --pathIterator;
-
-  while (!inputIterator.IsAtEnd())
-    {
-    while (!inputIterator.IsAtEndOfSlice())
-      {
-      while (!inputIterator.IsAtEndOfLine())
-        {
-        index = inputIterator.GetIndex();
-
-        if (index[dir1] != line)
-          {
-          line = index[dir1];
-          typename InputImageType::PointType tmpIndex;
-          inputImage->TransformContinuousIndexToPhysicalPoint(pathIterator.Value(), tmpIndex);
-          inputImage->TransformPhysicalPointToIndex(tmpIndex, indexToRemove);
-
-          if (pathIterator != vertexList->Begin())
-            {
-            --pathIterator;
-            }
-          if (index[dir1] != indexToRemove[dir1])
-            {
-            itkExceptionMacro(<< "Error!!!");
-            }
-          }
-        if (index[dir0] != indexToRemove[dir0])
-          {
-          outputIterator.Set(inputIterator.Get());
-          ++outputIterator;
-          }
-        ++inputIterator;
-        }
-      inputIterator.NextLine();
-      outputIterator.NextLine();
-      }
-    inputIterator.NextSlice();
-    outputIterator.NextSlice();
-    }
-
-}
-
-/**
- * Printself Method
- */
-template <class TInputImage, class TInputPath, class TOutputImage>
-void
-RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "Path Value: " << m_Value << std::endl;
-}
-
-template <class TInputImage, class TInputPath, class TOutputImage>
-void
-RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage>
-::GenerateOutputInformation()
-{
-  // call the superclass' implementation of this method
-  Superclass::GenerateOutputInformation();
-
-  // get pointers to the input and output
-  typename Superclass::InputImageConstPointer inputPtr = this->GetInput();
-  typename Superclass::OutputImagePointer     outputPtr = this->GetOutput();
-
-  unsigned int dir0;
-  //unsigned int dir1;
-
-  if (m_Direction == 0)
-    {
-    dir0 = 0;
-    //dir1 = 1;
-    }
-  else
-    {
-    dir0 = 1;
-    //dir1 = 0;
-    }
-
-  // we need to compute the output spacing, the output image size, and the
-  // output image start index
-  const typename TInputImage::SpacingType&
-                                        inputSpacing = inputPtr->GetSignedSpacing();
-  const typename TInputImage::SizeType& inputSize
-    = inputPtr->GetLargestPossibleRegion().GetSize();
-  const typename TInputImage::IndexType& inputStartIndex
-    = inputPtr->GetLargestPossibleRegion().GetIndex();
-
-  typename TOutputImage::SpacingType outputSpacing;
-  typename TOutputImage::SizeType    outputSize;
-  typename TOutputImage::IndexType   outputStartIndex;
-
-  for (unsigned int i = 0; i < TOutputImage::ImageDimension; ++i)
-    {
-    outputSpacing[i] = inputSpacing[i];
-    outputSize[i] = (unsigned int) (inputSize[i]);
-    outputStartIndex[i] = inputStartIndex[i];
-    }
-  // we remove one column of the image
-  outputSize[dir0] = inputSize[dir0] - 1;
-
-  outputPtr->SetSignedSpacing(outputSpacing);
-
-  typename TOutputImage::RegionType outputLargestPossibleRegion;
-  outputLargestPossibleRegion.SetSize(outputSize);
-  outputLargestPossibleRegion.SetIndex(outputStartIndex);
-
-  outputPtr->SetLargestPossibleRegion(outputLargestPossibleRegion);
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Feature/SeamCarving/otb-module.cmake b/Modules/Feature/SeamCarving/otb-module.cmake
deleted file mode 100644
index d0f0c8465d5031e2097b607a671cbfe534636d43..0000000000000000000000000000000000000000
--- a/Modules/Feature/SeamCarving/otb-module.cmake
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-set(DOCUMENTATION "This module contains necessary components to apply the seam
-carving algorithm published by Shai Avidan, Ariel Shamir, Seam Carving for
-Content-Aware  Resizing, ACM Transactions on Graphics, Volume 26, Number 3, SIGGRAPH
-2007.")
-
-otb_module(OTBSeamCarving
-  DEPENDS
-    OTBPath
-    OTBCommon
-    OTBITK
-
-  TEST_DEPENDS
-    OTBTestKernel
-    OTBImageBase
-
-  DESCRIPTION
-    "${DOCUMENTATION}"
-)
diff --git a/Modules/Feature/Textures/test/otbScalarImageToHigherOrderTexturesFilter.cxx b/Modules/Feature/Textures/test/otbScalarImageToHigherOrderTexturesFilter.cxx
index d2298e5796960dd4276c47642cbe6adbe485150e..dbaf3ddfbb271f928bb0676b358a7d7ff6ca7930 100644
--- a/Modules/Feature/Textures/test/otbScalarImageToHigherOrderTexturesFilter.cxx
+++ b/Modules/Feature/Textures/test/otbScalarImageToHigherOrderTexturesFilter.cxx
@@ -22,6 +22,7 @@
 #include "otbImage.h"
 #include "otbImageFileReader.h"
 #include "itkExtractImageFilter.h"
+#include "otbMacro.h"
 
 const unsigned int Dimension = 2;
 typedef float                            PixelType;
@@ -128,9 +129,9 @@ int ValidateAt( ImageType* inputImage, std::vector<ImageType::Pointer> computeRe
     PixelType output = computeResults[i]->GetPixel(idx);
     PixelType reference = featuresMeans[i];
 
-    std::cout << "index     : " << idx << std::endl;
-    std::cout << "compute : " << output << std::endl;
-    std::cout << "ref     : " << reference << std::endl;
+    otbLogMacro(Debug, << "index = " << idx
+      << " ; compute = " << output
+      << " ; ref = " << reference);
 
     if (reference != output)
     {
diff --git a/Modules/Filtering/Contrast/test/otbComputeGainLutFilter.cxx b/Modules/Filtering/Contrast/test/otbComputeGainLutFilter.cxx
index 74899c7f2d3ddf750b6c1ec7307493188b8fd5f5..2bc307aa9575d4f86ca476d0da6e5bcaeff35baa 100644
--- a/Modules/Filtering/Contrast/test/otbComputeGainLutFilter.cxx
+++ b/Modules/Filtering/Contrast/test/otbComputeGainLutFilter.cxx
@@ -23,6 +23,7 @@
 #include "otbImageFileWriter.h"
 #include "otbImageFileReader.h"
 #include "otbComputeGainLutFilter.h"
+#include "otbMacro.h"
 
 int otbComputeGainLutFilter(int itkNotUsed(argc), char * argv [])
 {
@@ -62,7 +63,7 @@ int otbComputeGainLutFilter(int itkNotUsed(argc), char * argv [])
   writer->Update();
 
   auto index = computeGainLut->GetOutput()->GetLargestPossibleRegion().GetIndex();
-  std::cout<<computeGainLut->GetOutput()->GetPixel( index )<<std::endl;
+  otbLogMacro(Debug, <<computeGainLut->GetOutput()->GetPixel( index ));
 
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.h b/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.h
deleted file mode 100644
index 6d8d3fb4e696f8ff9d426f83133276001766e4b6..0000000000000000000000000000000000000000
--- a/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbBinaryImageMinimalBoundingRegionCalculator_h
-#define otbBinaryImageMinimalBoundingRegionCalculator_h
-
-#include "itkImageToImageFilter.h"
-#include "itkObjectFactory.h"
-
-namespace otb
-{
-/**
- * \class BinaryImageMinimalBoundingRegionCalculator
- * \brief This class compute the smallest region of the image
- * containing every pixel with the foreground value.
- *
- * This class is used for instance in the RCC8 calculator filter,
- * where the input region used for computation has to be the smallest possible
- * for costs reasons. The Pad arg allows the user to get a region of pad  pixel larger
- * at each bound in case a security margin has to be kept.
- *
- * \sa ImageToImageRCC8Calculator
- *
- * \ingroup OTBImageManipulation
- */
-template <class TInputImage>
-class ITK_EXPORT BinaryImageMinimalBoundingRegionCalculator
-  : public itk::ImageToImageFilter<TInputImage, TInputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef BinaryImageMinimalBoundingRegionCalculator        Self;
-  typedef itk::ImageToImageFilter<TInputImage, TInputImage> Superclass;
-  typedef itk::SmartPointer<Self>                           Pointer;
-  typedef itk::SmartPointer<const Self>                     ConstPointer;
-  /** Creation through object factory macro */
-  itkNewMacro(Self);
-  /** Type macro */
-  itkTypeMacro(BinaryImageMinimalBoundingRegionCalculator, ImageToImageFilter);
-
-  typedef TInputImage                         InputImageType;
-  typedef typename InputImageType::PixelType  PixelType;
-  typedef typename InputImageType::RegionType RegionType;
-  typedef typename InputImageType::Pointer    InputImagePointerType;
-  /** Toogle the pad option */
-  itkGetMacro(Region, RegionType);
-  itkSetMacro(InsideValue, PixelType);
-  itkGetMacro(InsideValue, PixelType);
-  itkSetMacro(Pad, unsigned int);
-  itkGetMacro(Pad, unsigned int);
-
-protected:
-  /** Constructor */
-  BinaryImageMinimalBoundingRegionCalculator();
-  /** Destructor */
-  ~BinaryImageMinimalBoundingRegionCalculator() override {}
-  /** Main computation method */
-  void GenerateData(void) override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-private:
-  BinaryImageMinimalBoundingRegionCalculator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-  /** The computed region */
-  RegionType m_Region;
-  /** Toogle if pad wanted */
-  unsigned int m_Pad;
-  /** Inside value */
-  PixelType m_InsideValue;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbBinaryImageMinimalBoundingRegionCalculator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.hxx b/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.hxx
deleted file mode 100644
index cfe5d95b6b9d8099421302cab87764d99d84e8a3..0000000000000000000000000000000000000000
--- a/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.hxx
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbBinaryImageMinimalBoundingRegionCalculator_hxx
-#define otbBinaryImageMinimalBoundingRegionCalculator_hxx
-
-#include "otbBinaryImageMinimalBoundingRegionCalculator.h"
-#include "itkImageSliceConstIteratorWithIndex.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/*
- * Constructor
- */
-template <class TInputImage>
-BinaryImageMinimalBoundingRegionCalculator<TInputImage>
-::BinaryImageMinimalBoundingRegionCalculator()
-{
-  // The pad option is desactivated by default
-  m_Pad = 0;
-  // Set the default region
-  typename InputImageType::SizeType  size;
-  typename InputImageType::IndexType index;
-  size[0] = 0;
-  size[1] = 0;
-  index[0] = 0;
-  index[1] = 0;
-  m_Region.SetSize(size);
-  m_Region.SetIndex(index);
-  m_InsideValue = static_cast<PixelType>(255);
-}
-/**
- * Main computation method
- */
-template <class TInputImage>
-void
-BinaryImageMinimalBoundingRegionCalculator<TInputImage>
-::GenerateData(void)
-{
-  // Input images pointers
-  const InputImageType* image = this->GetInput();
-  // Iterator definition
-  typedef itk::ImageSliceConstIteratorWithIndex<InputImageType> SliceIteratorType;
-  // Indexes containing upper-left and lower-right corner
-  typename InputImageType::IndexType min;
-  typename InputImageType::IndexType max;
-  min[0] = 0;
-  min[1] = 0;
-  max[1] = 0;
-  max[1] = 0;
-  for (unsigned int axis = 0; axis < InputImageType::ImageDimension; ++axis)
-    { // Create the forward iterator to find lower bound
-    SliceIteratorType fit(image, image->GetLargestPossibleRegion());
-
-    fit.SetFirstDirection(!axis);
-    fit.SetSecondDirection(axis);
-    fit.GoToBegin();
-
-    // Walk through the two images line by line
-    while (!fit.IsAtEnd())
-      {
-      while (!fit.IsAtEndOfSlice())
-        {
-        while (!fit.IsAtEndOfLine())
-          {
-          // If a common intersection is found
-          if (fit.Get() == m_InsideValue)
-            {
-            // then the lower bound is found
-            min[axis] = fit.GetIndex()[axis];
-            fit.GoToReverseBegin(); // skip to the end
-            break;
-            }
-          ++fit;
-          }
-        fit.NextLine();
-        }
-      fit.NextSlice();
-      }
-    // Create the reverse iterator to find upper bound
-    SliceIteratorType rit(image, image->GetLargestPossibleRegion());
-    rit.SetFirstDirection(!axis);
-    rit.SetSecondDirection(axis);
-    rit.GoToReverseBegin();
-    // Walk through the two images line by line
-    while (!rit.IsAtReverseEnd())
-      {
-      while (!rit.IsAtReverseEndOfSlice())
-        {
-        while (!rit.IsAtReverseEndOfLine())
-          {
-          // If a common intersection is found
-          if (rit.Get() == m_InsideValue)
-            {
-            max[axis] = rit.GetIndex()[axis];
-            rit.GoToBegin(); //Skip to reverse end
-            break;
-            }
-          --rit;
-
-          }
-        rit.PreviousLine();
-
-        }
-      rit.PreviousSlice();
-      }
-    }
-
-  typename InputImageType::SizeType  size;
-  typename InputImageType::IndexType index;
-
-  for (unsigned int i = 0; i < InputImageType::ImageDimension; ++i)
-    {
-    size[i] = max[i] - min[i] + 1;
-    index[i] = min[i];
-    }
-
-  m_Region.SetIndex(index);
-  m_Region.SetSize(size);
-
-  if (m_Pad)
-    {
-    m_Region.PadByRadius(m_Pad);
-    }
-
-  m_Region.Crop(image->GetLargestPossibleRegion());
-}
-/**
- * PrintSelf method
- */
-template <class TInputImage>
-void
-BinaryImageMinimalBoundingRegionCalculator<TInputImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-} // End namespace otb
-
-#endif
diff --git a/Modules/Filtering/ImageManipulation/test/CMakeLists.txt b/Modules/Filtering/ImageManipulation/test/CMakeLists.txt
index e8317ea3781b71aeff5124c768480cea1b8efd5c..53e76737f0b54cf6717ef348095b401642d630c8 100644
--- a/Modules/Filtering/ImageManipulation/test/CMakeLists.txt
+++ b/Modules/Filtering/ImageManipulation/test/CMakeLists.txt
@@ -51,7 +51,6 @@ otbVectorRescaleIntensityImageFilter.cxx
 otbLog10ThresholdedImageFilterTest.cxx
 otbExtractROIResample.cxx
 otbLocalGradientVectorImageFilter.cxx
-otbBinaryImageMinimalBoundingRegionCalculator.cxx
 otbPerBandVectorImageFilterWithSobelFilter.cxx
 otbBinaryImageDensityFunction.cxx
 otbThresholdVectorImageFilter.cxx
@@ -451,18 +450,6 @@ otb_add_test(NAME bfTvLocalGradientVectorImageFilter COMMAND otbImageManipulatio
   ${INPUTDATA}/cupriteSubHsi.tif
   ${TEMP}/bfTvLocalGradientVectorImageFilter.tif)
 
-otb_add_test(NAME bfTvBoundingRegionCalculator COMMAND otbImageManipulationTestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/bfBoundingRegionCalculatorOutput.txt
-  ${TEMP}/bfBoundingRegionCalculatorOutput.txt
-  otbBinaryImageMinimalBoundingRegionCalculator
-  4
-  ${TEMP}/bfBoundingRegionCalculatorOutput.txt
-  ${INPUTDATA}/rcc8_mire1.png
-  ${INPUTDATA}/rcc8_mire2.png
-  ${INPUTDATA}/rcc8_mire3.png
-  ${INPUTDATA}/rcc8_mire4.png
-  )
 
 otb_add_test(NAME bfTvPerBandVectorImageFilterWithSobelFilter COMMAND otbImageManipulationTestDriver
   --compare-image ${EPSILON_7}
diff --git a/Modules/Filtering/ImageManipulation/test/otbBinaryImageMinimalBoundingRegionCalculator.cxx b/Modules/Filtering/ImageManipulation/test/otbBinaryImageMinimalBoundingRegionCalculator.cxx
deleted file mode 100644
index 90d3167cbb890262026198319a4b781b9af99b73..0000000000000000000000000000000000000000
--- a/Modules/Filtering/ImageManipulation/test/otbBinaryImageMinimalBoundingRegionCalculator.cxx
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbImage.h"
-#include "otbBinaryImageMinimalBoundingRegionCalculator.h"
-#include "otbImageFileReader.h"
-#include "otbImageList.h"
-
-int otbBinaryImageMinimalBoundingRegionCalculator(int itkNotUsed(argc), char* argv[])
-{
-  const unsigned int Dimension = 2;
-
-  int    nbImages  = atoi(argv[1]);
-  char * outfile   = argv[2];
-
-  typedef unsigned char                    PixelType;
-  typedef otb::Image<PixelType, Dimension> ImageType;
-  typedef otb::ImageFileReader<ImageType>  ReaderType;
-  typedef otb::BinaryImageMinimalBoundingRegionCalculator<ImageType>
-  BoundingRegionCalculatorType;
-  typedef BoundingRegionCalculatorType::RegionType RegionType;
-  typedef otb::ImageList<ImageType>                ImageListType;
-  typedef ImageListType::Iterator                  IteratorType;
-  // reference image list
-  ImageListType::Pointer images = ImageListType::New();
-
-  // Reading input images
-  std::ofstream out;
-  out.open(outfile, std::ios::out);
-  out << "Test results from otbBinaryImageBoundingRegionCalculator test." << std::endl;
-  for (int i = 1; i <= nbImages; ++i)
-    {
-    ReaderType::Pointer reader = ReaderType::New();
-    reader->SetFileName(argv[2 + i]);
-    reader->Update();
-    images->PushBack(reader->GetOutput());
-    }
-
-  // Declaration
-  BoundingRegionCalculatorType::Pointer brct;
-  // Computing bounding region for each image
-  for (IteratorType it = images->Begin(); it != images->End(); ++it)
-    {
-    brct = BoundingRegionCalculatorType::New();
-    brct->SetInput(it.Get());
-    brct->Update();
-    RegionType region = brct->GetRegion();
-    out << region.GetIndex() << "\t" << region.GetSize() << std::endl;
-    }
-  out << std::endl << "Testing the pad option" << std::endl << std::endl;
-  for (IteratorType it = images->Begin(); it != images->End(); ++it)
-    {
-    brct = BoundingRegionCalculatorType::New();
-    brct->SetPad(1);
-    brct->SetInput(it.Get());
-    brct->Update();
-    RegionType region = brct->GetRegion();
-    out << region.GetIndex() << "\t" << region.GetSize() << std::endl;
-    }
-
-  out.close();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx b/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx
index 98efbed44de03307f9ab8818fc8dcd85d67110a9..0b24cab0e47dd8544329617ada28fc1433a2897a 100644
--- a/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx
@@ -51,7 +51,6 @@ void RegisterTests()
   REGISTER_TEST(otbLog10ThresholdedImageFilterTest);
   REGISTER_TEST(otbExtractROIResample);
   REGISTER_TEST(otbLocalGradientVectorImageFilterTest);
-  REGISTER_TEST(otbBinaryImageMinimalBoundingRegionCalculator);
   REGISTER_TEST(otbPerBandVectorImageFilterWithSobelFilter);
   REGISTER_TEST(otbBinaryImageDensityFunction);
   REGISTER_TEST(otbThresholdVectorImageFilterTest);
diff --git a/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.h b/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.h
deleted file mode 100644
index f04fbd9892dcfbc7f378e0bdd6efce28e586f366..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbParserConditionDataNodeFeatureFunction_h
-#define otbParserConditionDataNodeFeatureFunction_h
-
-#include "otbDataNodeImageFunction.h"
-#include "otbPolyLineImageConstIterator.h"
-#include "otbMaskMuParserFunctor.h"
-#include <string>
-
-namespace otb
-{
-/** \class ParserConditionDataNodeFeatureFunction
-  * \brief Compute a ParserCondition based feature alongside a
-  * datanode.
-  *
-  * This function evaluate a condition alongside a datanode.
-  * The descriptor is the percentage of pixels iterated for which
-  * the condition is true.
-  *
-  * \ingroup Functions
-  * \sa DataNodeImageFunction
-  * \sa SpectralAngleDataNodeFeatureFunction
- *
- * \ingroup OTBMathParser
-  */
-
-template <
-class TImage,
-class TCoordRep = double,
-class TPrecision = double
->
-class ITK_EXPORT ParserConditionDataNodeFeatureFunction :
-    public DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision>
-{
-public:
-  /** Standard class typedefs. */
-  typedef ParserConditionDataNodeFeatureFunction                         Self;
-  typedef DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision>
-                                                              Superclass;
-  typedef itk::SmartPointer<Self>                             Pointer;
-  typedef itk::SmartPointer<const Self>                       ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(ParserConditionDataNodeFeatureFunction, DataNodeImageFunction);
-
-  /** Some typedefs. */
-  typedef typename Superclass::DataNodeType           DataNodeType;
-  typedef typename DataNodeType::LineType             LineType;
-
-  typedef TImage                                      InputImageType;
-  typedef typename InputImageType::ConstPointer       InputImageConstPointer;
-  typedef typename InputImageType::PixelType          PixelType;
-  typedef typename InputImageType::InternalPixelType  ScalarRealType;
-  typedef typename InputImageType::IndexType          IndexType;
-  typedef typename InputImageType::IndexValueType     IndexValueType;
-
-  typedef TCoordRep                                   CoordRepType;
-
-  typedef TPrecision                                  PrecisionType;
-
-  typedef PolyLineImageConstIterator<InputImageType, LineType>
-                                                      ImageLineIteratorType;
-
-  typedef Functor::MaskMuParserFunctor<PixelType>      ParserConditionFunctorType;
-  typedef typename ParserConditionFunctorType::Pointer ParserConditionFunctorPointer;
-
-  typedef std::vector<PrecisionType>                  OutputType;
-
-  OutputType Evaluate( const DataNodeType& node ) const override;
-
-  std::string GetExpression() const
-  {
-    return m_ParserConditionFunctor->GetExpression();
-  }
-
-  void SetExpression(std::string expression)
-  {
-    m_ParserConditionFunctor->SetExpression(expression);
-  }
-
-  void SetSpectralAngleReferencePixel(const PixelType& pixel)
-  {
-    m_ParserConditionFunctor->SetSpectralAngleReferencePixel(pixel);
-  }
-
-protected:
-  ParserConditionDataNodeFeatureFunction();
-  ~ParserConditionDataNodeFeatureFunction() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  ParserConditionDataNodeFeatureFunction(const Self&) = delete;
-  void operator=(const Self&) = delete;
-
-  /** ParserCondition Functor */
-  ParserConditionFunctorPointer  m_ParserConditionFunctor;
-};
-
-}
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbParserConditionDataNodeFeatureFunction.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.hxx b/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.hxx
deleted file mode 100644
index a32c38294f18b8a09a165f97bd7f347677813351..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.hxx
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbParserConditionDataNodeFeatureFunction_hxx
-#define otbParserConditionDataNodeFeatureFunction_hxx
-
-#include "otbParserConditionDataNodeFeatureFunction.h"
-
-namespace otb
-{
-
-/**
- * Constructor
- */
-template <class TImage, class TCoordRep, class TPrecision>
-ParserConditionDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>
-::ParserConditionDataNodeFeatureFunction()
-{
-  m_ParserConditionFunctor = ParserConditionFunctorType::New();
-}
-
-/**
- * Standard "PrintSelf" method
- */
-template <class TImage, class TCoordRep, class TPrecision>
-void
-ParserConditionDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>
-::PrintSelf( std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf( os, indent );
-  //os << indent << "ParserCondition : "    << m_ParserConditionFunctor << std::endl;
-}
-
-template <class TImage, class TCoordRep, class TPrecision>
-typename ParserConditionDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>
-::OutputType
- ParserConditionDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>
-::Evaluate( const DataNodeType& node ) const
-{
-  // The parser evaluation can't be const since the parser state
-  // changes at the first evaluation, but in fact we don't modify
-  // anything here.
-  // To fit with the rest of the framework, we try to keep the Evaluate
-  // function const
-  Self* _this = const_cast<Self*>(this);
-  ParserConditionFunctorType& parser = *(_this->m_ParserConditionFunctor);
-  // Ugly things over
-
-
-  const typename ImageLineIteratorType::PathType* path;
-
-  switch (node.GetNodeType())
-    {
-    case FEATURE_POINT:
-      {
-      itkExceptionMacro(<< "This DataNode type is not handle yet");
-      break;
-      }
-    case FEATURE_LINE:
-      {
-      path = node.GetLine();
-      break;
-      }
-    case FEATURE_POLYGON:
-      {
-      path = node.GetPolygonExteriorRing();
-      break;
-      }
-    default:
-      {
-      itkExceptionMacro(<< "This DataNode type is not handle yet");
-      break;
-      }
-    }
-
-  ImageLineIteratorType lineIt(this->GetInputImage(), path);
-  lineIt.GoToBegin();
-
-  double nbValidPixel = 0.;
-  double nbVisitedPixel = 0.;
-
-  while(!lineIt.IsAtEnd())
-    {
-    if(this->IsInsideBuffer(lineIt.GetIndex()))
-      {
-      if( parser(this->GetInputImage()->GetPixel(lineIt.GetIndex())) )
-        {
-        nbValidPixel += 1;
-        }
-      nbVisitedPixel += 1;
-      }
-    ++lineIt;
-    }
-
-  OutputType output;
-  if(nbVisitedPixel == 0)
-    {
-    output.push_back(static_cast<PrecisionType>(0.));
-    }
-  else
-    {
-    output.push_back(static_cast<PrecisionType>(nbValidPixel/nbVisitedPixel));
-    }
-
-  output.push_back(static_cast<PrecisionType>(nbValidPixel));
-  output.push_back(static_cast<PrecisionType>(nbVisitedPixel));
-  return output;
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Filtering/MathParser/test/CMakeLists.txt b/Modules/Filtering/MathParser/test/CMakeLists.txt
index 9f082865ac762f233a0383f097e990260d26203e..f2dbcdfd271d6eecd4f97d9e075847a7f49b85c3 100644
--- a/Modules/Filtering/MathParser/test/CMakeLists.txt
+++ b/Modules/Filtering/MathParser/test/CMakeLists.txt
@@ -23,7 +23,6 @@ otb_module_test()
 set(OTBMathParserTests
 otbMathParserTestDriver.cxx
 otbMaskMuParserFilterTest.cxx
-otbParserConditionDataNodeFeatureFunction.cxx
 otbParserTest.cxx
 otbImageListToSingleImageFilterTest.cxx
 otbBandMathImageFilter.cxx
@@ -48,32 +47,6 @@ otb_add_test(NAME bfTvMaskMuParserFilterTest COMMAND otbMathParserTestDriver
   "(b1>100)*(b2>120)"
   )
 
-otb_add_test(NAME bfTvParserConditionDataNodeFeatureFunction_Line_NDVI COMMAND otbMathParserTestDriver
-  --compare-ogr ${EPSILON_9}
-  ${BASELINE_FILES}/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp
-  ${TEMP}/bfTvParserConditionDataNodeFeatureFunction_Line_NDVI.shp
-  otbParserConditionDataNodeFeatureFunction
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
-  ${INPUTDATA}/DEM/srtm_directory
-  ${TEMP}/bfTvParserConditionDataNodeFeatureFunction_Line_NDVI.shp
-  "ndvi(b3,b4) > 0.047"
-  0
-  )
-
-otb_add_test(NAME bfTvParserConditionDataNodeFeatureFunction_Polygon_NDVI COMMAND otbMathParserTestDriver
-  --compare-ogr ${EPSILON_6}
-  ${BASELINE_FILES}/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp
-  ${TEMP}/bfTvParserConditionDataNodeFeatureFunction_Polygon_NDVI.shp
-  otbParserConditionDataNodeFeatureFunction
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
-  ${INPUTDATA}/DEM/srtm_directory
-  ${TEMP}/bfTvParserConditionDataNodeFeatureFunction_Polygon_NDVI.shp
-  "ndvi(b3,b4) > 0.047"
-  0
-  )
-
 otb_add_test(NAME coTvParser COMMAND otbMathParserTestDriver
   otbParserTest
   )
diff --git a/Modules/Filtering/MathParser/test/otbMathParserTestDriver.cxx b/Modules/Filtering/MathParser/test/otbMathParserTestDriver.cxx
index 5ef579c49abbcd1d1a033f9c42ac09072d8aad97..4f12db6c962a985a8c7a0d92e2a449f28e8aef28 100644
--- a/Modules/Filtering/MathParser/test/otbMathParserTestDriver.cxx
+++ b/Modules/Filtering/MathParser/test/otbMathParserTestDriver.cxx
@@ -23,7 +23,6 @@
 void RegisterTests()
 {
   REGISTER_TEST(otbMaskMuParserFilterTest);
-  REGISTER_TEST(otbParserConditionDataNodeFeatureFunction);
   REGISTER_TEST(otbParserTest);
   REGISTER_TEST(otbImageListToSingleImageFilter);
   REGISTER_TEST(otbBandMathImageFilter);
diff --git a/Modules/Filtering/MathParser/test/otbParserConditionDataNodeFeatureFunction.cxx b/Modules/Filtering/MathParser/test/otbParserConditionDataNodeFeatureFunction.cxx
deleted file mode 100644
index 4982b50ced444f777c2ae95ef66d2990c174319a..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MathParser/test/otbParserConditionDataNodeFeatureFunction.cxx
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-#include "otbParserConditionDataNodeFeatureFunction.h"
-
-#include "otbVectorImage.h"
-#include "otbImageFileReader.h"
-#include "otbVectorData.h"
-#include "otbVectorDataFileReader.h"
-#include "otbVectorDataIntoImageProjectionFilter.h"
-#include "otbVectorDataFileWriter.h"
-#include "itkPreOrderTreeIterator.h"
-
-
-int otbParserConditionDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[])
-{
-  const char * inputVD = argv[1];
-  const char * inputImg = argv[2];
-  const char * DEMDir = argv[3];
-  const char * outputVD = argv[4];
-  const char * expression = argv[5];
-  int DisplayWarnings = atoi(argv[6]);
-
-  typedef double CoordRepType;
-  typedef double PrecisionType;
-  typedef otb::VectorImage<PrecisionType> ImageType;
-  typedef otb::ImageFileReader<ImageType> ImageReaderType;
-  typedef otb::VectorData<CoordRepType, 2, PrecisionType> VectorDataType;
-  typedef VectorDataType::DataNodeType DataNodeType;
-  typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType;
-  typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType> VectorDataReProjFilter;
-  typedef otb::VectorDataFileWriter<VectorDataType> VectorDataWriterType;
-  typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> TreeIteratorType;
-
-  typedef otb::ParserConditionDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType>
-      ParserConditionDataNodeFeaturefunctionType;
-  typedef ParserConditionDataNodeFeaturefunctionType::OutputType ParserConditionFeatureOutputType;
-
-  ImageReaderType::Pointer imgReader = ImageReaderType::New();
-  VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New();
-  VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New();
-  VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New();
-  ParserConditionDataNodeFeaturefunctionType::Pointer
-      ParserConditionFeatureFunction = ParserConditionDataNodeFeaturefunctionType::New();
-
-  if (!DisplayWarnings)
-    {
-    imgReader->SetGlobalWarningDisplay(0);
-    }
-
-  otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDir);
-
-  vdReader->SetFileName(inputVD);
-  vdReader->Update();
-
-  imgReader->SetFileName(inputImg);
-  imgReader->UpdateOutputInformation();
-  imgReader->Update(); //Needed to set m_EndIndex, m_StartIndex in otbDataNodeImageFunction
-
-  vdReProjFilter->SetInputImage(imgReader->GetOutput());
-  vdReProjFilter->SetInputVectorData(vdReader->GetOutput());
-  vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true);
-  vdReProjFilter->Update();
-
-  ParserConditionFeatureFunction->SetExpression(expression);
-  ParserConditionFeatureFunction->SetInputImage(imgReader->GetOutput());
-
-  // Output
-  VectorDataType::Pointer outVD = VectorDataType::New();
-  // Retrieving root node
-  DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get();
-  // Create the document node
-  DataNodeType::Pointer document = DataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(document, root);
-  // Create the folder node
-  DataNodeType::Pointer folder = DataNodeType::New();
-  folder->SetNodeType(otb::FOLDER);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(folder, document);
-
-  TreeIteratorType itVector(vdReProjFilter->GetOutput()->GetDataTree());
-  itVector.GoToBegin();
-  while (!itVector.IsAtEnd())
-    {
-    if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature())
-      {
-      const DataNodeType::Pointer currentGeometry = itVector.Get();
-      ParserConditionFeatureOutputType currentResult;
-      currentResult = ParserConditionFeatureFunction->Evaluate(*(currentGeometry.GetPointer()));
-      currentGeometry->SetFieldAsDouble("NDVI", (double) (currentResult[0]));
-      outVD->GetDataTree()->Add(currentGeometry, folder);
-      }
-    ++itVector;
-    }
-
-  vdWriter->SetInput(outVD);
-  vdWriter->SetFileName(outputVD);
-  vdWriter->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/MorphologicalPyramid/CMakeLists.txt b/Modules/Filtering/MorphologicalPyramid/CMakeLists.txt
deleted file mode 100644
index fdbf5b6d47d68fab8095ce62a22602de84cc7092..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-project(OTBMorphologicalPyramid)
-otb_module_impl()
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.h
deleted file mode 100644
index b74ea6f27e557e57d9f33e79217a4170cab9d26b..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidAnalysisFilter_h
-#define otbMorphologicalPyramidAnalysisFilter_h
-
-#include "otbImageToImageListFilter.h"
-
-namespace otb
-{
-/** \class MorphologicalPyramidAnalysisFilter
- * \brief Multiscale analysis filter using the morphological pyramid algorithm.
- *
- * Pyramidal decomposition is based on the following statement : once an
- * image has been smoothed with a linear filter, it does not contain
- * any more high-frequency details. Therefore, it can be down-sampled
- * without any loss of information, according to Shannon Theorem. By
- * iterating the same smoothing on the down-sampled image, a
- * multi-resolution decomposition of the scene is
- * computed. If the smoothing filter is a morphological filter, this
- * is no longer true, as the filter is not linear. However, by keeping
- * the details possibly lost in the down-sampling operation, such a
- * decomposition can be used.
- *
- * The MorphologicalPyramidAnalysisFilter provide such a
- * decomposition. It's computation process is an iterative analyse
- * involving smoothing by the morphological filter, computing the
- * details lost in the smoothing, down-sampling the current image, and
- * computing the details lost in the down-sampling.
- *
- * \ingroup MultiScale
- * \sa MorphologicalPyramidSynthesisFilter, OpeningClosingMorphologicalFilter,
- * ClosingOpeningMorphologicalFilter
- *
- * \ingroup OTBMorphologicalPyramid
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-class ITK_EXPORT MorphologicalPyramidAnalysisFilter
-  : public ImageToImageListFilter<TInputImage, TOutputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef MorphologicalPyramidAnalysisFilter                Self;
-  typedef ImageToImageListFilter<TInputImage, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                           Pointer;
-  typedef itk::SmartPointer<const Self>                     ConstPointer;
-  /** Creation through object factory macro */
-  itkNewMacro(Self);
-  /** Type macro */
-  itkTypeMacro(MorphologicalPyramidAnalysisFilter, MorphologicalPyramidAnalysisFilter);
-  /** Input image dimension constant macro */
-  itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension);
-  /** Template parameters typedefs */
-  typedef TMorphoFilter                         MorphoFilterType;
-  typedef typename MorphoFilterType::KernelType KernelType;
-  /** Output related typedefs */
-  typedef typename Superclass::OutputImageType        OutputImageType;
-  typedef typename Superclass::OutputImageListType    OutputImageListType;
-  typedef typename OutputImageListType::Pointer       OutputImageListPointerType;
-  typedef typename Superclass::OutputImagePointerType OutputImagePointerType;
-  /** Input related typedefs */
-  typedef typename Superclass::InputImageType       InputImageType;
-  typedef typename Superclass::InputImageRegionType InputImageRegionType;
-  typedef typename InputImageType::Pointer          InputImagePointerType;
-  typedef typename InputImageType::ConstPointer     InputImageConstPointerType;
-  typedef typename InputImageType::SizeType         SizeType;
-  typedef typename InputImageType::ValueType        ValueType;
-  typedef typename InputImageType::PixelType        PixelType;
-  typedef typename InputImageType::SpacingType      SpacingType;
-  /** Accessors */
-  itkSetMacro(NumberOfLevels, int);
-  itkSetMacro(DecimationRatio, double);
-  itkGetConstReferenceMacro(NumberOfLevels, int);
-  itkGetConstReferenceMacro(DecimationRatio, double);
-  /**
-   * Get The Analyse image at each level of the pyramid.
-   * \return The analysed image at each level of the pyramid.
-   */
-  OutputImageListType* GetOutput(void) override;
-  /**
-   * Get The SupFilter details
-   * \return The brighter details extracted from the filtering operation.
-   */
-  OutputImageListType * GetSupFilter(void);
-  /**
-   * Get The InfFilter details
-   * \return The darker details extracted from the filtering operation.
-   */
-  OutputImageListType * GetInfFilter(void);
-  /**
-   * Get The SupDeci details
-   * \return The brighter details extracted from the resampling operation.
-   */
-  OutputImageListType * GetSupDeci(void);
-  /**
-   * Get The InfDeci details
-   * \return The brighter details extracted from the resampling operation.
-   */
-  OutputImageListType * GetInfDeci(void);
-
-protected:
-  /** Constructor */
-  MorphologicalPyramidAnalysisFilter();
-  /** Destructor */
-  ~MorphologicalPyramidAnalysisFilter() override;
-  void GenerateOutputInformation() override {}  // does nothing
-  /** Main computation method */
-  void GenerateData() override;
-  /** Printself method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  /** Number of levels of the algorithm */
-  int m_NumberOfLevels;
-  /** Subsampling scale used */
-  double m_DecimationRatio;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbMorphologicalPyramidAnalysisFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.hxx
deleted file mode 100644
index efa6eb0b51ea324ee4742cf7f7cc0c912dc060d3..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.hxx
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidAnalysisFilter_hxx
-#define otbMorphologicalPyramidAnalysisFilter_hxx
-
-#include "otbMorphologicalPyramidAnalysisFilter.h"
-
-#include "itkSubtractImageFilter.h"
-#include "itkMaximumImageFilter.h"
-#include "itkImageDuplicator.h"
-#include "otbMorphologicalPyramidResampler.h"
-#include "itkProgressAccumulator.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::MorphologicalPyramidAnalysisFilter()
-{
-  this->SetNumberOfRequiredOutputs(2);
-  m_DecimationRatio = 2.0;
-  m_NumberOfLevels = 4;
-  OutputImageListPointerType supFilter = OutputImageListType::New();
-  this->SetNthOutput(0, supFilter.GetPointer());
-  OutputImageListPointerType infFilter = OutputImageListType::New();
-  this->SetNthOutput(1, infFilter.GetPointer());
-  OutputImageListPointerType outputList = OutputImageListType::New();
-  this->SetNthOutput(2, outputList.GetPointer());
-  OutputImageListPointerType supDeci =   OutputImageListType::New();
-  this->SetNthOutput(3, supDeci.GetPointer());
-  OutputImageListPointerType infDeci =   OutputImageListType::New();
-  this->SetNthOutput(4, infDeci.GetPointer());
-}
-/**
- * Destructor
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::~MorphologicalPyramidAnalysisFilter() {}
-/**
- * Get The Analyse image at each level of the pyramid.
- * \return The analysed image at each level of the pyramid.
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::OutputImageListType*
-MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::GetOutput(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(2));
-}
-/**
- * Get The SupFilter details
- * \return The brighter details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::OutputImageListType*
-MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::GetSupFilter(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(0));
-}
-/**
- * Get The InfFilter details
- * \return The darker details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::OutputImageListType*
-MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::GetInfFilter(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(1));
-}
-/**
- * Get The SupDeci details
- * \return The brighter details extracted from the resampling operation.
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::OutputImageListType*
-MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::GetSupDeci(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(3));
-}
-/**
- * Get The InfDeci details
- * \return The brighter details extracted from the resampling operation.
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::OutputImageListType*
-MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::GetInfDeci(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(4));
-}
-/**
- * Main computation method
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-void
-MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::GenerateData(void)
-{
-  // Input image pointer
-  OutputImageListType * OutputImageList   = this->GetOutput();
-
-  // Output images pointers
-  OutputImageListType * supFilter = this->GetSupFilter();
-  OutputImageListType * infFilter = this->GetInfFilter();
-  OutputImageListType * supDeci = this->GetSupDeci();
-  OutputImageListType * infDeci = this->GetInfDeci();
-
-  // typedefs of the filters
-  typedef itk::SubtractImageFilter<InputImageType, InputImageType, OutputImageType> SubtractFilterType;
-  typedef itk::MaximumImageFilter<InputImageType, InputImageType, InputImageType>   MaxFilterType;
-  typedef itk::ImageDuplicator<InputImageType>                                      DuplicatorType;
-  typedef otb::MorphologicalPyramid::Resampler<InputImageType, OutputImageType>     ResamplerType;
-
-  // Input Image duplication to the currentImage Pointer
-  typename DuplicatorType::Pointer duplicator = DuplicatorType::New();
-  duplicator->SetInputImage(this->GetInput());
-  duplicator->Update();
-  typename InputImageType::Pointer currentImage = duplicator->GetOutput();
-  typename InputImageType::Pointer upsampled;
-
-  // Structuring element size computation
-  const int structElementDimension = static_cast<int>(std::ceil(this->GetDecimationRatio() / 2.));
-
-  // Structuring element creation
-  KernelType structuringElement;
-  structuringElement.SetRadius(structElementDimension);
-  structuringElement.CreateStructuringElement();
-
-  // Filters declarations
-  typename MorphoFilterType::Pointer   morphoFilter;
-  typename MaxFilterType::Pointer      max;
-  typename SubtractFilterType::Pointer subtract1, subtract2, subtract3, subtract4;
-  typename ResamplerType::Pointer      resampler1, resampler2;
-
-  // Size declaration
-  typename InputImageType::SizeType size;
-
-  // local variables declarations and initializations
-  int i = 0;
-  int sizeTmp;
-  //--------------------------------------------------------//
-  //                      Main loop                         //
-  //--------------------------------------------------------//
-  // While the number of iterations is not reached
-  otbMsgDevMacro(<< "Entering main loop");
-  while (i < this->GetNumberOfLevels())
-    {
-
-    // morphological filtering
-    morphoFilter = MorphoFilterType::New();
-    morphoFilter->SetKernel(structuringElement);
-    morphoFilter->SetInput(currentImage);
-    morphoFilter->Update();
-
-    // Maximum between current and filtered image
-    max = MaxFilterType::New();
-    max->SetInput1(morphoFilter->GetOutput());
-    max->SetInput2(currentImage);
-    max->Update();
-
-    // SupFilter detail image computation
-    subtract1 = SubtractFilterType::New();
-    subtract1->SetInput1(max->GetOutput());
-    subtract1->SetInput2(morphoFilter->GetOutput());
-    subtract1->Update();
-    otbMsgDevMacro(
-      << "MorphologicalPyramidAnalysisFilter: subtract1 OK " <<
-      subtract1->GetOutput()->GetLargestPossibleRegion().GetSize());
-    supFilter->PushBack(subtract1->GetOutput());
-    otbMsgDevMacro("MorphologicalPyramidAnalysisFilter: step " << i << " - Image appended to SupFilter");
-
-    // InfFilter detail image computation
-    subtract2 = SubtractFilterType::New();
-    subtract2->SetInput1(max->GetOutput());
-    subtract2->SetInput2(currentImage);
-    subtract2->Update();
-    otbMsgDevMacro(
-      << "MorphologicalPyramidAnalysisFilter: subtract2 OK " <<
-      subtract2->GetOutput()->GetLargestPossibleRegion().GetSize());
-    infFilter->PushBack(subtract2->GetOutput());
-    otbMsgDevMacro("MorphologicalPyramidAnalysisFilter: step " << i << " - Image appended to InfFilter");
-
-    // New  Size
-    size = morphoFilter->GetOutput()->GetLargestPossibleRegion().GetSize();
-    for (unsigned int j = 0; j < InputImageType::ImageDimension; ++j)
-      {
-      sizeTmp = size[j];
-      // As we knwow that our values will always be positive ones, we can simulate round by ceil(value+0.5)
-      size[j] = static_cast<unsigned int>(std::ceil((static_cast<double>(sizeTmp) / this->GetDecimationRatio()) + 0.5));
-      }
-    otbMsgDevMacro(<< "New size: " << size);
-
-    // Image subsampling
-    // Current image becomes the newly subsampled image
-    resampler1 = ResamplerType::New();
-    resampler1->SetInput(morphoFilter->GetOutput());
-    resampler1->SetSize(size);
-    resampler1->Update();
-    currentImage = resampler1->GetOutput();
-
-    otbMsgDevMacro(
-      << "MorphologicalPyramidAnalysisFilter: DownSampling OK " << currentImage->GetLargestPossibleRegion().GetSize());
-    // New current image is appended to the output list
-    OutputImageList->PushBack(currentImage);
-
-    // Image upsampling
-    resampler2 = ResamplerType::New();
-    resampler2->SetInput(resampler1->GetOutput());
-    resampler2->SetSize(morphoFilter->GetOutput()->GetLargestPossibleRegion().GetSize());
-    resampler2->Update();
-
-    otbMsgDevMacro(
-      << "MorphologicalPyramidAnalysisFilter: UpSampling OK " <<
-      resampler2->GetOutput()->GetLargestPossibleRegion().GetSize());
-    // Computation of the details lost in the subsampling operation
-    max = MaxFilterType::New();
-    max->SetInput1(morphoFilter->GetOutput());
-    max->SetInput2(resampler2->GetOutput());
-    max->Update();
-    otbMsgDevMacro(
-      << "MorphologicalPyramidAnalysisFilter: Max OK " << max->GetOutput()->GetLargestPossibleRegion().GetSize());
-
-    // InfDeci detail image computation
-    subtract4 = SubtractFilterType::New();
-    subtract4->SetInput1(max->GetOutput());
-    subtract4->SetInput2(morphoFilter->GetOutput());
-    subtract4->Update();
-    otbMsgDevMacro(
-      << "MorphologicalPyramidAnalysisFilter: subtract4 OK " <<
-      subtract4->GetOutput()->GetLargestPossibleRegion().GetSize());
-    infDeci->PushBack(subtract4->GetOutput());
-    otbMsgDevMacro("MorphologicalPyramidAnalysisFilter: step " << i << " - Image appended to InfDeci");
-
-    // SupDeci detail image computation
-    subtract3 = SubtractFilterType::New();
-    subtract3->SetInput1(max->GetOutput());
-    subtract3->SetInput2(resampler2->GetOutput());
-    subtract3->Update();
-    otbMsgDevMacro(
-      << "MorphologicalPyramidAnalysisFilter: subtract3 OK " <<
-      subtract3->GetOutput()->GetLargestPossibleRegion().GetSize());
-    supDeci->PushBack(subtract3->GetOutput());
-    otbMsgDevMacro("MorphologicalPyramidAnalysisFilter: step " << i << " - Image appended to SupDeci");
-
-    // Iteration ounter incrementation
-    ++i;
-    }
-  otbMsgDevMacro(<< "Exiting main loop");
-}
-/**
- * PrintSelf method
- */
-template <class TInputImage, class TOutputImage, class TMorphoFilter>
-void
-MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "DecimationRatio: " << m_DecimationRatio << std::endl;
-  os << indent << "NumberOfLevels: " << m_NumberOfLevels << std::endl;
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.h
deleted file mode 100644
index 65768b624caba0047b54cb4ced32745a59326cca..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidMRToMSConverter_h
-#define otbMorphologicalPyramidMRToMSConverter_h
-
-#include "otbImageListToImageListFilter.h"
-
-namespace otb
-{
-namespace MorphologicalPyramid
-{
-/**
- * \class MRToMSConverter
- * \brief This class convert a multi resolution decomposition from the morphological pyramid to a multi-scale one.
- *
- * This class convert a multi resolution decomposition from the morphological pyramid to a multi-scale one.
- *
- * The operation consists in iterativly upsampling and adding decimation details to a given detail image.
- *
- * \sa MorphologicalPyramidAnalyseFilter
- * \sa MorphologicalPyramidSynthesisFilter
- *
- * \ingroup OTBMorphologicalPyramid
- */
-template <class TInputImage, class TOutputImage>
-class ITK_EXPORT MRToMSConverter
-  : public ImageListToImageListFilter<TInputImage, TOutputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef MRToMSConverter                                       Self;
-  typedef ImageListToImageListFilter<TInputImage, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                               Pointer;
-  typedef itk::SmartPointer<const Self>                         ConstPointer;
-  /** Creation through object factory macro */
-  itkNewMacro(Self);
-  /** Type macro */
-  itkTypeMacro(MRToMSConverter, ImageListToImageListFilter);
-  /** Input parameters typedefs */
-  typedef TInputImage                                    InputImageType;
-  typedef typename Superclass::InputImagePointer         InputImagePointer;
-  typedef typename Superclass::InputImageListType        InputImageListType;
-  typedef typename Superclass::InputImageListPointerType InputImageListPointerType;
-  typedef typename InputImageListType::Iterator          InputImageListIteratorType;
-  /** Output parameters typedefs */
-  typedef TOutputImage                                    OutputImageType;
-  typedef typename Superclass::OutputImagePointer         OutputImagePointerType;
-  typedef typename Superclass::OutputImageListType        OutputImageListType;
-  typedef typename Superclass::OutputImageListPointerType OutputImageListPointerType;
-
-  /**
-   * Set The input list.
-   * \param imageList The analysed image at each level of the pyramid.
-   */
-  using Superclass::SetInput;
-  void SetInput(const InputImageListType * imageList) override;
-  /**
-   * Set The SupFilter details
-   * \param imageList The brighter details extracted from the filtering operation.
-   */
-  void SetSupFilter(InputImageListType * imageList);
-  /**
-   * Set The InfFilter details
-   * \param imageList The darker details extracted from the filtering operation.
-   */
-  void SetInfFilter(InputImageListType * imageList);
-  /**
-   * Set The SupDeci details
-   * \param imageList The brighter details extracted from the filtering operation.
-   */
-  void SetSupDeci(InputImageListType * imageList);
-  /**
-   * Set The InfDeci details
-   * \param imageList The darker details extracted from the filtering operation.
-   */
-  void SetInfDeci(InputImageListType * imageList);
-  /**
-   * Get the input list.
-   * \return The list of the analysed image at each pyramid level.
-   */
-  InputImageListType* GetInput(void) override;
-  /**
-   * Get The SupFilter details
-   * \return The brighter details extracted from the filtering operation.
-   */
-  InputImageListType* GetSupFilter(void);
-  /**
-   * Get The InfFilter details
-   * \return The darker details extracted from the filtering operation.
-   */
-  InputImageListType* GetInfFilter(void);
-  /**
-   * Get The SupDeci details
-   * \return The brighter details extracted from the resampling operation.
-   */
-  InputImageListType* GetSupDeci(void);
-  /**
-   * Get The InfDeci details
-   * \return The brighter details extracted from the resampling operation.
-   */
-  InputImageListType* GetInfDeci(void);
-  /**
-   * Get The inputList at full resolution.
-   * \return The analysed image at each pyramid level
-   * resampled at full resolution.
-   */
-  OutputImageListType* GetOutput(void) override;
-  /**
-   * Get The SupFilter details at full resolution.
-   * \return The brighter details extracted from the filtering operation
-   * resampled at full resolution.
-   */
-  OutputImageListType * GetSupFilterFullResolution(void);
-  /**
-   * Get The InfFilter details at full resolution.
-   * \return The darker details extracted from the filtering operation
-   * resampled at full resolution.
-   */
-  OutputImageListType * GetInfFilterFullResolution(void);
-  /**
-   * Get The SupDeci details at full resolution.
-   * \return The brighter details extracted from the resampling operation
-   * resampled at full resolution.
-   */
-  OutputImageListType * GetSupDeciFullResolution(void);
-  /**
-   * Get The InfDeci details at full resolution.
-   * \return The darker details extracted from the resampling operation
-   * resampled at full resolution.
-   */
-  OutputImageListType * GetInfDeciFullResolution(void);
-
-protected:
-  /** Constructor */
-  MRToMSConverter();
-  /** Destructor */
-  ~MRToMSConverter() override {}
-
-  /** Main computation method */
-  void GenerateData() override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  MRToMSConverter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace MorphologicalPyramid
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbMorphologicalPyramidMRToMSConverter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.hxx
deleted file mode 100644
index 51f9ff57e667d987d420a3a02d2c8a120da27e46..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.hxx
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidMRToMSConverter_hxx
-#define otbMorphologicalPyramidMRToMSConverter_hxx
-
-#include "otbMorphologicalPyramidMRToMSConverter.h"
-#include "otbMorphologicalPyramidResampler.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-namespace MorphologicalPyramid
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputImage>
-MRToMSConverter<TInputImage, TOutputImage>
-::MRToMSConverter()
-{
-  this->SetNumberOfRequiredInputs(2);
-  this->SetNumberOfRequiredOutputs(2);
-  OutputImageListPointerType supFilter = OutputImageListType::New();
-  this->SetNthOutput(0, supFilter.GetPointer());
-  OutputImageListPointerType infFilter = OutputImageListType::New();
-  this->SetNthOutput(1, infFilter.GetPointer());
-  OutputImageListPointerType outputList = OutputImageListType::New();
-  this->SetNthOutput(2, outputList.GetPointer());
-  OutputImageListPointerType supDeci =   OutputImageListType::New();
-  this->SetNthOutput(3, supDeci.GetPointer());
-  OutputImageListPointerType infDeci =   OutputImageListType::New();
-  this->SetNthOutput(4, infDeci.GetPointer());
-}
-/**
- * Get The inputList at full resolution.
- * \return The analysed image at each pyramid level
- * resampled at full resolution.
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::OutputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetOutput(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(2));
-}
-/**
- * Get The SupFilter details at full resolution.
- * \return The brighter details extracted from the filtering operation.
- * resampled at full resolution.
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::OutputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetSupFilterFullResolution(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(0));
-}
-/**
- * Get The InfFilter details at full resolution.
- * \return The darker details extracted from the filtering operation.
- * resampled at full resolution.
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::OutputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetInfFilterFullResolution(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(1));
-}
-/**
- * Get The SupDeci details at full resolution.
- * \return The brighter details extracted from the resampling operation.
- * resampled at full resolution.
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::OutputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetSupDeciFullResolution(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(3));
-}
-/**
- * Get The InfDeci details  at full resolution.
- * \return The brighter details extracted from the resampling operation.
- * resampled at full resolution.
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::OutputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetInfDeciFullResolution(void)
-{
-  return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(4));
-}
-/**
- * Set The input list.
- * \param imageList The analysed image at each level of the pyramid.
- */
-template <class TInputImage, class TOutputImage>
-void
-MRToMSConverter<TInputImage, TOutputImage>
-::SetInput(const InputImageListType * imageList)
-{
-  this->SetNthInput(2, const_cast<InputImageListType *>(imageList));
-}
-/**
- * Set The SupFilter details
- * \param imageList The brighter details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-void
-MRToMSConverter<TInputImage, TOutputImage>
-::SetSupFilter(InputImageListType * imageList)
-{
-  this->SetNthInput(0, const_cast<InputImageListType *>(imageList));
-}
-/**
- * Set The InfFilter details
- * \param imageList The darker details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-void
-MRToMSConverter<TInputImage, TOutputImage>
-::SetInfFilter(InputImageListType * imageList)
-{
-  this->SetNthInput(1, const_cast<InputImageListType *>(imageList));
-}
-/**
- * Set The SupDeci details
- * \param imageList The brighter details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-void
-MRToMSConverter<TInputImage, TOutputImage>
-::SetSupDeci(InputImageListType * imageList)
-{
-  this->SetNthInput(3, const_cast<InputImageListType *>(imageList));
-}
-/**
- * Set The InfDeci details
- * \param imageList The darker details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-void
-MRToMSConverter<TInputImage, TOutputImage>
-::SetInfDeci(InputImageListType * imageList)
-{
-  this->SetNthInput(4, const_cast<InputImageListType *>(imageList));
-}
-/**
- * Get the input list.
- * \return The list of the analysed image at each pyramid level.
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::InputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetInput(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(2));
-}
-/**
- * Get The SupFilter details.
- * \return The brighter details extracted from the filtering operation
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::InputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetSupFilter(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(0));
-}
-/**
- * Get The InfFilter details.
- * \return The darker details extracted from the filtering operation
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::InputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetInfFilter(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(1));
-}
-/**
- * Get The SupDeci details.
- * \return The brighter details extracted from the resampling operation
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::InputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetSupDeci(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(3));
-}
-/**
- * Get The InfDeci details.
- * \return The darker details extracted from the resampling operation.
- */
-template <class TInputImage, class TOutputImage>
-typename MRToMSConverter<TInputImage, TOutputImage>
-::InputImageListType*
-MRToMSConverter<TInputImage, TOutputImage>
-::GetInfDeci(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(4));
-}
-/**
- * Main computation method
- */
-template <class TInputImage, class TOutputImage>
-void
-MRToMSConverter<TInputImage, TOutputImage>
-::GenerateData()
-{
-  // Input images lists pointers
-  InputImageListPointerType supFilter = this->GetSupFilter();
-  InputImageListPointerType infFilter = this->GetInfFilter();
-  InputImageListPointerType supDeci = this->GetSupDeci();
-  InputImageListPointerType infDeci = this->GetInfDeci();
-  InputImageListPointerType inputList = this->GetInput();
-
-  // Output images lists pointers
-  OutputImageListPointerType supFilterFullResolution = this->GetSupFilterFullResolution();
-  OutputImageListPointerType infFilterFullResolution = this->GetInfFilterFullResolution();
-  OutputImageListPointerType supDeciFullResolution = this->GetSupDeciFullResolution();
-  OutputImageListPointerType infDeciFullResolution = this->GetInfDeciFullResolution();
-  OutputImageListPointerType outputList = this->GetOutput();
-
-  // typedef of the resampling filter
-  typedef otb::MorphologicalPyramid::Resampler<InputImageType, OutputImageType> ResamplerType;
-
-  // Definition of the resampler filters
-  typename ResamplerType::Pointer resampler;
-
-  // Full resolution size
-  typename InputImageType::SizeType frsize = supFilter->Front()->GetLargestPossibleRegion().GetSize();
-  otbMsgDevMacro(<< "MRToMSConverter: Full resolution size: " << frsize);
-
-  // SupFilter resampling
-  otbMsgDevMacro(<< "MRToMSConverter: SupFilter resampling.");
-  InputImageListIteratorType it = supFilter->Begin();
-  // The first image does not need any resampling
-  supFilterFullResolution->PushBack(it.Get());
-  ++it;
-  for (; it != supFilter->End(); ++it)
-    {
-    resampler = ResamplerType::New();
-    resampler->SetSize(frsize);
-    resampler->SetInput(it.Get());
-    resampler->Update();
-    supFilterFullResolution->PushBack(resampler->GetOutput());
-    }
-  otbMsgDevMacro(<< "MRToMSConverter: InfFilter resampling.");
-  // InfFilter resampling
-  it = infFilter->Begin();
-  // The first image does not need any resampling
-  infFilterFullResolution->PushBack(it.Get());
-  ++it;
-  for (; it != infFilter->End(); ++it)
-    {
-    resampler = ResamplerType::New();
-    resampler->SetSize(frsize);
-    resampler->SetInput(it.Get());
-    resampler->Update();
-    infFilterFullResolution->PushBack(resampler->GetOutput());
-    }
-
-  if (inputList)
-    {
-    otbMsgDevMacro(<< "MRToMSConverter: Optional inputList resampling.");
-    // Analyse image resampling
-    it = inputList->Begin();
-    // The first image does not need any resampling
-    outputList->PushBack(it.Get());
-    ++it;
-    for (; it != inputList->End(); ++it)
-      {
-      resampler = ResamplerType::New();
-      resampler->SetSize(frsize);
-      resampler->SetInput(it.Get());
-      resampler->Update();
-      outputList->PushBack(resampler->GetOutput());
-      }
-    }
-
-  if (supDeci)
-    {
-    otbMsgDevMacro(<< "MRToMSConverter: Optional supDeci resampling.");
-    // SupDeci resampling
-    it = supDeci->Begin();
-    // The first image does not need any resampling
-    supDeciFullResolution->PushBack(it.Get());
-    ++it;
-    for (; it != supDeci->End(); ++it)
-      {
-      resampler = ResamplerType::New();
-      resampler->SetSize(frsize);
-      resampler->SetInput(it.Get());
-      resampler->Update();
-      supDeciFullResolution->PushBack(resampler->GetOutput());
-      }
-    }
-
-  if (infDeci)
-    {
-    otbMsgDevMacro(<< "MRToMSConverter: Optional infDeci resampling.");
-    // InfDeci resampling
-    it = infDeci->Begin();
-    // The first image does not need any resampling
-    infDeciFullResolution->PushBack(it.Get());
-    ++it;
-    for (; it != infDeci->End(); ++it)
-      {
-      resampler = ResamplerType::New();
-      resampler->SetSize(frsize);
-      resampler->SetInput(it.Get());
-      resampler->Update();
-      infDeciFullResolution->PushBack(resampler->GetOutput());
-      }
-    }
-}
-/**
- * PrintSelf method
- */
-template <class TInputImage, class TOutputImage>
-void
-MRToMSConverter<TInputImage, TOutputImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace MorphologicalPyramid
-} // End namespace otb
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.h
deleted file mode 100644
index 7ce6013ba36c5a2a8b28627f6135a13ea942abfa..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidResampler_h
-#define otbMorphologicalPyramidResampler_h
-
-#include "itkImageToImageFilter.h"
-
-namespace otb
-{
-namespace MorphologicalPyramid
-{
-/**
- * \class Resampler
- * \brief This class performs the resampling of the given image to the given size.
- *
- * This class performs the resampling of the given image to the given size.It is used
- * in the MorphologicalPyramidAnalyseFilter and MorphologicalPyramidSynthesisFilter.
- *
- * The resampling is done by the itk::ResampleImageFilter, templated with the interpolator
- * itk::LinearInterpolateImageFunction and the transform itk::ScaleTransform.
- *
- * \sa MorphologicalPyramidAnalyseFilter
- * \sa MorphologicalPyramidSynthesisFilter
- * \sa ResampleImageFilter
- * \sa LinearInterpolateImageFunction
- * \sa ScaleTransform
- *
- * \ingroup OTBMorphologicalPyramid
- */
-template <class TInputImage, class TOutputImage>
-class ITK_EXPORT Resampler
-  : public itk::ImageToImageFilter<TInputImage, TOutputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef Resampler                                          Self;
-  typedef itk::ImageToImageFilter<TInputImage, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                            Pointer;
-  typedef itk::SmartPointer<const Self>                      ConstPointer;
-  /** Creation through object factory macro */
-  itkNewMacro(Self);
-  /** Type macro */
-  itkTypeMacro(Resampler, ImageToImageFilter);
-  /** Template parameters typedefs */
-  typedef TInputImage                           InputImageType;
-  typedef TOutputImage                          OutputImageType;
-  typedef typename OutputImageType::Pointer     OutputImagePointer;
-  typedef typename InputImageType::Pointer      InputImagePointer;
-  typedef typename OutputImageType::RegionType  OutputImageRegionType;
-  typedef typename TInputImage::PixelType       PixelType;
-  typedef typename InputImageType::ConstPointer InputImageConstPointer;
-  typedef typename OutputImageType::SizeType    SizeType;
-  typedef typename OutputImageType::SpacingType SpacingType;
-  /** Size parameter accessor */
-  itkSetMacro(Size, SizeType);
-  itkGetMacro(Size, SizeType);
-
-protected:
-  /** Constructor */
-  Resampler();
-  /** Destructor */
-  ~Resampler() override {}
-  /** Generate output information */
-  void GenerateOutputInformation() override;
-  /** Configure input requested region to be the largest possible region */
-  void GenerateInputRequestedRegion() override;
-  /** Configure output requested region to be the largest possible region */
-  void EnlargeOutputRequestedRegion(itk::DataObject * itkNotUsed(output)) override;
-  /** Main computation method */
-  void GenerateData() override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-private:
-  Resampler(const Self &) = delete;
-  void operator =(const Self&) = delete;
-  /// Output image size
-  SizeType m_Size;
-};
-} // End namespace MorphologicalPyramid
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbMorphologicalPyramidResampler.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.hxx
deleted file mode 100644
index 97cbf4a3c122c794ba8e2b735c49ff8ca3f64d79..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.hxx
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidResampler_hxx
-#define otbMorphologicalPyramidResampler_hxx
-#include "otbMorphologicalPyramidResampler.h"
-#include "itkResampleImageFilter.h"
-#include "itkScalableAffineTransform.h"
-#include "itkNearestNeighborInterpolateImageFunction.h"
-#include "itkProgressAccumulator.h"
-
-namespace otb
-{
-namespace MorphologicalPyramid
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputImage>
-Resampler<TInputImage, TOutputImage>
-::Resampler()
-{
-  for (unsigned int i = 0; i < InputImageType::ImageDimension; ++i)
-    {
-    m_Size[i] = 0;
-    }
-}
-/**
- * Configure input requested region to be the largest possible region.
- */
-template <class TInputImage, class TOutputImage>
-void
-Resampler<TInputImage, TOutputImage>
-::GenerateInputRequestedRegion()
-{
-  // Superclass method call
-  Superclass::GenerateInputRequestedRegion();
-  // Input and output image pointers retrieval
-  InputImagePointer  inputPtr = const_cast<InputImageType *> (this->GetInput());
-  OutputImagePointer outputPtr = this->GetOutput();
-  // If the pointers are not correct
-  if (!inputPtr || !outputPtr)
-    {
-    // exit
-    return;
-    }
-  // else
-  // Configure input requested region to be the largest possible region
-  inputPtr->SetRequestedRegion(inputPtr->GetLargestPossibleRegion());
-}
-/**
- * Configure output requested region to be the largest possible region
- */
-template <class TInputImage, class TOutputImage>
-void
-Resampler<TInputImage, TOutputImage>
-::EnlargeOutputRequestedRegion(itk::DataObject *itkNotUsed(output))
-{
-  this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
-}
-/**
- * Generate output information
- */
-template <class TInputImage, class TOutputImage>
-void
-Resampler<TInputImage, TOutputImage>
-::GenerateOutputInformation()
-{
-  // Superclass method call
-  Superclass::GenerateOutputInformation();
-  // Input and output image pointers retrieval
-  InputImageConstPointer inputPtr  = this->GetInput();
-  OutputImagePointer     outputPtr = this->GetOutput();
-  // If the pointers are not correct
-  if (!inputPtr || !outputPtr)
-    {
-    // exit
-    return;
-    }
-  unsigned int i;
-  // Computing output spacing, size and index from input data
-  const typename InputImageType::SpacingType& inputSpacing    = inputPtr->GetSignedSpacing();
-  const typename InputImageType::IndexType&   inputStartIndex = inputPtr->GetLargestPossibleRegion().GetIndex();
-  typename OutputImageType::IndexType         outputStartIndex;
-  typename OutputImageType::SpacingType       spacing;
-  for (i = 0; i < OutputImageType::ImageDimension; ++i)
-    {
-    outputStartIndex[i] =  inputStartIndex[i];
-    }
-
-  outputPtr->SetSignedSpacing(inputSpacing);
-  typename OutputImageType::RegionType outputLargestPossibleRegion;
-  outputLargestPossibleRegion.SetSize(this->GetSize());
-  outputLargestPossibleRegion.SetIndex(outputStartIndex);
-  outputPtr->SetLargestPossibleRegion(outputLargestPossibleRegion);
-}
-/**
- * Main computation method
- */
-template <class TInputImage, class TOutputImage>
-void
-Resampler<TInputImage, TOutputImage>
-::GenerateData()
-{
-  typename OutputImageType::Pointer result;
-
-  // Filters typedefs
-  typedef itk::ResampleImageFilter<InputImageType, OutputImageType>   ResampleFilterType;
-  typedef itk::ScalableAffineTransform<double, InputImageType::ImageDimension> TransformType;
-  typedef itk::LinearInterpolateImageFunction<InputImageType, double> InterpolatorType;
-
-  // Resampling filter creation
-  typename ResampleFilterType::Pointer resampler = ResampleFilterType::New();
-  typename InterpolatorType::Pointer   interpolator = InterpolatorType::New();
-  typename TransformType::Pointer      transform = TransformType::New();
-
-  // Scale parameters computation
-  typename TransformType::InputVectorType scales;
-  typename InputImageType::SizeType    inputSize = this->GetInput()->GetLargestPossibleRegion().GetSize();
-  typename InputImageType::SpacingType inputSpacing = this->GetInput()->GetSignedSpacing();
-  scales[0] = static_cast<double>(inputSize[0]) / static_cast<double>(m_Size[0]);
-  scales[1] = static_cast<double>(inputSize[1]) / static_cast<double>(m_Size[1]);
-  transform->SetScale(scales);
-  transform->SetCenter(this->GetInput()->GetOrigin());
-  typename TransformType::OutputVectorType translation;
-  translation[0] = 0.5 * inputSpacing[0] * (scales[0] - 1.0);
-  translation[1] = 0.5 * inputSpacing[1] * (scales[1] - 1.0);
-  transform->SetTranslation(translation);
-
-
-  // Resampling filter set up
-  resampler->SetTransform(transform);
-  resampler->SetInterpolator(interpolator);
-  resampler->SetOutputOrigin(this->GetInput()->GetOrigin());
-  resampler->SetSize(this->GetSize());
-  resampler->SetOutputSpacing( this->GetInput()->GetSpacing() );
-  resampler->SetOutputDirection( this->GetInput()->GetDirection() );
-  resampler->ReleaseDataFlagOn();
-
-  // Progress accumulator
-  itk::ProgressAccumulator::Pointer progress = itk::ProgressAccumulator::New();
-  progress->SetMiniPipelineFilter(this);
-  progress->RegisterInternalFilter(resampler, .5f);
-
-  // Input image connexion
-  resampler->SetInput(this->GetInput());
-  resampler->Update();
-  result = resampler->GetOutput();
-
-  /** Output filter connexion */
-  this->GraftOutput(result);
-}
-/**
- * PrintSelf method
- */
-template <class TInputImage, class TOutputImage>
-void
-Resampler<TInputImage, TOutputImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "Size: " << m_Size << std::endl;
-}
-} // End namespace MorphologicalPyramid
-} // End namespace otb
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h
deleted file mode 100644
index ea999b2a6d399ac17c860be768c528f5166feff2..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidSegmentationFilter_h
-#define otbMorphologicalPyramidSegmentationFilter_h
-
-#include "otbImageListToImageListFilter.h"
-namespace otb
-{
-/** \class MorphologicalPyramidSegmentationFilter
- * \brief This filter performs a segmentation of the details supFilter and infFilter extracted
- * with the morphological pyramid.
- *
- * The first step is to convert the multi-resolution analysis from the pyramid to a multi-scale one using the
- * MRToMSConverter filter.
- *
- * The segmentation algorithm used is based on seeds extraction using the ImageToPointSetFilter, followed by
- * a connected threshold segmentation using the ConnectedThresholdImageFilter. A final relabelling step is done
- * with the LabelImageFilter and RelabelImageFilter to remove object whose sizes are to small regarding the
- * MinimumObjectSize parameter. The threshold for seeds extraction and segmentation are computed using quantiles.
- *
- * A pre processing step is applied by multiplying the full resolution brighter details (resp. darker details)
- * with the original image (resp. the inverted original image). This performs an enhancement of the regions contour
- * precision.
- *
- * The details from the pyramid are set via the SetBrighterDetails() and SetDarkerDetails() methods. The brighter and
- * darker details depends on the filter used in the pyramid analysis. If the OpeningClosing filter is used, then the
- * brighter details are those from the supFilter image list, whereas if the ClosingOpening filter is used, the brighter
- * details are those from the infFilter list.
- *
- * The output of the segmentation filter is a single segmentation images list, containing first the brighter details
- * segmentation from higher scale to lower, and then the darker details in the same order. The attention of the used
- * is drawn to the fact that since the label filter used internally will deal with a large number of labels, so the
- * OutputPixelType is required to be sufficiently precise. Unsigned short or Unsigned long would be a good choice,
- * unless the user has a very good reason to think that a less precise type will be sufficient.
- *
- * \ingroup MultiScale
- * \sa MorphologicalPyramidSynthesisFilter, OpeningClosingMorphologicalFilter,
- * ClosingOpeningMorphologicalFilter, Segmenter, MRToMSConverter, Resampler
- *
- * \ingroup OTBMorphologicalPyramid
- */
-template <class TInputImage, class TOutputImage>
-class ITK_EXPORT MorphologicalPyramidSegmentationFilter
-  : public ImageListToImageListFilter<TInputImage, TOutputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef MorphologicalPyramidSegmentationFilter                Self;
-  typedef ImageListToImageListFilter<TInputImage, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                               Pointer;
-  typedef itk::SmartPointer<const Self>                         ConstPointer;
-  /** Creation through object factory macro */
-  itkNewMacro(Self);
-  /** Type macro */
-  itkTypeMacro(MorphologicalPyramidSegmentationFilter, ImageListToImageListFilter);
-  /** Input image dimension constant macro */
-  itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension);
-  /** Output related typedefs */
-  typedef typename Superclass::OutputImageType        OutputImageType;
-  typedef typename OutputImageType::PixelType         OutputPixelType;
-  typedef typename Superclass::OutputImageListType    OutputImageListType;
-  typedef typename OutputImageListType::Pointer       OutputImageListPointerType;
-  typedef typename Superclass::OutputImagePointerType OutputImagePointerType;
-  typedef typename OutputImageListType::Iterator      OutputImageListIteratorType;
-  /** Input related typedefs */
-  typedef typename Superclass::InputImageType     InputImageType;
-  typedef typename InputImageType::PixelType      InputPixelType;
-  typedef typename InputImageType::Pointer        InputImagePointerType;
-  typedef typename Superclass::InputImageListType InputImageListType;
-  typedef typename InputImageListType::Pointer    InputImageListPointerType;
-  /** Vector of number of objects */
-  typedef std::vector<OutputPixelType> NumberOfObjectsVectorType;
-  /** Min object size parameter accessor */
-  itkSetMacro(MinimumObjectSize, unsigned long);
-  itkGetMacro(MinimumObjectSize, unsigned long);
-  /** Quantile for seeds extraction */
-  itkSetMacro(SeedsQuantile, double);
-  itkGetMacro(SeedsQuantile, double);
-  /** Quantile for connected thresholding */
-  itkSetMacro(ConnectedThresholdQuantile, double);
-  itkGetMacro(ConnectedThresholdQuantile, double);
-  /**
-   * Get a vector containing the number of segmented objects for each image.
-   * \return The vector.
-   */
-  NumberOfObjectsVectorType GetNumberOfObjectsVector(void);
-  /**
-   * Set the reference image.
-   * \param image The reference image which was decomposed by the pyramid.
-   */
-  void SetReferenceImage(InputImageType * image);
-  /**
-   * Set the brighter details from the pyramid. The brighter details are the supFilter or
-   * infFilter details from the pyramid, depending on the morphological filter used.
-   * \param imageList The brighter details extracted from the filtering operation.
-   */
-  void SetBrighterDetails(InputImageListType * imageList);
-  /**
-   * Set the darker details from the pyramid. The darker details are the supFilter or
-   * infFilter details from the pyramid, depending on the morphological filter used.
-   * \param imageList The darker details extracted from the filtering operation.
-   */
-  void SetDarkerDetails(InputImageListType * imageList);
-  /**
-   * Get the reference image
-   * \return The reference image.
-   */
-  InputImageType* GetReferenceImage(void);
-  /**
-   * Get the brighter details from the pyramid. The brighter details are the supFilter or
-   * infFilter details from the pyramid, depending on the morphological filter used.
-   * \return The brighter details extracted from the resampling operation.
-   */
-  InputImageListType* GetBrighterDetails(void);
-  /**
-   * Get the darker details from the pyramid. The darker details are the supFilter or
-   * infFilter details from the pyramid, depending on the morphological filter used.
-   * \return The darker details extracted from the resampling operation.
-   */
-  InputImageListType *GetDarkerDetails(void);
-
-protected:
-  /** Constructor */
-  MorphologicalPyramidSegmentationFilter();
-  /** Destructor */
-  ~MorphologicalPyramidSegmentationFilter() override;
-  void GenerateOutputInformation() override {}  // does nothing
-  /** Main computation method */
-  void GenerateData() override;
-  /** Printself method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-private:
-  unsigned long m_MinimumObjectSize;
-  /** Quantile for seeds determination */
-  double m_SeedsQuantile;
-  /** Quantile to set the connectedThresholdFilter threshold */
-  double m_ConnectedThresholdQuantile;
-  /** Number of segmented objects per images */
-  NumberOfObjectsVectorType m_NumberOfObjectsVector;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbMorphologicalPyramidSegmentationFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.hxx
deleted file mode 100644
index eab84021facc5864d3204878b836da3088359f84..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.hxx
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidSegmentationFilter_hxx
-#define otbMorphologicalPyramidSegmentationFilter_hxx
-
-#include "otbMorphologicalPyramidSegmentationFilter.h"
-
-#include "otbMorphologicalPyramidMRToMSConverter.h"
-#include "otbMorphologicalPyramidSegmenter.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputImage>
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::MorphologicalPyramidSegmentationFilter()
-{
-  this->SetNumberOfRequiredInputs(3);
-  m_MinimumObjectSize = 10;
-  m_SeedsQuantile = 0.9;
-  m_ConnectedThresholdQuantile = 0.9;
-}
-/**
- * Destructor
- */
-template <class TInputImage, class TOutputImage>
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::~MorphologicalPyramidSegmentationFilter() {}
-
-/**
- * Set the reference image.
- * \param image The reference image which was decomposed by the pyramid.
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::SetReferenceImage(InputImageType * image)
-{
-  this->SetNthInput(0, const_cast<InputImageType *>(image));
-}
-/**
- * Set the brighter details from the pyramid. The brighter details are the supFilter or
- * infFilter details from the pyramid, depending on the morphological filter used.
- * \param imageList The brighter details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::SetBrighterDetails(InputImageListType * imageList)
-{
-  this->SetNthInput(1, const_cast<InputImageListType *>(imageList));
-}
-/**
- * Set the darker details from the pyramid. The darker details are the supFilter or
- * infFilter details from the pyramid, depending on the morphological filter used.
- * \param imageList The darker details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::SetDarkerDetails(InputImageListType * imageList)
-{
-  this->SetNthInput(2, const_cast<InputImageListType *>(imageList));
-}
-/**
- * Get the reference image
- * \return The reference image.
- */
-template <class TInputImage, class TOutputImage>
-typename MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::InputImageType*
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::GetReferenceImage(void)
-{
-  return dynamic_cast<InputImageType *>(this->itk::ProcessObject::GetInput(0));
-}
-/**
- * Get the brighter details from the pyramid. The brighter details are the supFilter or
- * infFilter details from the pyramid, depending on the morphological filter used.
- * \param imageList The brighter details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-typename MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::InputImageListType*
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::GetBrighterDetails(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(1));
-}
-/**
- * Get the darker details from the pyramid. The darker details are the supFilter or
- * infFilter details from the pyramid, depending on the morphological filter used.
- * \return The darker details extracted from the resampling operation.
- */
-template <class TInputImage, class TOutputImage>
-typename MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::InputImageListType*
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::GetDarkerDetails(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(2));
-}
-
-/**
- * Get a vector containing the number of segmented objects for each image.
- * \return The vector.
- */
-template <class TInputImage, class TOutputImage>
-typename MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::NumberOfObjectsVectorType
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::GetNumberOfObjectsVector(void)
-{
-  return m_NumberOfObjectsVector;
-}
-/**
- * Main computation method
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::GenerateData(void)
-{
-  // Reference image pointer
-  InputImagePointerType referenceImage = this->GetReferenceImage();
-  otbMsgDevMacro("SegmentationFilter: reference image size: " << referenceImage->GetLargestPossibleRegion().GetSize());
-
-  // Output images list pointer
-  OutputImageListPointerType outputList = this->GetOutput();
-
-  // Multi resolution to multi scale filter typedef
-  typedef otb::MorphologicalPyramid::MRToMSConverter<InputImageType, InputImageType> MRToMSConverterType;
-
-  // Segmentation filter typedef
-  typedef otb::MorphologicalPyramid::Segmenter<InputImageType, OutputImageType> SegmenterType;
-
-  // MR To MS conversion
-  typename MRToMSConverterType::Pointer mrtoms = MRToMSConverterType::New();
-  mrtoms->SetSupFilter(this->GetBrighterDetails());
-  mrtoms->SetInfFilter(this->GetDarkerDetails());
-  mrtoms->Update();
-
-  // Full resolution Input images lists pointers
-  InputImageListPointerType brighter = mrtoms->GetSupFilterFullResolution();
-  InputImageListPointerType darker = mrtoms->GetInfFilterFullResolution();
-
-  // Segmentation filter definition
-  typename InputImageListType::Iterator it;
-  // Segment the supFilter details
-  for (it = brighter->Begin(); it != brighter->End(); ++it)
-    {
-    typename SegmenterType::Pointer segmenter = SegmenterType::New();
-    segmenter->SetMinimumObjectSize(m_MinimumObjectSize);
-    segmenter->SetSeedsQuantile(m_SeedsQuantile);
-    segmenter->SetConnectedThresholdQuantile(m_ConnectedThresholdQuantile);
-    segmenter->SetOriginalImage(referenceImage);
-    segmenter->SetDetailsImage(it.Get());
-    segmenter->Update();
-    m_NumberOfObjectsVector.push_back(segmenter->GetNumberOfObjects());
-    outputList->PushBack(segmenter->GetOutput());
-    }
-
-  // Segment the infFilter details
-  for (it = darker->Begin(); it != darker->End(); ++it)
-    {
-    typename SegmenterType::Pointer segmenter = SegmenterType::New();
-    segmenter->SetMinimumObjectSize(m_MinimumObjectSize);
-    segmenter->SetSeedsQuantile(m_SeedsQuantile);
-    segmenter->SetConnectedThresholdQuantile(m_ConnectedThresholdQuantile);
-    segmenter->SetOriginalImage(referenceImage);
-    segmenter->SetSegmentDarkDetailsBool(true);
-
-    segmenter->SetDetailsImage(it.Get());
-    segmenter->Update();
-    m_NumberOfObjectsVector.push_back(segmenter->GetNumberOfObjects());
-    outputList->PushBack(segmenter->GetOutput());
-    }
-}
-/**
- * PrintSelf method
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h
deleted file mode 100644
index 873ee46da44eab0b49cf18fef11e36406b55c3e2..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidSegmenter_h
-#define otbMorphologicalPyramidSegmenter_h
-
-#include "itkImageToImageFilter.h"
-
-namespace otb
-{
-namespace MorphologicalPyramid
-{
-/**
- * \class Segmenter
- * \brief This class performs the segmentation of a detail image extracted from a
- * morphological pyramid analysis.
- *
- * This class performs the segmentation of a detail image extracted from a
- * morphological pyramid analysis.
- *
- * The Segmentation is performed using the ConnectedThresholdImageFilter. The seeds
- * are extracted from the image using the ImageToPointSetFilter. The thresolds are set
- * by using quantiles computed with the HistogramGenerator.
- *
- * \sa MorphologicalPyramidAnalyseFilter
- * \sa MorphologicalPyramidSynthesisFilter
- * \sa ResampleImageFilter
- * \sa LinearInterpolateImageFunction
- * \sa ScaleTransform
- *
- * \ingroup OTBMorphologicalPyramid
- */
-template <class TInputImage, class TOutputImage>
-class ITK_EXPORT Segmenter
-  : public itk::ImageToImageFilter<TInputImage, TOutputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef Segmenter                                          Self;
-  typedef itk::ImageToImageFilter<TInputImage, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                            Pointer;
-  typedef itk::SmartPointer<const Self>                      ConstPointer;
-  /** Creation through object factory macro */
-  itkNewMacro(Self);
-  /** Type macro */
-  itkTypeMacro(Segmenter, ImageToImageFilter);
-  /** Template parameters typedefs */
-  typedef TInputImage                           InputImageType;
-  typedef typename InputImageType::PixelType    InputPixelType;
-  typedef typename InputImageType::Pointer      InputImagePointerType;
-  typedef TOutputImage                          OutputImageType;
-  typedef typename OutputImageType::Pointer     OutputImagePointerType;
-  typedef typename OutputImageType::PixelType   OutputPixelType;
-  typedef typename OutputImageType::RegionType  OutputImageRegionType;
-  typedef typename OutputImageType::SizeType    SizeType;
-  typedef typename OutputImageType::SpacingType SpacingType;
-
-  /** ImageDimension constants */
-  itkStaticConstMacro(DetailsImageDimension, unsigned int,
-                      TInputImage::ImageDimension);
-  itkStaticConstMacro(OriginalImageDimension, unsigned int,
-                      TInputImage::ImageDimension);
-  itkStaticConstMacro(OutputImageDimension, unsigned int,
-                      TOutputImage::ImageDimension);
-  /**
-   * Set the details image.
-   * \param detailsImage The details image from the morphological pyramid
-   */
-  void SetDetailsImage(const InputImageType * detailsImage);
-  /**
-   * Get the details image.
-   * \return detailsImage The input details image.
-   */
-  InputImageType * GetDetailsImage(void);
-  /**
-   * Set the original image.
-   * \param originalImage The original image to segment.
-   */
-  void SetOriginalImage(const InputImageType * originalImage);
-  /**
-   * Get the original image.
-   * \return originalImage The original image to segment.
-   */
-  InputImageType * GetOriginalImage(void);
-
-  /** Min object size parameter accessor */
-  itkSetMacro(MinimumObjectSize, unsigned long);
-  itkGetMacro(MinimumObjectSize, unsigned long);
-  /** Quantile for seeds extraction */
-  itkSetMacro(SeedsQuantile, double);
-  itkGetMacro(SeedsQuantile, double);
-  /** Quantile for connected thresholding */
-  itkSetMacro(ConnectedThresholdQuantile, double);
-  itkGetMacro(ConnectedThresholdQuantile, double);
-  /** Toogle the darker detail segmentation */
-  itkSetMacro(SegmentDarkDetailsBool, bool);
-  itkGetMacro(SegmentDarkDetailsBool, bool);
-  itkBooleanMacro(SegmentDarkDetailsBool);
-  /** Get the number of segmented objects */
-  itkGetMacro(NumberOfObjects, OutputPixelType);
-
-protected:
-  /** Constructor */
-  Segmenter();
-  /** Destructor */
-  ~Segmenter() override {}
-  /** Main computation method */
-  void GenerateData(void) override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /**
-   * Configure the input datas.
-   */
-  void GenerateInputRequestedRegion(void) override;
-  /**
-   * Configure the output data.
-   */
-  using Superclass::EnlargeOutputRequestedRegion;
-  void EnlargeOutputRequestedRegion(void);
-
-private:
-  Segmenter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-  /** Minimum size for the segmented object */
-  unsigned long m_MinimumObjectSize;
-  /** Quantile for seeds determination */
-  double m_SeedsQuantile;
-  /** Quantile to set the connectedThresholdFilter threshold */
-  double m_ConnectedThresholdQuantile;
-  /** Set to true if the details to segment are darker than background */
-  bool m_SegmentDarkDetailsBool;
-  /** Number of segmented objects */
-  OutputPixelType m_NumberOfObjects;
-};
-} // End namespace MorphologicalPyramid
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbMorphologicalPyramidSegmenter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.hxx
deleted file mode 100644
index 555b483dd25bdc150964a02d9fc8dab61beb90ac..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.hxx
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidSegmenter_hxx
-#define otbMorphologicalPyramidSegmenter_hxx
-
-#include "otbMorphologicalPyramidSegmenter.h"
-
-#include "otbImage.h"
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkConnectedThresholdImageFilter.h"
-#include "itkConnectedComponentImageFilter.h"
-#include "itkRelabelComponentImageFilter.h"
-#include "itkThresholdImageFilter.h"
-#include "itkMultiplyImageFilter.h"
-#include "itkCastImageFilter.h"
-#include "itkInvertIntensityImageFilter.h"
-#include "itkRescaleIntensityImageFilter.h"
-#include "otbThresholdImageToPointSetFilter.h"
-#include "itkScalarImageToHistogramGenerator.h"
-#include "itkMinimumMaximumImageCalculator.h"
-
-namespace otb
-{
-namespace MorphologicalPyramid
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputImage>
-Segmenter<TInputImage, TOutputImage>
-::Segmenter()
-{
-  this->SetNumberOfRequiredInputs(2);
-  m_SeedsQuantile = 0.9;
-  m_MinimumObjectSize = 10;
-  m_SegmentDarkDetailsBool = false;
-  m_NumberOfObjects = 0;
-  m_ConnectedThresholdQuantile = 0.9;
-}
-/**
- * Set the details image.
- * \param detailsImage The details image from the morphological pyramid
- */
-template <class TInputImage, class TOutputImage>
-void
-Segmenter<TInputImage, TOutputImage>
-::SetDetailsImage(const InputImageType * detailsImage)
-{
-  this->SetNthInput(0, const_cast<TInputImage *>(detailsImage));
-}
-/**
- * Set the details image.
- * \return detailsImage The input details image.
- */
-template <class TInputImage, class TOutputImage>
-typename Segmenter<TInputImage, TOutputImage>::InputImageType *
-Segmenter<TInputImage, TOutputImage>
-::GetDetailsImage(void)
-{
-  return const_cast<InputImageType *>(this->GetInput(0));
-}
-/**
-  * Set the original image.
-  * \param originalImage The original image to segment.
-  */
-template <class TInputImage, class TOutputImage>
-void
-Segmenter<TInputImage, TOutputImage>
-::SetOriginalImage(const InputImageType * originalImage)
-{
-  this->SetNthInput(1, const_cast<TInputImage *>(originalImage));
-}
-/**
- * Get the original image.
- * \return originalImage The original image to segment.
- */
-template <class TInputImage, class TOutputImage>
-typename Segmenter<TInputImage, TOutputImage>::InputImageType *
-Segmenter<TInputImage, TOutputImage>
-::GetOriginalImage(void)
-{
-  return const_cast<InputImageType *>(this->GetInput(1));
-}
-/**
- * Configure the input datas.
- */
-template <class TInputImage, class TOutputImage>
-void
-Segmenter<TInputImage, TOutputImage>
-::GenerateInputRequestedRegion()
-{
-  // call the superclass' implementation of this method
-  Superclass::GenerateInputRequestedRegion();
-
-  // get pointers to the inputs
-  InputImagePointerType detailsPtr =
-    const_cast<InputImageType *>(this->GetInput(0));
-
-  InputImagePointerType origPtr =
-    const_cast<InputImageType *>(this->GetInput(1));
-
-  if (!detailsPtr || !origPtr)
-    {
-    return;
-    }
-
-  // We need to
-  // configure the inputs such that all the data is available.
-  detailsPtr->SetRequestedRegion(detailsPtr->GetLargestPossibleRegion());
-  origPtr->SetRequestedRegion(origPtr->GetLargestPossibleRegion());
-}
-/**
- * Configure the output data
- */
-template <class TInputImage, class TOutputImage>
-void
-Segmenter<TInputImage, TOutputImage>
-::EnlargeOutputRequestedRegion(void)
-{
-  this->GetOutput()
-  ->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
-}
-
-/**
- * Main computation method
- */
-template <class TInputImage, class TOutputImage>
-void
-Segmenter<TInputImage, TOutputImage>
-::GenerateData()
-{
-  // Input images pointers
-  InputImagePointerType details = this->GetDetailsImage();
-  InputImagePointerType original = this->GetOriginalImage();
-
-  // Typedefs for details image enhancement
-  typedef double                                                                   FloatPixelType;
-  typedef otb::Image<FloatPixelType, InputImageType::ImageDimension>               FloatImageType;
-  typedef itk::InvertIntensityImageFilter<InputImageType, InputImageType>          InvertFilterType;
-  typedef itk::MultiplyImageFilter<FloatImageType, FloatImageType, InputImageType> MultiplyFilterType;
-  typedef itk::CastImageFilter<InputImageType, FloatImageType>                     CastImageFilterType;
-  typedef itk::MinimumMaximumImageCalculator<InputImageType>                       MinMaxCalculatorType;
-
-  //Typedefs for seeds extraction
-  typedef itk::PointSet<InputPixelType, InputImageType::ImageDimension>     PointSetType;
-  typedef otb::ThresholdImageToPointSetFilter<InputImageType, PointSetType> PointSetFilterType;
-  typedef typename PointSetType::PointsContainer::Iterator                  PointSetIteratorType;
-
-  // Typedefs for segmentation
-  typedef itk::ConnectedThresholdImageFilter<InputImageType, InputImageType>  ConnectedFilterType;
-  typedef itk::ConnectedComponentImageFilter<InputImageType, OutputImageType> LabelFilterType;
-  typedef itk::RelabelComponentImageFilter<OutputImageType, OutputImageType>  RelabelFilterType;
-  typedef itk::ThresholdImageFilter<OutputImageType>                          ThresholdFilterType;
-
-  // Typedefs for statistics computation
-  typedef itk::Statistics::ScalarImageToHistogramGenerator<InputImageType> HistGeneratorType;
-
-  /////////////////////////////////////
-  //// Details image enhancement //////
-  /////////////////////////////////////
-
-  // Filters instantiation
-  typename InvertFilterType::Pointer     invert;
-  typename CastImageFilterType::Pointer  cast1 = CastImageFilterType::New();
-  typename CastImageFilterType::Pointer  cast2 = CastImageFilterType::New();
-  typename MultiplyFilterType::Pointer   mult = MultiplyFilterType::New();
-  typename MinMaxCalculatorType::Pointer minMax =  MinMaxCalculatorType::New();
-
-  // Pipeline connection
-  cast1->SetInput(details);
-
-  minMax->SetImage(original);
-  minMax->ComputeMaximum();
-
-  // If we want to segment darker detail, the original image must have its itensity inverted
-  if (m_SegmentDarkDetailsBool)
-    {
-    invert = InvertFilterType::New();
-    invert->SetInput(original);
-    invert->SetMaximum(minMax->GetMaximum());
-    cast2->SetInput(invert->GetOutput());
-    }
-  else
-    {
-    cast2->SetInput(original);
-    }
-  mult->SetInput1(cast1->GetOutput());
-  mult->SetInput2(cast2->GetOutput());
-  mult->Update();
-
-  /////////////////////////////////////
-  //// Thresholds computation /////////
-  /////////////////////////////////////
-
-  // Filter instantiation
-  typename HistGeneratorType::Pointer histogram = HistGeneratorType::New();
-  // Seeds Threshold is computed from the quantile
-  histogram->SetInput(details);
-  histogram->SetNumberOfBins(255);
-  histogram->SetMarginalScale(10.0);
-  histogram->Compute();
-  InputPixelType pointSetThreshold =
-    static_cast<InputPixelType>(histogram->GetOutput()->Quantile(0, m_SeedsQuantile));
-
-  // Segmentation Threshold is computed from the quantile
-  histogram = HistGeneratorType::New();
-  histogram->SetInput(mult->GetOutput());
-  histogram->SetNumberOfBins(255);
-  histogram->SetMarginalScale(10.0);
-  histogram->Compute();
-  InputPixelType connectedThresholdValue =
-    static_cast<InputPixelType>(histogram->GetOutput()->Quantile(0, m_ConnectedThresholdQuantile));
-
-  /////////////////////////////////////
-  //// Seeds extraction ///////////////
-  /////////////////////////////////////
-
-  typename PointSetFilterType::Pointer pointSetFilter = PointSetFilterType::New();
-  pointSetFilter->SetInput(0, details);
-  pointSetFilter->SetLowerThreshold(pointSetThreshold);
-  pointSetFilter->Update();
-
-  /////////////////////////////////////
-  //// Segmentation ///////////////////
-  /////////////////////////////////////
-
-  // Filters instantiation
-  typename ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New();
-  typename LabelFilterType::Pointer     labeler = LabelFilterType::New();
-  typename RelabelFilterType::Pointer   relabeler = RelabelFilterType::New();
-  typename ThresholdFilterType::Pointer threshold = ThresholdFilterType::New();
-
-  //Passing seeds to the connected filter
-  connectedThreshold = ConnectedFilterType::New();
-  connectedThreshold->ClearSeeds();
-  connectedThreshold->SetInput(mult->GetOutput());
-  PointSetIteratorType it = pointSetFilter->GetOutput()->GetPoints()->Begin();
-  while (it != pointSetFilter->GetOutput()->GetPoints()->End())
-    {
-    typename OutputImageType::IndexType index;
-    index[0] = static_cast<long int>(it.Value()[0]);
-    index[1] = static_cast<long int>(it.Value()[1]);
-    connectedThreshold->AddSeed(index);
-    ++it;
-    }
-
-  // segmentation
-  connectedThreshold->SetLower(connectedThresholdValue);
-
-  // labelling
-  labeler = LabelFilterType::New();
-  relabeler = RelabelFilterType::New();
-  labeler->SetInput(connectedThreshold->GetOutput());
-  relabeler->SetInput(labeler->GetOutput());
-  relabeler->SetMinimumObjectSize(m_MinimumObjectSize);
-  relabeler->Update();
-
-  // In some cases it might happen that the whole extent of the image is segmented as a single region.
-  // Since this is not desirable, we test this case here to avoid it.
-  threshold = ThresholdFilterType::New();
-  threshold->SetInput(relabeler->GetOutput());
-  OutputPixelType num = 0;
-  if (relabeler->GetNumberOfObjects() == 1)
-    {
-    unsigned int surface = mult->GetOutput()->GetLargestPossibleRegion().GetSize()[0]
-                           * mult->GetOutput()->GetLargestPossibleRegion().GetSize()[1];
-    if (relabeler->GetSizeOfObjectsInPixels()[0] == surface)
-      {
-      num = 0;
-      }
-    else
-      {
-      num = 1;
-      }
-    }
-  else
-    {
-    num = static_cast<OutputPixelType>(relabeler->GetNumberOfObjects());
-    }
-  threshold->ThresholdOutside(0, num);
-
-  // Output connection
-  threshold->GraftOutput(this->GetOutput());
-  threshold->Update();
-  this->GraftOutput(threshold->GetOutput());
-  m_NumberOfObjects = num;
-}
-/**
- * PrintSelf method
- */
-template <class TInputImage, class TOutputImage>
-void
-Segmenter<TInputImage, TOutputImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-
-}
-} // End namespace MorphologicalPyramid
-} // End namespace otb
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h
deleted file mode 100644
index 20a8f447aef515dbb646b154de76e1fe832bca29..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidSynthesisFilter_h
-#define otbMorphologicalPyramidSynthesisFilter_h
-
-#include "otbImageToImageListFilter.h"
-
-namespace otb
-{
-/**
- * \class MorphologicalPyramidSynthesisFilter
- * \brief Recomposition of the multiscale analysis performed with
- * a MorphologicalPyramidAnalyseFilter.
- *
- * Once a morphological pyramidal decompisition has been made, it is
- * possible to rebuild without any loss of information the original
- * image at full resolution. The MorphologicalPyramidsynthesisFilter
- * provides such a functionality. At each iteration, it performs the
- * up-sampling of the current image using the
- * otb::morphologicalPyramid::Resampler filter, the addition of
- * the details lost in down-sampling, and the addition of the details
- * lost in smoothing.
- *
- * \ingroup MultiScale
- * \sa MorphologicalPyramidAnalyseFilter
- * \sa MorphologicalPyramidResampler
- *
- * \ingroup OTBMorphologicalPyramid
- */
-template <class TInputImage, class TOutputImage>
-class ITK_EXPORT MorphologicalPyramidSynthesisFilter
-  : public ImageToImageListFilter<TInputImage, TOutputImage>
-{
-public:
-  /** Standard typedefs */
-  typedef MorphologicalPyramidSynthesisFilter               Self;
-  typedef ImageToImageListFilter<TInputImage, TOutputImage> Superclass;
-  typedef itk::SmartPointer<Self>                           Pointer;
-  typedef itk::SmartPointer<const Self>                     ConstPointer;
-  /** Creation through object factory macro */
-  itkNewMacro(Self);
-  /** Type macro */
-  itkTypeMacro(MorphologicalPyramidSynthesisFilter, MorphologicalPyramidSynthesisFilter);
-  /** Input image dimension constant macro */
-  itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension);
-  /** Output related typedefs */
-  typedef typename Superclass::OutputImageType                      OutputImageType;
-  typedef typename Superclass::OutputImageListType                  OutputImageListType;
-  typedef typename OutputImageListType::Pointer                     OutputImageListPointerType;
-  typedef typename Superclass::OutputImagePointerType               OutputImagePointerType;
-  typedef typename Superclass::OutputImageListType::Iterator        ImageListIterator;
-  typedef typename Superclass::OutputImageListType::ReverseIterator ImageListReverseIterator;
-  /** Input related typedefs */
-  typedef typename Superclass::InputImageType       InputImageType;
-  typedef typename Superclass::InputImageRegionType InputImageRegionType;
-  typedef typename InputImageType::Pointer          InputImagePointer;
-  typedef typename InputImageType::ConstPointer     InputImageConstPointer;
-  typedef typename InputImageType::SizeType         SizeType;
-  typedef typename InputImageType::ValueType        ValueType;
-  typedef typename InputImageType::PixelType        PixelType;
-  typedef typename InputImageType::SpacingType      SpacingType;
-  typedef otb::ImageList<InputImageType>            InputImageListType;
-  typedef typename InputImageListType::Pointer      InputImageListPointerType;
-  /** Size vector typedefs */
-  typedef std::vector<SizeType>                     SizeVectorType;
-  typedef typename SizeVectorType::iterator         SizeIterator;
-  typedef typename SizeVectorType::reverse_iterator SizeReverseIterator;
-  /**
-   * Set The SupFilter details
-   * \param imageList The brighter details extracted from the filtering operation.
-   */
-  void SetSupFilter(InputImageListType * imageList);
-  /**
-   * Set The InfFilter details
-   * \param imageList The darker details extracted from the filtering operation.
-   */
-  void SetInfFilter(InputImageListType * imageList);
-  /**
-   * Set The SupDeci details
-   * \param imageList The brighter details extracted from the filtering operation.
-   */
-  void SetSupDeci(InputImageListType * imageList);
-  /**
-   * Set The InfDeci details
-   * \param imageList The darker details extracted from the filtering operation.
-   */
-  void SetInfDeci(InputImageListType * imageList);
-  /**
-   * Get The SupFilter details
-   * \return The brighter details extracted from the filtering operation.
-   */
-  InputImageListType* GetSupFilter(void);
-  /**
-   * Get The InfFilter details
-   * \return The darker details extracted from the filtering operation.
-   */
-  InputImageListType* GetInfFilter(void);
-  /**
-   * Get The SupDeci details
-   * \return The brighter details extracted from the resampling operation.
-   */
-  InputImageListType* GetSupDeci(void);
-  /**
-   * Get The InfDeci details
-   * \return The brighter details extracted from the resampling operation.
-   */
-  InputImageListType* GetInfDeci(void);
-
-protected:
-  /** Constructor */
-  MorphologicalPyramidSynthesisFilter();
-  /** Destructor */
-  ~MorphologicalPyramidSynthesisFilter() override;
-  void GenerateOutputInformation() override {}  // does nothing
-  /** Main computation method */
-  void GenerateData() override;
-  /** Printself method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbMorphologicalPyramidSynthesisFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.hxx
deleted file mode 100644
index 3f8d81ccf76f316314434ba1c39437c007115289..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.hxx
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbMorphologicalPyramidSynthesisFilter_hxx
-#define otbMorphologicalPyramidSynthesisFilter_hxx
-
-#include "otbMorphologicalPyramidSynthesisFilter.h"
-
-#include "otbMorphologicalPyramidResampler.h"
-#include "itkSubtractImageFilter.h"
-#include "itkAddImageFilter.h"
-#include "itkImageDuplicator.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputImage>
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::MorphologicalPyramidSynthesisFilter()
-{
-  this->SetNumberOfRequiredInputs(5);
-}
-/**
- * Destructor
- */
-template <class TInputImage, class TOutputImage>
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::~MorphologicalPyramidSynthesisFilter() {}
-/**
- * Set The SupFilter details
- * \param imageList The brighter details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::SetSupFilter(InputImageListType * imageList)
-{
-  this->SetNthInput(1, const_cast<InputImageListType *>(imageList));
-}
-/**
- * Set The InfFilter details
- * \param imageList The darker details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::SetInfFilter(InputImageListType * imageList)
-{
-  this->SetNthInput(2, const_cast<InputImageListType *>(imageList));
-}
-
-/**
-  * Set The SupDeci details
-  * \param imageList The brighter details extracted from the filtering operation.
-  */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::SetSupDeci(InputImageListType * imageList)
-{
-  this->SetNthInput(3, const_cast<InputImageListType *>(imageList));
-}
-/**
- * Set The InfDeci details
- * \param imageList The darker details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::SetInfDeci(InputImageListType * imageList)
-{
-  this->SetNthInput(4, const_cast<InputImageListType *>(imageList));
-}
-
-/**
- * Get The SupFilter details
- * \return The brighter details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-typename MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::InputImageListType*
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::GetSupFilter(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(1));
-}
-/**
- * Get The InfFilter details
- * \return The darker details extracted from the filtering operation.
- */
-template <class TInputImage, class TOutputImage>
-typename MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::InputImageListType*
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::GetInfFilter(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(2));
-}
-/**
- * Get The SupDeci details
- * \return The brighter details extracted from the resampling operation.
- */
-template <class TInputImage, class TOutputImage>
-typename MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::InputImageListType*
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::GetSupDeci(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(3));
-}
-/**
- * Get The InfDeci details
- * \return The darker details extracted from the resampling operation.
- */
-template <class TInputImage, class TOutputImage>
-typename MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::InputImageListType*
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::GetInfDeci(void)
-{
-  return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(4));
-}
-/**
- * Main computation method
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::GenerateData(void)
-{
-  otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter : Entering main method.");
-  // Input image pointer
-  InputImageListType * supFilter = this->GetSupFilter();
-  InputImageListType * infFilter = this->GetInfFilter();
-  InputImageListType * supDeci = this->GetSupDeci();
-  InputImageListType * infDeci = this->GetInfDeci();
-
-  // Output pointer
-  OutputImageListType * OutputImageList   = this->GetOutput();
-
-  // typedefs of the filters
-  typedef itk::SubtractImageFilter<InputImageType, InputImageType, OutputImageType> SubtractFilterType;
-  typedef itk::AddImageFilter<InputImageType, InputImageType, InputImageType>       AddFilterType;
-  typedef otb::MorphologicalPyramid::Resampler<InputImageType, InputImageType>      ResamplerType;
-  typedef itk::ImageDuplicator<InputImageType>                                      DuplicatorType;
-
-  // Input Image duplication to the currentImage Pointer
-  typename DuplicatorType::Pointer duplicator = DuplicatorType::New();
-  duplicator->SetInputImage(this->GetInput());
-  duplicator->Update();
-
-  // Input Image duplication to the currentImage Pointer
-  typename InputImageType::Pointer currentImage = duplicator->GetOutput();
-
-  // Filters declarations
-  typename AddFilterType::Pointer      add1, add2;
-  typename SubtractFilterType::Pointer subtract1, subtract2;
-  typename ResamplerType::Pointer      resampler;
-
-  // Size vector computation
-  SizeVectorType size;
-
-  ImageListIterator it = supFilter->Begin();
-
-  while (it != supFilter->End())
-    {
-    size.push_back(it.Get()->GetLargestPossibleRegion().GetSize());
-    ++it;
-    }
-  otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter : Size vector computation OK");
-
-  // Iterators definition
-  ImageListReverseIterator itinfFilter = infFilter->ReverseBegin();
-  ImageListReverseIterator itsupFilter = supFilter->ReverseBegin();
-  ImageListReverseIterator itinfDeci = infDeci->ReverseBegin();
-  ImageListReverseIterator itsupDeci = supDeci->ReverseBegin();
-  SizeReverseIterator      itSize = size.rbegin();
-
-  int i = 1;
-//--------------------------------------------------------//
-//                      Main loop                         //
-//--------------------------------------------------------//
-  while (itinfFilter != infFilter->ReverseEnd()
-         && itsupFilter != supFilter->ReverseEnd()
-         && itinfDeci != infDeci->ReverseEnd()
-         && itsupDeci != supDeci->ReverseEnd()
-         && itSize != size.rend())
-    {
-
-    ++i;
-    // Upsampling current image
-    resampler = ResamplerType::New();
-    resampler->SetSize(*itSize);
-    resampler->SetInput(currentImage);
-    resampler->Update();
-    otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter: step " << i << " Upsampling OK");
-    // Adding *sup details from current level
-    add1 = AddFilterType::New();
-    add1->SetInput1(resampler->GetOutput());
-    add1->SetInput2(itsupFilter.Get());
-    add2 = AddFilterType::New();
-    add2->SetInput1(add1->GetOutput());
-    add2->SetInput2(itsupDeci.Get());
-
-    // Adding *inf details from current level
-    subtract1 = SubtractFilterType::New();
-    subtract1->SetInput1(add2->GetOutput());
-    subtract1->SetInput2(itinfFilter.Get());
-    subtract2 = SubtractFilterType::New();
-    subtract2->SetInput1(subtract1->GetOutput());
-    subtract2->SetInput2(itinfDeci.Get());
-    subtract2->Update();
-    otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter: step " << i << " Details addition OK");
-
-    // Updating current image
-    currentImage = subtract2->GetOutput();
-    OutputImageList->PushBack(currentImage);
-
-    // Iterators incrementation
-    ++itsupFilter;
-    ++itinfFilter;
-    ++itsupDeci;
-    ++itinfDeci;
-    ++itSize;
-    }
-  otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter: Exiting main method.");
-}
-/**
- * PrintSelf method
- */
-template <class TInputImage, class TOutputImage>
-void
-MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-
-#endif
diff --git a/Modules/Filtering/MorphologicalPyramid/otb-module.cmake b/Modules/Filtering/MorphologicalPyramid/otb-module.cmake
deleted file mode 100644
index 677f456dbaf8e456576007b5ba645deeb8e4a3f0..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/otb-module.cmake
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-set(DOCUMENTATION "If the smoothing filter used in the pyramidal analysis is a
-morphological filter, one cannot safely subsample the filtered image without loss
-of information. However, by keeping the details possibly lost in the
-down-sampling operation, such a decomposition can be used. The Morphological Pyramid is an
-approach to such a decomposition. This module contains classes useful in meeting
-that goal.")
-
-otb_module(OTBMorphologicalPyramid
-  DEPENDS
-    OTBCommon
-    OTBITK
-    OTBImageBase
-    OTBObjectList
-    OTBPointSet
-
-  TEST_DEPENDS
-    OTBImageIO
-    OTBMorphologicalProfiles
-    OTBTestKernel
-
-  DESCRIPTION
-    "${DOCUMENTATION}"
-)
diff --git a/Modules/Filtering/MorphologicalPyramid/test/CMakeLists.txt b/Modules/Filtering/MorphologicalPyramid/test/CMakeLists.txt
deleted file mode 100644
index 90bf757fdcb09ac89bbd1b9deb5899cd11f81b1f..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/test/CMakeLists.txt
+++ /dev/null
@@ -1,148 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-otb_module_test()
-
-set(OTBMorphologicalPyramidTests
-otbMorphologicalPyramidTestDriver.cxx
-otbMorphologicalPyramidAnalysisFilter.cxx
-otbMorphologicalPyramidSegmenter.cxx
-otbMorphologicalPyramidSynthesisFilter.cxx
-otbMorphologicalPyramidMRToMSConverter.cxx
-otbMorphologicalPyramidResampler.cxx
-otbMorphologicalPyramidSegmentationFilter.cxx
-)
-
-add_executable(otbMorphologicalPyramidTestDriver ${OTBMorphologicalPyramidTests})
-target_link_libraries(otbMorphologicalPyramidTestDriver ${OTBMorphologicalPyramid-Test_LIBRARIES})
-otb_module_target_label(otbMorphologicalPyramidTestDriver)
-
-# Tests Declaration
-
-otb_add_test(NAME msTvMorphoPyrAnalysisFilter COMMAND otbMorphologicalPyramidTestDriver
-  --compare-n-images ${NOTOL} 5
-  ${BASELINE}/msPyrAn_mire_log_an_2.png
-  ${TEMP}/msPyrAn_mire_log_an_2.png
-  ${BASELINE}/msPyrAn_mire_log_sf_2.png
-  ${TEMP}/msPyrAn_mire_log_sf_2.png
-  ${BASELINE}/msPyrAn_mire_log_if_2.png
-  ${TEMP}/msPyrAn_mire_log_if_2.png
-  ${BASELINE}/msPyrAn_mire_log_sd_2.png
-  ${TEMP}/msPyrAn_mire_log_sd_2.png
-  ${BASELINE}/msPyrAn_mire_log_id_2.png
-  ${TEMP}/msPyrAn_mire_log_id_2.png
-  otbMorphologicalPyramidAnalysisFilter
-  ${INPUTDATA}/mire_log.png
-  ${TEMP}/msPyrAn_mire_log
-  png
-  2
-  2.0)
-
-otb_add_test(NAME msTvMorphoPyrSegmentBright COMMAND otbMorphologicalPyramidTestDriver
-  --compare-image ${NOTOL}
-  ${BASELINE}/msPyrSegmenter_IKO_Halles_4_2_sf.tif
-  ${TEMP}/msPyrSegmenter_IKO_Halles_4_2_sf.tif
-  otbMorphologicalPyramidSegmenter
-  ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif
-  ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif
-  ${TEMP}/msPyrSegmenter_IKO_Halles_4_2_sf.tif
-  0
-  0.9
-  0.9
-  10
-  )
-set_property(TEST msTvMorphoPyrSegmentBright PROPERTY DEPENDS msTvMorphoPyrMRToMSConverter)
-
-otb_add_test(NAME msTvMorphoPyrSegmentDark COMMAND otbMorphologicalPyramidTestDriver
-  --compare-image ${NOTOL}
-  ${BASELINE}/msPyrSegmenter_IKO_Halles_4_2_if.tif
-  ${TEMP}/msPyrSegmenter_IKO_Halles_4_2_if.tif
-  otbMorphologicalPyramidSegmenter
-  ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif
-  ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif
-  ${TEMP}/msPyrSegmenter_IKO_Halles_4_2_if.tif
-  1
-  0.9
-  0.9
-  10
-  )
-set_property(TEST msTvMorphoPyrSegmentDark PROPERTY DEPENDS msTvMorphoPyrMRToMSConverter)
-
-otb_add_test(NAME msTvMorphoPyrSynthesisFilter COMMAND otbMorphologicalPyramidTestDriver
-  --compare-image ${NOTOL}
-  ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif
-  ${TEMP}/msPyrSynth_IKO_Halles_4_2.tif
-  otbMorphologicalPyramidSynthesisFilter
-  ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif
-  ${TEMP}/msPyrSynth_IKO_Halles_4_2.tif
-  4
-  2.0)
-
-otb_add_test(NAME msTvMorphoPyrMRToMSConverter COMMAND otbMorphologicalPyramidTestDriver
-  --compare-n-images ${EPSILON_8} 3
-  ${BASELINE}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif
-  ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif
-  ${BASELINE}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif
-  ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif
-  ${BASELINE}/msPyrMRToMS_IKO_Halles_4_2_an_full.tif
-  ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_an_full.tif
-  otbMorphologicalPyramidMRToMSConverter
-  ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif
-  ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif
-  ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif
-  ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_an_full.tif
-  4
-  2.0)
-
-otb_add_test(NAME msTvMorphoPyrResampler COMMAND otbMorphologicalPyramidTestDriver
-  --compare-n-images ${EPSILON_8} 2
-  ${BASELINE}/msPyrResampler_IKO_LesHalles_256_2.tif
-  ${TEMP}/msPyrResampler_IKO_LesHalles_256_2.tif
-  ${BASELINE}/msPyrResampler_IKO_LesHalles_full.tif
-  ${TEMP}/msPyrResampler_IKO_LesHalles_full.tif
-  otbMorphologicalPyramidResampler
-  ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif
-  ${TEMP}/msPyrResampler_IKO_LesHalles_256_2.tif
-  ${TEMP}/msPyrResampler_IKO_LesHalles_full.tif
-  256
-  256
-  )
-
-otb_add_test(NAME msTvMorphoPyrSegmentationFilter COMMAND otbMorphologicalPyramidTestDriver
-  --compare-n-images ${NOTOL} 4
-  ${BASELINE}/msPyrSegmentation_IKO_Halles_2.tif
-  ${TEMP}/msPyrSegmentation_IKO_Halles_2.tif
-  ${BASELINE}/msPyrSegmentation_IKO_Halles_4.tif
-  ${TEMP}/msPyrSegmentation_IKO_Halles_4.tif
-  ${BASELINE}/msPyrSegmentation_IKO_Halles_5.tif
-  ${TEMP}/msPyrSegmentation_IKO_Halles_5.tif
-  ${BASELINE}/msPyrSegmentation_IKO_Halles_7.tif
-  ${TEMP}/msPyrSegmentation_IKO_Halles_7.tif
-  otbMorphologicalPyramidSegmentationFilter
-  ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif
-  ${TEMP}/msPyrSegmentation_IKO_Halles_
-  tif
-  4
-  2.0
-  0.9
-  0.9
-  10
-  )
-
diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidAnalysisFilter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidAnalysisFilter.cxx
deleted file mode 100644
index c2704c3627f73b4d0a830b6fdaf65a4d46cb44fe..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidAnalysisFilter.cxx
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbMorphologicalPyramidAnalysisFilter.h"
-#include "otbOpeningClosingMorphologicalFilter.h"
-#include "itkBinaryBallStructuringElement.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbImage.h"
-
-int otbMorphologicalPyramidAnalysisFilter(int itkNotUsed(argc), char * argv[])
-{
-  const char *       inputFilename = argv[1];
-  const char *       outputFilenamePrefix = argv[2];
-  const char *       outputFilenameSuffix = argv[3];
-  const unsigned int numberOfLevels = atoi(argv[4]);
-  const float        decimationRatio = atof(argv[5]);
-
-  const unsigned int Dimension = 2;
-  typedef unsigned char InputPixelType;
-  typedef unsigned char OutputPixelType;
-
-  typedef otb::Image<InputPixelType, Dimension>  InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  typedef otb::ImageFileReader<InputImageType>  ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  typedef itk::BinaryBallStructuringElement<InputPixelType, Dimension> StructuringElementType;
-  typedef otb::OpeningClosingMorphologicalFilter<InputImageType, InputImageType, StructuringElementType>
-  OpeningClosingFilterType;
-  typedef otb::MorphologicalPyramidAnalysisFilter<InputImageType, OutputImageType, OpeningClosingFilterType>
-  PyramidFilterType;
-  typedef PyramidFilterType::OutputImageListType::Iterator ImageListIterator;
-
-  // Reading input image
-  ReaderType::Pointer reader = ReaderType::New();
-  reader->SetFileName(inputFilename);
-
-  // Instantiation
-  PyramidFilterType::Pointer pyramid = PyramidFilterType::New();
-  pyramid->SetNumberOfLevels(numberOfLevels);
-  pyramid->SetDecimationRatio(decimationRatio);
-  pyramid->SetInput(reader->GetOutput());
-  pyramid->Update();
-
-  // Retrieving iterators on the results images
-  ImageListIterator itAnalyse = pyramid->GetOutput()->Begin();
-  ImageListIterator itSupFilter = pyramid->GetSupFilter()->Begin();
-  ImageListIterator itInfFilter = pyramid->GetInfFilter()->Begin();
-  ImageListIterator itInfDeci = pyramid->GetInfDeci()->Begin();
-  ImageListIterator itSupDeci =  pyramid->GetSupDeci()->Begin();
-
-  WriterType::Pointer writer =  WriterType::New();
-
-  int i = 1;
-  //      std::stringstream oss;
-  std::ostringstream oss;
-  // Writing the results images
-  while ((itAnalyse != pyramid->GetOutput()->End())
-         && (itSupFilter != pyramid->GetSupFilter()->End())
-         && (itInfFilter != pyramid->GetInfFilter()->End())
-         && (itInfDeci != pyramid->GetInfDeci()->End())
-         && (itSupDeci != pyramid->GetSupDeci()->End())
-         )
-    {
-    oss << outputFilenamePrefix << "_an_" << i << "." << outputFilenameSuffix;
-    writer->SetInput(itAnalyse.Get());
-    writer->SetFileName(oss.str());
-    writer->Update();
-    oss.str("");
-    oss << outputFilenamePrefix << "_sf_" << i << "." << outputFilenameSuffix;
-    writer->SetInput(itSupFilter.Get());
-    writer->SetFileName(oss.str());
-    writer->Update();
-    oss.str("");
-    oss << outputFilenamePrefix << "_if_" << i << "." << outputFilenameSuffix;
-    writer->SetInput(itInfFilter.Get());
-    writer->SetFileName(oss.str());
-    writer->Update();
-    oss.str("");
-    oss << outputFilenamePrefix << "_id_" << i << "." << outputFilenameSuffix;
-    writer->SetInput(itInfDeci.Get());
-    writer->SetFileName(oss.str());
-    writer->Update();
-    std::cout << "File " << oss.str() << " written" << std::endl;
-    oss.str("");
-    oss << outputFilenamePrefix << "_sd_" << i << "." << outputFilenameSuffix;
-    writer->SetInput(itSupDeci.Get());
-    writer->SetFileName(oss.str());
-    writer->Update();
-    oss.str("");
-    ++itAnalyse;
-    ++itSupFilter;
-    ++itInfFilter;
-    ++itInfDeci;
-    ++itSupDeci;
-    ++i;
-    }
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidMRToMSConverter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidMRToMSConverter.cxx
deleted file mode 100644
index cfc82520f07c0d3996c88da2a996b42b1058f4b2..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidMRToMSConverter.cxx
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbMorphologicalPyramidAnalysisFilter.h"
-#include "otbMorphologicalPyramidMRToMSConverter.h"
-#include "otbOpeningClosingMorphologicalFilter.h"
-#include "itkBinaryBallStructuringElement.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbImage.h"
-
-int otbMorphologicalPyramidMRToMSConverter(int itkNotUsed(argc), char * argv[])
-{
-  const char *       inputFilename = argv[1];
-  const char *       outputFilename1 = argv[2];
-  const char *       outputFilename2 = argv[3];
-  const char *       outputFilename3 = argv[4];
-  const unsigned int numberOfLevels = atoi(argv[5]);
-  const float        decimationRatio = atof(argv[6]);
-
-  const unsigned int Dimension = 2;
-  typedef double InputPixelType;
-  typedef double OutputPixelType;
-
-  typedef otb::Image<InputPixelType, Dimension>  InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  typedef otb::ImageFileReader<InputImageType>  ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  typedef itk::BinaryBallStructuringElement<InputPixelType, Dimension> StructuringElementType;
-  typedef otb::OpeningClosingMorphologicalFilter<InputImageType, InputImageType, StructuringElementType>
-  OpeningClosingFilterType;
-  typedef otb::MorphologicalPyramidAnalysisFilter<InputImageType, InputImageType, OpeningClosingFilterType>
-  PyramidAnalysisFilterType;
-  typedef otb::MorphologicalPyramid::MRToMSConverter<InputImageType, OutputImageType> MRToMSConverterType;
-
-  // Reading input image
-  ReaderType::Pointer reader = ReaderType::New();
-  reader->SetFileName(inputFilename);
-
-  // Analysis
-  PyramidAnalysisFilterType::Pointer pyramidAnalysis = PyramidAnalysisFilterType::New();
-  pyramidAnalysis->SetNumberOfLevels(numberOfLevels);
-  pyramidAnalysis->SetDecimationRatio(decimationRatio);
-  pyramidAnalysis->SetInput(reader->GetOutput());
-
-  // From multi resolution to multi scale
-  MRToMSConverterType::Pointer mrtoms = MRToMSConverterType::New();
-  mrtoms->SetInput(pyramidAnalysis->GetOutput());
-  mrtoms->SetSupFilter(pyramidAnalysis->GetSupFilter());
-  mrtoms->SetSupDeci(pyramidAnalysis->GetSupDeci());
-  mrtoms->SetInfFilter(pyramidAnalysis->GetInfFilter());
-  mrtoms->SetInfDeci(pyramidAnalysis->GetInfDeci());
-  mrtoms->Update();
-
-  // Writing the output images
-  WriterType::Pointer writer1 = WriterType::New();
-  writer1->SetFileName(outputFilename1);
-  writer1->SetInput(mrtoms->GetSupFilterFullResolution()->Back());
-  writer1->Update();
-
-  WriterType::Pointer writer2 = WriterType::New();
-  writer2->SetFileName(outputFilename2);
-  writer2->SetInput(mrtoms->GetInfFilterFullResolution()->Back());
-  writer2->Update();
-
-  WriterType::Pointer writer3 = WriterType::New();
-  writer3->SetFileName(outputFilename3);
-  writer3->SetInput(mrtoms->GetOutput()->Back());
-  writer3->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidResampler.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidResampler.cxx
deleted file mode 100644
index 0d43971cf29e675072a0437c1f9e2f91a6d805e6..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidResampler.cxx
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbMorphologicalPyramidResampler.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbImage.h"
-
-int otbMorphologicalPyramidResampler(int itkNotUsed(argc), char * argv[])
-{
-  const char*        inputFilename = argv[1];
-  const char*        outputFilename1 = argv[2];
-  const char*        outputFilename2 = argv[3];
-  const unsigned int size_x = atoi(argv[4]);
-  const unsigned int size_y = atoi(argv[5]);
-
-  const unsigned int Dimension = 2;
-  typedef double InputPixelType;
-  typedef double OutputPixelType;
-
-  typedef otb::Image<InputPixelType, Dimension>  InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  typedef otb::ImageFileReader<InputImageType>  ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  typedef otb::MorphologicalPyramid::Resampler<InputImageType, OutputImageType>
-  ResamplerType;
-
-  // Input image reading
-  ReaderType::Pointer reader = ReaderType::New();
-  reader->SetFileName(inputFilename);
-
-  InputImageType::SizeType size;
-  size[0] = size_x;
-  size[1] = size_y;
-
-  // Instantiation
-  ResamplerType::Pointer resampler = ResamplerType::New();
-  resampler->SetInput(reader->GetOutput());
-  resampler->SetSize(size);
-
-  // File writing
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetInput(resampler->GetOutput());
-  writer->SetFileName(outputFilename1);
-  writer->Update();
-
-  ResamplerType::Pointer resampler2 = ResamplerType::New();
-  resampler2->SetInput(resampler->GetOutput());
-  resampler2->SetSize(reader->GetOutput()->GetLargestPossibleRegion().GetSize());
-
-  WriterType::Pointer writer2 = WriterType::New();
-  writer2->SetInput(resampler2->GetOutput());
-  writer2->SetFileName(outputFilename2);
-  writer2->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmentationFilter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmentationFilter.cxx
deleted file mode 100644
index 959150db21b47e4ddd2131fe26736ff19a11a6a5..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmentationFilter.cxx
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbMorphologicalPyramidSegmentationFilter.h"
-#include "otbOpeningClosingMorphologicalFilter.h"
-#include "itkBinaryBallStructuringElement.h"
-#include "otbMorphologicalPyramidAnalysisFilter.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbImage.h"
-
-int otbMorphologicalPyramidSegmentationFilter(int itkNotUsed(argc), char * argv[])
-{
-  const char*        inputFilename = argv[1];
-  const char*        outputFilenamePrefix = argv[2];
-  const char *       outputFilenameSuffix = argv[3];
-  const unsigned int numberOfLevels = atoi(argv[4]);
-  const double       decimationRatio = atof(argv[5]);
-  const float        seedsQuantile = atof(argv[6]);
-  const float        segmentationQuantile = atof(argv[7]);
-  const unsigned int minObjectSize = atoi(argv[8]);
-
-  const unsigned int Dimension = 2;
-  typedef double         InputPixelType;
-  typedef unsigned short OutputPixelType;
-
-  typedef otb::Image<InputPixelType, Dimension>  InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  typedef otb::ImageFileReader<InputImageType>  ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  typedef itk::BinaryBallStructuringElement<InputPixelType, Dimension> StructuringElementType;
-  typedef otb::OpeningClosingMorphologicalFilter<InputImageType, InputImageType, StructuringElementType>
-  OpeningClosingFilterType;
-  typedef otb::MorphologicalPyramidAnalysisFilter<InputImageType, InputImageType, OpeningClosingFilterType>
-  PyramidFilterType;
-  typedef otb::MorphologicalPyramidSegmentationFilter<InputImageType, OutputImageType>
-  SegmentationFilterType;
-  typedef SegmentationFilterType::OutputImageListIteratorType OutputListIteratorType;
-
-  // Input images reading
-  ReaderType::Pointer reader = ReaderType::New();
-  reader->SetFileName(inputFilename);
-
-  //Analyse
-  PyramidFilterType::Pointer pyramid = PyramidFilterType::New();
-  pyramid->SetNumberOfLevels(numberOfLevels);
-  pyramid->SetDecimationRatio(decimationRatio);
-  pyramid->SetInput(reader->GetOutput());
-
-  // Segmentation
-  SegmentationFilterType::Pointer segmentation = SegmentationFilterType::New();
-  segmentation->SetReferenceImage(reader->GetOutput());
-  segmentation->SetBrighterDetails(pyramid->GetSupFilter());
-  segmentation->SetDarkerDetails(pyramid->GetInfFilter());
-  segmentation->SetSeedsQuantile(seedsQuantile);
-  segmentation->SetConnectedThresholdQuantile(segmentationQuantile);
-  segmentation->SetMinimumObjectSize(minObjectSize);
-  segmentation->Update();
-
-  // Output writing
-  OutputListIteratorType it = segmentation->GetOutput()->Begin();
-  WriterType::Pointer    writer;
-  int                    index = 1;
-  std::stringstream      oss;
-  while (it != segmentation->GetOutput()->End())
-    {
-    oss << outputFilenamePrefix << index << "." << outputFilenameSuffix;
-    writer = WriterType::New();
-    writer->SetInput(it.Get());
-    writer->SetFileName(oss.str());
-    writer->Update();
-    std::cout << oss.str() << " file written." << std::endl;
-    oss.str("");
-    ++index;
-    ++it;
-    }
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmenter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmenter.cxx
deleted file mode 100644
index 12b2ac54df9a3ec70a7e2d8490ed48f1fc2bff51..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmenter.cxx
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbMorphologicalPyramidSegmenter.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbImage.h"
-
-int otbMorphologicalPyramidSegmenter(int itkNotUsed(argc), char * argv[])
-{
-  const char*        inputFilename = argv[1];
-  const char*        originalFilename = argv[2];
-  const char*        outputFilename1 = argv[3];
-  const bool         segmentDark = atoi(argv[4]);
-  const float        seedsQuantile = atof(argv[5]);
-  const float        segmentationQuantile = atof(argv[6]);
-  const unsigned int minObjectSize = atoi(argv[7]);
-
-  const unsigned int Dimension = 2;
-  typedef double         InputPixelType;
-  typedef unsigned short OutputPixelType;
-
-  typedef otb::Image<InputPixelType, Dimension>  InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  typedef otb::ImageFileReader<InputImageType>  ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  typedef otb::MorphologicalPyramid::Segmenter<InputImageType, OutputImageType>
-  SegmenterType;
-
-  // Input images reading
-  ReaderType::Pointer reader = ReaderType::New();
-  reader->SetFileName(inputFilename);
-  ReaderType::Pointer reader2 = ReaderType::New();
-  reader2->SetFileName(originalFilename);
-
-  // Instantiation
-  SegmenterType::Pointer segmenter = SegmenterType::New();
-  segmenter->SetDetailsImage(reader->GetOutput());
-  segmenter->SetOriginalImage(reader2->GetOutput());
-  segmenter->SetSegmentDarkDetailsBool(segmentDark);
-  segmenter->SetSeedsQuantile(seedsQuantile);
-  segmenter->SetConnectedThresholdQuantile(segmentationQuantile);
-  segmenter->SetMinimumObjectSize(minObjectSize);
-
-  // File writing
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetInput(segmenter->GetOutput());
-  writer->SetFileName(outputFilename1);
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSynthesisFilter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSynthesisFilter.cxx
deleted file mode 100644
index 084ba8bd43b89bd77f8b326dddf1b231725f3eec..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSynthesisFilter.cxx
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-
-#include "otbMorphologicalPyramidAnalysisFilter.h"
-#include "otbMorphologicalPyramidSynthesisFilter.h"
-#include "otbOpeningClosingMorphologicalFilter.h"
-#include "itkBinaryBallStructuringElement.h"
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbImage.h"
-
-int otbMorphologicalPyramidSynthesisFilter(int itkNotUsed(argc), char * argv[])
-{
-  const char *       inputFilename = argv[1];
-  const char *       outputFilename = argv[2];
-  const unsigned int numberOfLevels = atoi(argv[3]);
-  const float        decimationRatio = atof(argv[4]);
-
-  const unsigned int Dimension = 2;
-  typedef unsigned char InputPixelType;
-  typedef unsigned char OutputPixelType;
-
-  typedef otb::Image<InputPixelType, Dimension>  InputImageType;
-  typedef otb::Image<OutputPixelType, Dimension> OutputImageType;
-
-  typedef otb::ImageFileReader<InputImageType>  ReaderType;
-  typedef otb::ImageFileWriter<OutputImageType> WriterType;
-
-  typedef itk::BinaryBallStructuringElement<InputPixelType, Dimension> StructuringElementType;
-  typedef otb::OpeningClosingMorphologicalFilter<InputImageType, InputImageType, StructuringElementType>
-  OpeningClosingFilterType;
-  typedef otb::MorphologicalPyramidAnalysisFilter<InputImageType, OutputImageType, OpeningClosingFilterType>
-  PyramidAnalysisFilterType;
-  typedef otb::MorphologicalPyramidSynthesisFilter<InputImageType, OutputImageType>
-  PyramidSynthesisFilterType;
-
-  // Reading input image
-  ReaderType::Pointer reader = ReaderType::New();
-  reader->SetFileName(inputFilename);
-
-  // Analysis
-  PyramidAnalysisFilterType::Pointer pyramidAnalysis = PyramidAnalysisFilterType::New();
-  pyramidAnalysis->SetNumberOfLevels(numberOfLevels);
-  pyramidAnalysis->SetDecimationRatio(decimationRatio);
-  pyramidAnalysis->SetInput(reader->GetOutput());
-  pyramidAnalysis->Update();
-
-  // Synthesis
-  PyramidSynthesisFilterType::Pointer pyramidSynthesis = PyramidSynthesisFilterType::New();
-  pyramidSynthesis->SetInput(pyramidAnalysis->GetOutput()->Back());
-  pyramidSynthesis->SetSupFilter(pyramidAnalysis->GetSupFilter());
-  pyramidSynthesis->SetSupDeci(pyramidAnalysis->GetSupDeci());
-  pyramidSynthesis->SetInfFilter(pyramidAnalysis->GetInfFilter());
-  pyramidSynthesis->SetInfDeci(pyramidAnalysis->GetInfDeci());
-  pyramidSynthesis->Update();
-
-  // Writing the output image
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetFileName(outputFilename);
-  writer->SetInput(pyramidSynthesis->GetOutput()->Back());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidTestDriver.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidTestDriver.cxx
deleted file mode 100644
index 7eae072f41716ed76033b26bbd70d0592fd0ce36..0000000000000000000000000000000000000000
--- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidTestDriver.cxx
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbTestMain.h"
-
-void RegisterTests()
-{
-  REGISTER_TEST(otbMorphologicalPyramidAnalysisFilter);
-  REGISTER_TEST(otbMorphologicalPyramidSegmenter);
-  REGISTER_TEST(otbMorphologicalPyramidSynthesisFilter);
-  REGISTER_TEST(otbMorphologicalPyramidMRToMSConverter);
-  REGISTER_TEST(otbMorphologicalPyramidResampler);
-  REGISTER_TEST(otbMorphologicalPyramidSegmentationFilter);
-}
diff --git a/Modules/Filtering/Path/include/otbVectorizationPathListFilter.h b/Modules/Filtering/Path/include/otbVectorizationPathListFilter.h
deleted file mode 100644
index 5ca5b65c5285040ec2079884721d9ec09de46ca5..0000000000000000000000000000000000000000
--- a/Modules/Filtering/Path/include/otbVectorizationPathListFilter.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbVectorizationPathListFilter_h
-#define otbVectorizationPathListFilter_h
-
-#include "otbPathListSource.h"
-#include "itkImageRegionIterator.h"
-#include "itkNeighborhoodIterator.h"
-#include "itkConstantBoundaryCondition.h"
-#include "otbImage.h"
-
-namespace otb
-{
-/** \class VectorizationPathListFilter
- *  \brief This filter performs a vectorization from a line detector modulus and direction outputs.
- *
- *  The output of this filter is an otb::ObjectList<TOutputPath>.
- *
- *  This filter performs vectorization at non-grid position by using the barycenter of the few pixels with
- *  non-null intensity in the given direction. A threshold can be set to tune the sensibility of the first point
- *  detection. Path with less than three vertices are not kept by the filter.
- *
- * \ingroup PathListSource
- *
- * \ingroup OTBPath
- */
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-class ITK_EXPORT VectorizationPathListFilter
-  : public PathListSource<TOutputPath>
-{
-public:
-  /** Standard typedefs */
-  typedef VectorizationPathListFilter   Self;
-  typedef PathListSource<TOutputPath>   Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(VectorizationPathListFilter, PathListSource);
-
-  /** Template parameters typedefs */
-  typedef TInputModulus                           InputModulusType;
-  typedef typename InputModulusType::ConstPointer InputModulusConstPointerType;
-  typedef typename InputModulusType::PixelType    InputPixelType;
-  typedef typename InputModulusType::PointType    PointType;
-  typedef typename InputModulusType::IndexType    IndexType;
-
-  typedef TInputDirection                              InputDirectionType;
-  typedef typename InputDirectionType::ConstPointer    InputDirectionConstPointerType;
-  typedef TOutputPath                                  OutputPathType;
-  typedef typename OutputPathType::Pointer             OutputPathPointerType;
-  typedef typename OutputPathType::ContinuousIndexType VertexType;
-
-  /** Derived typedefs */
-  typedef typename Superclass::OutputPathListType        OutputPathListType;
-  typedef typename Superclass::OutputPathListPointerType OutputPathListPointerType;
-
-  /** Set/get the input modulus */
-  using Superclass::SetInput;
-  void SetInput(InputModulusType * inputModulus);
-  const InputModulusType * GetInput(void);
-
-  /** Set/get the input direction */
-  void SetInputDirection(InputDirectionType * inputDirection);
-  const InputDirectionType * GetInputDirection(void);
-
-  itkSetMacro(AmplitudeThreshold, InputPixelType);
-  itkGetMacro(AmplitudeThreshold, InputPixelType);
-
-protected:
-
-  /** Other internal useful typedefs */
-  typedef otb::Image<bool, InputModulusType::ImageDimension> FlagImageType;
-  typedef typename FlagImageType::Pointer                    FlagImagePointerType;
-
-  typedef itk::ImageRegionConstIterator<InputModulusType>   ModRegionIteratorType;
-  typedef itk::ImageRegionConstIterator<InputDirectionType> DirRegionIteratorType;
-  typedef itk::ImageRegionIterator<FlagImageType>           FlagRegionIteratorType;
-
-  typedef itk::ConstantBoundaryCondition<InputModulusType>   ModBCType;
-  typedef itk::ConstantBoundaryCondition<InputDirectionType> DirBCType;
-  typedef itk::ConstantBoundaryCondition<FlagImageType>      FlagBCType;
-
-  typedef itk::ConstNeighborhoodIterator<InputModulusType, ModBCType>   ModNeighborhoodIteratorType;
-  typedef itk::ConstNeighborhoodIterator<InputDirectionType, ModBCType> DirNeighborhoodIteratorType;
-  typedef itk::NeighborhoodIterator<FlagImageType, FlagBCType>          FlagNeighborhoodIteratorType;
-
-  typedef typename ModNeighborhoodIteratorType::RadiusType RadiusType;
-  typedef typename ModNeighborhoodIteratorType::OffsetType OffsetType;
-  typedef std::vector<OffsetType>                          OffsetVectorType;
-
-  typedef typename OutputPathType::VertexListType VertexListType;
-  typedef typename VertexListType::ConstPointer   VertexListPointerType;
-  typedef typename VertexListType::ConstIterator  VertexIteratorType;
-
-  /** Constructor */
-  VectorizationPathListFilter();
-  /** Destructor */
-  ~VectorizationPathListFilter() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** Main computation method */
-  void GenerateData(void) override;
-  /**
-   * Compute a vector of the 8  neighbors to explore from the direction and the type of search (forward or backward).
-   * \param direction The direction
-   * \param flagReverse The type of search
-   * \return The neighborhood vector
-   */
-  OffsetVectorType GetEightNeighborOffsetFromDirection(double direction, unsigned int flagReverse);
-  /**
-   * Compute a vector of the 3  neighbors to explore from the direction and the type of search (forward or backward).
-   * \param direction The direction
-   * \param flagReverse The type of search
-   * \return The neighborhood vector
-   */
-  OffsetVectorType GetThreeNeighborOffsetFromDirection(double direction, unsigned int flagReverse);
-private:
-  VectorizationPathListFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-  /** Amplitude threshold to start following a path */
-  InputPixelType m_AmplitudeThreshold;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbVectorizationPathListFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/Path/include/otbVectorizationPathListFilter.hxx b/Modules/Filtering/Path/include/otbVectorizationPathListFilter.hxx
deleted file mode 100644
index 66ac753b113d61519262f03e0dbf29c4eaf60c38..0000000000000000000000000000000000000000
--- a/Modules/Filtering/Path/include/otbVectorizationPathListFilter.hxx
+++ /dev/null
@@ -1,677 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbVectorizationPathListFilter_hxx
-#define otbVectorizationPathListFilter_hxx
-
-#include "otbVectorizationPathListFilter.h"
-#include "otbMacro.h"
-#include "otbMath.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::VectorizationPathListFilter()
-{
-  this->SetNumberOfRequiredInputs(2);
-  this->SetNumberOfRequiredInputs(2);
-  m_AmplitudeThreshold = 1.0;
-}
-
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-void
-VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::SetInput(InputModulusType * inputModulus)
-{
-  this->itk::ProcessObject::SetNthInput(0, const_cast<InputModulusType *>(inputModulus));
-}
-
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-const typename VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::InputModulusType *
-VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::GetInput(void)
-{
-  if (this->GetNumberOfInputs() < 1)
-    {
-    return nullptr;
-    }
-  return static_cast<const TInputModulus*>(this->itk::ProcessObject::GetInput(0));
-}
-
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-void
-VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::SetInputDirection(InputDirectionType * inputDirection)
-{
-  this->itk::ProcessObject::SetNthInput(1, const_cast<InputDirectionType *>(inputDirection));
-}
-
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-const typename VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::InputDirectionType *
-VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::GetInputDirection(void)
-{
-  if (this->GetNumberOfInputs() < 2)
-    {
-    return nullptr;
-    }
-  return static_cast<const TInputDirection *>(this->itk::ProcessObject::GetInput(1));
-}
-
-/**
- * Main computation method
- */
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-void
-VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::GenerateData(void)
-{
-  InputModulusConstPointerType   modPtr = this->GetInput();
-  InputDirectionConstPointerType dirPtr = this->GetInputDirection();
-  OutputPathListPointerType      outPtr = this->GetOutput();
-
-  typedef typename OffsetVectorType::iterator OffsetIteratorType;
-
-  RadiusType radius;
-  radius.Fill(2);
-  OffsetVectorType offsetVector;
-
-  // Creation of the flag image
-  FlagImagePointerType flagImage = FlagImageType::New();
-  flagImage->SetRegions(modPtr->GetLargestPossibleRegion());
-  flagImage->Allocate();
-  flagImage->FillBuffer(false);
-
-  // Iterators instantiation
-  ModRegionIteratorType modIt(modPtr, modPtr->GetLargestPossibleRegion());
-  DirRegionIteratorType dirIt(dirPtr, dirPtr->GetLargestPossibleRegion());
-  FlagRegionIteratorType flagIt(flagImage, flagImage->GetLargestPossibleRegion());
-
-  for (modIt.GoToBegin(), dirIt.GoToBegin(), flagIt.GoToBegin();
-       (!modIt.IsAtEnd()) && (!dirIt.IsAtEnd()) && (!flagIt.IsAtEnd());
-       ++modIt, ++dirIt, ++flagIt)
-    {
-    if ((modIt.Get() > m_AmplitudeThreshold) && (!flagIt.Get()))
-      {
-      //this is a beginning, to follow in two directions
-      OutputPathPointerType pathTempDirect = OutputPathType::New();
-      OutputPathPointerType pathTempReverse = OutputPathType::New();
-      OutputPathPointerType path = OutputPathType::New();
-
-      bool   flagFinish;
-      int    flagReverse = 0;
-      double totalAmplitude = 0;
-
-      ModNeighborhoodIteratorType nModIt(radius, modPtr, modPtr->GetLargestPossibleRegion());
-      DirNeighborhoodIteratorType nDirIt(radius, dirPtr, dirPtr->GetLargestPossibleRegion());
-      FlagNeighborhoodIteratorType nFlagIt(radius, flagImage, flagImage->GetLargestPossibleRegion());
-
-      for (flagReverse = 0; flagReverse < 2; ++flagReverse)
-        {
-        nModIt.SetLocation(modIt.GetIndex());
-        nDirIt.SetLocation(dirIt.GetIndex());
-        nFlagIt.SetLocation(flagIt.GetIndex());
-        // temporary point
-        PointType  point;
-        VertexType vertex;
-        modPtr->TransformIndexToPhysicalPoint(nModIt.GetIndex(), point);
-        modPtr->TransformPhysicalPointToContinuousIndex(point, vertex);
-        if (flagReverse == 0)
-          {
-          flagIt.Set(true);
-
-          //  otbMsgDebugMacro(<<"Adding new vertex: "<<vertex);
-
-          pathTempDirect->AddVertex(vertex);
-          }
-        flagFinish = false;
-        while (!flagFinish)
-          {
-          offsetVector = GetThreeNeighborOffsetFromDirection(nDirIt.GetCenterPixel(), flagReverse);
-          OffsetIteratorType vecIt = offsetVector.begin();
-          bool               flagFound = false;
-          while (vecIt != offsetVector.end() && !flagFound)
-            {
-            flagFound = nModIt.GetPixel(*vecIt) > 0
-                        && !nFlagIt.GetPixel(*vecIt);
-            ++vecIt;
-            }
-          if (flagFound)
-            {
-            point.Fill(0);
-            PointType tmpPoint;
-            totalAmplitude = 0;
-            for (vecIt = offsetVector.begin(); vecIt != offsetVector.end(); ++vecIt)
-              {
-              double currentAmplitude = nModIt.GetPixel(*vecIt);
-              modPtr->TransformIndexToPhysicalPoint(nModIt.GetIndex(*vecIt), tmpPoint);
-              point[0] += currentAmplitude * tmpPoint[0];
-              point[1] += currentAmplitude * tmpPoint[1];
-              totalAmplitude += currentAmplitude;
-              }
-            point[0] = point[0] / totalAmplitude;
-            point[1] = point[1] / totalAmplitude;
-            modPtr->TransformPhysicalPointToContinuousIndex(point, vertex);
-            if (flagReverse == 0)
-              {
-//               otbMsgDevMacro(<<"Adding new vertex (direct): "<<vertex);
-
-              pathTempDirect->AddVertex(vertex);
-              }
-            else
-              {
-
-//               otbMsgDevMacro(<<"Adding new vertex (reverse): "<<vertex);
-
-              pathTempReverse->AddVertex(vertex);
-              }
-            // flag the pixel use
-            nFlagIt.SetCenterPixel(true);
-            //update the neighbor iterators so they are centered on the nearest pixel to the barycenter
-            IndexType newIndex;
-            if (modPtr->TransformPhysicalPointToIndex(point, newIndex))
-              {
-//              otbMsgDevMacro(<<"Moving to new center: " << newIndex);
-              nModIt.SetLocation(newIndex);
-              nDirIt.SetLocation(newIndex);
-              nFlagIt.SetLocation(newIndex);
-
-              if (nModIt.GetCenterPixel() == 0)
-                {
-                //we need to check that in case the barycenter is out...
-                flagFinish = true;
-                }
-              if (nFlagIt.GetCenterPixel())
-                {
-                //we don't want to go back to the same pixels
-                flagFinish = true;
-                }
-              }
-            else
-              {
-              //new point outside image
-              flagFinish = true;
-              }
-            }
-          else
-            {
-            flagFinish = true;
-            }
-          }
-        }
-      VertexListPointerType vertexDirect = pathTempDirect->GetVertexList();
-      VertexListPointerType vertexReverse = pathTempReverse->GetVertexList();
-
-      unsigned int numberVertex = 0;
-
-      VertexIteratorType vertexReverseIt = vertexReverse->End();
-      if (vertexReverseIt != vertexReverse->Begin())
-        {
-        --vertexReverseIt;
-        while (vertexReverseIt != vertexReverse->Begin())
-          {
-          path->AddVertex(vertexReverseIt.Value());
-          ++numberVertex;
-          --vertexReverseIt;
-          }
-        path->AddVertex(vertexReverseIt.Value());
-        }
-
-      VertexIteratorType vertexDirectIt = vertexDirect->Begin();
-      while (vertexDirectIt != vertexDirect->End())
-        {
-        path->AddVertex(vertexDirectIt.Value());
-        ++vertexDirectIt;
-        ++numberVertex;
-        }
-
-      // otbMsgDebugMacro(<<"Path number of vertices: "<<numberVertex);
-
-      if (numberVertex > 3)
-        {
-        outPtr->PushBack(path);
-        }
-      }
-    }
-}
-
-/**
- * Compute the 8 neighbors to explore from the direction and the type of search (forward or backward).
- * \param direction The direction
- * \param flagReverse The type of search
- * \return The neighborhood
- */
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-typename VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::OffsetVectorType
-VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::GetEightNeighborOffsetFromDirection(double direction, unsigned int flagReverse)
-{
-  int              neighborhoodNumber = 0;
-  OffsetVectorType offset;
-  offset.reserve(8);
-  if (direction > 0)
-    {
-    //find the direction in terms of 0, 1, 2, 3
-    neighborhoodNumber = (int) (direction / (CONST_PI_4) -1);
-    }
-  else
-    {
-    neighborhoodNumber = (int) ((direction + CONST_PI) / (CONST_PI_4) -1);
-    neighborhoodNumber = (neighborhoodNumber + 4);
-    //if the direction was <0 need to convert to 4, 5, 6, 7
-    }
-  if (flagReverse)
-    {
-    //if the reverse flag is activated we need to look on the other side
-    neighborhoodNumber = (neighborhoodNumber + 4) % 8;
-    }
-  OffsetType tmpOffset;
-  switch (neighborhoodNumber)
-    {
-    case 0:
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-
-      tmpOffset[0] = 2;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-
-      break;
-
-    case 1:
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-
-      tmpOffset[0] = 2;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      break;
-
-    case 2:
-      tmpOffset[0] = 0;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-
-      tmpOffset[0] = 0;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      break;
-
-    case 3:
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-
-      tmpOffset[0] = -2;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      break;
-
-    case 4:
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-
-      tmpOffset[0] = -2;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -2;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      break;
-
-    case 5:
-      tmpOffset[0] = -1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-
-      tmpOffset[0] = -2;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      break;
-
-    case 6:
-      tmpOffset[0] = 0;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-
-      tmpOffset[0] = 0;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      break;
-
-    case 7:
-      tmpOffset[0] = 1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-
-      tmpOffset[0] = 2;
-      tmpOffset[1] = -2;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 2;
-      tmpOffset[1] = 2;
-      offset.push_back(tmpOffset);
-      break;
-    }
-  return offset;
-}
-
-/**
- * Compute the 3 neighbors to explore from the direction and the type of search (forward or backward).
- * \param direction The direction
- * \param flagReverse The type of search
- * \return The neighborhood
- */
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-typename VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::OffsetVectorType
-VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::GetThreeNeighborOffsetFromDirection(double direction, unsigned int flagReverse)
-{
-  int              neighborhoodNumber = 0;
-  OffsetVectorType offset;
-  offset.reserve(3);
-  if (direction > 0)
-    {
-    //find the direction in terms of 0, 1, 2, 3
-    neighborhoodNumber = (int) (direction / (CONST_PI_4) -1);
-    }
-  else
-    {
-    neighborhoodNumber = (int) ((direction + CONST_PI) / (CONST_PI_4) -1);
-    neighborhoodNumber = (neighborhoodNumber + 4);
-    //if the direction was <0 need to convert to 4, 5, 6, 7
-    }
-  if (flagReverse)
-    {
-    //if the reverse flag is activated we need to look on the other side
-    neighborhoodNumber = (neighborhoodNumber + 4) % 8;
-    }
-  OffsetType tmpOffset;
-//  otbMsgDevMacro(<<"Direction: " << neighborhoodNumber)
-  switch (neighborhoodNumber)
-    {
-    case 0:
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-
-      break;
-
-    case 1:
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-
-      break;
-
-    case 2:
-      tmpOffset[0] = 0;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-
-      break;
-
-    case 3:
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-
-      break;
-
-    case 4:
-      tmpOffset[0] = -1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = -1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-
-      break;
-
-    case 5:
-      tmpOffset[0] = -1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 0;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-
-      break;
-
-    case 6:
-      tmpOffset[0] = 0;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-
-      break;
-
-    case 7:
-      tmpOffset[0] = 1;
-      tmpOffset[1] = -1;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 0;
-      offset.push_back(tmpOffset);
-      tmpOffset[0] = 1;
-      tmpOffset[1] = 1;
-      offset.push_back(tmpOffset);
-
-      break;
-    }
-  return offset;
-}
-
-/**
- * PrintSelf Method
- */
-template <class TInputModulus, class TInputDirection, class TOutputPath>
-void
-VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-} // End namespace otb
-#endif
diff --git a/Modules/Filtering/Path/test/CMakeLists.txt b/Modules/Filtering/Path/test/CMakeLists.txt
index 699c24a3ca0a9e7761c463280b97dc4e468282da..79fe10a22d30c9ca5bd5d652c8e663fea243964d 100644
--- a/Modules/Filtering/Path/test/CMakeLists.txt
+++ b/Modules/Filtering/Path/test/CMakeLists.txt
@@ -36,7 +36,6 @@ otbDrawPathFilter.cxx
 otbOrientationPath.cxx
 otbPolyLineImageConstIterator.cxx
 otbRegionImageToRectangularPathListFilter.cxx
-otbVectorizationPathListFilter.cxx
 otbClosePathFunctor.cxx
 otbPolyLineImageIterator.cxx
 )
@@ -62,12 +61,12 @@ otb_add_test(NAME feTvImageToEdgePathFilterBis COMMAND otbPathTestDriver
 
 otb_add_test(NAME feTvImageToEdgePathFilter COMMAND otbPathTestDriver
   --compare-image ${EPSILON_8}
-  ${BASELINE}/feImageToEdgePathFilter_rcc8_mire4.png
-  ${TEMP}/feImageToEdgePathFilter_rcc8_mire4.png
+  ${BASELINE}/feImageToEdgePathFilterOutput.tif
+  ${TEMP}/feImageToEdgePathFilterOutput.tif
   otbImageToEdgePathFilter
-  ${INPUTDATA}/rcc8_mire4.png
-  ${TEMP}/feImageToEdgePathFilter_rcc8_mire4.png
-  255
+  ${INPUTDATA}/labelImage_UnsignedChar.tif
+  ${TEMP}/feImageToEdgePathFilterOutput.tif
+  3
   )
 
 otb_add_test(NAME feTuCompacityPathCircle COMMAND otbPathTestDriver
@@ -165,31 +164,6 @@ otb_add_test(NAME feTvRegionImageToRectangularPathListFilter COMMAND otbPathTest
   0.9 #fit score
   10)  #minimum size
 
-otb_add_test(NAME feTvVectorizationPathListFilterImageOutput COMMAND otbPathTestDriver
-  --compare-image ${EPSILON_8}
-  ${BASELINE}/feTvVectorizationPathListOutput.png
-  ${TEMP}/feTvVectorizationPathListOutput.png
-  otbVectorizationPathListFilter
-  ${INPUTDATA}/InputForRoadDetection_NonMaxRem.raw.hdr
-  ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr
-  ${TEMP}/feTvVectorizationPathListOutputIgnored.txt
-  ${TEMP}/feTvVectorizationPathListOutput.png
-  0.0001
-  )
-
-otb_add_test(NAME feTvVectorizationPathListFilterAsciiOutput COMMAND otbPathTestDriver
-  --compare-ascii ${EPSILON_3}
-  ${BASELINE_FILES}/feTvVectorizationPathListOutput.txt
-  ${TEMP}/feTvVectorizationPathListOutput.txt
-  otbVectorizationPathListFilter
-  ${INPUTDATA}/InputForRoadDetection_NonMaxRem.raw.hdr
-  ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr
-  ${TEMP}/feTvVectorizationPathListOutput.txt
-  ${TEMP}/feTvVectorizationPathListOutputIgnored.png
-  0.0005
-  )
-
-
 otb_add_test(NAME bfTvClosePathFunctor COMMAND otbPathTestDriver
   --compare-ascii ${NOTOL}
   ${BASELINE_FILES}/bfClosePathFunctorTest.txt
diff --git a/Modules/Filtering/Path/test/otbImageToEdgePathFilter.cxx b/Modules/Filtering/Path/test/otbImageToEdgePathFilter.cxx
index 450d33c2779751a006ba73c2da10f26232724c07..688bd0fca736b92ca78a9acc4f90c4d90550df8b 100644
--- a/Modules/Filtering/Path/test/otbImageToEdgePathFilter.cxx
+++ b/Modules/Filtering/Path/test/otbImageToEdgePathFilter.cxx
@@ -25,6 +25,7 @@
 #include "otbImage.h"
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
+#include "otbMacro.h"
 
 int otbImageToEdgePathFilter(int itkNotUsed(argc), char * argv[])
 {
@@ -54,7 +55,7 @@ int otbImageToEdgePathFilter(int itkNotUsed(argc), char * argv[])
 
   pathFilter->Update();
 
-  std::cout << " pathFilter = " << pathFilter << std::endl;
+  otbLogMacro(Debug, << " pathFilter = " << pathFilter);
 
   PathType * outputPath = pathFilter->GetOutput();
 
@@ -67,7 +68,7 @@ int otbImageToEdgePathFilter(int itkNotUsed(argc), char * argv[])
 
   VertexListTypePointer ptrVertexList =  outputPath->GetVertexList();
 
-  std::cout << "Size : " << ptrVertexList->Size() << std::endl;
+  otbLogMacro(Info, << "Size : " << ptrVertexList->Size());
 
   // Initialize Output Image
   ImageType::Pointer outputImage = ImageType::New();
@@ -80,7 +81,7 @@ int otbImageToEdgePathFilter(int itkNotUsed(argc), char * argv[])
 
   for (unsigned int cpt = 0; cpt <  ptrVertexList->Size(); ++cpt)
     {
-    std::cout << " Point " << cpt << " : " << ptrVertexList->GetElement(cpt) << std::endl;
+    otbLogMacro(Debug, << " Point " << cpt << " : " << ptrVertexList->GetElement(cpt));
     IndexType pos;
     pos[0] = static_cast<unsigned long>(ptrVertexList->GetElement(cpt)[0]);
     pos[1] = static_cast<unsigned long>(ptrVertexList->GetElement(cpt)[1]);
diff --git a/Modules/Filtering/Path/test/otbPathListToHistogramGenerator.cxx b/Modules/Filtering/Path/test/otbPathListToHistogramGenerator.cxx
index 23165541122163dbed43f788be8a5d86e2e35766..eaa39a949918925e2c6112d569676b53d9752c36 100644
--- a/Modules/Filtering/Path/test/otbPathListToHistogramGenerator.cxx
+++ b/Modules/Filtering/Path/test/otbPathListToHistogramGenerator.cxx
@@ -21,7 +21,7 @@
 
 
 
-#include "itkMacro.h"
+#include "otbMacro.h"
 #include "itkPolyLineParametricPath.h"
 #include "otbOrientationPathFunction.h"
 #include "otbPathListToHistogramGenerator.h"
@@ -78,17 +78,16 @@ int otbPathListToHistogramGenerator(int itkNotUsed(argc), char * argv[])
   const HistogramType * histogram = histogramGenerator->GetOutput();
 
   const unsigned int histogramSize = histogram->Size();
-  std::cout << "Histogram size " << histogramSize << std::endl;
+  otbLogMacro(Info, << "Histogram size " << histogramSize);
 
   for (unsigned int bin = 0; bin < histogramSize; bin++)
     {
     if (histogram->GetFrequency(bin, 0) != NbOfPointsPerHistogram)
       {
-      std::cout << "Error in histogram value !" << std::endl;
+      otbLogMacro(Warning, << "Error in histogram value !");
       return EXIT_FAILURE;
       }
-    std::cout << "bin = " << bin << " frequency = ";
-    std::cout << histogram->GetFrequency(bin, 0) << std::endl;
+    otbLogMacro(Debug, << "bin = " << bin << " frequency = " << histogram->GetFrequency(bin, 0));
     }
 
   return EXIT_SUCCESS;
diff --git a/Modules/Filtering/Path/test/otbPathTestDriver.cxx b/Modules/Filtering/Path/test/otbPathTestDriver.cxx
index 5d1b508991581b0c74237020d6a8eb0d819f6c48..36352f2ca861edbda39448ed175d19b844c00ee3 100644
--- a/Modules/Filtering/Path/test/otbPathTestDriver.cxx
+++ b/Modules/Filtering/Path/test/otbPathTestDriver.cxx
@@ -36,7 +36,6 @@ void RegisterTests()
   REGISTER_TEST(otbOrientationPath);
   REGISTER_TEST(otbPolyLineImageConstIterator);
   REGISTER_TEST(otbRegionImageToRectangularPathListFilter);
-  REGISTER_TEST(otbVectorizationPathListFilter);
   REGISTER_TEST(otbClosePathFunctor);
   REGISTER_TEST(otbPolyLineImageIterator);
 }
diff --git a/Modules/Filtering/Path/test/otbVectorizationPathListFilter.cxx b/Modules/Filtering/Path/test/otbVectorizationPathListFilter.cxx
deleted file mode 100644
index d4bf64c81c83e7628b6561ed906de841d124190a..0000000000000000000000000000000000000000
--- a/Modules/Filtering/Path/test/otbVectorizationPathListFilter.cxx
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbVectorizationPathListFilter.h"
-#include "itkPolyLineParametricPath.h"
-#include "otbImageFileReader.h"
-#include <fstream>
-
-#include "otbDrawPathListFilter.h"
-#include "otbImageFileWriter.h"
-
-int otbVectorizationPathListFilter(int itkNotUsed(argc), char * argv[])
-{
-  const char * modfname = argv[1];
-  const char * dirfname = argv[2];
-  const char * outfname = argv[3];
-  const char * outImagefname = argv[4];
-  const double thresh = atof(argv[5]);
-
-  const unsigned int Dimension = 2;
-  typedef double                                                              PixelType;
-  typedef unsigned char                                                       OutputPixelType;
-  typedef otb::Image<PixelType, Dimension>                                    ImageType;
-  typedef otb::Image<OutputPixelType, Dimension>                              OutputImageType;
-  typedef otb::ImageFileWriter<OutputImageType>                               WriterType;
-  typedef otb::ImageFileReader<ImageType>                                     ReaderType;
-  typedef itk::PolyLineParametricPath<Dimension>                              PathType;
-  typedef otb::DrawPathListFilter<OutputImageType, PathType, OutputImageType> DrawFilterType;
-  typedef otb::VectorizationPathListFilter<ImageType, ImageType, PathType>    VectorizationPathListFilterType;
-  typedef VectorizationPathListFilterType::OutputPathListType                 PathListType;
-  typedef PathListType::ConstIterator                                         PathListIteratorType;
-  typedef PathType::VertexListType                                            VertexListType;
-  typedef VertexListType::ConstIterator                                       VertexIteratorType;
-  // Instantiating objects
-  VectorizationPathListFilterType::Pointer filter = VectorizationPathListFilterType::New();
-  ReaderType::Pointer                      modReader = ReaderType::New();
-  ReaderType::Pointer                      dirReader = ReaderType::New();
-
-  modReader->SetFileName(modfname);
-  dirReader->SetFileName(dirfname);
-
-  filter->SetInput(modReader->GetOutput());
-  filter->SetInputDirection(dirReader->GetOutput());
-  filter->SetAmplitudeThreshold(thresh);
-  filter->Update();
-
-  PathListType::Pointer pathList = filter->GetOutput();
-  PathListIteratorType  pathListIt = pathList->Begin();
-
-  std::ofstream file;
-  file.open(outfname);
-  unsigned int counter = 0;
-
-  while (pathListIt != pathList->End())
-    {
-    file << "Path " << counter << ": ";
-    for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin();
-         vIt != pathListIt.Get()->GetVertexList()->End();
-         ++vIt)
-      {
-      if (vIt != pathListIt.Get()->GetVertexList()->Begin())
-        {
-        file << ", ";
-        }
-      file << vIt.Value();
-      }
-    file << std::endl;
-    ++pathListIt;
-    ++counter;
-    }
-  file.close();
-
-  OutputImageType::Pointer output = OutputImageType::New();
-  output->SetRegions(modReader->GetOutput()->GetLargestPossibleRegion());
-  output->Allocate();
-  output->FillBuffer(255);
-
-  DrawFilterType::Pointer drawer = DrawFilterType::New();
-  drawer->SetInput(output);
-  drawer->SetInputPath(filter->GetOutput());
-  drawer->SetPathValue(0);
-
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetFileName(outImagefname);
-  writer->SetInput(drawer->GetOutput());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.h b/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.h
deleted file mode 100644
index 056a1003cbb58712343a0cc63fa3193483d6eb17..0000000000000000000000000000000000000000
--- a/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbOrthoRectificationFilter_h
-#define otbOrthoRectificationFilter_h
-
-#include <sstream>
-#include <stdio.h>
-
-#include "otbGenericRSResampleImageFilter.h"
-#include "otbCompositeTransform.h"
-#include "otbInverseSensorModel.h"
-
-#include "otbVectorImage.h"
-#include "otbImage.h"
-
-namespace otb
-{
-/** \class OrthoRectificationFilter
- *
- * \brief Class for Orthorectifying an image
- *
- * This class is used to apply map projection and sensor model transformation
- * to orthorectify an image, with or without DEM.
- *
- * \ingroup Projection
- *
- * \example Projections/OrthoRectificationExample.cxx
- *
- *
- * \ingroup OTBProjection
- */
-
-template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision = double>
-class ITK_EXPORT OrthoRectificationFilter :
-    public GenericRSResampleImageFilter<TInputImage, TOutputImage>
-{
-public:
-  /** Standard class typedefs */
-  typedef GenericRSResampleImageFilter<TInputImage,
-      TOutputImage>                     Superclass;
-  typedef OrthoRectificationFilter      Self;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-
-  /** types definitions */
-  typedef typename TInputImage::IndexType   IndexType;
-  typedef typename TInputImage::SizeType    SizeType;
-  typedef typename TInputImage::SpacingType SpacingType;
-  typedef typename TInputImage::PointType   PointType;
-  typedef typename TInputImage::RegionType  RegionType;
-
-  typedef typename TOutputImage::PixelType OutputPixelType;
-
-  /** output map projection */
-  typedef TMapProjection                   MapProjectionType;
-  typedef typename TMapProjection::Pointer MapProjectionPointerType;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(OrthoRectificationFilter, GenericRSResampleImageFilter);
-
-  /** Accessors */
-  virtual void SetMapProjection(MapProjectionType* arg)
-  {
-    if (this->m_MapProjection != arg)
-      {
-      this->m_MapProjection = arg;
-      this->Modified();
-      }
-  }
-  itkGetObjectMacro(MapProjection, MapProjectionType);
-
-protected:
-  OrthoRectificationFilter();
-  ~OrthoRectificationFilter() override;
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-  void GenerateInputRequestedRegion() override;
-  void GenerateOutputInformation(void) override;
-
-private:
-  OrthoRectificationFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  /** Map Projection used to transform cartographic coordinates in geographic  coordinates */
-  MapProjectionPointerType m_MapProjection;
-
-};
-
-} // namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbOrthoRectificationFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.hxx b/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.hxx
deleted file mode 100644
index c383f86a9cb2bfb58e39c9511eda1f4088cef048..0000000000000000000000000000000000000000
--- a/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.hxx
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbOrthoRectificationFilter_hxx
-#define otbOrthoRectificationFilter_hxx
-
-#include "otbOrthoRectificationFilter.h"
-#include "itkMetaDataObject.h"
-
-namespace otb
-{
-
-template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision>
-OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision>
-::OrthoRectificationFilter(): m_MapProjection(nullptr)
-{}
-
-template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision>
-OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision>
-::~OrthoRectificationFilter()
-{}
-
-template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision>
-void OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "OrthoRectification" << "\n";
-}
-
-template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision>
-void
-OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision>
-::GenerateInputRequestedRegion()
-{
-  Superclass::GenerateInputRequestedRegion();
-}
-
-template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision>
-void
-OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision>
-::GenerateOutputInformation()
-{
-  // call the superclass' implementation of this method
-  Superclass::GenerateOutputInformation();
-
-  if(!m_MapProjection.IsNull()  && !m_MapProjection->GetWkt().empty())
-    {
-    // fill up the metadata information for ProjectionRef
-    itk::MetaDataDictionary&  dict          = this->GetOutput()->GetMetaDataDictionary();
-    std::string               projectionRef = m_MapProjection->GetWkt();
-    itk::EncapsulateMetaData<std::string>(dict, MetaDataKey::ProjectionRefKey, projectionRef);
-
-    // Fill the GenericRSTransform with those information
-    this->SetOutputProjectionRef(projectionRef);
-    this->UpdateTransform();
-    }
-}
-
-} //namespace otb
-
-#endif
diff --git a/Modules/Filtering/Projection/test/CMakeLists.txt b/Modules/Filtering/Projection/test/CMakeLists.txt
index ce356198437339a0c7cceb404ff537d1125a6ffd..b2e82e3676835ab5d7883aee53e014939ae41d3e 100644
--- a/Modules/Filtering/Projection/test/CMakeLists.txt
+++ b/Modules/Filtering/Projection/test/CMakeLists.txt
@@ -24,7 +24,6 @@ set(OTBProjectionTests
 otbSensorModel.cxx
 otbProjectionTestDriver.cxx
 otbVectorDataProjectionFilterFromGeoToMap.cxx
-otbOrthoRectificationFilter.cxx
 otbGenericRSResampleImageFilter.cxx
 otbGeometriesProjectionFilter.cxx
 otbGenericRSTransformGenericTest.cxx
@@ -44,7 +43,6 @@ otbVectorDataProjectionFilterFromMapToImage.cxx
 otbGenericRSTransformFromImage.cxx
 otbCompositeTransform.cxx
 otbLeastSquareAffineTransformEstimator.cxx
-otbSpectralAngleDataNodeFeatureFunction.cxx
 otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx
 otbGeographicalDistance.cxx
 otbTileImageFilterRSTransformTest.cxx
@@ -112,7 +110,6 @@ foreach( file ${GEOMGCP} )
     1 # imgTol
     ${current_geotol} # geoTol
     0 # create baseline (argv[7])
-    1 # mode verbose
     1 # 0 : no keyword check  1 : check needed keywords
   )
 endforeach()
@@ -157,7 +154,6 @@ foreach( file ${GEOMGCP} )
     1 # imgTol
     1 # geoTol
     0 # create baseline (argv[7])
-    1 # mode verbose
     0 # 0 : no keyword check  1 : check needed keywords
   )
 endforeach()
@@ -190,6 +186,16 @@ RAPIDEYE/level1B/2008-12-25T005918_RE3_1B-NAC_397971_12345_band3.ntf
 SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff
 )
 
+set(TOLERANCE_RATIO
+0
+0
+0
+0
+0
+0
+0.0002
+)
+
 set(IMG_TYPE
 "pleiades-1"
 "wv2-1"
@@ -305,6 +311,8 @@ foreach(current_img ${IMG_TEST_ORTHO})
 	list(GET RESOL ${IMGNB} current_resol         )
 	list(GET GRIDSPACING ${IMGNB} current_grid_spacing)
 	list(GET ISCOMPLEX ${IMGNB} current_is_compex)
+  list(GET TOLERANCE_RATIO ${IMGNB} current_tolerance_ratio)
+
 	math(EXPR IMGNB "${IMGNB} + 1")
 
 	set( MODENB 0)
@@ -315,7 +323,8 @@ foreach(current_img ${IMG_TEST_ORTHO})
 	  otb_add_test(NAME prTvOrthoRectification_${current_imgtype}_${current_mode} COMMAND otbProjectionTestDriver
 		  --compare-image ${EPSILON_4}  ${BASELINE}/prTvOrthoRectification_${current_imgtype}_${current_mode}.tif
 		  ${TEMP}/prTvOrthoRectification_${current_imgtype}_${current_mode}.tif
-		  otbOrthoRectificationFilter
+                  --tolerance-ratio ${current_tolerance_ratio}
+		  otbGenericRSResampleImageFilter
 		  LARGEINPUT{${current_img}?&geom=${INPUTDATA}/${current_geomgcp}.geom}
 		  ${TEMP}/prTvOrthoRectification_${current_imgtype}_${current_mode}.tif
 		  ${current_originx}
@@ -338,19 +347,6 @@ endforeach()
 #----------------- OrthoRectification tests (end) -----------------------
 #------------------------------------------------------------------------
 
-otb_add_test(NAME prTvotbGenericRSResampleImageFilter COMMAND otbProjectionTestDriver
-  --compare-image ${EPSILON_4}
-  ${BASELINE}/prTvotbGenericRSResampleImageFilterOutput.tif
-  ${TEMP}/prTvotbGenericRSResampleImageFilterOutput.tif
-  otbGenericRSResampleImageFilter
-  LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF}
-  1000
-  15
-  0
-  1
-  ${TEMP}/prTvotbGenericRSResampleImageFilterOutput.tif
-  )
-
 otb_add_test(NAME prTvGeometriesProjectionFilterLines COMMAND otbProjectionTestDriver
   --compare-ogr ${EPSILON_9}
   ${BASELINE_FILES}/prTvVectorDataProjectionFilterLines.shp
@@ -585,29 +581,10 @@ otb_add_test(NAME prTvLeastSquareAffineTransformEstimator COMMAND otbProjectionT
   352 807 919 10023 12102 14181
   )
 
-otb_add_test(NAME bfTvSpectralAngleDataNodeFeatureFunction_Polygon COMMAND otbProjectionTestDriver
-  --compare-ogr ${EPSILON_3}
-  ${BASELINE_FILES}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp
-  ${TEMP}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp
-  otbSpectralAngleDataNodeFeatureFunction
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
-  ${INPUTDATA}/DEM/srtm_directory
-  ${TEMP}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp
-  0 )
-
-otb_add_test(NAME bfTvSpectralAngleDataNodeFeatureFunction_Line COMMAND otbProjectionTestDriver
-  --compare-ogr ${EPSILON_9}
-  ${BASELINE_FILES}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp
-  ${TEMP}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp
-  otbSpectralAngleDataNodeFeatureFunction
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
-  ${INPUTDATA}/DEM/srtm_directory
-  ${TEMP}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp
-  0
-  )
-
+set(VALID_CONDITION err=12)
+if(OTB_OSSIM_VERSION LESS 20200)
+set(VALID_CONDITION err=10)
+endif()
 otb_add_test(NAME prTvGCPsToRPCSensorModelImageCheckInputGcpPointsProjection_WithDEM COMMAND otbProjectionTestDriver
   otbGCPsToRPCSensorModelImageFilterCheckRpcModel
   ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500.tif
@@ -712,9 +689,13 @@ otb_add_test(NAME prTvGCPsToRPCSensorModelImageCheckInputGcpPointsProjection_Wit
   2450 2350 1.43238 43.6063 144.66
   2450 2400 1.43239 43.6051 144.932
   2450 2450 1.43239 43.6038 136.794
-  err=10 # Tolerance in meters, the first goal of this test
+  ${VALID_CONDITION} # Tolerance in meters, the first goal of this test
   )
 
+set(VALID_CONDITION err=20)
+if(OTB_OSSIM_VERSION LESS 20200)
+set(VALID_CONDITION err=10)
+endif()
 otb_add_test(NAME prTvGCPsToRPCSensorModelImageCheckInputGcpPointsProjection_WithoutDEM COMMAND otbProjectionTestDriver
   otbGCPsToRPCSensorModelImageFilterCheckRpcModel
   ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500.tif
@@ -819,7 +800,7 @@ otb_add_test(NAME prTvGCPsToRPCSensorModelImageCheckInputGcpPointsProjection_Wit
   2450 2350 1.43238 43.6059 0
   2450 2400 1.43238 43.6047 0
   2450 2450 1.43239 43.6034 0
-  err=10 # Tolerance in meters, the first goal of this test
+  ${VALID_CONDITION} # Tolerance in meters, the first goal of this test
   )
 
 otb_add_test(NAME prTvGeographicalDistance COMMAND otbProjectionTestDriver
@@ -846,10 +827,15 @@ otb_add_test(NAME prTvTileImageFilterGenericRSTransformTest_LASVEGAS_DIMAPv1 COM
   LARGEINPUT{PLEIADES/LASVEGAS_JP2_DIMAPv1_PRIMARY_PMS_lossless_12bits/IMGPHR_PHR1A_SENSOR_20120217_IPU_20120217_5374-001_V1/IMG_R3C1.JP2}
   )
 
-otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterAndOrtho COMMAND otbProjectionTestDriver
+set(VALID_CONDITION)
+if(OTB_OSSIM_VERSION LESS 20200)
+set(VALID_CONDITION
   --compare-image ${EPSILON_4}
   ${BASELINE}/otbGCPsToRPCSensorModelImageFilterAndOrthoOutput.tif
-  ${TEMP}/otbGCPsToRPCSensorModelImageFilterAndOrthoOutput.tif
+  ${TEMP}/otbGCPsToRPCSensorModelImageFilterAndOrthoOutput.tif)
+endif()
+otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterAndOrtho COMMAND otbProjectionTestDriver
+  ${VALID_CONDITION}
   otbGCPsToRPCSensorModelImageFilterAndOrtho
   ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500.tif
   ${TEMP}/otbGCPsToRPCSensorModelImageFilterAndOrthoOutput.tif
@@ -968,10 +954,15 @@ otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterAndOrtho COMMAND otbProject
   #LARGEINPUT{VECTOR/MidiPyrenees/roads.shp}
   #)
 
-otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterWithoutDEM COMMAND otbProjectionTestDriver
+set(VALID_CONDITION)
+if(OTB_OSSIM_VERSION LESS 20200)
+set(VALID_CONDITION
   --compare-ascii ${EPSILON_4}
   ${BASELINE_FILES}/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt
-  ${TEMP}/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt
+  ${TEMP}/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt)
+endif()
+otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterWithoutDEM COMMAND otbProjectionTestDriver
+  ${VALID_CONDITION}
   otbGCPsToRPCSensorModelImageFilterWithoutDEM
   ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500.tif
   ${TEMP}/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt
@@ -1193,28 +1184,3 @@ set(GenericConversionChecking_INPUTS
       #${INPUTDATA}/DEM/srtm_directory
       #3 )
   #endforeach()
-
-
-
-  set(SENSOR_TYPES
-    "QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF"
-    "GEOEYE/LES_ROCHES/po_350134_bgrn_0000000.tif"
-    "WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_MUL/09DEC10103019-M2AS-052298844010_01_P001.TIF"
-    )
-
-  foreach( file ${SENSOR_TYPES})
-    # Get the sensor name
-    set(sharp_regexp "([0-9A-Za-z_]*)[ ]*/[ ]*(.*)")
-    string(REGEX REPLACE "${sharp_regexp}" "\\1" sensor_name "${file}")
-    # Tests
-    otb_add_test(NAME prTvotbGenericRSResampleImageFilterFromMap_${sensor_name} COMMAND otbProjectionTestDriver
-      --compare-image ${EPSILON_4}
-      ${BASELINE}/prTvotbGenericRSResampleImageFilterOutputFromMap_${sensor_name}.tif
-      ${TEMP}/prTvotbGenericRSResampleImageFilterOutputFromMap_${sensor_name}.tif
-      otbGenericRSResampleImageFilterFromMap
-      LARGEINPUT{${file}}
-      15
-      0
-      ${TEMP}/prTvotbGenericRSResampleImageFilterOutputFromMap_${sensor_name}.tif
-      )
-  endforeach()
diff --git a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx
index 8ebb1678fd04526694eb59bc4604f4368985f38c..f9eb115fcf556b9104b6b157d4fa0425e3ebd0a1 100644
--- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx
+++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx
@@ -21,8 +21,8 @@
 #include "otbImageFileReader.h"
 #include "otbGCPsToRPCSensorModelImageFilter.h"
 #include "otbImageFileWriter.h"
-#include "otbGenericMapProjection.h"
-#include "otbOrthoRectificationFilter.h"
+#include "otbGenericRSResampleImageFilter.h"
+#include "otbMacro.h"
 
 int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[])
 {
@@ -46,8 +46,7 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[])
   typedef GCPsToSensorModelFilterType::Point2DType        Point2DType;
   typedef GCPsToSensorModelFilterType::Point3DType        Point3DType;
   typedef otb::ImageFileWriter<ImageType>                                  WriterType;
-  typedef otb::GenericMapProjection<otb::TransformDirection::INVERSE> MapProjectionType;
-  typedef otb::OrthoRectificationFilter<ImageType, ImageType, MapProjectionType> OrthoRectifFilterType;
+  typedef otb::GenericRSResampleImageFilter<ImageType, ImageType> OrthoRectifFilterType;
 
   ReaderType::Pointer reader = ReaderType::New();
   reader->SetFileName(infname);
@@ -58,7 +57,7 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[])
 
   unsigned int nbGCPs = (argc - 11) / 5;
 
-  std::cout << "Receiving " << nbGCPs << " from command line." << std::endl;
+  otbLogMacro(Info, << "Receiving " << nbGCPs << " from command line.");
 
   for (unsigned int gcpId = 0; gcpId < nbGCPs; ++gcpId)
     {
@@ -71,7 +70,7 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[])
     geoPoint[1] = atof(argv[14 + 5 * gcpId]);
     geoPoint[2] = atof(argv[15 + 5 * gcpId]);
 
-    std::cout << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint << std::endl;
+    otbLogMacro(Debug, << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint);
 
     rpcEstimator->AddGCP(sensorPoint, geoPoint);
     }
@@ -82,17 +81,14 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[])
   std::cout.setf(std::ios::fixed, std::ios::floatfield);
   std::cout.precision(10);
 
-  std::cout << rpcEstimator->GetOutput()->GetImageKeywordlist() << std::endl;
-  std::cout << "Residual ground error: " << rpcEstimator->GetRMSGroundError() << std::endl;
+  otbLogMacro(Debug, << rpcEstimator->GetOutput()->GetImageKeywordlist());
+  otbLogMacro(Info, << "Residual ground error: " << rpcEstimator->GetRMSGroundError());
 
   // Orthorectify the output image
   WriterType::Pointer writer = WriterType::New();
 
   OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New();
 
-
-  MapProjectionType::Pointer  utmMapProjection = MapProjectionType::New();
-
   orthoRectifFilter->SetInput(rpcEstimator->GetOutput());
 
   ImageType::IndexType start;
@@ -115,9 +111,9 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[])
   origin[1] = strtod(argv[4], nullptr);         //Origin northing
   orthoRectifFilter->SetOutputOrigin(origin);
 
-  utmMapProjection->SetWkt(otb::SpatialReference::FromUTM(atoi(argv[9]),argv[10][0]=='N'?otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt());
+  std::string wkt = otb::SpatialReference::FromUTM(atoi(argv[9]),argv[10][0]=='N'?otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt();
 
-  orthoRectifFilter->SetMapProjection(utmMapProjection);
+  orthoRectifFilter->SetOutputProjectionRef(wkt);
 
   ImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel());
   no_data.Fill(0.0);
diff --git a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx
index 23c60827eba42ff34561c4e951813694ee8928d4..a7f96117e0790366160dace88340ecdc6e7fb131 100644
--- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx
+++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx
@@ -23,6 +23,7 @@
 #include "otbGCPsToRPCSensorModelImageFilter.h"
 #include "otbGenericRSTransform.h"
 #include "otbGeographicalDistance.h"
+#include "otbMacro.h"
 #include <string>
 
 int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[])
@@ -62,7 +63,7 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[])
   rpcEstimator->SetInput(reader->GetOutput());
 
   unsigned int nbGCPs = nbPoints / 5;
-  std::cout << "Receiving " << nbPoints << " from command line." << std::endl;
+  otbLogMacro(Info, << "Receiving " << nbPoints << " from command line.");
 
   for (unsigned int gcpId = 0; gcpId < nbGCPs; ++gcpId)
     {
@@ -75,7 +76,7 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[])
     geoPoint[1] = std::stof(argv[ 6 + gcpId * 5]);
     geoPoint[2] = std::stof(argv[ 7 + gcpId * 5]);
 
-    std::cout << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint << std::endl;
+    otbLogMacro(Debug, << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint);
 
     rpcEstimator->AddGCP(sensorPoint, geoPoint);
     }
@@ -91,7 +92,7 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[])
 
   GenericRSTransformType::Pointer grsTrasnform = GenericRSTransformType::New();
   grsTrasnform->SetInputKeywordList(rpcEstimator->GetKeywordlist());
-  std::cout<<rpcEstimator->GetKeywordlist()<<std::endl;
+  otbLogMacro(Debug, <<rpcEstimator->GetKeywordlist());
   grsTrasnform->SetOutputProjectionRef("EPSG:4326");
 
   // Set the DEM Directory
@@ -126,11 +127,9 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[])
     // Search for nans
     if ( vnl_math_isnan(transformedPoint2D[0]) || vnl_math_isnan(transformedPoint2D[1]) )
       {
-      std::cout << "Reference : "<< geoPoint
-                <<" --> Result of the reprojection using the estimated RpcModel "<<  transformedPoint2D
-                << std::endl;
-      std::cout<<"The result of the projection is nan, there is a problem with the estimated RpcModel "
-               << std::endl<<std::endl;
+      otbLogMacro(Warning, << "Reference : "<< geoPoint
+        <<" --> Result of the reprojection using the estimated RpcModel "<<  transformedPoint2D);
+      otbLogMacro(Warning, <<"The result of the projection is nan, there is a problem with the estimated RpcModel");
       isErrorDetected = true;
       }
 
@@ -138,14 +137,13 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[])
     double residual = geoDistance->Evaluate(geoPoint, transformedPoint2D);
     if( residual > tol )
       {
-      std::cout << "Reference : "<< geoPoint
-                <<" --> Result of the reprojection using the estimated RpcModel "
-                << transformedPoint2D
-                << std::endl
-                << " Residual ["<< residual << "] is higher than the tolerance ["
-                << tol
-                <<"], there is a problem with the estimated RpcModel"
-                <<std::endl<<std::endl;
+      otbLogMacro(Warning, << "Reference : "<< geoPoint
+        <<" --> Result of the reprojection using the estimated RpcModel "
+        << transformedPoint2D
+        << std::endl
+        << " Residual ["<< residual << "] is higher than the tolerance ["
+        << tol
+        <<"], there is a problem with the estimated RpcModel");
       isErrorDetected = true;
       }
     }
diff --git a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx
index 454efe2bec765317ade7baf261d3bb1307ee97a2..e09549e06e51570fefb2b134a627680dc53f5c50 100644
--- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx
+++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx
@@ -53,7 +53,7 @@ int otbGCPsToRPCSensorModelImageFilterWithoutDEM(int argc, char* argv[])
 
   unsigned int nbGCPs = (argc - 3) / 5;
 
-  std::cout << "Receiving " << nbGCPs << " from command line." << std::endl;
+  otbLogMacro(Info, << "Receiving " << nbGCPs << " from command line.");
 
   for (unsigned int gcpId = 0; gcpId < nbGCPs; ++gcpId)
     {
@@ -66,7 +66,7 @@ int otbGCPsToRPCSensorModelImageFilterWithoutDEM(int argc, char* argv[])
     geoPoint[1] = atof(argv[6 + 5 * gcpId]);
     geoPoint[2] = atof(argv[7 + 5 * gcpId]);
 
-    std::cout << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint << std::endl;
+    otbLogMacro(Debug, << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint);
 
     rpcEstimator->AddGCP(sensorPoint, geoPoint);
     }
diff --git a/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx b/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx
index c61ad46200e62e100276c9cb1a3a661071918535..31027d1eae899c096547675667a3c57403498061 100644
--- a/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx
+++ b/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx
@@ -19,183 +19,124 @@
  */
 
 
-#include "otbGenericRSResampleImageFilter.h"
+
+// iostream is used for general output
+#include <iostream>
+#include <stdlib.h>
+#include <complex>
 
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
+#include "otbGenericMapProjection.h"
+#include "itkUnaryFunctorImageFilter.h"
 
-#include <ogr_spatialref.h>
-
-// Extract ROI
-#include "otbMultiChannelExtractROI.h"
-
-// Images definition
-const unsigned int Dimension = 2;
-typedef double                                      PixelType;
-typedef otb::VectorImage<PixelType, Dimension>      ImageType;
-typedef ImageType::SizeType                         SizeType;
-
-typedef otb::GenericRSResampleImageFilter<ImageType,
-                                          ImageType> ImageResamplerType;
-typedef ImageResamplerType::OriginType              OriginType;
-typedef ImageResamplerType::SpacingType             SpacingType;
-
-typedef otb::ImageFileReader<ImageType>             ReaderType;
-typedef otb::ImageFileWriter<ImageType>    WriterType;
-
+#include "otbDEMHandler.h"
+#include "otbUnaryImageFunctorWithVectorImageFilter.h"
+#include "otbGenericRSResampleImageFilter.h"
+#include "otbComplexToIntensityImageFilter.h"
+#include "otbPerBandVectorImageFilter.h"
 
-int otbGenericRSResampleImageFilter(int itkNotUsed(argc), char* argv[])
+int otbGenericRSResampleImageFilter(int argc, char* argv[])
 {
+  if (argc != 15)
+    {
+    std::cout << argv[0] <<
+    " <input filename> <output filename> <origin easting> <origin northing>"
+    " <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>"
+    " <grid_spacing> <mode> <mode.info> <is_complex>"
+              << std::endl;
 
-  // SmartPointer instantiation
-  ImageResamplerType::Pointer resampler = ImageResamplerType::New();
-
-  const char * infname = argv[1];
-  const char * outfname = argv[6];
-  unsigned int isize    = atoi(argv[2]);
-  double iGridSpacing    = atof(argv[3]);
-  int    useInRpc          = atoi(argv[4]);
-  int    useOutRpc          = atoi(argv[5]);
-
-
-  ReaderType::Pointer         reader    = ReaderType::New();
-
-  // Read the input image
-  reader->SetFileName(infname);
-  reader->UpdateOutputInformation();
-
-  // Fill the output size with the user selection
-  SizeType      size;
-  size.Fill(isize);
-
-  // Set the origin & the spacing of the output
-  OriginType  origin;
-  origin[0] = 367340;
-  origin[1] = 4.83467e+06;
-
-  SpacingType  spacing;
-  spacing[0] = 0.6;
-  spacing[1] = -0.6;
-
-  // Build the output projection ref : UTM ref
-  OGRSpatialReference    oSRS;
-  oSRS.SetProjCS("UTM");
-  oSRS.SetUTM(31, true);
-  char * utmRef = nullptr;
-  oSRS.exportToWkt(&utmRef);
+    return EXIT_FAILURE;
+    }
 
-  // Displacement Field spacing
-  SpacingType  gridSpacing;
-  gridSpacing[0] = iGridSpacing;
-  gridSpacing[1] = -iGridSpacing;
-
-  // Default value builder
-  ImageType::PixelType defaultValue;
-  itk::NumericTraits<ImageType::PixelType>::SetLength(defaultValue, reader->GetOutput()->GetNumberOfComponentsPerPixel());
-
-  // Set the Resampler Parameters
-  resampler->SetInput(reader->GetOutput());
-  resampler->SetDisplacementFieldSpacing(gridSpacing);
-  resampler->SetOutputOrigin(origin);
-  resampler->SetOutputSize(size);
-  resampler->SetOutputSpacing(spacing);
-  resampler->SetOutputProjectionRef(utmRef);
-  resampler->SetEdgePaddingValue(defaultValue);
-  if (useInRpc)
+  typedef std::complex<double>                                                      ComplexPixelType;
+  typedef otb::VectorImage<ComplexPixelType,2>                                     ComplexVectorImageType;
+  typedef otb::VectorImage<double, 2>                                               VectorImageType;
+  typedef otb::ImageFileReader<VectorImageType>                                     ReaderType;
+  typedef otb::ImageFileReader<ComplexVectorImageType>                              ComplexReaderType;
+  typedef otb::ImageFileWriter<VectorImageType>                                     WriterType;
+
+  // Handling of complex images
+  typedef otb::Image<ComplexPixelType> ComplexImageType;
+  typedef otb::Image<double>           ImageType;
+  typedef otb::ComplexToIntensityImageFilter<ComplexImageType, ImageType> IntensityFilterType;
+  typedef otb::PerBandVectorImageFilter<ComplexVectorImageType,VectorImageType,IntensityFilterType> PerBandIntensityFilterType;
+  typedef otb::GenericRSResampleImageFilter<VectorImageType, VectorImageType> OrthoRectifFilterType;
+
+  //Allocate pointer
+  ReaderType::Pointer reader = ReaderType::New();
+  ComplexReaderType::Pointer cReader = ComplexReaderType::New();
+  WriterType::Pointer writer = WriterType::New();
+  PerBandIntensityFilterType::Pointer intensityFilter = PerBandIntensityFilterType::New();
+  
+  OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New();
+
+  writer->SetFileName(argv[2]);
+  
+  bool isComplex = atoi(argv[14]);
+
+  if(isComplex)
     {
-    resampler->SetInputRpcGridSize(20);
-    resampler->EstimateInputRpcModelOn();
+      cReader->SetFileName(argv[1]);
+      cReader->GenerateOutputInformation();
+      intensityFilter->SetInput(cReader->GetOutput());
+      VectorImageType::PixelType no_data(cReader->GetOutput()->GetNumberOfComponentsPerPixel());
+      no_data.Fill(0);
+      orthoRectifFilter->SetEdgePaddingValue(no_data);
+      orthoRectifFilter->SetInput(intensityFilter->GetOutput());
     }
-
-  if (useOutRpc)
+  else
     {
-    resampler->SetOutputRpcGridSize(20);
-    resampler->EstimateOutputRpcModelOn();
+      reader->SetFileName(argv[1]);
+      reader->GenerateOutputInformation();
+      VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel());
+      no_data.Fill(0);
+      orthoRectifFilter->SetEdgePaddingValue(no_data);
+      orthoRectifFilter->SetInput(reader->GetOutput());
     }
 
+  VectorImageType::IndexType start;
+  start[0] = 0;
+  start[1] = 0;
+  orthoRectifFilter->SetOutputStartIndex(start);
 
-  // Write the resampled image
-  WriterType::Pointer writer= WriterType::New();
-  writer->SetNumberOfDivisionsTiledStreaming(4);
-  writer->SetFileName(outfname);
-  writer->SetInput(resampler->GetOutput());
-  writer->Update();
+  VectorImageType::SizeType size;
+  size[0] = atoi(argv[5]);      // X size
+  size[1] = atoi(argv[6]);            //Y size
+  orthoRectifFilter->SetOutputSize(size);
 
-  std::cout << resampler << std::endl;
+  VectorImageType::SpacingType spacing;
+  spacing[0] = atof(argv[7]);
+  spacing[1] = atof(argv[8]);
+  orthoRectifFilter->SetOutputSpacing(spacing);
 
-  return EXIT_SUCCESS;
-}
-
-
-int otbGenericRSResampleImageFilterFromMap(int itkNotUsed(argc), char* argv[])
-{
-  typedef otb::MultiChannelExtractROI<PixelType, PixelType>  ExtractROIType;
-
-  // SmartPointer instantiation
-  ExtractROIType::Pointer extractor = ExtractROIType::New();
-  ImageResamplerType::Pointer resampler = ImageResamplerType::New();
+  VectorImageType::PointType origin;
+  origin[0] = strtod(argv[3], nullptr);         //Origin easting
+  origin[1] = strtod(argv[4], nullptr);         //Origin northing
+  orthoRectifFilter->SetOutputOrigin(origin);
 
-  const char * infname   = argv[1];
-  const char * outfname  = argv[4];
-  double iGridSpacing    = atof(argv[2]);
-  int    useInRpc        = atoi(argv[3]);
-
-  // Reader Instantiation
-  ReaderType::Pointer         reader    = ReaderType::New();
-  reader->SetFileName(infname);
-  reader->UpdateOutputInformation();
-
-  SpacingType  spacing;
-  spacing[0] =  2.5;
-  spacing[1] = -2.5;
+  std::string wkt = otb::SpatialReference::FromUTM(atoi(argv[9]),atoi(argv[10]) ? otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt();
+  orthoRectifFilter->SetOutputProjectionRef(wkt);
 
   // Displacement Field spacing
-  SpacingType  gridSpacing;
-  gridSpacing[0] = iGridSpacing;
-  gridSpacing[1] = -iGridSpacing;
-
-  // Default value builder
-  ImageType::PixelType defaultValue;
-  itk::NumericTraits<ImageType::PixelType>::SetLength(defaultValue, reader->GetOutput()->GetNumberOfComponentsPerPixel());
-
-  // Extract a roi centered on the input center
-  ImageType::RegionType roi;
-  ImageType::IndexType  roiIndex;
-  SizeType              roiSize;
-
-  // Fill the size
-  roiSize.Fill(250);
-
-  // Fill the start index
-  roiIndex[0] = (unsigned int)((reader->GetOutput()->GetLargestPossibleRegion().GetSize()[0] - roiSize[0]) /2);
-  roiIndex[1] = (unsigned int)((reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1] - roiSize[1]) /2);
-
-  roi.SetIndex(roiIndex);
-  roi.SetSize(roiSize);
-
-  extractor->SetExtractionRegion(roi);
-  extractor->SetInput(reader->GetOutput());
-  extractor->UpdateOutputInformation();
-
-  // Set the Resampler Parameters
-  resampler->SetInput(extractor->GetOutput());
-  resampler->SetDisplacementFieldSpacing(gridSpacing);
-  resampler->SetOutputParametersFromMap("UTM", spacing);
-
-  if (useInRpc)
-    {
-    resampler->SetInputRpcGridSize(20);
-    resampler->EstimateInputRpcModelOn();
-    }
-
-  // Write the resampled image
-  WriterType::Pointer writer= WriterType::New();
-  writer->SetAutomaticTiledStreaming();
-  writer->SetFileName(outfname);
-  writer->SetInput(resampler->GetOutput());
+  VectorImageType::SpacingType  gridSpacing;
+  gridSpacing[0] = atof(argv[11]);
+  gridSpacing[1] = -atof(argv[11]);
+  orthoRectifFilter->SetDisplacementFieldSpacing(gridSpacing);
+  
+  // manage demHandler
+  if (atoi(argv[12])==1) //mode = no DEM
+  {
+	  otb::DEMHandler::Instance()->SetDefaultHeightAboveEllipsoid(135.8);
+  }
+  else if ( (atoi(argv[12])==2) || (atoi(argv[12])==3) ) //mode = DEM SRTM || DEM GTIFF
+  {
+	  otb::DEMHandler::Instance()->OpenDEMDirectory(argv[13]);
+  }
+
+  writer->SetInput(orthoRectifFilter->GetOutput());
+  writer->SetNumberOfDivisionsTiledStreaming(4);
   writer->Update();
 
-  std::cout << resampler << std::endl;
-
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Filtering/Projection/test/otbOrthoRectificationFilter.cxx b/Modules/Filtering/Projection/test/otbOrthoRectificationFilter.cxx
deleted file mode 100644
index e832b5dc0ff2163ec5abe0c0518544932f845552..0000000000000000000000000000000000000000
--- a/Modules/Filtering/Projection/test/otbOrthoRectificationFilter.cxx
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-// iostream is used for general output
-#include <iostream>
-#include <stdlib.h>
-#include <complex>
-
-#include "otbImageFileReader.h"
-#include "otbImageFileWriter.h"
-#include "otbGenericMapProjection.h"
-#include "itkUnaryFunctorImageFilter.h"
-//#include "itkComplexToModulusImageFilter.h"
-#include "otbDEMHandler.h"
-#include "otbUnaryImageFunctorWithVectorImageFilter.h"
-#include "otbOrthoRectificationFilter.h"
-#include "otbComplexToIntensityImageFilter.h"
-#include "otbPerBandVectorImageFilter.h"
-
-int otbOrthoRectificationFilter(int argc, char* argv[])
-{
-  if (argc != 15)
-    {
-    std::cout << argv[0] <<
-    " <input filename> <output filename> <origin easting> <origin northing>"
-    " <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>"
-    " <grid_spacing> <mode> <mode.info> <is_complex>"
-              << std::endl;
-
-    return EXIT_FAILURE;
-    }
-
-  typedef std::complex<double>                                                      ComplexPixelType;
-  typedef otb::VectorImage<ComplexPixelType,2>                                     ComplexVectorImageType;
-  typedef otb::VectorImage<double, 2>                                               VectorImageType;
-  typedef otb::ImageFileReader<VectorImageType>                                     ReaderType;
-  typedef otb::ImageFileReader<ComplexVectorImageType>                              ComplexReaderType;
-  typedef otb::ImageFileWriter<VectorImageType>                                     WriterType;
-
-  // Handling of complex images
-  typedef otb::Image<ComplexPixelType> ComplexImageType;
-  typedef otb::Image<double>           ImageType;
-  typedef otb::ComplexToIntensityImageFilter<ComplexImageType, ImageType> IntensityFilterType;
-  typedef otb::PerBandVectorImageFilter<ComplexVectorImageType,VectorImageType,IntensityFilterType> PerBandIntensityFilterType;
-  typedef otb::GenericMapProjection<otb::TransformDirection::INVERSE> MapProjectionType;
-  typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType, MapProjectionType> OrthoRectifFilterType;
-
-  //Allocate pointer
-  ReaderType::Pointer reader = ReaderType::New();
-  ComplexReaderType::Pointer cReader = ComplexReaderType::New();
-  WriterType::Pointer writer = WriterType::New();
-  PerBandIntensityFilterType::Pointer intensityFilter = PerBandIntensityFilterType::New();
-  
-  OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New();
-
-  writer->SetFileName(argv[2]);
-  
-  bool isComplex = atoi(argv[14]);
-
-  if(isComplex)
-    {
-      cReader->SetFileName(argv[1]);
-      cReader->GenerateOutputInformation();
-      intensityFilter->SetInput(cReader->GetOutput());
-      VectorImageType::PixelType no_data(cReader->GetOutput()->GetNumberOfComponentsPerPixel());
-      no_data.Fill(0);
-      orthoRectifFilter->SetEdgePaddingValue(no_data);
-      orthoRectifFilter->SetInput(intensityFilter->GetOutput());
-    }
-  else
-    {
-      reader->SetFileName(argv[1]);
-      reader->GenerateOutputInformation();
-      VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel());
-      no_data.Fill(0);
-      orthoRectifFilter->SetEdgePaddingValue(no_data);
-      orthoRectifFilter->SetInput(reader->GetOutput());
-    }
-
-  VectorImageType::IndexType start;
-  start[0] = 0;
-  start[1] = 0;
-  orthoRectifFilter->SetOutputStartIndex(start);
-
-  VectorImageType::SizeType size;
-  size[0] = atoi(argv[5]);      // X size
-  size[1] = atoi(argv[6]);            //Y size
-  orthoRectifFilter->SetOutputSize(size);
-
-  VectorImageType::SpacingType spacing;
-  spacing[0] = atof(argv[7]);
-  spacing[1] = atof(argv[8]);
-  orthoRectifFilter->SetOutputSpacing(spacing);
-
-  VectorImageType::PointType origin;
-  origin[0] = strtod(argv[3], nullptr);         //Origin easting
-  origin[1] = strtod(argv[4], nullptr);         //Origin northing
-  orthoRectifFilter->SetOutputOrigin(origin);
-
-  MapProjectionType::Pointer utmMapProjection = MapProjectionType::New();
-  utmMapProjection->SetWkt(otb::SpatialReference::FromUTM(atoi(argv[9]),atoi(argv[10]) ? otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt());
-  orthoRectifFilter->SetMapProjection(utmMapProjection);
-
-  // Displacement Field spacing
-  VectorImageType::SpacingType  gridSpacing;
-  gridSpacing[0] = atof(argv[11]);
-  gridSpacing[1] = -atof(argv[11]);
-  orthoRectifFilter->SetDisplacementFieldSpacing(gridSpacing);
-  
-  // manage demHandler
-  if (atoi(argv[12])==1) //mode = no DEM
-  {
-	  otb::DEMHandler::Instance()->SetDefaultHeightAboveEllipsoid(135.8);
-  }
-  else if ( (atoi(argv[12])==2) || (atoi(argv[12])==3) ) //mode = DEM SRTM || DEM GTIFF
-  {
-	  otb::DEMHandler::Instance()->OpenDEMDirectory(argv[13]);
-  }
-
-  writer->SetInput(orthoRectifFilter->GetOutput());
-  writer->SetNumberOfDivisionsTiledStreaming(4);
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx b/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx
index 6f985e5f5c797ef0a758fb4e70eb198d42b629ad..acbe2a16407fa3b09ef58adf069c95c836bc83ab 100644
--- a/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx
+++ b/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx
@@ -24,9 +24,7 @@ void RegisterTests()
 {
   REGISTER_TEST(otbSensorModel);
   REGISTER_TEST(otbVectorDataProjectionFilterFromGeoToMap);
-  REGISTER_TEST(otbOrthoRectificationFilter);
   REGISTER_TEST(otbGenericRSResampleImageFilter);
-  REGISTER_TEST(otbGenericRSResampleImageFilterFromMap);
   REGISTER_TEST(otbGeometriesProjectionFilter);
   REGISTER_TEST(otbGenericRSTransformGenericTest);
   REGISTER_TEST(otbVectorDataTransformFilter);
@@ -46,7 +44,6 @@ void RegisterTests()
   REGISTER_TEST(otbGenericRSTransformImageAndMNTToWGS84ConversionChecking);
   REGISTER_TEST(otbCompositeTransform);
   REGISTER_TEST(otbLeastSquareAffineTransformEstimator);
-  REGISTER_TEST(otbSpectralAngleDataNodeFeatureFunction);
   REGISTER_TEST(otbGCPsToRPCSensorModelImageFilterCheckRpcModel);
   REGISTER_TEST(otbGeographicalDistance);
   REGISTER_TEST(otbTileImageFilterRSTransformTest);
diff --git a/Modules/Filtering/Projection/test/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx
index f6b3c0454a7fd69a42806915eb216a7a3e15f59b..d64e315160dfb4cf90e58649f357cd48a02de6cb 100644
--- a/Modules/Filtering/Projection/test/otbSensorModel.cxx
+++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx
@@ -34,6 +34,7 @@
 #include "itkEuclideanDistanceMetric.h"
 #include "otbGeographicalDistance.h"
 #include "otbGenericRSTransform.h"
+#include "otbMacro.h"
 
 #if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic push
@@ -65,7 +66,7 @@ int produceGCP(char * outputgcpfilename, const otb::ImageKeywordlist& kwlist, bo
    forwardSensorModel->SetImageGeometry(kwlist);
    if( forwardSensorModel->IsValidSensorModel() == false )
    {
-     std::cout<<"Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!"<<std::endl;
+     otbLogMacro(Warning, <<"Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!");
      return EXIT_FAILURE;
    } 
    
@@ -155,11 +156,11 @@ bool provideGCP(char * gcpfilename, pointsContainerType& imgPt, geo3dPointsConta
 
 int otbSensorModel(int argc, char* argv[])
 {
-  if (argc != 10)
+  if (argc != 9)
     {
     std::cout << argv[0] 
               << " <input geom filename> <input gcp filename> <output gcp filename> "
-              <<" <needed keywords> <imgTol> <geoTol> <writeBaseline> <modeVerbose> <only check needed keywords>" << std::endl;
+              <<" <needed keywords> <imgTol> <geoTol> <writeBaseline> <only check needed keywords>" << std::endl;
 
     return EXIT_FAILURE;
     }
@@ -171,8 +172,7 @@ int otbSensorModel(int argc, char* argv[])
   double imgTol = atof(argv[5]);
   double geoTol = atof(argv[6]);
   int writeBaseline = atoi(argv[7]);
-  int modeVerbose = atoi(argv[8]);
-  bool checkNeededKw = atoi(argv[9]);
+  bool checkNeededKw = atoi(argv[8]);
 
   // -------------------
   // Some instantiations  
@@ -370,21 +370,18 @@ int otbSensorModel(int argc, char* argv[])
       geoPointOSSIM[1] = ossimGPoint.lat;
 
 	  // Just for debug purpose
-	  if (modeVerbose)
-	  {
-		  std::cout << ">>>>>>>>>>>>>> ---------------------" << std::endl;
-		  std::cout << ">>>>>>>>>>>>>>" << geomfilename << std::endl;
-		  std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) 
-					<<  "Image to geo (Inverse/Forward SensorModel): " << imagePoint << " -> " << geoPoint << "\n";
-		  std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) 
-					<<  "Geo to image (Inverse/Forward SensorModel): " << geoPoint << " -> " << reversedImagePoint << "\n";
-		  std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) 
-					<<  "Image to geo (GenericRSTransform): " << imagePoint << " -> " << geoPointGRS << "\n";
-		  std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) 
-					<<  "Geo to image (GenericRSTransform): " << geoPointGRS << " -> " << reversedImagePointGRS << "\n";
-		  std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) 
-					<<  "Image to geo (OSSIM): " << imagePoint << " -> " << geoPointOSSIM << "\n";
-	  }
+    otbLogMacro(Debug, << "------------------------------------------------");
+    otbLogMacro(Debug, << geomfilename);
+    otbLogMacro(Debug, << std::setprecision(15) 
+        <<  "Image to geo (Inverse/Forward SensorModel): " << imagePoint << " -> " << geoPoint);
+    otbLogMacro(Debug, << std::setprecision(15) 
+        <<  "Geo to image (Inverse/Forward SensorModel): " << geoPoint << " -> " << reversedImagePoint);
+    otbLogMacro(Debug, << std::setprecision(15) 
+        <<  "Image to geo (GenericRSTransform): " << imagePoint << " -> " << geoPointGRS);
+    otbLogMacro(Debug, << std::setprecision(15) 
+        <<  "Geo to image (GenericRSTransform): " << geoPointGRS << " -> " << reversedImagePointGRS);
+    otbLogMacro(Debug, << std::setprecision(15) 
+        <<  "Image to geo (OSSIM): " << imagePoint << " -> " << geoPointOSSIM);
 
 	  	  
 	  // 3. Results should be plausible (no NaN and no clearly out of bound results)
@@ -477,12 +474,9 @@ int otbSensorModel(int argc, char* argv[])
 	  double dist6 = geoDistance->Evaluate(geoPointGRS, geoPointGCP);
 	  double dist7 = geoDistance->Evaluate(geoPointOSSIM, geoPointGCP);
 	  
-	  if (modeVerbose)
-	  {
-		  std::cout << ">>>>>>>>>>>>>>" << "Forward SensorModel VS GCP : " <<  dist5 << std::endl;
-		  std::cout << ">>>>>>>>>>>>>>" << "GenericRSTransform VS GCP : " <<  dist6 << std::endl;
-		  std::cout << ">>>>>>>>>>>>>>" << "OSSIM VS GCP : " <<  dist7 << std::endl;
-	  }
+    otbLogMacro(Debug, << "Forward SensorModel VS GCP : " <<  dist5);
+    otbLogMacro(Debug, << "GenericRSTransform VS GCP : " <<  dist6);
+    otbLogMacro(Debug, << "OSSIM VS GCP : " <<  dist7);
 	  
 	  if (dist5>geoTol)
 	  {
diff --git a/Modules/Filtering/Projection/test/otbSpectralAngleDataNodeFeatureFunction.cxx b/Modules/Filtering/Projection/test/otbSpectralAngleDataNodeFeatureFunction.cxx
deleted file mode 100644
index eb239242e2ad774a69c3480b8d447904c0945516..0000000000000000000000000000000000000000
--- a/Modules/Filtering/Projection/test/otbSpectralAngleDataNodeFeatureFunction.cxx
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-#include "otbSpectralAngleDataNodeFeatureFunction.h"
-
-#include "otbVectorImage.h"
-#include "otbImageFileReader.h"
-#include "otbVectorData.h"
-#include "otbVectorDataFileReader.h"
-#include "otbVectorDataIntoImageProjectionFilter.h"
-#include "otbVectorDataFileWriter.h"
-#include "itkPreOrderTreeIterator.h"
-
-
-int otbSpectralAngleDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[])
-{
-  const char * inputVD  = argv[1];
-  const char * inputImg = argv[2];
-  const char * DEMDir   = argv[3];
-  const char * outputVD = argv[4];
-  int DisplayWarnings   = atoi(argv[5]);
-
-  typedef double                                      CoordRepType;
-  typedef double                                      PrecisionType;
-  typedef otb::VectorImage<PrecisionType>             ImageType;
-  typedef otb::ImageFileReader<ImageType>             ImageReaderType;
-  typedef otb::VectorData<CoordRepType, 2, PrecisionType>
-                                                      VectorDataType;
-  typedef VectorDataType::DataNodeType                DataNodeType;
-  typedef otb::VectorDataFileReader<VectorDataType>   VectorDataReaderType;
-  typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType>
-                                                      VectorDataReProjFilter;
-  typedef otb::VectorDataFileWriter<VectorDataType>   VectorDataWriterType;
-  typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType>
-                                                      TreeIteratorType;
-
-  typedef otb::SpectralAngleDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType>
-                                                      FeaturefunctionType;
-  typedef FeaturefunctionType::OutputType
-                                                      FeatureOutputType;
-
-  ImageReaderType::Pointer imgReader = ImageReaderType::New();
-  VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New();
-  VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New();
-  VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New();
-  FeaturefunctionType::Pointer featureFunction = FeaturefunctionType::New();
-
-  if (!DisplayWarnings)
-   {
-    imgReader->SetGlobalWarningDisplay(0);
-   }
-
-  otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDir);
-
-  vdReader->SetFileName(inputVD);
-  vdReader->Update();
-
-  imgReader->SetFileName(inputImg);
-  imgReader->UpdateOutputInformation();
-  imgReader->Update(); //Needed to set m_EndIndex, m_StartIndex in otbDataNodeImageFunction
-
-  vdReProjFilter->SetInputImage(imgReader->GetOutput());
-  vdReProjFilter->SetInputVectorData(vdReader->GetOutput());
-  vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true);
-  vdReProjFilter->Update();
-
-  std::cout<< "vdReProjFilter->GetOutput()->Size(): "
-        << vdReProjFilter->GetOutput()->Size() << std::endl;
-
-  featureFunction->SetInputImage(imgReader->GetOutput());
-  featureFunction->SetRadius(0);
-
-  // Output
-  VectorDataType::Pointer outVD = VectorDataType::New();
-  // Retrieving root node
-  DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get();
-  // Create the document node
-  DataNodeType::Pointer document = DataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(document, root);
-  // Create the folder node
-  DataNodeType::Pointer folder = DataNodeType::New();
-  folder->SetNodeType(otb::FOLDER);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(folder, document);
-
-  TreeIteratorType itVector(vdReProjFilter->GetOutput()->GetDataTree());
-  itVector.GoToBegin();
-  while (!itVector.IsAtEnd())
-    {
-    if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature())
-         {
-          const DataNodeType::Pointer currentGeometry = itVector.Get();
-          FeatureOutputType currentResult;
-          currentResult = featureFunction->Evaluate(*(currentGeometry.GetPointer()));
-          currentGeometry->SetFieldAsDouble("RADIOM", (double)(currentResult[0]));
-          outVD->GetDataTree()->Add(currentGeometry, folder);
-         }
-    ++itVector;
-    }
-
-  vdWriter->SetInput(outVD);
-  vdWriter->SetFileName(outputVD);
-  vdWriter->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.h b/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.h
deleted file mode 100644
index 5a0d897384035224960895f0ce23a76dacc68d80..0000000000000000000000000000000000000000
--- a/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbDBOverlapDataNodeFeatureFunction_h
-#define otbDBOverlapDataNodeFeatureFunction_h
-
-#include "otbDataNodeVectorDataFunction.h"
-
-#include "itkPreOrderTreeIterator.h"
-
-namespace otb
-{
-/** \class DBOverlapDataNodeFeatureFunction
-  * \brief
-  *
-  *
-  * \ingroup Functions
-  * \sa DataNodeVectorDataFunction
- *
- * \ingroup OTBVectorDataManipulation
-  */
-
-template <
-class TCoordRep = double,
-class TPrecision = double
->
-class ITK_EXPORT DBOverlapDataNodeFeatureFunction :
-    public DataNodeVectorDataFunction<std::vector<TPrecision>, TCoordRep, TPrecision>
-{
-public:
-  /** Standard class typedefs. */
-  typedef DBOverlapDataNodeFeatureFunction                    Self;
-  typedef DataNodeVectorDataFunction<std::vector<TPrecision>, TCoordRep, TPrecision>
-                                                              Superclass;
-  typedef itk::SmartPointer<Self>                             Pointer;
-  typedef itk::SmartPointer<const Self>                       ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(DBOverlapDataNodeFeatureFunction, DataNodeVectorDataFunction);
-
-  /** Some typedefs. */
-  typedef typename Superclass::DataNodeType           DataNodeType;
-  typedef typename DataNodeType::PointType            PointType;
-  typedef typename DataNodeType::LineType             LineType;
-  typedef typename LineType::VertexType               VertexType;
-  typedef typename DataNodeType::PolygonType          PolygonType;
-
-  typedef typename Superclass::VectorDataType         VectorDataType;
-  typedef typename VectorDataType::DataTreeType       DataTreeType;
-  typedef itk::PreOrderTreeIterator<typename VectorDataType::DataTreeType>
-                                                      TreeIteratorType;
-
-  typedef TCoordRep                                   CoordRepType;
-
-  typedef TPrecision                                  PrecisionType;
-
-  typedef std::vector<PrecisionType>                  OutputType;
-
-  OutputType Evaluate( const DataNodeType& node ) const override;
-
-  /** Set/Get methods */
-  itkGetConstMacro(DistanceThreshold, PrecisionType);
-  itkSetMacro(DistanceThreshold, PrecisionType);
-
-  /** Method to compute the distance of a point to a segment */
-  double ComputeEuclideanDistanceMetricToSegment(VertexType q1, VertexType q2, VertexType p) const;
-
-protected:
-  DBOverlapDataNodeFeatureFunction();
-  ~DBOverlapDataNodeFeatureFunction() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  DBOverlapDataNodeFeatureFunction(const Self&) = delete;
-  void operator=(const Self&) = delete;
-
-  /** Road / Building distance Threshold */
-  PrecisionType               m_DistanceThreshold;
-};
-
-}
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbDBOverlapDataNodeFeatureFunction.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.hxx b/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.hxx
deleted file mode 100644
index 3ede4ecc7f096b033ae7ff40a85a0c14fc832c04..0000000000000000000000000000000000000000
--- a/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.hxx
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbDBOverlapDataNodeFeatureFunction_hxx
-#define otbDBOverlapDataNodeFeatureFunction_hxx
-
-#include "otbDBOverlapDataNodeFeatureFunction.h"
-
-namespace otb
-{
-
-/**
- * Constructor
- */
-template <class TCoordRep, class TPrecision>
-DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision>
-::DBOverlapDataNodeFeatureFunction()
- :m_DistanceThreshold(50)//in physical coordinates
-{
-}
-
-/**
- * Standard "PrintSelf" method
- */
-template <class TCoordRep, class TPrecision>
-void
-DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision>
-::PrintSelf(
-  std::ostream& os,
-  itk::Indent indent) const
-{
-  Superclass::PrintSelf( os, indent );
-  os << indent << "Distance Threshold: " << m_DistanceThreshold << std::endl;
-}
-
-/**
- * Method to compute the distance of a point to a segment
- */
-template <class TCoordRep, class TPrecision>
-double
-DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision>
-::ComputeEuclideanDistanceMetricToSegment(VertexType q1, VertexType q2, VertexType p) const
-{
-  // Length of the segment
-  double l2 = q1.SquaredEuclideanDistanceTo(q2);
-
-  // Is the projection of p on the segment inside (0<u<1) or
-  // inside the segment bounds
-  double u = ((p[0] - q1[0]) *(q2[0] - q1[0] ) +
-    (p[1] - q1[1]) *(q2[1] - q1[1])) / l2;
-
-  if( u < 1e-10 ) u = 0.;
-  if( u -1. > 1e-10 ) u = 1.;
-  double x = q1[0] + u *(q2[0] - q1[0] );
-  double y = q1[1] + u *(q2[1] - q1[1] );
-  double dx = x - p[0];
-  double dy = y - p[1];
-
-  return std::sqrt(dx*dx + dy*dy);
- }
-
-template <class TCoordRep, class TPrecision>
-typename DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision>
-::OutputType
-DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision>
-::Evaluate( const DataNodeType& node ) const
-{
-  OutputType output;
-
-  //build the tmp DataTree containing polygon within the radius
-  typename VectorDataType::Pointer tmpDataTree = VectorDataType::New();
-  typename DataNodeType::Pointer root = tmpDataTree->GetDataTree()->GetRoot()->Get();
-  typename DataNodeType::Pointer document = DataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  tmpDataTree->GetDataTree()->Add(document, root);
-
-  TreeIteratorType itVector(this->GetInputVectorData()->GetDataTree());
-  itVector.GoToBegin();
-    while (!itVector.IsAtEnd())
-      {
-      if (itVector.Get()->IsPolygonFeature())
-        {
-        typename DataNodeType::Pointer currentGeometry = itVector.Get();
-        unsigned int i=0;
-        while (i<currentGeometry->GetPolygonExteriorRing()->GetVertexList()->Size())
-          {
-          unsigned int j=0;
-          while (j<node.GetLine()->GetVertexList()->Size()-1)
-            {
-            double dist;
-            dist = this->ComputeEuclideanDistanceMetricToSegment(node.GetLine()->GetVertexList()->GetElement(j),
-                                                     node.GetLine()->GetVertexList()->GetElement(j+1),
-                                                     currentGeometry->GetPolygonExteriorRing()->GetVertexList()->GetElement(i));
-            //std::cout << "dist: " << dist << std::endl;
-            //std::cout << "m_DistanceThreshold: " << m_DistanceThreshold << std::endl;
-            if (dist <= m_DistanceThreshold)
-              {
-              //Add the current polygon to the tmp DataTree
-              //jump to the next one
-              tmpDataTree->GetDataTree()->Add(currentGeometry, document);
-              j = node.GetLine()->GetVertexList()->Size();
-              i = currentGeometry->GetPolygonExteriorRing()->GetVertexList()->Size();
-              }
-            ++j;
-            }
-          ++i;
-          }
-        }
-      ++itVector;
-      }
-
-  /*
-  std::cout << this->GetInputVectorData()->GetDataTree()->Count() << std::endl;
-  std::cout << tmpDataTree->GetDataTree()->Count() << std::endl;
-  */
-  unsigned int crossAcc = 0;
-  unsigned int nbBuildings = 0;
-
-  TreeIteratorType it(tmpDataTree->GetDataTree());
-  it.GoToBegin();
-  while (!it.IsAtEnd())
-    {
-    if (it.Get()->IsPolygonFeature())
-      {
-      typename DataNodeType::Pointer currentGeometry = it.Get();
-      nbBuildings ++;
-      for (unsigned int i=0; i<node.GetLine()->GetVertexList()->Size()-1; ++i)
-        {
-
-        if(currentGeometry->GetPolygonExteriorRing()->NbCrossing(node.GetLine()->GetVertexList()->GetElement(i),
-                                                                 node.GetLine()->GetVertexList()->GetElement(i+1)))
-          {
-          crossAcc ++;
-          break;
-          }
-        }
-      }
-    ++it;
-    }
-
-  if(nbBuildings == 0)
-    {
-    output.push_back(static_cast<PrecisionType>(0.));
-    }
-  else
-    {
-    output.push_back(static_cast<PrecisionType>((double)(crossAcc)/(double)(nbBuildings)));
-    }
-
-  output.push_back(static_cast<PrecisionType>(crossAcc));
-  output.push_back(static_cast<PrecisionType>(nbBuildings));
-
-  return output;
-}
-
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h b/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h
deleted file mode 100644
index 303db1003b0aeae9e2b39c24a551d57bc2b3bb4c..0000000000000000000000000000000000000000
--- a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_h
-#define otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_h
-
-#include "otbDataNodeImageFunction.h"
-
-#include "otbBinarySpectralAngleFunctor.h"
-#include "otbPolyLineImageConstIterator.h"
-#include "itkLineConstIterator.h"
-#include "itkVariableLengthVector.h"
-
-namespace otb
-{
-/** \class RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction
-  * \brief Compute the spectral angle between the radiometry along
-  * a line and its neighborhood
-  *
-  * This function compares the radiometry along a datanode with the
-  * radiometry of the neighborhood.
-  *
-  * It computes the mean of a rectangular area around each line segment,
-  * and the mean of two rectangular areas on each side of the line segment.
-  * The descriptor is the spectral angle between the two values,
-  * scaled by \$f\pi\$f.
-  *
-  * The width of the area around a line segment can be specified with
-  * SetCenterRadius.
-  *
-  * The neighborhood area can be specified by two radius, using SetNeighborhoodBeginRadius
-  * and SetNeighborhoodEndRadius.
-  *
-  *
-  * \ingroup Functions
-  * \sa DataNodeImageFunction
-  * \sa NDVIDataNodeFeatureFunction
- *
- * \ingroup OTBVectorDataManipulation
-  */
-
-template <
-class TImage,
-class TCoordRep = double,
-class TPrecision = double
->
-class ITK_EXPORT RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction :
-    public DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision>
-{
-public:
-  /** Standard class typedefs. */
-  typedef RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction                Self;
-  typedef DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision>
-                                                              Superclass;
-  typedef itk::SmartPointer<Self>                             Pointer;
-  typedef itk::SmartPointer<const Self>                       ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction, DataNodeImageFunction);
-
-  /** Some typedefs. */
-  typedef typename Superclass::DataNodeType           DataNodeType;
-  typedef typename DataNodeType::LineType             LineType;
-  typedef typename LineType::Pointer                  LinePointer;
-  typedef typename LineType::ContinuousIndexType      ContinuousIndexType;
-  typedef typename LineType::VertexListConstIteratorType VertexListConstIteratorType;
-
-  typedef TImage                                      InputImageType;
-  typedef typename InputImageType::ConstPointer       InputImageConstPointer;
-  typedef typename InputImageType::PixelType          PixelType;
-  typedef typename InputImageType::InternalPixelType  ScalarRealType;
-  typedef typename InputImageType::IndexType          IndexType;
-  typedef typename InputImageType::IndexValueType     IndexValueType;
-
-  typedef TCoordRep                                   CoordRepType;
-
-  typedef TPrecision                                  PrecisionType;
-
-  typedef itk::VariableLengthVector<PrecisionType>    ReferencePixelType;
-
-  typedef PolyLineImageConstIterator<InputImageType, LineType> ImageLineIteratorType;
-  typedef itk::LineConstIterator<InputImageType>      LineIteratorType;
-
-  typedef Functor::BinarySpectralAngleFunctor<PixelType, ReferencePixelType, PrecisionType>
-                                                      SpectralAngleFunctorType;
-
-  typedef std::pair<IndexType, IndexType>             IndexPairType;
-  typedef std::vector<PrecisionType>                  OutputType;
-
-  /* Compute the descriptor value along this DataNode */
- OutputType Evaluate( const DataNodeType& node ) const override;
-
-  /* Get the radius used to define the area around a line segment.
-   * A radius of 0 means that the area is reduced to a line joining
-   * the two segments extremities. */
-  itkGetConstMacro(CenterRadius, unsigned int);
-
-  /* Set the radius used to define the area around a line segment.
-   * A radius of 0 means that the area is reduced to a line joining
-   * the two segments extremities. */
-  itkSetMacro(CenterRadius, unsigned int);
-
-  /* Get the radius used to define the start of the neighboring area.
-   * Typically this value must be greater than CenterRadius */
-  itkGetConstMacro(NeighborhoodBeginRadius, unsigned int);
-
-  /* Set the radius used to define the start of the neighboring area.
-   * Typically this value must be greater than CenterRadius */
-  itkSetMacro(NeighborhoodBeginRadius, unsigned int);
-
-  /* Get the radius used to define the end of the neighboring area.
-   * Typically this value must be greater than NeighborhoodBeginRadius */
-  itkGetConstMacro(NeighborhoodEndRadius, unsigned int);
-
-  /* Set the radius used to define the end of the neighboring area.
-   * Typically this value must be greater than NeighborhoodBeginRadius */
-  itkSetMacro(NeighborhoodEndRadius, unsigned int);
-
-protected:
-  RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction();
-  ~RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction(const Self&) = delete;
-  void operator=(const Self&) = delete;
-
-  /** Center radius */
-  unsigned int m_CenterRadius;
-
-  /** Neighborhood start radius */
-  unsigned int m_NeighborhoodBeginRadius;
-
-  /** Neighborhood end radius */
-  unsigned int m_NeighborhoodEndRadius;
-
-};
-
-}
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.hxx b/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.hxx
deleted file mode 100644
index eadf8f167ae171fba94d11b0f94a362cdea0435e..0000000000000000000000000000000000000000
--- a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.hxx
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_hxx
-#define otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_hxx
-
-#include "otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h"
-
-namespace otb
-{
-
-/**
- * Constructor
- */
-template<class TImage, class TCoordRep, class TPrecision>
-RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction() :
-  m_CenterRadius(1), m_NeighborhoodBeginRadius(2), m_NeighborhoodEndRadius(3)
-{
-}
-
-/**
- * Standard "PrintSelf" method
- */
-template<class TImage, class TCoordRep, class TPrecision>
-void RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::PrintSelf(std::ostream& os,
-                                                                                    itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-template<class TImage, class TCoordRep, class TPrecision>
-typename RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::OutputType RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<
-    TImage, TCoordRep, TPrecision>::Evaluate(const DataNodeType& node) const
-{
-
-  // TODO faire avce un ikk
-  const typename ImageLineIteratorType::PathType* path;
-
-  switch (node.GetNodeType())
-    {
-    case FEATURE_POINT:
-      {
-      itkExceptionMacro(<< "This DataNode type is not handled yet");
-      break;
-      }
-    case FEATURE_LINE:
-      {
-      path = node.GetLine();
-      break;
-      }
-    case FEATURE_POLYGON:
-      {
-      path = node.GetPolygonExteriorRing();
-      break;
-      }
-    default:
-      {
-      itkExceptionMacro(<< "This DataNode type is not handle yet");
-      break;
-      }
-    }
-
-  std::vector<std::pair<IndexType, IndexType> > splitedLineIdNeigh;
-  std::vector<std::pair<IndexType, IndexType> > splitedLineIdCentral;
-
-  // Split line and polygon into segment (ie. line with two vertex
-  VertexListConstIteratorType it1 = path->GetVertexList()->Begin();
-  VertexListConstIteratorType it2 = path->GetVertexList()->Begin();
-  VertexListConstIteratorType itStop = path->GetVertexList()->End();
-
-  ++it2;
-  if (it2 == itStop)
-    {
-    itkExceptionMacro(<< "Invalid DataNode, must at least contain two points");
-    }
-
-  while (it1 != itStop && it2 != itStop)
-    {
-    IndexType id1, id2;
-    id1[0] = static_cast<int> (it1.Value()[0]);
-    id1[1] = static_cast<int> (it1.Value()[1]);
-    id2[0] = static_cast<int> (it2.Value()[0]);
-    id2[1] = static_cast<int> (it2.Value()[1]);
-
-    // Compute the direction of the current line
-    itk::Vector<double, 2> direction;
-    direction[0] = it2.Value()[0] - it1.Value()[0];
-    direction[1] = it2.Value()[1] - it1.Value()[1];
-    direction.Normalize();
-
-    // Compute the orthogonal direction of the current line
-    itk::Vector<double, 2> orthogonalDirection;
-    orthogonalDirection[0] = direction[1];
-    orthogonalDirection[1] = -direction[0];
-
-    splitedLineIdCentral.push_back(IndexPairType(id1, id2));
-    for (unsigned int j = 1; j <= m_CenterRadius; ++j)
-      {
-      IndexType shift11, shift12;
-      shift11[0] = id1[0] - j * orthogonalDirection[0];
-      shift11[1] = id1[1] - j * orthogonalDirection[1];
-      shift12[0] = id1[0] + j * orthogonalDirection[0];
-      shift12[1] = id1[1] + j * orthogonalDirection[1];
-      IndexType shift21, shift22;
-      shift21[0] = id2[0] - j * orthogonalDirection[0];
-      shift21[1] = id2[1] - j * orthogonalDirection[1];
-      shift22[0] = id2[0] + j * orthogonalDirection[0];
-      shift22[1] = id2[1] + j * orthogonalDirection[1];
-
-      splitedLineIdCentral.push_back(IndexPairType(shift11, shift21));
-      splitedLineIdCentral.push_back(IndexPairType(shift12, shift22));
-      }
-
-    for (unsigned int j = m_NeighborhoodBeginRadius; j <= m_NeighborhoodEndRadius; ++j)
-      {
-      IndexType shift11, shift12;
-      shift11[0] = id1[0] - j * orthogonalDirection[0];
-      shift11[1] = id1[1] - j * orthogonalDirection[1];
-      shift12[0] = id1[0] + j * orthogonalDirection[0];
-      shift12[1] = id1[1] + j * orthogonalDirection[1];
-      IndexType shift21, shift22;
-      shift21[0] = id2[0] - j * orthogonalDirection[0];
-      shift21[1] = id2[1] - j * orthogonalDirection[1];
-      shift22[0] = id2[0] + j * orthogonalDirection[0];
-      shift22[1] = id2[1] + j * orthogonalDirection[1];
-
-      splitedLineIdNeigh.push_back(IndexPairType(shift11, shift21));
-      splitedLineIdNeigh.push_back(IndexPairType(shift12, shift22));
-      }
-    ++it1;
-    ++it2;
-    }
-
-  // in FEATURE_POLYGON case, first point appears twice (first vertex and last vertew, thus we create a line of 1 point...)
-  if (node.GetNodeType() == FEATURE_POLYGON)
-    {
-    splitedLineIdCentral.pop_back();
-    splitedLineIdNeigh.pop_back();
-    splitedLineIdNeigh.pop_back();
-    }
-
-  double centralNbVisitedPixel = 0.;
-
-  PixelType centralRadiomAcc(this->GetInputImage()->GetNumberOfComponentsPerPixel());
-  centralRadiomAcc.Fill(0);
-
-  for (unsigned int i = 0; i < splitedLineIdCentral.size(); ++i)
-    {
-    LineIteratorType lineIt(this->GetInputImage(), splitedLineIdCentral[i].first, splitedLineIdCentral[i].second);
-    lineIt.GoToBegin();
-
-    while (!lineIt.IsAtEnd())
-      {
-      if (this->IsInsideBuffer(lineIt.GetIndex()))
-        {
-        centralRadiomAcc += this->GetInputImage()->GetPixel( lineIt.GetIndex() );
-        centralNbVisitedPixel += 1;
-        }
-      ++lineIt;
-      }
-    }
-
-  double neighNbVisitedPixel = 0.;
-
-  PixelType neighborRadiomAcc(this->GetInputImage()->GetNumberOfComponentsPerPixel());
-  neighborRadiomAcc.Fill(0);
-
-  for (unsigned int i = 0; i < splitedLineIdNeigh.size(); ++i)
-    {
-    LineIteratorType lineIt(this->GetInputImage(), splitedLineIdNeigh[i].first, splitedLineIdNeigh[i].second);
-    lineIt.GoToBegin();
-
-    while (!lineIt.IsAtEnd())
-      {
-      if (this->IsInsideBuffer(lineIt.GetIndex()))
-        {
-        neighborRadiomAcc += this->GetInputImage()->GetPixel( lineIt.GetIndex() );
-        neighNbVisitedPixel += 1;
-        }
-      ++lineIt;
-      }
-    }
-
-  OutputType output;
-  if (centralNbVisitedPixel > 0 && neighNbVisitedPixel > 0)
-    {
-    // Compute averaged radiometry in both areas
-    centralRadiomAcc  /= centralNbVisitedPixel;
-    neighborRadiomAcc /= neighNbVisitedPixel;
-
-    // Compute the spectral angle between the center area and the neighbor area
-    SpectralAngleFunctorType spectralAngleFunctor;
-    double angle = spectralAngleFunctor(neighborRadiomAcc, centralRadiomAcc);
-
-    // Make sure we are in [0, 1] interval
-    angle /= otb::CONST_PI;
-
-    output.push_back(static_cast<PrecisionType> (angle));
-    }
-  else
-    {
-    output.push_back(static_cast<PrecisionType> (0.));
-    }
-
-  // TODO: handle streaming, need to output the current state
-  return output;
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.h b/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.h
deleted file mode 100644
index 1bc3dce3fea38484b86e8629213bf652ef138aeb..0000000000000000000000000000000000000000
--- a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbSpectralAngleDataNodeFeatureFunction_h
-#define otbSpectralAngleDataNodeFeatureFunction_h
-
-#include "otbDataNodeImageFunction.h"
-
-#include "otbBinarySpectralAngleFunctor.h"
-#include "otbPolyLineImageConstIterator.h"
-#include "itkLineConstIterator.h"
-#include "itkVariableLengthVector.h"
-
-namespace otb
-{
-/** \class SpectralAngleDataNodeFeatureFunction
-  * \brief Compute a spectral angle based feature alongside a
-  * datanode.
-  *
-  * This function compute a spectral angle alongside a datanode.
-  * The feature is the mean spectral angle regarding a
-  * reference pixel alongside the tested datanode.
-  *
-  * The output has three elements:
-  * - #0: mean spectral angle of a neighborhood around the datanode, weighted to fit in [0, 1] interval
-  * - #1: accumulator of the spectral angle alongside the datanode
-  * - #2: number of visited pixel
-  *
-  * \ingroup Functions
-  * \sa DataNodeImageFunction
-  * \sa NDVIDataNodeFeatureFunction
- *
- * \ingroup OTBVectorDataManipulation
-  */
-
-template <
-class TImage,
-class TCoordRep = double,
-class TPrecision = double
->
-class ITK_EXPORT SpectralAngleDataNodeFeatureFunction :
-    public DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision>
-{
-public:
-  /** Standard class typedefs. */
-  typedef SpectralAngleDataNodeFeatureFunction                Self;
-  typedef DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision>
-                                                              Superclass;
-  typedef itk::SmartPointer<Self>                             Pointer;
-  typedef itk::SmartPointer<const Self>                       ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(SpectralAngleDataNodeFeatureFunction, DataNodeImageFunction);
-
-  /** Some typedefs. */
-  typedef typename Superclass::DataNodeType           DataNodeType;
-  typedef typename DataNodeType::LineType             LineType;
-  typedef typename LineType::Pointer                  LinePointer;
-  typedef typename LineType::ContinuousIndexType      ContinuousIndexType;
-  typedef typename LineType::VertexListConstIteratorType VertexListConstIteratorType;
-
-  typedef TImage                                      InputImageType;
-  typedef typename InputImageType::ConstPointer       InputImageConstPointer;
-  typedef typename InputImageType::PixelType          PixelType;
-  typedef typename InputImageType::InternalPixelType  ScalarRealType;
-  typedef typename InputImageType::IndexType          IndexType;
-  typedef typename InputImageType::IndexValueType     IndexValueType;
-
-  typedef TCoordRep                                   CoordRepType;
-
-  typedef TPrecision                                  PrecisionType;
-
-  typedef itk::VariableLengthVector<PrecisionType>    ReferencePixelType;
-
-  typedef PolyLineImageConstIterator<InputImageType, LineType> ImageLineIteratorType;
-  typedef itk::LineConstIterator<InputImageType>      LineIteratorType;
-
-  typedef Functor::BinarySpectralAngleFunctor<PixelType, ReferencePixelType, PrecisionType>
-                                                      SpectralAngleFunctorType;
-
-  typedef std::pair<IndexType, IndexType>             IndexPairType;
-  typedef std::vector<PrecisionType>                  OutputType;
-
-  OutputType Evaluate( const DataNodeType& node ) const override;
-
-  /** Set/Get methods */
-  itkGetConstMacro(RefPixel, PixelType);
-  itkSetMacro(RefPixel, PixelType);
-
-  itkGetConstMacro(Radius, unsigned int);
-  itkSetMacro(Radius, unsigned int);
-
-protected:
-  SpectralAngleDataNodeFeatureFunction();
-  ~SpectralAngleDataNodeFeatureFunction() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  SpectralAngleDataNodeFeatureFunction(const Self&) = delete;
-  void operator=(const Self&) = delete;
-
-  /** SpectralAngle Functor & ReferencePixel*/
-  ReferencePixelType          m_RefPixel;
-  SpectralAngleFunctorType    m_SpectralAngleFunctor;
-
-  /** Neighborhood radius */
-  unsigned int m_Radius;
-};
-
-}
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbSpectralAngleDataNodeFeatureFunction.hxx"
-#endif
-
-#endif
diff --git a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.hxx b/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.hxx
deleted file mode 100644
index c2ed9e81e295505f4fbaad58afeeaa772f77770e..0000000000000000000000000000000000000000
--- a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.hxx
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbSpectralAngleDataNodeFeatureFunction_hxx
-#define otbSpectralAngleDataNodeFeatureFunction_hxx
-
-#include "otbSpectralAngleDataNodeFeatureFunction.h"
-
-namespace otb
-{
-
-/**
- * Constructor
- */
-template<class TImage, class TCoordRep, class TPrecision>
-SpectralAngleDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::SpectralAngleDataNodeFeatureFunction() :
-  m_Radius(2)
-{
-  //Example for QuickBird images (on a specific image)
-  m_RefPixel.SetSize(4);
-  m_RefPixel.SetElement(0, 252.284);
-  m_RefPixel.SetElement(1, 357.3);
-  m_RefPixel.SetElement(2, 232.644);
-  m_RefPixel.SetElement(3, 261.558);
-}
-
-/**
- * Standard "PrintSelf" method
- */
-template<class TImage, class TCoordRep, class TPrecision>
-void SpectralAngleDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::PrintSelf(std::ostream& os,
-                                                                                    itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "Reference Pixel: " << m_RefPixel << std::endl;
-}
-
-template<class TImage, class TCoordRep, class TPrecision>
-typename SpectralAngleDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::OutputType SpectralAngleDataNodeFeatureFunction<
-    TImage, TCoordRep, TPrecision>::Evaluate(const DataNodeType& node) const
-{
-
-  // TODO faire avce un ikk
-  const typename ImageLineIteratorType::PathType* path;
-
-  switch (node.GetNodeType())
-    {
-    case FEATURE_POINT:
-      {
-      itkExceptionMacro(<< "This DataNode type is not handle yet");
-      break;
-      }
-    case FEATURE_LINE:
-      {
-      path = node.GetLine();
-      break;
-      }
-    case FEATURE_POLYGON:
-      {
-      path = node.GetPolygonExteriorRing();
-      break;
-      }
-    default:
-      {
-      itkExceptionMacro(<< "This DataNode type is not handle yet");
-      break;
-      }
-    }
-
-  std::vector<std::pair<IndexType, IndexType> > splitedLineIdNeigh;
-  std::vector<std::pair<IndexType, IndexType> > splitedLineIdCentral;
-
-  // Split line and polygon into segment (ie. line with two vertex
-  VertexListConstIteratorType it1 = path->GetVertexList()->Begin();
-  VertexListConstIteratorType it2 = path->GetVertexList()->Begin();
-  VertexListConstIteratorType itStop = path->GetVertexList()->End();
-
-  ++it2;
-  if (it2 == itStop)
-    {
-    itkExceptionMacro(<< "Invalid DataNode, must at least contain two points");
-    }
-
-  while (it1 != itStop && it2 != itStop)
-    {
-    IndexType id1, id2;
-    id1[0] = static_cast<int> (it1.Value()[0]);
-    id1[1] = static_cast<int> (it1.Value()[1]);
-    id2[0] = static_cast<int> (it2.Value()[0]);
-    id2[1] = static_cast<int> (it2.Value()[1]);
-
-    // Compute the direction of the current line
-    itk::Vector<double, 2> direction;
-    direction[0] = it2.Value()[0] - it1.Value()[0];
-    direction[1] = it2.Value()[1] - it1.Value()[1];
-    direction.Normalize();
-
-    // Compute the orthogonal direction of the current line
-    itk::Vector<double, 2> orthogonalDirection;
-    orthogonalDirection[0] = direction[1];
-    orthogonalDirection[1] = -direction[0];
-
-    splitedLineIdCentral.push_back(IndexPairType(id1, id2));
-
-    for (unsigned int j = 1; j <= m_Radius; ++j)
-      {
-      IndexType shift11, shift12;
-      shift11[0] = id1[0] - j * orthogonalDirection[0];
-      shift11[1] = id1[1] - j * orthogonalDirection[1];
-      shift12[0] = id1[0] + j * orthogonalDirection[0];
-      shift12[1] = id1[1] + j * orthogonalDirection[1];
-      IndexType shift21, shift22;
-      shift21[0] = id2[0] - j * orthogonalDirection[0];
-      shift21[1] = id2[1] - j * orthogonalDirection[1];
-      shift22[0] = id2[0] + j * orthogonalDirection[0];
-      shift22[1] = id2[1] + j * orthogonalDirection[1];
-
-      splitedLineIdCentral.push_back(IndexPairType(shift11, shift21));
-      splitedLineIdCentral.push_back(IndexPairType(shift12, shift22));
-      }
-
-    ++it1;
-    ++it2;
-    }
-
-  // in FEATURE_POLYGON case, first point appears twice (first vertex and last vertew, thus we create a line of 1 point...)
-  if (node.GetNodeType() == FEATURE_POLYGON)
-    {
-    splitedLineIdCentral.pop_back();
-    }
-
-  double centralAccSpectralAngle = 0.;
-  //double centralAccSpectralAngleSecondOrder = 0.;
-  double centralNbVisitedPixel = 0.;
-
-  for (unsigned int i = 0; i < splitedLineIdCentral.size(); ++i)
-    {
-    LineIteratorType lineIt(this->GetInputImage(), splitedLineIdCentral[i].first, splitedLineIdCentral[i].second);
-    lineIt.GoToBegin();
-
-    while (!lineIt.IsAtEnd())
-      {
-      if (this->IsInsideBuffer(lineIt.GetIndex()))
-        {
-        PixelType currPixel = this->GetInputImage()->GetPixel( lineIt.GetIndex() );
-        double angle = m_SpectralAngleFunctor(currPixel, this->GetRefPixel());
-        centralAccSpectralAngle += angle;
-        //centralAccSpectralAngleSecondOrder += angle * angle;
-        centralNbVisitedPixel += 1;
-        }
-      ++lineIt;
-      }
-    }
-
-  OutputType output;
-
-  double meanCentral = 0.;
-  //double stddevCentral = 0.;
-  if (centralNbVisitedPixel != 0.)
-    {
-    meanCentral = static_cast<double> (centralAccSpectralAngle) / centralNbVisitedPixel;
-    //stddevCentral = std::sqrt( centralAccSpectralAngleSecondOrder/centralNbVisitedPixel - meanCentral*meanCentral );
-    }
-
-  if (meanCentral == 0.)
-    {
-    output.push_back(static_cast<PrecisionType> (0.));
-    }
-  else
-    {
-    // Compute the descriptor here
-    // meanCentral is in [0, pi]
-    // We need a descriptor in [0 1]
-
-    double descriptor = meanCentral / otb::CONST_PI;
-    output.push_back(static_cast<PrecisionType>( descriptor ));
-    }
-
-  output.push_back(static_cast<PrecisionType> (centralAccSpectralAngle));
-  output.push_back(static_cast<PrecisionType> (centralNbVisitedPixel));
-
-  return output;
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Filtering/VectorDataManipulation/test/CMakeLists.txt b/Modules/Filtering/VectorDataManipulation/test/CMakeLists.txt
index 8513e931ac8918b27fe82f9d51d17cacbeb759a9..a4f17c2c5abfea6b32e5f7bc1bdd3270b66e4334 100644
--- a/Modules/Filtering/VectorDataManipulation/test/CMakeLists.txt
+++ b/Modules/Filtering/VectorDataManipulation/test/CMakeLists.txt
@@ -22,12 +22,10 @@ otb_module_test()
 
 set(OTBVectorDataManipulationTests
 otbVectorDataManipulationTestDriver.cxx
-otbDBOverlapDataNodeFeatureFunction.cxx
 otbVectorDataExtractROI.cxx
 otbPolygonCompacityFunctor.cxx
 otbVectorDataToRandomLineGenerator.cxx
 otbConcatenateVectorDataFilter.cxx
-otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.cxx
 )
 
 add_executable(otbVectorDataManipulationTestDriver ${OTBVectorDataManipulationTests})
@@ -36,18 +34,6 @@ otb_module_target_label(otbVectorDataManipulationTestDriver)
 
 # Tests Declaration
 
-otb_add_test(NAME bfTvDBOverlapDataNodeFeatureFunction COMMAND otbVectorDataManipulationTestDriver
-  --compare-ogr ${NOTOL}
-  ${BASELINE_FILES}/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp
-  ${TEMP}/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp
-  otbDBOverlapDataNodeFeatureFunction
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp
-  ${TEMP}/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp
-  0
-  )
-
-
 otb_add_test(NAME coTvVectorDataExtractROI COMMAND otbVectorDataManipulationTestDriver
   --compare-ogr ${NOTOL}
   ${BASELINE_FILES}/coVectorDataExtractROIOutput.shp
@@ -84,12 +70,10 @@ otb_add_test(NAME bfTvVectorDataToRandomLineGenerator COMMAND otbVectorDataManip
   ${BASELINE_FILES}/bfTvVectorDataToRandomLineGeneratorOutput.shp
   ${TEMP}/bfTvVectorDataToRandomLineGeneratorOutput.shp
   otbVectorDataToRandomLineGenerator
-  ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Polygons.shp
+  ${INPUTDATA}/Capitole-Shadows.shp
   ${TEMP}/bfTvVectorDataToRandomLineGeneratorOutput.shp
   )
 
-
-
 otb_add_test(NAME bfTvConcatenateVectorDataFilter COMMAND otbVectorDataManipulationTestDriver
   --compare-ogr ${NOTOL}
   ${BASELINE_FILES}/otbConcatenateVectorDataFilter_Output.shp
@@ -99,24 +83,3 @@ otb_add_test(NAME bfTvConcatenateVectorDataFilter COMMAND otbVectorDataManipulat
   ${INPUTDATA}/waterways.shp
   ${TEMP}/otbConcatenateVectorDataFilter_Output.shp
   )
-
-otb_add_test(NAME bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_Polygon COMMAND otbVectorDataManipulationTestDriver
-  --compare-ogr ${EPSILON_3}
-  ${BASELINE_FILES}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp
-  ${TEMP}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp
-  otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
-  ${INPUTDATA}/DEM/srtm_directory
-  ${TEMP}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp
-  0 )
-otb_add_test(NAME bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_Line COMMAND otbVectorDataManipulationTestDriver
-  --compare-ogr ${EPSILON_9}
-  ${BASELINE_FILES}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp
-  ${TEMP}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp
-  otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
-  ${INPUTDATA}/DEM/srtm_directory
-  ${TEMP}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp
-  0 )
diff --git a/Modules/Filtering/VectorDataManipulation/test/otbDBOverlapDataNodeFeatureFunction.cxx b/Modules/Filtering/VectorDataManipulation/test/otbDBOverlapDataNodeFeatureFunction.cxx
deleted file mode 100644
index 7bc471de7647fdd08f38f284fcabda330f9a50bb..0000000000000000000000000000000000000000
--- a/Modules/Filtering/VectorDataManipulation/test/otbDBOverlapDataNodeFeatureFunction.cxx
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-#include "otbDBOverlapDataNodeFeatureFunction.h"
-
-#include "otbVectorData.h"
-#include "otbVectorDataFileReader.h"
-#include "otbVectorDataFileWriter.h"
-
-
-int otbDBOverlapDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[])
-{
-  const char * inputVD  = argv[1];
-  const char * inputDB  = argv[2];
-  const char * outputVD = argv[3];
-  int DisplayWarnings   = atoi(argv[4]);
-
-  typedef double                                      CoordRepType;
-  typedef double                                      PrecisionType;
-  typedef otb::VectorData<CoordRepType, 2, PrecisionType>
-                                                      VectorDataType;
-  typedef VectorDataType::DataNodeType                DataNodeType;
-  typedef otb::VectorDataFileReader<VectorDataType>   VectorDataReaderType;
-  typedef otb::VectorDataFileWriter<VectorDataType>   VectorDataWriterType;
-  typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType>
-                                                      TreeIteratorType;
-
-  typedef otb::DBOverlapDataNodeFeatureFunction<CoordRepType, PrecisionType>
-                                                      DataNodeFunctionType;
-  typedef DataNodeFunctionType::OutputType
-                                                      FeatureOutputType;
-
-  VectorDataReaderType::Pointer   vdReader = VectorDataReaderType::New();
-  VectorDataReaderType::Pointer vdDBReader = VectorDataReaderType::New();
-  VectorDataWriterType::Pointer   vdWriter = VectorDataWriterType::New();
-  DataNodeFunctionType::Pointer   function = DataNodeFunctionType::New();
-
-  if (!DisplayWarnings)
-   {
-    vdReader->SetGlobalWarningDisplay(0);
-   }
-
-  vdReader->SetFileName(inputVD);
-  vdReader->Update();
-
-  vdDBReader->SetFileName(inputDB);
-  vdDBReader->Update();
-
-  function->SetInputVectorData(vdDBReader->GetOutput());
-  function->SetDistanceThreshold(0.003);
-
-  // Output
-  VectorDataType::Pointer outVD = VectorDataType::New();
-  // Retrieving root node
-  DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get();
-  // Create the document node
-  DataNodeType::Pointer document = DataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(document, root);
-  // Create the folder node
-  DataNodeType::Pointer folder = DataNodeType::New();
-  folder->SetNodeType(otb::FOLDER);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(folder, document);
-
-  TreeIteratorType itVector(vdReader->GetOutput()->GetDataTree());
-  itVector.GoToBegin();
-  while (!itVector.IsAtEnd())
-    {
-    if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature())
-         {
-          const DataNodeType::Pointer currentGeometry = itVector.Get();
-          FeatureOutputType currentResult;
-          currentResult = function->Evaluate(*(currentGeometry.GetPointer()));
-          currentGeometry->SetFieldAsDouble("DBOVER", (double)(currentResult[0]));
-          outVD->GetDataTree()->Add(currentGeometry, folder);
-         }
-    ++itVector;
-    }
-
-  vdWriter->SetInput(outVD);
-  vdWriter->SetFileName(outputVD);
-  vdWriter->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/VectorDataManipulation/test/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.cxx b/Modules/Filtering/VectorDataManipulation/test/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.cxx
deleted file mode 100644
index a5481e05d3f0b64f74f0b2e2153722fa960ff722..0000000000000000000000000000000000000000
--- a/Modules/Filtering/VectorDataManipulation/test/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.cxx
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h"
-
-#include "otbVectorImage.h"
-#include "otbImageFileReader.h"
-#include "otbVectorData.h"
-#include "otbVectorDataFileReader.h"
-#include "otbVectorDataIntoImageProjectionFilter.h"
-#include "otbVectorDataFileWriter.h"
-#include "itkPreOrderTreeIterator.h"
-
-
-int otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[])
-{
-  const char * inputVD  = argv[1];
-  const char * inputImg = argv[2];
-  const char * DEMDir   = argv[3];
-  const char * outputVD = argv[4];
-  int DisplayWarnings   = atoi(argv[5]);
-
-  typedef double                                      CoordRepType;
-  typedef double                                      PrecisionType;
-  typedef otb::VectorImage<PrecisionType>             ImageType;
-  typedef otb::ImageFileReader<ImageType>             ImageReaderType;
-  typedef otb::VectorData<CoordRepType, 2, PrecisionType>
-                                                      VectorDataType;
-  typedef VectorDataType::DataNodeType                DataNodeType;
-  typedef otb::VectorDataFileReader<VectorDataType>   VectorDataReaderType;
-  typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType>
-                                                      VectorDataReProjFilter;
-  typedef otb::VectorDataFileWriter<VectorDataType>   VectorDataWriterType;
-  typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType>
-                                                      TreeIteratorType;
-
-  typedef otb::RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType>
-                                                      FeaturefunctionType;
-  typedef FeaturefunctionType::OutputType
-                                                      FeatureOutputType;
-
-  ImageReaderType::Pointer imgReader = ImageReaderType::New();
-  VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New();
-  VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New();
-  VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New();
-  FeaturefunctionType::Pointer featureFunction = FeaturefunctionType::New();
-
-  if (!DisplayWarnings)
-   {
-    imgReader->SetGlobalWarningDisplay(0);
-   }
-
-  otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDir);
-
-  vdReader->SetFileName(inputVD);
-  vdReader->Update();
-
-  imgReader->SetFileName(inputImg);
-  imgReader->UpdateOutputInformation();
-  imgReader->Update(); //Needed to set m_EndIndex, m_StartIndex in otbDataNodeImageFunction
-
-  vdReProjFilter->SetInputImage(imgReader->GetOutput());
-  vdReProjFilter->SetInputVectorData(vdReader->GetOutput());
-  vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true);
-  vdReProjFilter->Update();
-
-  std::cout<< "vdReProjFilter->GetOutput()->Size(): "
-        << vdReProjFilter->GetOutput()->Size() << std::endl;
-
-  featureFunction->SetInputImage(imgReader->GetOutput());
-
-  // Output
-  VectorDataType::Pointer outVD = VectorDataType::New();
-  // Retrieving root node
-  DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get();
-  // Create the document node
-  DataNodeType::Pointer document = DataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(document, root);
-  // Create the folder node
-  DataNodeType::Pointer folder = DataNodeType::New();
-  folder->SetNodeType(otb::FOLDER);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(folder, document);
-
-  TreeIteratorType itVector(vdReProjFilter->GetOutput()->GetDataTree());
-  itVector.GoToBegin();
-  while (!itVector.IsAtEnd())
-    {
-    if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature())
-         {
-          const DataNodeType::Pointer currentGeometry = itVector.Get();
-          FeatureOutputType currentResult;
-          currentResult = featureFunction->Evaluate(*(currentGeometry.GetPointer()));
-          currentGeometry->SetFieldAsDouble("RADIOM_HOM", (double)(currentResult[0]));
-          outVD->GetDataTree()->Add(currentGeometry, folder);
-         }
-    ++itVector;
-    }
-
-  vdWriter->SetInput(outVD);
-  vdWriter->SetFileName(outputVD);
-  vdWriter->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Filtering/VectorDataManipulation/test/otbVectorDataManipulationTestDriver.cxx b/Modules/Filtering/VectorDataManipulation/test/otbVectorDataManipulationTestDriver.cxx
index c4230b11556a036ec89fa39103beba40d12a5252..d09a9aaed3041af20589dc65f6f1a6903c3e4437 100644
--- a/Modules/Filtering/VectorDataManipulation/test/otbVectorDataManipulationTestDriver.cxx
+++ b/Modules/Filtering/VectorDataManipulation/test/otbVectorDataManipulationTestDriver.cxx
@@ -22,10 +22,8 @@
 
 void RegisterTests()
 {
-  REGISTER_TEST(otbDBOverlapDataNodeFeatureFunction);
   REGISTER_TEST(otbVectorDataExtractROI);
   REGISTER_TEST(otbPolygonCompacityFunctor);
   REGISTER_TEST(otbVectorDataToRandomLineGenerator);
   REGISTER_TEST(otbConcatenateVectorDataFilter);
-  REGISTER_TEST(otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction);
 }
diff --git a/Modules/Filtering/Wavelet/include/otbWaveletOperatorBase.hxx b/Modules/Filtering/Wavelet/include/otbWaveletOperatorBase.hxx
index 704e8eff1809e13aee0570b76f312c4a0b4720ce..193ed93eca16281259824f9d3699212698633ef0 100644
--- a/Modules/Filtering/Wavelet/include/otbWaveletOperatorBase.hxx
+++ b/Modules/Filtering/Wavelet/include/otbWaveletOperatorBase.hxx
@@ -156,14 +156,9 @@ void
 WaveletOperatorBase<TMotherWaveletOperator, TPixel, VDimension, TAllocator>
 ::ReduceFilterLength(CoefficientVector& coeff)
 {
-  const unsigned int length = coeff.size();
-  assert(length >= 2);
-  CoefficientVector newFilter(length - 2);
-  for (unsigned int i = 0; i < newFilter.size(); ++i)
-    {
-    newFilter[i] = coeff[i + 1];
-    }
-  coeff = newFilter;
+  assert(coeff.size() >= 2);
+  coeff.pop_back();
+  coeff.erase(coeff.begin());
 }
 
 } // end of namespace otb
diff --git a/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx b/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx
index f0bd16acb33d5cc824933eaa9ac7610c331f3ca7..3f4d9771db9bfe0bbe1125a6380389af162f139b 100644
--- a/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx
+++ b/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx
@@ -772,7 +772,9 @@ unsigned int OGRIOHelper
           if (std::string(key) != "FID")
             {
             // Edit the value of the field and add it to the current feature
-            ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.GetFieldAsString(key).c_str());
+            int fIndex = ogrFeature->GetFieldIndex(key);
+            if (fIndex >= 0)
+              ogrFeature->SetField(fIndex , kwl.GetFieldAsString(key).c_str());
             }
           }
 
@@ -826,7 +828,9 @@ unsigned int OGRIOHelper
           // Get the key of the Nth OGRFieldRefn
           const char * key = kwl.GetNthField(i).first->GetNameRef();
           // Edit the value of the field and add it to the current feature
-          ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.GetFieldAsString(key).c_str());
+          int fIndex = ogrFeature->GetFieldIndex(key);
+          if (fIndex >= 0)
+            ogrFeature->SetField(fIndex , kwl.GetFieldAsString(key).c_str());
           }
 
 //        ogrFeature->SetField("Name", dataNode->GetNodeId());
@@ -911,7 +915,9 @@ unsigned int OGRIOHelper
           // Get the key of the Nth OGRFieldRefn
           const char * key = kwl.GetNthField(i).first->GetNameRef();
           // Edit the value of the field and add it to the current feature
-          ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.GetFieldAsString(key).c_str());
+          int fIndex = ogrFeature->GetFieldIndex(key);
+          if (fIndex >= 0)
+            ogrFeature->SetField(fIndex , kwl.GetFieldAsString(key).c_str());
           }
 
         ogrFeature->SetGeometry(ogrPolygon);
diff --git a/Modules/IO/ImageIO/include/otbImageFileReader.hxx b/Modules/IO/ImageIO/include/otbImageFileReader.hxx
index 09c7e0cae81c623443aeb33566093047a2a67c7c..4d39b7cd1797e35930be419fbf797291b0469b47 100644
--- a/Modules/IO/ImageIO/include/otbImageFileReader.hxx
+++ b/Modules/IO/ImageIO/include/otbImageFileReader.hxx
@@ -445,7 +445,7 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
           }
         if (otb_kwl.Empty())
           {
-          otbLogMacro(Info,<< "No kwl metadata found in file "<<lFileNameOssimKeywordlist);
+          otbLogMacro(Debug,<< "No kwl metadata found in file "<<lFileNameOssimKeywordlist);
           }
         }
       }
diff --git a/Modules/IO/ImageIO/test/CMakeLists.txt b/Modules/IO/ImageIO/test/CMakeLists.txt
index 04d68c8293cc8e29b00c957863e6abd96f45a694..6fd2e7e6fd5957f9e91e724b67f27283bedf190b 100644
--- a/Modules/IO/ImageIO/test/CMakeLists.txt
+++ b/Modules/IO/ImageIO/test/CMakeLists.txt
@@ -1352,6 +1352,7 @@ otb_add_test(NAME ioTvCompoundMetadataReaderTest
   --compare-ascii ${EPSILON_9}
   ${INPUTDATA}/QB_Toulouse_SensorModel_labelImage.geom
   ${TEMP}/ioTvCompoundMetadataReaderTest.geom
+  --ignore-lines-with 1 support_data.
   otbWriteGeomFile
   ${INPUTDATA}/QB_Toulouse_combo.vrt
   ${TEMP}/ioTvCompoundMetadataReaderTest.tif)
diff --git a/Modules/IO/ImageIO/test/otbComplexImageManipulationTest.cxx b/Modules/IO/ImageIO/test/otbComplexImageManipulationTest.cxx
index aa59af502ce74303a5a8cac74c854015a591abca..2cd546a6f7988116852a3e79f010a347cf6a92b7 100644
--- a/Modules/IO/ImageIO/test/otbComplexImageManipulationTest.cxx
+++ b/Modules/IO/ImageIO/test/otbComplexImageManipulationTest.cxx
@@ -68,11 +68,11 @@ bool IsEqual(itk::VariableLengthVector<TInternalPixel> output, itk::VariableLeng
 template<class TIndex, class TPixel>
 bool TestCompare(TIndex idx, TPixel output, TPixel expected)
 {
-  std::cout << "PIXEL " << idx << "  -->  "
+  otbLogMacro(Debug, << "PIXEL " << idx << "  -->  "
             << "OUTPUT = "   << output
             << "   ||   "
             << "EXPECTED = " << expected
-            << std::endl;
+            << std::endl);
 
   if (!IsEqual(output, expected))
     {
diff --git a/Modules/IO/TestKernel/include/otbTestHelper.h b/Modules/IO/TestKernel/include/otbTestHelper.h
index 19f7207d04124dfbcf45934772687910e021baad..a99b106e1b4b4a32f0d934aca60e3887713b73fd 100644
--- a/Modules/IO/TestKernel/include/otbTestHelper.h
+++ b/Modules/IO/TestKernel/include/otbTestHelper.h
@@ -60,38 +60,45 @@ public:
   typedef std::vector<std::string> StringList;
   typedef StringList::const_iterator StringListIt;
 
+  typedef std::vector<double> EpsilonList;
+  typedef EpsilonList::const_iterator EpsilonListIt;
+
   TestHelper();
 
   ~TestHelper() override;
 
   int RegressionTestAllImages(const StringList& baselineFilenamesImage,
-                              const StringList& testFilenamesImage);
+                              const StringList& testFilenamesImage,
+                              const EpsilonList& epsilons);
 
   int RegressionTestAllMetaData(const StringList& baselineFilenamesMetaData,
-                                const StringList& testFilenamesMetaData);
+                                const StringList& testFilenamesMetaData,
+                                const EpsilonList& epsilons);
 
   int RegressionTestAllAscii(const StringList& baselineFilenamesAscii,
                              const StringList& testFilenamesAscii,
+                             const EpsilonList& epsilons,
                              const StringList& ignoredLines);
 
   int RegressionTestAllDiff(const StringList& baselineFilenamesAscii,
                              const StringList& testFilenamesAscii,
+                             const EpsilonList& epsilons,
                              const StringList& ignoredLines);
 
   int RegressionTestAllBinary(const StringList& baselineFilenamesBinary,
                               const StringList& testFilenamesBinary);
 
   int RegressionTestAllOgr(const StringList& baselineFilenamesOgr,
-                           const StringList& testFilenamesOgr);
+                           const StringList& testFilenamesOgr,
+                           const EpsilonList& epsilons);
 
   itkSetMacro(ReportErrors, bool);
   itkBooleanMacro(ReportErrors);
   itkSetMacro(IgnoreLineOrder, bool);
   itkBooleanMacro(IgnoreLineOrder);
 
-  itkSetMacro(ToleranceDiffValue, double);
-  itkSetMacro(Epsilon, double);
   itkSetMacro(EpsilonBoundaryChecking, double);
+  itkSetMacro(ToleranceRatio, double);
 
 private:
 
@@ -157,8 +164,7 @@ private:
   static void DumpOGRFeature(FILE* fileid, OGRFeature* feature, char** papszOptions = nullptr);
   static void DumpOGRGeometry(FILE* fileid, OGRGeometry* geometry, const char * pszPrefix, char** papszOptions = nullptr);
 
-  double m_ToleranceDiffValue;
-  double m_Epsilon;
+  double m_ToleranceRatio;
   double m_EpsilonBoundaryChecking;
   bool   m_ReportErrors;
   bool   m_IgnoreLineOrder;
diff --git a/Modules/IO/TestKernel/include/otbTestMain.h b/Modules/IO/TestKernel/include/otbTestMain.h
index 40696ad53934f22e1864e316565cda2f79b7ae3e..d0d988393af1207beb29467ae5919191f17432e2 100644
--- a/Modules/IO/TestKernel/include/otbTestMain.h
+++ b/Modules/IO/TestKernel/include/otbTestMain.h
@@ -69,6 +69,25 @@ void LoadTestEnv()
   itk::Statistics::MersenneTwisterRandomVariateGenerator::GetInstance()->SetSeed(121212);
 }
 
+/** CheckOption, utility function to test the presence of a given token
+ *  in the argument list. The function also checks if there are at least 'min'
+ *  arguments left to parse the token (token included) */
+bool CheckOption(char* arg,const char* token,int ac, int min)
+{
+  if( strcmp(arg, token) == 0 )
+    {
+    if (min < ac)
+      {
+      return true;
+      }
+    else
+      {
+      std::cerr << "Can't parse token '"<<token<< "', need at least "<<min-1<<" arguments after.\n";
+      }
+    }
+  return false;
+}
+
 int main(int ac, char* av[])
 {
   #ifdef OTB_USE_MPI
@@ -76,10 +95,13 @@ int main(int ac, char* av[])
   #endif
 
   bool   lFlagRegression(false);
-  double lToleranceDiffValue(0);
-  double lEpsilon(0);
+  std::vector<double> toleranceDiffValues;
+  std::vector<double> toleranceOgrValues;
+  std::vector<double> toleranceMetaValues;
+  std::vector<double> toleranceAsciiValues;
   bool   lIgnoreOrder(false);
   double epsilonBoundary(0.0);
+  double lToleranceRatio(0.0);
 
   typedef otb::TestHelper::StringList   StringList;
   StringList baselineFilenamesBinary;
@@ -125,185 +147,176 @@ int main(int ac, char* av[])
     }
   else
     {
-    if (strcmp(av[1], "--with-threads") == 0)
-      {
-      int numThreads = atoi(av[2]);
-      itk::MultiThreader::SetGlobalDefaultNumberOfThreads(numThreads);
-      av += 2;
-      ac -= 2;
-      }
-    else if (strcmp(av[1], "--without-threads") == 0)
-      {
-      itk::MultiThreader::SetGlobalDefaultNumberOfThreads(1);
-      av += 1;
-      ac -= 1;
-      }
-    if (strcmp(av[1], "--ignore-order") == 0)
-      {
-      lIgnoreOrder = true;
-      av += 1;
-      ac -= 1;
-      }
-    if (strcmp(av[1], "--epsilon-boundary") == 0)
-      {
-      epsilonBoundary = atof(av[2]);
-      av += 2;
-      ac -= 2;
-      }
-    if (strcmp(av[1], "--compare-image") == 0)
-      {
-      lFlagRegression = true;
-      lToleranceDiffValue = (double) (::atof(av[2]));
-      baselineFilenamesImage.reserve(1);
-      testFilenamesImage.reserve(1);
-      baselineFilenamesImage.push_back(av[3]);
-      testFilenamesImage.push_back(av[4]);
-      av += 4;
-      ac -= 4;
-      }
-    else if (strcmp(av[1], "--compare-n-images") == 0)
+    int ac0 = ac+1;
+    while (strncmp(av[1], "--", 2) == 0 && ac0 > ac)
       {
-      lFlagRegression = true;
-      lToleranceDiffValue = (double) (::atof(av[2]));
-      // Number of comparisons to do
-      unsigned int nbComparisons = (unsigned int) (::atoi(av[3]));
-      baselineFilenamesImage.reserve(nbComparisons);
-      testFilenamesImage.reserve(nbComparisons);
-      // Retrieve all the file names
-      for (unsigned int i = 0; i < nbComparisons; ++i)
+      ac0 = ac;
+      if (CheckOption(av[1],"--with-threads", ac, 2))
         {
-        baselineFilenamesImage.push_back(av[4 + 2 * i]);
-        testFilenamesImage.push_back(av[5 + 2 * i]);
+        int numThreads = atoi(av[2]);
+        itk::MultiThreader::SetGlobalDefaultNumberOfThreads(numThreads);
+        av += 2;
+        ac -= 2;
         }
-      av += 3 + 2 * nbComparisons;
-      ac -= 3 + 2 * nbComparisons;
-      }
-    else if (strcmp(av[1], "--compare-binary") == 0)
-      {
-      lFlagRegression = true;
-      baselineFilenamesBinary.reserve(1);
-      testFilenamesBinary.reserve(1);
-      baselineFilenamesBinary.push_back(av[2]);
-      testFilenamesBinary.push_back(av[3]);
-      av += 3;
-      ac -= 3;
-      }
-    else if (strcmp(av[1], "--compare-n-binary") == 0)
-      {
-      lFlagRegression = true;
-      unsigned int nbComparisons = (unsigned int) (::atoi(av[2]));
-      baselineFilenamesBinary.reserve(nbComparisons);
-      testFilenamesBinary.reserve(nbComparisons);
-      // Retrieve all the file names
-      for (unsigned int i = 0; i < nbComparisons; ++i)
+      else if (CheckOption(av[1], "--without-threads",ac, 1))
         {
-        baselineFilenamesBinary.push_back(av[3 + 2 * i]);
-        testFilenamesBinary.push_back(av[4 + 2 * i]);
+        itk::MultiThreader::SetGlobalDefaultNumberOfThreads(1);
+        av += 1;
+        ac -= 1;
         }
-      av += 2 + 2 * nbComparisons;
-      ac -= 2 + 2 * nbComparisons;
-      }
-    /************************************************************************/
-    // COMPARE ASCII
-    else if (strcmp(av[1], "--compare-ascii") == 0)
-      {
-      lFlagRegression = true;
-      lEpsilon = (double) (::atof(av[2]));
-      baselineFilenamesAscii.reserve(1);
-      testFilenamesAscii.reserve(1);
-      baselineFilenamesAscii.push_back(av[3]);
-      testFilenamesAscii.push_back(av[4]);
-      av += 4;
-      ac -= 4;
-
-      if (ac > 1)
+      else if (CheckOption(av[1], "--ignore-order", ac, 1))
+        {
+        lIgnoreOrder = true;
+        av += 1;
+        ac -= 1;
+        }
+      else if (CheckOption(av[1], "--epsilon-boundary", ac, 2))
         {
-        if (strcmp(av[1], "--ignore-lines-with") == 0)
+        epsilonBoundary = atof(av[2]);
+        av += 2;
+        ac -= 2;
+        }
+      else if (CheckOption(av[1], "--compare-image", ac, 4))
+        {
+        lFlagRegression = true;
+        toleranceDiffValues.push_back((double) (::atof(av[2])));
+        baselineFilenamesImage.push_back(av[3]);
+        testFilenamesImage.push_back(av[4]);
+        av += 4;
+        ac -= 4;
+        }
+      else if (CheckOption(av[1], "--compare-n-images", ac, 3))
+        {
+        lFlagRegression = true;
+        // Number of comparisons to do
+        unsigned int nbComparisons = (unsigned int) (::atoi(av[3]));
+        double tol = (double) (::atof(av[2]));
+        toleranceDiffValues.reserve(toleranceDiffValues.size() + nbComparisons);
+        baselineFilenamesImage.reserve(baselineFilenamesImage.size() + nbComparisons);
+        testFilenamesImage.reserve(testFilenamesImage.size() + nbComparisons);
+        // Retrieve all the file names
+        for (unsigned int i = 0; i < nbComparisons; ++i)
           {
-          unsigned int nbIgnoredLines = (unsigned int) (::atoi(av[2]));
-          for (unsigned int i = 0; i < nbIgnoredLines; ++i)
-            {
-            ignoredLines.push_back(av[3 + i]);
-            }
-          av += 2 + nbIgnoredLines;
-          ac -= 2 + nbIgnoredLines;
+          toleranceDiffValues.push_back(tol);
+          baselineFilenamesImage.push_back(av[4 + 2 * i]);
+          testFilenamesImage.push_back(av[5 + 2 * i]);
           }
+        av += 3 + 2 * nbComparisons;
+        ac -= 3 + 2 * nbComparisons;
         }
-      }
-    /************************************************************************/
-    else if (strcmp(av[1], "--compare-n-ascii") == 0)
-      {
-      lFlagRegression = true;
-      lEpsilon = (double) (::atof(av[2]));
-      // Number of comparisons to do
-      unsigned int nbComparisons = (unsigned int) (::atoi(av[3]));
-      baselineFilenamesAscii.reserve(nbComparisons);
-      testFilenamesAscii.reserve(nbComparisons);
-      // Retrieve all the file names
-      for (unsigned int i = 0; i < nbComparisons; ++i)
+      else if (CheckOption(av[1], "--compare-binary", ac, 3))
         {
-        baselineFilenamesAscii.push_back(av[4 + 2 * i]);
-        testFilenamesAscii.push_back(av[5 + 2 * i]);
+        lFlagRegression = true;
+        baselineFilenamesBinary.reserve(1);
+        testFilenamesBinary.reserve(1);
+        baselineFilenamesBinary.push_back(av[2]);
+        testFilenamesBinary.push_back(av[3]);
+        av += 3;
+        ac -= 3;
         }
-      av += 3 + 2 * nbComparisons;
-      ac -= 3 + 2 * nbComparisons;
-
-      if (ac > 1)
+      else if (CheckOption(av[1], "--compare-n-binary", ac, 2))
         {
-        if (strcmp(av[1], "--ignore-lines-with") == 0)
+        lFlagRegression = true;
+        unsigned int nbComparisons = (unsigned int) (::atoi(av[2]));
+        baselineFilenamesBinary.reserve(nbComparisons);
+        testFilenamesBinary.reserve(nbComparisons);
+        // Retrieve all the file names
+        for (unsigned int i = 0; i < nbComparisons; ++i)
           {
-          unsigned int nbIgnoredLines = (unsigned int) (::atoi(av[2]));
-          for (unsigned int i = 0; i < nbIgnoredLines; ++i)
-            {
-            ignoredLines.push_back(av[3 + i]);
-            }
-          av += 2 + nbIgnoredLines;
-          ac -= 2 + nbIgnoredLines;
+          baselineFilenamesBinary.push_back(av[3 + 2 * i]);
+          testFilenamesBinary.push_back(av[4 + 2 * i]);
           }
+        av += 2 + 2 * nbComparisons;
+        ac -= 2 + 2 * nbComparisons;
         }
+      /************************************************************************/
+      // COMPARE ASCII
+      else if (CheckOption(av[1], "--compare-ascii", ac, 4))
+        {
+        lFlagRegression = true;
+        toleranceAsciiValues.push_back((double) (::atof(av[2])));
+        baselineFilenamesAscii.push_back(av[3]);
+        testFilenamesAscii.push_back(av[4]);
+        av += 4;
+        ac -= 4;
+        }
+      else if (CheckOption(av[1], "--compare-n-ascii", ac, 3))
+        {
+        lFlagRegression = true;
+        double tol = (double) (::atof(av[2]));
+        // Number of comparisons to do
+        unsigned int nbComparisons = (unsigned int) (::atoi(av[3]));
+        baselineFilenamesAscii.reserve(baselineFilenamesAscii.size() + nbComparisons);
+        testFilenamesAscii.reserve(testFilenamesAscii.size() + nbComparisons);
+        // Retrieve all the file names
+        for (unsigned int i = 0; i < nbComparisons; ++i)
+          {
+          toleranceAsciiValues.push_back(tol);
+          baselineFilenamesAscii.push_back(av[4 + 2 * i]);
+          testFilenamesAscii.push_back(av[5 + 2 * i]);
+          }
+        av += 3 + 2 * nbComparisons;
+        ac -= 3 + 2 * nbComparisons;
+        }
+      else if (CheckOption(av[1], "--ignore-lines-with", ac, 2))
+        {
+        unsigned int nbIgnoredLines = (unsigned int) (::atoi(av[2]));
+        for (unsigned int i = 0; i < nbIgnoredLines; ++i)
+          {
+          ignoredLines.push_back(av[3 + i]);
+          }
+        av += 2 + nbIgnoredLines;
+        ac -= 2 + nbIgnoredLines;
+        }
+      /************************************************************************/
+      else if (CheckOption(av[1], "--compare-metadata", ac, 4))
+        {
+        lFlagRegression = true;
+        toleranceMetaValues.push_back((double) (::atof(av[2])));
+        baselineFilenamesMetaData.push_back(av[3]);
+        testFilenamesMetaData.push_back(av[4]);
+        av += 4;
+        ac -= 4;
+        }
+      else if (CheckOption(av[1], "--compare-ogr", ac, 4))
+        {
+        lFlagRegression = true;
+        toleranceOgrValues.push_back((double) (::atof(av[2])));
+        baselineFilenamesOgr.push_back(av[3]);
+        testFilenamesOgr.push_back(av[4]);
+        av += 4;
+        ac -= 4;
+        }
+      else if (CheckOption(av[1], "--tolerance-ratio", ac, 2))
+        {
+        lToleranceRatio = (double) (::atof(av[2]));
+        av += 2;
+        ac -= 2;
+        }
+      } // end while
 
-      }
-    else if (strcmp(av[1], "--compare-metadata") == 0)
-      {
-      lFlagRegression = true;
-      lToleranceDiffValue = (double) (::atof(av[2]));
-      baselineFilenamesMetaData.reserve(1);
-      testFilenamesMetaData.reserve(1);
-      baselineFilenamesMetaData.push_back(av[3]);
-      testFilenamesMetaData.push_back(av[4]);
-      av += 4;
-      ac -= 4;
-      }
-
-    else if (strcmp(av[1], "--compare-ogr") == 0)
+    // Check there is one argument left for the test
+    if (ac >= 2)
       {
-      lFlagRegression = true;
-      lToleranceDiffValue = (double) (::atof(av[2]));
-      baselineFilenamesOgr.reserve(1);
-      testFilenamesOgr.reserve(1);
-      baselineFilenamesOgr.push_back(av[3]);
-      testFilenamesOgr.push_back(av[4]);
-      av += 4;
-      ac -= 4;
+      testToRun = av[1];
       }
-    testToRun = av[1];
     }
 
   otb::ConfigurationManager::InitOpenMPThreads();
 
   std::map<std::string, MainFuncPointer>::iterator j = StringToTestFunctionMap.find(testToRun);
+  int result = EXIT_SUCCESS;
   // If the test doesn't exists
   if ( j == StringToTestFunctionMap.end() )
       {
         PrintAvailableTests();
-        std::cerr << "Failure: " << testToRun << ": no test identified " << testToRun << "\n";
-        return -1;
+        std::cerr << "Failure: no test identified for '" << testToRun << "'\n";
+        result = -1;
       }
   else
   {
     otb::Logger::Instance()->LogSetupInformation();
     MainFuncPointer f = j->second;
-    int             result;
     try
     {
       // Invoke the test's "main" function.
@@ -326,24 +339,29 @@ int main(int ac, char* av[])
       result = EXIT_FAILURE;
     }
 
+    bool checkBaseline = true;
     if (result != EXIT_SUCCESS)
     {
-      return -1;
+      checkBaseline = false;
+      result = -1;
     }
 
-
-    result = EXIT_SUCCESS;
 #ifdef OTB_USE_MPI
-    otb::MPIConfig::Pointer mpiConfig = otb::MPIConfig::Instance();
-    if (mpiConfig->GetMyRank() == 0)
-    {
+    if (otb::MPIConfig::Instance()->GetMyRank() != 0)
+      {
+      checkBaseline = false;
+      }
 #endif
+
+    if (checkBaseline)
+    {
     std::cout << " -> Test EXIT SUCCESS." << std::endl;
     if (lFlagRegression == false)
       {
       std::cout << "-------------  No control baseline tests    -------------" << std::endl;
-      return result;
       }
+    else
+    {
 
     try
       {
@@ -351,8 +369,7 @@ int main(int ac, char* av[])
       // Make a list of possible baselines
 
       testHelper->SetIgnoreLineOrder(lIgnoreOrder);
-      testHelper->SetToleranceDiffValue(lToleranceDiffValue); // What's the difference
-      testHelper->SetEpsilon(lEpsilon); // maybe we should consolidate...
+      testHelper->SetToleranceRatio(lToleranceRatio);
       if (epsilonBoundary != 0.0)
         {
         testHelper->SetEpsilonBoundaryChecking(epsilonBoundary);
@@ -361,21 +378,20 @@ int main(int ac, char* av[])
       // Non regression test for images
       if ((baselineFilenamesImage.size() > 0) && (testFilenamesImage.size() > 0))
         {
-        result += testHelper->RegressionTestAllImages(baselineFilenamesImage, testFilenamesImage);
+        result += testHelper->RegressionTestAllImages(baselineFilenamesImage, testFilenamesImage, toleranceDiffValues);
         }
       /***********************************************************************************/
       // Non-regression test for metadata.
       if ((baselineFilenamesMetaData.size() > 0) && (testFilenamesMetaData.size() > 0))
         {
-        result += testHelper->RegressionTestAllMetaData(baselineFilenamesMetaData, testFilenamesMetaData);
+        result += testHelper->RegressionTestAllMetaData(baselineFilenamesMetaData, testFilenamesMetaData, toleranceMetaValues);
         }
-
       /***********************************************************************************/
       // Non regression test for ascii files
       if ((baselineFilenamesAscii.size() > 0) && (testFilenamesAscii.size() > 0))
         {
         //result += testHelper->RegressionTestAllAscii(baselineFilenamesAscii, testFilenamesAscii, ignoredLines);
-        result += testHelper->RegressionTestAllDiff(baselineFilenamesAscii, testFilenamesAscii, ignoredLines);
+        result += testHelper->RegressionTestAllDiff(baselineFilenamesAscii, testFilenamesAscii, toleranceAsciiValues, ignoredLines);
         }
       /******************************************************************************/
       // Non regression test for binary files
@@ -387,42 +403,44 @@ int main(int ac, char* av[])
       // Non regression test for OGR files
       if ((baselineFilenamesOgr.size() > 0) && (testFilenamesOgr.size() > 0))
         {
-        result += testHelper->RegressionTestAllOgr(baselineFilenamesOgr, testFilenamesOgr);
+        result += testHelper->RegressionTestAllOgr(baselineFilenamesOgr, testFilenamesOgr, toleranceOgrValues);
         }
-
+      std::cout << "-------------  End control baseline tests    -------------" << std::endl;
       }
     catch (itk::ExceptionObject& e)
       {
       std::cerr << "otbTestMain 'control baseline test': ITK Exception thrown:" << std::endl;
       std::cerr << e.GetFile() << ":" << e.GetLine() << ":" << std::endl;
       std::cerr << e.GetDescription() << std::endl;
-      return -1;
+      result = -1;
       }
     catch (std::bad_alloc& err)
       {
       std::cerr << "otbTestMain 'control baseline test': Exception bad_alloc thrown: " << std::endl;
       std::cerr << (char*) err.what() << std::endl;
-      return -1;
+      result = -1;
       }
     catch (const std::exception& e)
       {
       std::cerr << "otbTestMain 'control baseline test': std::exception  thrown:" << std::endl;
       std::cerr << e.what() <<  std::endl;
-      return -1;
+      result = -1;
       }
     catch (...)
       {
       std::cerr << "otbTestMain 'control baseline test': Unknown exception thrown !" << std::endl;
-      return -1;
+      result = -1;
       }
-    std::cout << "-------------  End control baseline tests    -------------" << std::endl;
+
+    } // if there is a baseline control
+
+    } // if checkBaseline
+  } // if test function exists
 
 #ifdef OTB_USE_MPI
-      otb::MPIConfig::Instance()->terminate();
-    }
+  otb::MPIConfig::Instance()->terminate();
 #endif
-    return result;
-    }
+  return result;
 }
 
 #endif
diff --git a/Modules/IO/TestKernel/src/otbTestDriver.cxx b/Modules/IO/TestKernel/src/otbTestDriver.cxx
index 3cc8444bbef895fb40132d9a125899a8e2cc1fa3..930c1910b4ea1311fbb60faa47bbf0e29845e533 100644
--- a/Modules/IO/TestKernel/src/otbTestDriver.cxx
+++ b/Modules/IO/TestKernel/src/otbTestDriver.cxx
@@ -200,6 +200,7 @@ int Execute(int argc, char * argv[])
   itksysProcess_Execute(process);
   itksysProcess_WaitForExit(process, nullptr);
   int retCode = itksysProcess_GetExitValue(process);
+  itksysProcess_Delete(process);
   return retCode;
 }
 
diff --git a/Modules/IO/TestKernel/src/otbTestHelper.cxx b/Modules/IO/TestKernel/src/otbTestHelper.cxx
index 69079360ccebd6cad29b10118713af8e88d2daf4..af7f6aa58d4ef96437508649fc20db2c3cdc42d7 100644
--- a/Modules/IO/TestKernel/src/otbTestHelper.cxx
+++ b/Modules/IO/TestKernel/src/otbTestHelper.cxx
@@ -106,16 +106,19 @@ void TestHelper::CheckValueTolerance(const char *comment, double ref, double tes
 }
 
 int TestHelper::RegressionTestAllImages(const StringList& baselineFilenamesImage,
-                                        const StringList& testFilenamesImage)
+                                        const StringList& testFilenamesImage,
+                                        const EpsilonList& epsilons)
 {
   int result = 0;
   StringListIt itbaselineFilenames = baselineFilenamesImage.begin();
   StringListIt itTestFilenames = testFilenamesImage.begin();
+  EpsilonListIt itEpsilon = epsilons.begin();
   int                                cpt(1);
   // For each couple of baseline and test file, do the comparison
   for (; (itbaselineFilenames != baselineFilenamesImage.end())
-         && (itTestFilenames != testFilenamesImage.end());
-       ++itbaselineFilenames, ++itTestFilenames)
+         && (itTestFilenames != testFilenamesImage.end())
+         && (itEpsilon != epsilons.end());
+       ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon)
     {
     std::string baselineFilenameImage = (*itbaselineFilenames);
     std::string testFilenameImage = (*itTestFilenames);
@@ -131,7 +134,7 @@ int TestHelper::RegressionTestAllImages(const StringList& baselineFilenamesImage
       this->ReportErrorsOff();
       baseline->second = this->RegressionTestImage(cpt, testFilenameImage.c_str(),
                                                         (baseline->first).c_str(),
-                                                        m_ToleranceDiffValue);
+                                                        *itEpsilon);
 
       multiResult = baseline->second;
       ++baseline;
@@ -143,7 +146,7 @@ int TestHelper::RegressionTestAllImages(const StringList& baselineFilenamesImage
       baseline->second
         = this->RegressionTestImage(cpt, testFilenameImage.c_str(),
                                          (baseline->first).c_str(),
-                                         m_ToleranceDiffValue);
+                                         *itEpsilon);
       }
     ++cpt;
     result += multiResult;
@@ -152,16 +155,19 @@ int TestHelper::RegressionTestAllImages(const StringList& baselineFilenamesImage
 }
 
 int TestHelper::RegressionTestAllMetaData(const StringList& baselineFilenamesMetaData,
-                                          const StringList& testFilenamesMetaData)
+                                          const StringList& testFilenamesMetaData,
+                                          const EpsilonList& epsilons)
 {
   int result = 0;
   // Creates iterators on baseline filenames vector and test filenames vector
   StringListIt itbaselineFilenames = baselineFilenamesMetaData.begin();
   StringListIt itTestFilenames = testFilenamesMetaData.begin();
+  EpsilonListIt itEpsilon = epsilons.begin();
   // For each couple of baseline and test file, do the comparison
   for (; (itbaselineFilenames != baselineFilenamesMetaData.end())
-         && (itTestFilenames != testFilenamesMetaData.end());
-       ++itbaselineFilenames, ++itTestFilenames)
+         && (itTestFilenames != testFilenamesMetaData.end())
+         && (itEpsilon != epsilons.end());
+       ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon)
     {
     std::string baselineFilenameImage = (*itbaselineFilenames);
     std::string testFilenameImage = (*itTestFilenames);
@@ -177,7 +183,7 @@ int TestHelper::RegressionTestAllMetaData(const StringList& baselineFilenamesMet
       this->ReportErrorsOff();
       baseline->second = this->RegressionTestMetaData(testFilenameImage.c_str(),
                                                            (baseline->first).c_str(),
-                                                           m_ToleranceDiffValue);
+                                                           *itEpsilon);
 
       multiResult = baseline->second;
       ++baseline;
@@ -189,7 +195,7 @@ int TestHelper::RegressionTestAllMetaData(const StringList& baselineFilenamesMet
       baseline->second
         = this->RegressionTestMetaData(testFilenameImage.c_str(),
                                             (baseline->first).c_str(),
-                                            m_ToleranceDiffValue);
+                                            *itEpsilon);
       }
     result += multiResult;
     }
@@ -198,6 +204,7 @@ int TestHelper::RegressionTestAllMetaData(const StringList& baselineFilenamesMet
 
 int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii,
                                        const StringList& testFilenamesAscii,
+                                       const EpsilonList& epsilons,
                                        const StringList& ignoredLines)
 {
   int result = 0;
@@ -205,6 +212,7 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii,
   StringListIt itbaselineFilenames = baselineFilenamesAscii.begin();
   StringListIt itTestFilenames = testFilenamesAscii.begin();
   StringListIt itIgnoredLines = ignoredLines.begin();
+  EpsilonListIt itEpsilon = epsilons.begin();
 
   // Warning message
   if (ignoredLines.size() > 0)
@@ -219,8 +227,9 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii,
 
   // For each couple of baseline and test file, do the comparison
   for (; (itbaselineFilenames != baselineFilenamesAscii.end())
-         && (itTestFilenames != testFilenamesAscii.end());
-       ++itbaselineFilenames, ++itTestFilenames)
+         && (itTestFilenames != testFilenamesAscii.end())
+         && (itEpsilon != epsilons.end());
+       ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon)
     {
     std::string baselineFilenameAscii = (*itbaselineFilenames);
     std::string testFilenameAscii = (*itTestFilenames);
@@ -237,7 +246,7 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii,
       this->ReportErrorsOff();
       baseline->second = this->RegressionTestAsciiFile(testFilenameAscii.c_str(),
                                                             (baseline->first).c_str(),
-                                                            m_Epsilon,
+                                                            *itEpsilon,
                                                             ignoredLines);
 
       multiResult = baseline->second;
@@ -250,7 +259,7 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii,
       baseline->second
         = this->RegressionTestAsciiFile(testFilenameAscii.c_str(),
                                              (baseline->first).c_str(),
-                                             m_Epsilon,
+                                             *itEpsilon,
                                              ignoredLines);
       }
     result += multiResult;
@@ -261,6 +270,7 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii,
 
 int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii,
                                        const StringList& testFilenamesAscii,
+                                       const EpsilonList& epsilons,
                                        const StringList& ignoredLines)
 {
   int result = 0;
@@ -268,6 +278,7 @@ int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii,
   StringListIt itbaselineFilenames = baselineFilenamesAscii.begin();
   StringListIt itTestFilenames = testFilenamesAscii.begin();
   StringListIt itIgnoredLines = ignoredLines.begin();
+  EpsilonListIt itEpsilon = epsilons.begin();
 
   // Warning message
   if (ignoredLines.size() > 0)
@@ -282,8 +293,9 @@ int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii,
 
   // For each couple of baseline and test file, do the comparison
   for (; (itbaselineFilenames != baselineFilenamesAscii.end())
-         && (itTestFilenames != testFilenamesAscii.end());
-       ++itbaselineFilenames, ++itTestFilenames)
+         && (itTestFilenames != testFilenamesAscii.end())
+         && (itEpsilon != epsilons.end());
+       ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon)
     {
     std::string baselineFilenameAscii = (*itbaselineFilenames);
     std::string testFilenameAscii = (*itTestFilenames);
@@ -300,7 +312,7 @@ int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii,
       this->ReportErrorsOff();
       baseline->second = this->RegressionTestDiffFile(testFilenameAscii.c_str(),
                                                             (baseline->first).c_str(),
-                                                            m_Epsilon,
+                                                            *itEpsilon,
                                                             ignoredLines);
 
       multiResult = baseline->second;
@@ -313,7 +325,7 @@ int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii,
       baseline->second
         = this->RegressionTestDiffFile(testFilenameAscii.c_str(),
                                              (baseline->first).c_str(),
-                                             m_Epsilon,
+                                             *itEpsilon,
                                              ignoredLines);
       }
     result += multiResult;
@@ -369,16 +381,19 @@ int TestHelper::RegressionTestAllBinary(const StringList& baselineFilenamesBinar
 }
 
 int TestHelper::RegressionTestAllOgr(const StringList& baselineFilenamesOgr,
-                                     const StringList& testFilenamesOgr)
+                                     const StringList& testFilenamesOgr,
+                                     const EpsilonList& epsilons)
 {
   int result = 0;
   // Creates iterators on baseline filenames vector and test filenames vector
   StringListIt itbaselineFilenames = baselineFilenamesOgr.begin();
   StringListIt itTestFilenames = testFilenamesOgr.begin();
+  EpsilonListIt itEpsilon = epsilons.begin();
   // For each couple of baseline and test file, do the comparison
   for (; (itbaselineFilenames != baselineFilenamesOgr.end())
-         && (itTestFilenames != testFilenamesOgr.end());
-       ++itbaselineFilenames, ++itTestFilenames)
+         && (itTestFilenames != testFilenamesOgr.end())
+         && (itEpsilon != epsilons.end());
+       ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon)
     {
     std::string baselineFilenameOgr = (*itbaselineFilenames);
     std::string testFilenameOgr = (*itTestFilenames);
@@ -394,8 +409,8 @@ int TestHelper::RegressionTestAllOgr(const StringList& baselineFilenamesOgr,
       std::cout << "Testing non-regression on OGR file: " << (baseline->first) << std::endl;
       this->ReportErrorsOff();
       baseline->second = this->RegressionTestOgrFile(testFilenameOgr.c_str(),
-                                                          (baseline->first).c_str(),
-                                                          m_ToleranceDiffValue);
+                                                    (baseline->first).c_str(),
+                                                    *itEpsilon);
 
       multiResult = baseline->second;
       ++baseline;
@@ -407,7 +422,7 @@ int TestHelper::RegressionTestAllOgr(const StringList& baselineFilenamesOgr,
       baseline->second
         = this->RegressionTestOgrFile(testFilenameOgr.c_str(),
                                            (baseline->first).c_str(),
-                                           m_ToleranceDiffValue);
+                                           *itEpsilon);
       }
     result += multiResult;
     }
@@ -1326,6 +1341,12 @@ int TestHelper::RegressionTestImage(int cpt, const char *testImageFilename, cons
 
   ImageType::PixelType status = diff->GetTotalDifference();
   unsigned long        numberOfPixelsWithDifferences = diff->GetNumberOfPixelsWithDifferences();
+  int ret = 0;
+  if ((status.GetSquaredNorm() > 0) &&
+      ((double) numberOfPixelsWithDifferences > m_ToleranceRatio*baselineSize[0]*baselineSize[1]))
+    {
+    ret = 1;
+    }
 
   //Write only one this message
   if (m_ReportErrors == 0)
@@ -1335,7 +1356,7 @@ int TestHelper::RegressionTestImage(int cpt, const char *testImageFilename, cons
                             << status << " for " << numberOfPixelsWithDifferences << " pixel(s).");
     }
   // if there are discrepencies, create an diff image
-  if (status.GetSquaredNorm() > 0 && m_ReportErrors)
+  if (ret && m_ReportErrors)
     {
     typedef otb::PrintableImageFilter<ImageType>               RescaleType;
     typedef otb::ImageFileWriter<RescaleType::OutputImageType> WriterType;
@@ -1479,7 +1500,7 @@ int TestHelper::RegressionTestImage(int cpt, const char *testImageFilename, cons
       std::cout << "</DartMeasurement>" << std::endl;
       }
     }
-  return (status.GetSquaredNorm() > 0) ? 1 : 0;
+  return ret;
 }
 
 int TestHelper::RegressionTestMetaData(const char *testImageFilename, const char *baselineImageFilename,
@@ -2643,8 +2664,7 @@ void TestHelper::ogrReportOnLayer(OGRLayer * ref_poLayer,
 }
 
 TestHelper::TestHelper() :
-    m_ToleranceDiffValue(0),
-    m_Epsilon(0),
+    m_ToleranceRatio(0),
     m_EpsilonBoundaryChecking(1.0e-30),
     m_ReportErrors(false),
     m_IgnoreLineOrder(false),
diff --git a/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.h b/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.h
deleted file mode 100644
index 224f16af2c1b9b5f91200dd65209a03e4b231501..0000000000000000000000000000000000000000
--- a/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbStandardDSCostFunction_h
-#define otbStandardDSCostFunction_h
-
-#include "itkSingleValuedCostFunction.h"
-
-#include "otbVectorDataToDSValidatedVectorDataFilter.h"
-#include <string>
-
-namespace otb
-{
-/** \class StandardDSCostFunction
-  * \brief Standard Cost Function used to estimate the fuzzy model parameters
-  * in the Dempster-Shafer framework
-  *
-  * This class has been developed to estimate, with the help of the Amoeba
-  * optimizer, the fuzzy model parameters to be used in the class
-  * otb::VectorDataToDSValidatedVectorDataFilter. The cost value compute the
-  * cost according to:
-  * - an enriched ground truth vector data (using VectorDataToRoadDescription)
-  * - an enriched negative sample VectorData or at least random samples
-  * - an hypothesis (the same as the considered DSValidationFilter)
-  *      (by default (NONDVI, ROADSA, NOBUIL))
-  * - a weight between 0 and 1 (0.5 by default) corresponding to the situation
-  *      policy regarding under detection/false detection (1 no under detection
-  *      0 no false detection)
-  * For now the cost function use the NONDVI Feature, ROADSA Feature and and
-  * the NOBUIL Feature.
-  * For each evolution of the VectorDataToDSValidatedVectorDataFilter,
-  * this cost function must be adapted.
-  *
-  * \ingroup CostFunction
-  * \sa VectorDataToDSValidatedVectorDataFilter
-  * \sa AmoebaOptimizer
- *
- * \ingroup OTBDempsterShafer
- */
-
-template <class TDSValidationFilter>
-class ITK_EXPORT StandardDSCostFunction :
-public itk::SingleValuedCostFunction
-{
-public:
-  /** Standard class typedefs. */
-  typedef StandardDSCostFunction                       Self;
-  typedef itk::SingleValuedCostFunction                Superclass;
-  typedef itk::SmartPointer<Self>                      Pointer;
-  typedef itk::SmartPointer<const Self>                ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(StandardDSCostFunction, itk::SingleValuedCostFunction);
-
-  typedef Superclass::MeasureType                      MeasureType;   //double
-  typedef Superclass::DerivativeType                   DerivativeType; //Array<double>
-  typedef Superclass::ParametersType                   ParametersType; //Array<double>
-
-  typedef TDSValidationFilter                          DSValidationFilterType;
-  typedef typename DSValidationFilterType::VectorDataType
-                                                       VectorDataType;
-  typedef typename DSValidationFilterType::TreeIteratorType
-                                                       TreeIteratorType;
-  typedef typename DSValidationFilterType::LabelSetType
-                                                       LabelSetType;
-
-  typedef FuzzyDescriptorsModelManager                 FuzzyDescriptorsModelManagerType;
-
-  typedef FuzzyDescriptorsModelManager::DescriptorListType
-                                                       DescriptorListType;
-  typedef FuzzyDescriptorsModelManager::DescriptorsModelType
-                                                       DescriptorsModelType;
-  typedef FuzzyDescriptorsModelManager::PairType       PairType;
-
-  typedef Parser                                       ParserType;
-
-  /** This method returns the value of the cost function corresponding
-    * to the specified parameters.    */
-  MeasureType GetValue( const ParametersType & parameters ) const override;
-
-  /** This method returns the derivative of the cost function corresponding
-    * to the specified parameters.   */
-  void GetDerivative( const ParametersType & parameters,
-                               DerivativeType & derivative ) const override;
-
-  unsigned int GetNumberOfParameters(void) const override;
-
-  itkSetMacro(Weight, double);
-  itkGetConstMacro(Weight, double);
-
-  itkSetMacro(CriterionFormula, std::string);
-  itkGetConstMacro(CriterionFormula, std::string);
-
-  void SetDescriptorList(DescriptorListType list)
-  {
-    m_DescriptorList = list;
-  }
-
-  DescriptorListType GetDescriptorList()
-  {
-    return m_DescriptorList;
-  }
-
-  itkSetObjectMacro(GTVectorData, VectorDataType);
-  itkGetConstObjectMacro(GTVectorData, VectorDataType);
-
-  itkSetObjectMacro(NSVectorData, VectorDataType);
-  itkGetConstObjectMacro(NSVectorData, VectorDataType);
-
-
-  LabelSetType GetBeliefHypothesis()
-  {
-    return m_BeliefHypothesis;
-  }
-
-  void SetBeliefHypothesis(LabelSetType hypothesis)
-  {
-    m_BeliefHypothesis = hypothesis;
-  }
-
-  LabelSetType GetPlausibilityHypothesis()
-  {
-    return m_PlausibilityHypothesis;
-  }
-
-  void SetPlausibilityHypothesis(LabelSetType hypothesis)
-  {
-    m_PlausibilityHypothesis = hypothesis;
-  }
-
-protected:
-  /** Constructor */
-  StandardDSCostFunction();
-  /** Destructor */
-  ~StandardDSCostFunction() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  StandardDSCostFunction(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-
-  typename VectorDataType::Pointer            m_GTVectorData; //Ground Truth
-  typename VectorDataType::Pointer            m_NSVectorData; //Negative Samples
-
-  typename ParserType::Pointer       m_Parser;
-  std::string                        m_CriterionFormula;
-
-  double                             m_Weight; //range ]0; 1[
-
-  LabelSetType                       m_BeliefHypothesis;
-  LabelSetType                       m_PlausibilityHypothesis;
-
-  DescriptorListType                 m_DescriptorList;
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbStandardDSCostFunction.hxx"
-#endif
-
-#endif
diff --git a/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.hxx b/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.hxx
deleted file mode 100644
index 236c1e5e9ae83b087987a43347be174f80a4d5ac..0000000000000000000000000000000000000000
--- a/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.hxx
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbStandardDSCostFunction_hxx
-#define otbStandardDSCostFunction_hxx
-
-#include "otbStandardDSCostFunction.h"
-
-namespace otb
-{
-// Constructor
-template <class TDSValidationFilter>
-StandardDSCostFunction<TDSValidationFilter>
-::StandardDSCostFunction() :
-  m_CriterionFormula("((Belief + Plausibility)/2.)"),
-  m_Weight(0.5)
-{
- m_GTVectorData = VectorDataType::New();
- m_NSVectorData = VectorDataType::New();
- m_Parser =  ParserType::New();
-}
-
-template <class TDSValidationFilter>
-unsigned int
-StandardDSCostFunction<TDSValidationFilter>
-::GetNumberOfParameters() const
- {
-  return m_DescriptorList.size()*4;
- }
-
-template <class TDSValidationFilter>
-typename StandardDSCostFunction<TDSValidationFilter>
-::MeasureType
- StandardDSCostFunction<TDSValidationFilter>
-::GetValue(const ParametersType & parameters) const
- {
-  if (parameters.size() != m_DescriptorList.size()*4)
-    {
-    itkExceptionMacro(<< "Wrong model!" )
-    }
-
-  //Initialize parser
-  m_Parser->SetExpr(m_CriterionFormula);
-
-  DescriptorsModelType descModel;
-  for (unsigned int i = 0; i < m_DescriptorList.size(); ++i)
-    {
-    std::vector<double> tmp;
-    for (unsigned int j = 0; j < 4; ++j)
-      {
-      tmp.push_back(parameters[4*i+j]);
-      }
-    PairType pair( m_DescriptorList[i], tmp);
-    descModel.push_back(pair);
-    }
-
-  typename DSValidationFilterType::Pointer internalFunctionGT = DSValidationFilterType::New();
-  internalFunctionGT->SetCriterionFormula("1");
-  internalFunctionGT->SetInput(m_GTVectorData);
-  internalFunctionGT->SetBeliefHypothesis(m_BeliefHypothesis);
-  internalFunctionGT->SetPlausibilityHypothesis(m_PlausibilityHypothesis);
-  try
-    {
-    internalFunctionGT->SetDescriptorModels(descModel);
-    }
-  catch ( itk::ExceptionObject & )
-    {
-    return 1;
-    }
-  internalFunctionGT->Update();
-
-  typename DSValidationFilterType::Pointer internalFunctionNS = DSValidationFilterType::New();
-  internalFunctionNS->SetCriterionFormula("1");
-  internalFunctionNS->SetInput(m_NSVectorData);
-  internalFunctionNS->SetBeliefHypothesis(m_BeliefHypothesis);
-  internalFunctionNS->SetBeliefHypothesis(m_PlausibilityHypothesis);
-  try
-    {
-    internalFunctionNS->SetDescriptorModels(descModel);
-    }
-  catch (itk::ExceptionObject &)
-    {
-    return 1;
-    }
-  internalFunctionNS->Update();
-
-  double accGT = 0.0;
-  double accNS = 0.0;
-  double nGT = 0.0;
-  double nNS = 0.0;
-
-  TreeIteratorType itVectorGT(internalFunctionGT->GetOutput()->GetDataTree());
-  itVectorGT.GoToBegin();
-  while (!itVectorGT.IsAtEnd())
-    {
-    if (!itVectorGT.Get()->IsRoot() && !itVectorGT.Get()->IsDocument() && !itVectorGT.Get()->IsFolder())
-      {
-      double belief = itVectorGT.Get()->GetFieldAsDouble("Belief");
-      double plausibility = itVectorGT.Get()->GetFieldAsDouble("Plausi");
-
-      m_Parser->DefineVar("Belief", &belief);
-      m_Parser->DefineVar("Plausibility", &plausibility);
-
-      accGT += ((1 - m_Parser->Eval()) * (1 - m_Parser->Eval()));
-      nGT += 1.0;
-
-      m_Parser->ClearVar();
-      }
-    itVectorGT++;
-    }
-
-  TreeIteratorType itVectorNS(internalFunctionNS->GetOutput()->GetDataTree());
-  itVectorNS.GoToBegin();
-  while (!itVectorNS.IsAtEnd())
-    {
-    if (!itVectorNS.Get()->IsRoot() && !itVectorNS.Get()->IsDocument() && !itVectorNS.Get()->IsFolder())
-      {
-      double belief = itVectorNS.Get()->GetFieldAsDouble("Belief");
-      double plausibility = itVectorNS.Get()->GetFieldAsDouble("Plausi");
-
-      m_Parser->DefineVar("Belief", &belief);
-      m_Parser->DefineVar("Plausibility", &plausibility);
-
-      accNS += (m_Parser->Eval() * m_Parser->Eval());
-      nNS += 1.0;
-
-      m_Parser->ClearVar();
-      }
-    itVectorNS++;
-    }
-  return (m_Weight * accGT / nGT + (1 - m_Weight) * accNS / nNS);
-}
-
-template <class TDSValidationFilter>
-void
-StandardDSCostFunction<TDSValidationFilter>
-::GetDerivative(const ParametersType & itkNotUsed(parameters), DerivativeType & itkNotUsed(derivative)) const
- {
-  //Not necessary for Amoeba Optimizer
-  itkExceptionMacro(<< "Not Supposed to be used when using Amoeba Optimizer!")
- }
-
-// PrintSelf Method
-template <class TDSValidationFilter>
-void
-StandardDSCostFunction<TDSValidationFilter>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-
-}// end namespace otb
-
-#endif
diff --git a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h b/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h
deleted file mode 100644
index 43a3b9a6f953f658e9217d9a39f6d23a1482acc2..0000000000000000000000000000000000000000
--- a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbVectorDataToDSValidatedVectorDataFilter_h
-#define otbVectorDataToDSValidatedVectorDataFilter_h
-
-#include "otbMassOfBelief.h"
-
-#include "otbVectorDataToVectorDataFilter.h"
-
-#include "itkPreOrderTreeIterator.h"
-#include "otbVectorData.h"
-#include "otbFuzzyDescriptorsModelManager.h"
-
-#include "otbFuzzyVariable.h"
-#include "otbJointMassOfBeliefFilter.h"
-#include "otbParser.h"
-#include <string>
-
-namespace otb
-{
-/** \class VectorDataToDSValidatedVectorDataFilter
-  * \brief VectorData filter validating data nodes using
-  * Dempster-Shafer theory.
-  *
-  * This filter takes as input a vector data containing
-  * features score and validate (or not) each data node
-  * according to these features score, a fuzzy model corresponding
-  * to each feature and a criterion according to the Dempster-Shafer
-  * theory. By default the filter is (for now) parametrized to process
-  * VectorDatas providing by the VectorDataToRoadDescriptionFilter.
-  * The hypothesis must be set using the SetHypothesis method.
-  * The convention is for each feature Fe, a mass of Belief is defined
-  * with two variables named Fe and Fe_. Thus, an hypothesis must declared:
-  * VectorDataToVectorDataFilter::LabelSetType hyp;
-  * hyp.insert("Fe(i)");
-  * hyp.insert("Fe(j)_");
-  * hyp.insert("Fe(k)_");
-  *
-  * Fe(i), Fe(j) and Fe(k) being descriptors.
-  *
-  * The criterion can be set through SetCriterionFormula() as a
-  * string referring to "Belief" and "Plausibility" from the
-  * Dempster-Shafer theory. By default the criterion is:
-  * "((Belief + Plausibility)/2) >= 0.5"
-  *
-  * The considered features will be the intersection between
-  * the features embedded in this filter and the features embedded
-  * in the input vector data. For now, the filter uses "NONDVI" and
-  * "ROADSA" features.
-  *
-  *
-  * \ingroup VectorDataFilter
-  * \sa VectorDataToRoadDescriptionFilter
-  * \sa VectorDataToBuildingDescriptionFilter
- *
- * \ingroup OTBDempsterShafer
- */
-
-template <class TVectorData, class TPrecision=float>
-class ITK_EXPORT VectorDataToDSValidatedVectorDataFilter :
-public otb::VectorDataToVectorDataFilter<TVectorData, TVectorData>
-{
-public:
-  /** Standard class typedefs. */
-  typedef VectorDataToDSValidatedVectorDataFilter      Self;
-  typedef VectorDataToVectorDataFilter<TVectorData,
-    TVectorData>                                       Superclass;
-  typedef itk::SmartPointer<Self>                      Pointer;
-  typedef itk::SmartPointer<const Self>                ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(VectorDataToDSValidatedVectorDataFilter, VectorDataToVectorDataFilter);
-
-  /** Some typedefs. */
-  typedef TVectorData                               VectorDataType;
-  typedef typename VectorDataType::Pointer          VectorDataPointer;
-  typedef typename VectorDataType::DataNodeType     DataNodeType;
-  typedef itk::PreOrderTreeIterator<typename VectorDataType::DataTreeType>
-                                                    TreeIteratorType;
-
-  typedef TPrecision                                PrecisionType;
-  typedef MassOfBelief<std::string, PrecisionType>
-                                                    MassOfBeliefFunctionType;
-  typedef typename MassOfBeliefFunctionType::LabelSetType
-                                                    LabelSetType;
-  typedef JointMassOfBeliefFilter<MassOfBeliefFunctionType>
-                                                    JointMassOfBeliefFilterType;
-  typedef Parser                                    ParserType;
-
-  typedef itk::DataObject::Pointer DataObjectPointer;
-  typedef itk::DataObject          DataObject;
-
-
-  typedef FuzzyVariable<std::string, PrecisionType>           FuzzyVarType;
-
-  typedef FuzzyDescriptorsModelManager::PairType              PairType;
-  typedef FuzzyDescriptorsModelManager::DescriptorsModelType  DescriptorModelsType;
-
-  /** Descriptor model accessors. */
-  virtual void AddDescriptor(const std::string& key, std::vector<double> model);
-  virtual void ClearDescriptors();
-
-  void SetDescriptorModels( DescriptorModelsType model );
-  DescriptorModelsType GetDescriptorModels()
-  {
-    return m_DescriptorModels;
-  }
-
-  /** Parameter accessors. */
-  itkGetConstMacro(CriterionFormula, std::string);
-  itkSetMacro(CriterionFormula, std::string);
-
-  itkGetMacro(CriterionThreshold, double);
-  itkSetMacro(CriterionThreshold, double);
-
-  LabelSetType GetBeliefHypothesis()
-  {
-    return m_BeliefHypothesis;
-  }
-
-  void SetBeliefHypothesis(LabelSetType hypothesis)
-  {
-    m_BeliefHypothesis = hypothesis;
-  }
-
-  LabelSetType GetPlausibilityHypothesis()
-  {
-    return m_PlausibilityHypothesis;
-  }
-
-  void SetPlausibilityHypothesis(LabelSetType hypothesis)
-  {
-    m_PlausibilityHypothesis = hypothesis;
-  }
-
-  unsigned int GetNumberOfParameters()
-  {
-    return (m_DescriptorModels.size() * 4);
-  }
-
-
-protected:
-  /** Triggers the Computation */
-  void GenerateData(void) override;
-  /** Constructor */
-  VectorDataToDSValidatedVectorDataFilter();
-  /** Destructor */
-  ~VectorDataToDSValidatedVectorDataFilter() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-  std::string GetNextID()
-    {
-      std::ostringstream oss;
-      oss << m_CurrentID++;
-      return oss.str();
-    }
-
-private:
-  VectorDataToDSValidatedVectorDataFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  // Descriptor bench
-  DescriptorModelsType                            m_DescriptorModels;
-  std::vector< typename FuzzyVarType::Pointer >   m_FuzzyVars;
-  LabelSetType                                    m_Universe,
-                                                  m_BeliefHypothesis,
-                                                  m_PlausibilityHypothesis;
-  double                                          m_Bel, m_Plau;
-  typename ParserType::Pointer                    m_Parser;
-
-  std::string                                     m_CriterionFormula;
-  double                                          m_CriterionThreshold;
-  unsigned int                                    m_CurrentID;
-};
-
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbVectorDataToDSValidatedVectorDataFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.hxx b/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.hxx
deleted file mode 100644
index 8e07927bb6fd9106cce86ea182c59e9da92d690c..0000000000000000000000000000000000000000
--- a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.hxx
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbVectorDataToDSValidatedVectorDataFilter_hxx
-#define otbVectorDataToDSValidatedVectorDataFilter_hxx
-
-#include "otbVectorDataToDSValidatedVectorDataFilter.h"
-#include <iostream>
-
-namespace otb
-{
-
-// Constructor
-template <class TVectorData, class TPrecision>
-  VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision>
-::VectorDataToDSValidatedVectorDataFilter() :
-  m_Bel(0.0),
-  m_Plau(0.0),
-  m_CriterionFormula("((Belief + Plausibility)/2.)"),
-  m_CriterionThreshold(0.5),
-  m_CurrentID(0)
-{
-  this->SetNumberOfRequiredInputs(1);
-
-  m_Parser =  ParserType::New();
-}
-
-
-template <class TVectorData, class TPrecision>
-void
-VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision>
-::AddDescriptor(const std::string& key, std::vector<double>  model)
-{
-  bool alreadyExist = false;
-
-  if (model.size() != 4)
-    {
-     itkExceptionMacro(<< "Wrong model! Size(=" << model.size() << ") > 4" )
-    }
-  else if (model[0]<0 || model[1]<model[0] || model[2]<model[1] || model[2]>1)
-    {
-     itkExceptionMacro(<< "Wrong model! Values have to be 0<=v1<=v2<=v3<=1" )
-    }
-  else if (model[3]<.75 || model[3]>1.0)
-    {
-      itkExceptionMacro(<< "Wrong model! Values have to be 0.75<=v4<=1" )
-    }
-  else
-    {
-    for (unsigned int i=0; i<m_DescriptorModels.size(); ++i)
-      {
-      if (m_DescriptorModels[i].first.compare(key) == 0)
-        {
-        for (unsigned int j=0; j<4; ++j)
-          {
-           m_DescriptorModels[i].second.at(j) = model[j];
-          }
-        alreadyExist = true;
-        }
-      }
-    if (!alreadyExist)
-      {
-      m_DescriptorModels.push_back(std::pair<std::string, std::vector<double> >(key, model));
-      }
-    }
-
-  this->Modified();
-}
-
-
-template <class TVectorData, class TPrecision>
-void
-VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision>
-::ClearDescriptors()
-{
-  m_DescriptorModels.clear();
-}
-
-template <class TVectorData, class TPrecision>
-void
-VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision>
-::SetDescriptorModels(DescriptorModelsType model)
-{
-  for (unsigned int i=0; i<model.size(); ++i)
-    {
-     this->AddDescriptor(model[i].first, model[i].second);
-    }
-}
-
-
-template <class TVectorData, class TPrecision>
-void
-VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision>
-::GenerateData()
-{
-  //Initialize Dempster Shafer tools
-  if( m_DescriptorModels.size() == 0 )
-    {
-    itkExceptionMacro(<< "No defined Descriptor. Please add a descriptor model.");
-    }
-
-  for (unsigned int i=0; i<m_DescriptorModels.size(); ++i)
-    {
-    typename FuzzyVarType::Pointer fuz = FuzzyVarType::New();
-    std::string fuzName, fuzName_;
-    fuzName  = m_DescriptorModels[i].first;
-    fuzName_ = m_DescriptorModels[i].first + "_";
-
-    fuz->SetMembership(fuzName,
-                       0.0,
-                       0.0,
-                       m_DescriptorModels[i].second[0],
-                       m_DescriptorModels[i].second[1],
-                       0.0,
-                       m_DescriptorModels[i].second[3]);
-    fuz->SetMembership(fuzName_,
-                       m_DescriptorModels[i].second[1],
-                       m_DescriptorModels[i].second[2],
-                       1.0,
-                       1.0,
-                       0.0,
-                       m_DescriptorModels[i].second[3]);
-
-    m_FuzzyVars.push_back(fuz);
-
-    m_Universe.insert(fuzName);
-    m_Universe.insert(fuzName_);
-    }
-
-  //Initialize parser
-  m_Parser->SetExpr(m_CriterionFormula);
-  m_Parser->DefineVar("Belief", &m_Bel);
-  m_Parser->DefineVar("Plausibility", &m_Plau);
-
-  // Output
-  this->GetOutput(0)->SetMetaDataDictionary(this->GetInput()->GetMetaDataDictionary());
-  // Retrieving root node
-  typename DataNodeType::Pointer root = this->GetOutput(0)->GetDataTree()->GetRoot()->Get();
-  // Create the document node
-  typename DataNodeType::Pointer document = DataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  // Adding the layer to the data tree
-  this->GetOutput(0)->GetDataTree()->Add(document, root);
-  // Create the folder node
-  typename DataNodeType::Pointer folder = DataNodeType::New();
-  folder->SetNodeType(otb::FOLDER);
-  // Adding the layer to the data tree
-  this->GetOutput(0)->GetDataTree()->Add(folder, document);
-  this->GetOutput(0)->SetProjectionRef(this->GetInput()->GetProjectionRef());
-
-  TreeIteratorType itVector(this->GetInput()->GetDataTree());
-  itVector.GoToBegin();
-  while (!itVector.IsAtEnd())
-    {
-    if (!itVector.Get()->IsRoot() && !itVector.Get()->IsDocument() && !itVector.Get()->IsFolder())
-      {
-      typename DataNodeType::Pointer currentGeometry = itVector.Get();
-      typename JointMassOfBeliefFilterType::Pointer jointMassFilter = JointMassOfBeliefFilterType::New();
-
-      for (unsigned int i=0; i<m_DescriptorModels.size(); ++i)
-        {
-        if (currentGeometry->HasField(m_DescriptorModels[i].first))
-          {
-          LabelSetType H, H_;
-          std::string fuzName, fuzName_;
-          fuzName  = m_DescriptorModels[i].first;
-          fuzName_ = m_DescriptorModels[i].first + "_";
-
-          typename MassOfBeliefFunctionType::Pointer mass = MassOfBeliefFunctionType::New();
-          mass->InitializePowerSetMasses(m_Universe);
-
-          H.insert(fuzName);
-          H_.insert(fuzName_);
-
-          mass->SetMass(H, m_FuzzyVars[i]->GetMembership(fuzName, currentGeometry->GetFieldAsDouble(fuzName)));
-          mass->SetMass(H_, m_FuzzyVars[i]->GetMembership(fuzName_, currentGeometry->GetFieldAsDouble(fuzName)));
-
-          mass->EstimateUncertainty();
-
-          jointMassFilter->PushBackInput(mass);
-          }
-        }
-      jointMassFilter->Update();
-      m_Bel  = jointMassFilter->GetOutput()->GetBelief(m_BeliefHypothesis);
-      m_Plau = jointMassFilter->GetOutput()->GetPlausibility(m_PlausibilityHypothesis);
-
-     if (m_Parser->Eval() >= m_CriterionThreshold)
-        {
-        currentGeometry->SetNodeId(this->GetNextID());
-        currentGeometry->SetFieldAsDouble("Belief", m_Bel);
-        currentGeometry->SetFieldAsDouble("Plausi", m_Plau);
-        this->GetOutput(0)->GetDataTree()->Add(currentGeometry, folder);
-        }
-      }
-    ++itVector;
-    }
-}
-
-
-// PrintSelf Method
-template <class TVectorData, class TPrecision>
-void
-VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Learning/DempsterShafer/test/CMakeLists.txt b/Modules/Learning/DempsterShafer/test/CMakeLists.txt
index d999a90fa0638dc4c981451209009bb73d925a46..9ebe35857fe75dfddf2560633365b8cfe8145a65 100644
--- a/Modules/Learning/DempsterShafer/test/CMakeLists.txt
+++ b/Modules/Learning/DempsterShafer/test/CMakeLists.txt
@@ -24,7 +24,6 @@ set(OTBDempsterShaferTests
 otbDempsterShaferTestDriver.cxx
 otbMassOfBeliefDSApplied.cxx
 otbConfusionMatrixToMassOfBeliefTest.cxx
-otbVectorDataToDSValidatedVectorDataFilter.cxx
 otbDempsterShaferFusionTests.cxx
 otbDSFusionOfClassifiersImageFilterTest.cxx
 otbJointMassOfBeliefFilter.cxx
@@ -85,16 +84,6 @@ otb_add_test(NAME fzTvConfusionMatrixToMassOfBeliefTestRecall COMMAND otbDempste
   otbConfusionMatrixToMassOfBeliefTest
   RECALL)
 
-otb_add_test(NAME fzTvVectorDataToDSValidatedVectorDataFilter COMMAND otbDempsterShaferTestDriver
-  --compare-ogr ${EPSILON_9}
-  ${BASELINE_FILES}/fzTvDSValidatedRoadVectorDataOutput.shp
-  ${TEMP}/fzTvDSValidatedRoadVectorDataOutput.shp
-  otbVectorDataToDSValidatedVectorDataFilter
-  ${TEMP}/fzTvVectorDataToRoadDescriptionFilterOutput.shp
-  ${TEMP}/fzTvDSValidatedRoadVectorDataOutput.shp
-  )
-set_property(TEST fzTvVectorDataToDSValidatedVectorDataFilter PROPERTY DEPENDS fzTvVectorDataToRoadDescriptionFilter)
-
 otb_add_test(NAME fzDSFusionTestConfMatFileVCMTestPrecision COMMAND otbDempsterShaferTestDriver
   otbDempsterShaferFusionConfMatFileTest
   ${INPUTDATA}/Classification/QB_1_ortho_C1_V.csv
diff --git a/Modules/Learning/DempsterShafer/test/otbConfusionMatrixToMassOfBeliefTest.cxx b/Modules/Learning/DempsterShafer/test/otbConfusionMatrixToMassOfBeliefTest.cxx
index 16b6aba2c91b5e00ed7ecef33418d17bf549322e..e13f12d3dcb5c5b21eaa3a37d0a3ea255413ac2c 100644
--- a/Modules/Learning/DempsterShafer/test/otbConfusionMatrixToMassOfBeliefTest.cxx
+++ b/Modules/Learning/DempsterShafer/test/otbConfusionMatrixToMassOfBeliefTest.cxx
@@ -18,7 +18,7 @@
  * limitations under the License.
  */
 
-#include "itkMacro.h"
+#include "otbMacro.h"
 #include <iostream>
 
 #include "otbConfusionMatrixToMassOfBelief.h"
diff --git a/Modules/Learning/DempsterShafer/test/otbDempsterShaferFusionTests.cxx b/Modules/Learning/DempsterShafer/test/otbDempsterShaferFusionTests.cxx
index de6790003dd25767c5623f4e5dfb075ca9213b74..2c27a36d124845e896cd27b8b7ab4ca0256ab9ff 100644
--- a/Modules/Learning/DempsterShafer/test/otbDempsterShaferFusionTests.cxx
+++ b/Modules/Learning/DempsterShafer/test/otbDempsterShaferFusionTests.cxx
@@ -22,6 +22,7 @@
 #include "otbMassOfBelief.h"
 #include "otbJointMassOfBeliefFilter.h"
 #include "otbConfusionMatrixToMassOfBelief.h"
+#include "otbMacro.h"
 #include <fstream>
 
 
@@ -337,11 +338,12 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[]
     // Vector containing the Mass of Belief of the universe for each classifier
     vectorUniverseMOBs.push_back(mobUniverseClk);
 
-    std::cout << "confusion matrix[Cl_" << itClk << "] = " << std::endl;
+    otbLogMacro(Debug, << "confusion matrix[Cl_" << itClk << "] = ");
+    std::ostringstream oss;
     for (unsigned int itLabel = 0; itLabel < nbClassesClk; ++itLabel)
       {
       IntLabelPixelType classLabel = mapOfIndicesClk[itLabel];
-      std::cout << "[" << classLabel << "] ";
+      oss << "[" << classLabel << "] ";
 
       // If the current classLabel has already been added to the universe
       if (universe.count(classLabel) > 0)
@@ -353,29 +355,26 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[]
         universe[classLabel] = 1;
         }
       }
-    std::cout << std::endl << confMatClk << std::endl;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << oss.str());
+    otbLogMacro(Debug, << confMatClk);
 
     for (itMapMOBClk = mapMOBClk.begin(); itMapMOBClk != mapMOBClk.end(); ++itMapMOBClk)
       {
-      std::cout << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second << std::endl;
+      otbLogMacro(Debug, << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second);
       }
 
-    std::cout << "*******************************************************************************" << std::endl;
+    otbLogMacro(Debug, << "*******************************************************************************");
     }
 
   // Number of classes in the universe
   unsigned int nbClasses = universe.size();
 
-  std::cout << "universe:" << std::endl;
+  otbLogMacro(Info, << "universe:");
   for (itUniverse = universe.begin(); itUniverse != universe.end(); ++itUniverse)
     {
-    std::cout << "Class Label " << itUniverse->first;
-    std::cout << " present in " << itUniverse->second << " classifier(s)" << std::endl;
+    otbLogMacro(Info, << "Class Label " << itUniverse->first
+      << " present in " << itUniverse->second << " classifier(s)");
     }
-  std::cout << std::endl;
-
-
 
   /* ***************************************************************************************** */
   /* ************************ RESULTS OF THE CLASSIFICATION OF PIXEL X *********************** */
@@ -415,9 +414,8 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[]
     mLabelSetClk = vectorMapMOBs[itClk][classLabelk];
     mLabelSetClk_ = 1 - mLabelSetClk - mUniverseClk;
 
-    std::cout << "classifiedPixelX[" << itClk << "] = " << classLabelk;
-    std::cout << "; MassOfBelief_Cl_" << itClk << "[" << classLabelk << "] = " << mLabelSetClk;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << "classifiedPixelX[" << itClk << "] = " << classLabelk
+      << "; MassOfBelief_Cl_" << itClk << "[" << classLabelk << "] = " << mLabelSetClk);
 
     // The first time the label {Ai} is found in classifiedPixelX
     if (mapJointMassesStepI.count(classLabelk) == 0)
@@ -443,9 +441,6 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[]
     mapJointMassesUniverseStepI[classLabelk] = mUniverseClkNew;
     }
 
-  std::cout << "*******************************************************************************" << std::endl;
-  std::cout << std::endl;
-
   /* ***************************************************************************************** */
   /* *************************************** DS STEP #2 ************************************** */
   /* ***************************************************************************************** */
@@ -464,10 +459,9 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[]
     B = B * (1 - mLabelSetClk);
     C = C * mLabelSetClk_;
 
-    std::cout << "****************************************" << std::endl;
-    std::cout << "mapJointMassesStepI[" << classLabelk << "] = " << mLabelSetClk << std::endl;
-    std::cout << "mapJointMassesStepI_[" << classLabelk << "] = " << mLabelSetClk_ << std::endl;
-    std::cout << "mapJointMassesUniverseStepI[" << classLabelk << "] = " << mUniverseClk << std::endl;
+    otbLogMacro(Debug, << "mapJointMassesStepI[" << classLabelk << "] = " << mLabelSetClk);
+    otbLogMacro(Debug, << "mapJointMassesStepI_[" << classLabelk << "] = " << mLabelSetClk_);
+    otbLogMacro(Debug, << "mapJointMassesUniverseStepI[" << classLabelk << "] = " << mUniverseClk);
     }
 
   unsigned int nbClkGroupsStepI = mapJointMassesStepI.size();
@@ -483,13 +477,9 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[]
       }
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "nbClasses = " << nbClasses << std::endl;
-  std::cout << "nbClassifiers = " << nbClassifiers << std::endl;
-  std::cout << "nbClkGroupsStepI = " << nbClkGroupsStepI << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
+  otbLogMacro(Info, << "nbClasses = " << nbClasses);
+  otbLogMacro(Info, << "nbClassifiers = " << nbClassifiers);
+  otbLogMacro(Info, << "nbClkGroupsStepI = " << nbClkGroupsStepI);
 
   // Calculation of the Belief function of each singleton {Ai} and {Ai_}
   SingleClassLabelMassMapType mapBelStepII, mapBelStepII_;
@@ -536,9 +526,6 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[]
     addBelLabelSetClk += belLabelSetClk;
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-
-
   /* ***************************************************************************************** */
   /* ************************************ DECISION PROCESS *********************************** */
   /* ***************************************************************************************** */
@@ -580,9 +567,8 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[]
       mapBelStepII_[classLabelk] = addBelLabelSetClk;
       }
 
-    std::cout << "Bel(" << classLabelk << ") = " << mapBelStepII[classLabelk] << std::endl;
-    std::cout << "Bel(NOT_" << classLabelk << ") = " << mapBelStepII_[classLabelk] << std::endl;
-    std::cout << std::endl;
+    otbLogMacro(Info, << "Bel(" << classLabelk << ") = " << mapBelStepII[classLabelk]);
+    otbLogMacro(Info, << "Bel(NOT_" << classLabelk << ") = " << mapBelStepII_[classLabelk]);
     }
 
   // If the DS VOTED LABEL is NOT unique, the result of the DS Fusion is undefinedValue
@@ -595,20 +581,12 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[]
       }
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl;
-  std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl;
-  std::cout << std::endl;
+  otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet);
+  otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk);
 
   return EXIT_SUCCESS;
 }
 
-// ********************************************************************************************************
-// ********************************************************************************************************
-// ********************************************************************************************************
-
-
-
 
 // OPTIMIZED RECURSIVE DS FUSION
 int otbDempsterShaferFusionOptRecTest(int argc, char * argv[])
@@ -640,7 +618,7 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[])
     mapLabelSets[vectorAllLabels[it]] = labelSet;
     }
 
-  std::cout << "universe = " << universe << std::endl;
+  otbLogMacro(Info, << "universe = " << universe);
 
   //**********************************************************************
   //************** RESULTS OF THE CLASSIFICATION OF PIXEL X **************
@@ -691,7 +669,7 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[])
 
   for (unsigned int it = 0; it < classifiedPixelX.size(); ++it)
     {
-    std::cout << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it] << std::endl;
+    otbLogMacro(Debug, << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it]);
     }
 
   //**********************************************************************
@@ -882,11 +860,9 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[])
     B = B * (1 - mLabelSetClk);
     C = C * mLabelSetClk_;
 
-    std::cout << "****************************************" << std::endl;
-    std::cout << "mapJointMassesStepI[" << labelSetClk << "] = " << mLabelSetClk << std::endl;
-    std::cout << "mapJointMassesStepI_[" << labelSetClk << "] = " << mLabelSetClk_ << std::endl;
-    std::cout << "mapJointMassesUniverseStepI[" << labelSetClk << "] = " << mapJointMassesUniverseStepI[labelSetClk]
-        << std::endl;
+    otbLogMacro(Debug, << "mapJointMassesStepI[" << labelSetClk << "] = " << mLabelSetClk);
+    otbLogMacro(Debug, << "mapJointMassesStepI_[" << labelSetClk << "] = " << mLabelSetClk_);
+    otbLogMacro(Debug, << "mapJointMassesUniverseStepI[" << labelSetClk << "] = " << mapJointMassesUniverseStepI[labelSetClk]);
     }
 
   unsigned int nbClkGroupsStepI = mapJointMassesStepI.size();
@@ -902,11 +878,9 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[])
       }
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "nbClasses = " << nbClasses << std::endl;
-  std::cout << "nbClassifiers = " << classifiedPixelX .size() << std::endl;
-  std::cout << "nbClkGroupsStepI = " << nbClkGroupsStepI << std::endl;
+  otbLogMacro(Info, << "nbClasses = " << nbClasses);
+  otbLogMacro(Info, << "nbClassifiers = " << classifiedPixelX .size());
+  otbLogMacro(Info, << "nbClkGroupsStepI = " << nbClkGroupsStepI);
 
   // Calculation of the Belief function of each singleton {Ai} and {Ai_}
 
@@ -954,8 +928,6 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[])
     addBelLabelSetClk = addBelLabelSetClk + belLabelSetClk;
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-
   // The decision for the DS Fusion is made with the MAXIMAL Belief function:
   // {Ai} is chosen if Bel({Ai}) = MAX(Bel({Aj}))
 
@@ -992,9 +964,8 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[])
       mapBelStepII_[labelSetClk] = addBelLabelSetClk;
       }
 
-    std::cout << "Bel(" << labelSetClk << ") = " << mapBelStepII[labelSetClk] << std::endl;
-    std::cout << "Bel(NOT_" << labelSetClk << ") = " << mapBelStepII_[labelSetClk] << std::endl;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << "Bel(" << labelSetClk << ") = " << mapBelStepII[labelSetClk]);
+    otbLogMacro(Debug, << "Bel(NOT_" << labelSetClk << ") = " << mapBelStepII_[labelSetClk]);
     }
 
   // If the DS VOTED LABEL is NOT unique, the result of the DS Fusion is the UNION of all the candidates {Ai}
@@ -1008,10 +979,8 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[])
       }
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl;
-  std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl;
-  std::cout << std::endl;
+  otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet);
+  otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk);
 
   return EXIT_SUCCESS;
 }
@@ -1045,7 +1014,7 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[])
     mapLabelSets[vectorAllLabels[it]] = labelSet;
     }
 
-  std::cout << "universe = " << universe << std::endl;
+  otbLogMacro(Info, << "universe = " << universe);
 
   //**********************************************************************
   //************** RESULTS OF THE CLASSIFICATION OF PIXEL X **************
@@ -1063,7 +1032,7 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[])
 
   for (unsigned int it = 0; it < classifiedPixelX.size(); ++it)
     {
-    std::cout << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it] << std::endl;
+    otbLogMacro(Debug, << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it]);
     }
 
   //**********************************************************************
@@ -1184,14 +1153,9 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[])
     itMapJMOBFilters->second->Update();
     mapJMOBFStepI[itMapJMOBFilters->first] = itMapJMOBFilters->second->GetOutput();
 
-    std::cout << "****************************************************************************" << std::endl;
-    std::cout << "jointMassClkFilterStepI[" << itMapJMOBFilters->first << "] = " << itMapJMOBFilters->second
-        << std::endl;
+    otbLogMacro(Debug, << "jointMassClkFilterStepI[" << itMapJMOBFilters->first << "] = " << itMapJMOBFilters->second);
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-
   //**********************************************************************
   //***************************** DS STEP #2 *****************************
   //**********************************************************************
@@ -1213,8 +1177,7 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[])
     B = B * (1 - mLabelSetClk);
     C = C * mLabelSetClk_;
 
-    std::cout << "****************************************************************************" << std::endl;
-    std::cout << "jointMassOfBeliefStepI[" << itMapJMOBF->first << "] = " << itMapJMOBF->second << std::endl;
+    otbLogMacro(Debug, << "jointMassOfBeliefStepI[" << itMapJMOBF->first << "] = " << itMapJMOBF->second);
     }
 
   unsigned int nbClkGroupsStepI = mapJMOBFStepI.size();
@@ -1278,9 +1241,6 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[])
     addBelLabelSetClk = addBelLabelSetClk + belLabelSetClk;
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-
   // The decision for the DS Fusion is made with the MAXIMAL Belief function:
   // {Ai} is chosen if Bel({Ai}) = MAX(Bel({Aj}))
 
@@ -1319,10 +1279,8 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[])
       mapBelStepII[labelSetClk_] = addBelLabelSetClk;
       }
 
-    std::cout << "Bel(" << labelSetClk << ") = " << mapBelStepII[labelSetClk] << std::endl;
-    std::cout << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = " << mapBelStepII[labelSetClk_]
-        << std::endl;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << "Bel(" << labelSetClk << ") = " << mapBelStepII[labelSetClk]);
+    otbLogMacro(Debug, << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = " << mapBelStepII[labelSetClk_]);
     }
 
   // If the DS VOTED LABEL is NOT unique, the result of the DS Fusion is the UNION of all the candidates {Ai}
@@ -1336,10 +1294,8 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[])
       }
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl;
-  std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl;
-  std::cout << std::endl;
+  otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet);
+  otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk);
 
   return EXIT_SUCCESS;
 }
@@ -1372,7 +1328,7 @@ int otbDempsterShaferFusionTest(int argc, char * argv[])
     mapLabelSets[vectorAllLabels[it]] = labelSet;
     }
 
-  std::cout << "universe = " << universe << std::endl;
+  otbLogMacro(Info, << "universe = " << universe);
 
   //**********************************************************************
   //************** RESULTS OF THE CLASSIFICATION OF PIXEL X **************
@@ -1390,7 +1346,7 @@ int otbDempsterShaferFusionTest(int argc, char * argv[])
 
   for (unsigned int it = 0; it < classifiedPixelX.size(); ++it)
     {
-    std::cout << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it] << std::endl;
+    otbLogMacro(Debug, << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it]);
     }
 
   //**********************************************************************
@@ -1490,13 +1446,8 @@ int otbDempsterShaferFusionTest(int argc, char * argv[])
   jointMassClkFilter->Update();
   MassOfBeliefFunctionType::Pointer jointMass = jointMassClkFilter->GetOutput();
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "jointMassClkFilter = " << jointMassClkFilter << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "jointMassOfBelief = " << jointMass << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
+  otbLogMacro(Debug, << "jointMassClkFilter = " << jointMassClkFilter);
+  otbLogMacro(Debug, << "jointMassOfBelief = " << jointMass);
 
   // The decision for the DS Fusion is made with the MAXIMAL Belief function:
   // {Ai} is chosen if Bel({Ai}) = MAX(Bel({Aj}))
@@ -1523,10 +1474,9 @@ int otbDempsterShaferFusionTest(int argc, char * argv[])
         }
       }
 
-    std::cout << "Bel(" << labelSetClk << ") = " << jointMass->GetBelief(labelSetClk) << std::endl;
-    std::cout << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = "
-        << jointMass->GetBelief(labelSetClk_) << std::endl;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << "Bel(" << labelSetClk << ") = " << jointMass->GetBelief(labelSetClk));
+    otbLogMacro(Debug, << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = "
+        << jointMass->GetBelief(labelSetClk_));
     }
 
   //If the DS VOTED LABEL is NOT unique
@@ -1539,28 +1489,13 @@ int otbDempsterShaferFusionTest(int argc, char * argv[])
       }
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl;
-  std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl;
-  std::cout << std::endl;
+  otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet);
+  otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk);
 
   return EXIT_SUCCESS;
 }
 
 
-
-
-
-
-
-// ********************************************************************************************************
-// ********************************************************************************************************
-// ********************************************************************************************************
-// ********************************************************************************************************
-// ********************************************************************************************************
-// ********************************************************************************************************
-
-
 // OPTIMIZED RECURSIVE DS FUSION FROM CONFUSION MATRIX FILES
 int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
 {
@@ -1658,11 +1593,12 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
     // Vector containing the Mass of Belief of the universe for each classifier
     vectorUniverseMOBs.push_back(mobUniverseClk);
 
-    std::cout << "confusion matrix[Cl_" << itClk << "] = " << std::endl;
+    otbLogMacro(Debug, << "confusion matrix[Cl_" << itClk << "] = ");
+    std::ostringstream oss;
     for (itMapOfClassesClk = mapOfClassesClk.begin(); itMapOfClassesClk != mapOfClassesClk.end(); ++itMapOfClassesClk)
       {
       IntLabelPixelType classLabel = itMapOfClassesClk->first;
-      std::cout << "[" << classLabel << "] ";
+      oss << "[" << classLabel << "] ";
 
       // If the current classLabel has already been added to the universe
       if (universe.count(classLabel) > 0)
@@ -1674,29 +1610,24 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
         universe[classLabel] = 1;
         }
       }
-    std::cout << std::endl << confMatClk << std::endl;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << oss.str());
+    otbLogMacro(Debug, << confMatClk);
 
     for (itMapMOBClk = mapMOBClk.begin(); itMapMOBClk != mapMOBClk.end(); ++itMapMOBClk)
       {
-      std::cout << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second << std::endl;
+      otbLogMacro(Debug, << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second);
       }
-
-    std::cout << "*******************************************************************************" << std::endl;
     }
 
   // Number of classes in the universe
   unsigned int nbClasses = universe.size();
 
-  std::cout << "universe:" << std::endl;
+  otbLogMacro(Info, << "universe:");
   for (itUniverse = universe.begin(); itUniverse != universe.end(); ++itUniverse)
     {
-    std::cout << "Class Label " << itUniverse->first;
-    std::cout << " present in " << itUniverse->second << " classifier(s)" << std::endl;
+    otbLogMacro(Info, << "Class Label " << itUniverse->first
+      << " present in " << itUniverse->second << " classifier(s)");
     }
-  std::cout << std::endl;
-
-
 
   /* ***************************************************************************************** */
   /* ************************ RESULTS OF THE CLASSIFICATION OF PIXEL X *********************** */
@@ -1740,9 +1671,8 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
     mLabelSetClk = vectorMapMOBs[itClk][classLabelk];
     mLabelSetClk_ = 1 - mLabelSetClk - mUniverseClk;
 
-    std::cout << "classifiedPixelX[" << itClk << "] = " << classLabelk;
-    std::cout << "; MassOfBelief_Cl_" << itClk << "[" << classLabelk << "] = " << mLabelSetClk;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << "classifiedPixelX[" << itClk << "] = " << classLabelk
+      << "; MassOfBelief_Cl_" << itClk << "[" << classLabelk << "] = " << mLabelSetClk);
 
     // The first time the label {Ai} is found in classifiedPixelX
     if (mapJointMassesStepI.count(classLabelk) == 0)
@@ -1768,9 +1698,6 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
     mapJointMassesUniverseStepI[classLabelk] = mUniverseClkNew;
     }
 
-  std::cout << "*******************************************************************************" << std::endl;
-  std::cout << std::endl;
-
   /* ***************************************************************************************** */
   /* *************************************** DS STEP #2 ************************************** */
   /* ***************************************************************************************** */
@@ -1789,10 +1716,9 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
     B = B * (1 - mLabelSetClk);
     C = C * mLabelSetClk_;
 
-    std::cout << "****************************************" << std::endl;
-    std::cout << "mapJointMassesStepI[" << classLabelk << "] = " << mLabelSetClk << std::endl;
-    std::cout << "mapJointMassesStepI_[" << classLabelk << "] = " << mLabelSetClk_ << std::endl;
-    std::cout << "mapJointMassesUniverseStepI[" << classLabelk << "] = " << mUniverseClk << std::endl;
+    otbLogMacro(Debug, << "mapJointMassesStepI[" << classLabelk << "] = " << mLabelSetClk);
+    otbLogMacro(Debug, << "mapJointMassesStepI_[" << classLabelk << "] = " << mLabelSetClk_);
+    otbLogMacro(Debug, << "mapJointMassesUniverseStepI[" << classLabelk << "] = " << mUniverseClk);
     }
 
   unsigned int nbClkGroupsStepI = mapJointMassesStepI.size();
@@ -1808,13 +1734,9 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
       }
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "nbClasses = " << nbClasses << std::endl;
-  std::cout << "nbClassifiers = " << nbClassifiers << std::endl;
-  std::cout << "nbClkGroupsStepI = " << nbClkGroupsStepI << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
+  otbLogMacro(Info, << "nbClasses = " << nbClasses);
+  otbLogMacro(Info, << "nbClassifiers = " << nbClassifiers);
+  otbLogMacro(Info, << "nbClkGroupsStepI = " << nbClkGroupsStepI);
 
   // Calculation of the Belief function of each singleton {Ai} and {Ai_}
   SingleClassLabelMassMapType mapBelStepII, mapBelStepII_;
@@ -1861,9 +1783,6 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
     addBelLabelSetClk += belLabelSetClk;
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-
-
   /* ***************************************************************************************** */
   /* ************************************ DECISION PROCESS *********************************** */
   /* ***************************************************************************************** */
@@ -1905,9 +1824,8 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
       mapBelStepII_[classLabelk] = addBelLabelSetClk;
       }
 
-    std::cout << "Bel(" << classLabelk << ") = " << mapBelStepII[classLabelk] << std::endl;
-    std::cout << "Bel(NOT_" << classLabelk << ") = " << mapBelStepII_[classLabelk] << std::endl;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << "Bel(" << classLabelk << ") = " << mapBelStepII[classLabelk]);
+    otbLogMacro(Debug, << "Bel(NOT_" << classLabelk << ") = " << mapBelStepII_[classLabelk]);
     }
 
   // If the DS VOTED LABEL is NOT unique, the result of the DS Fusion is undefinedValue
@@ -1920,24 +1838,13 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[])
       }
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl;
-  std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl;
-  std::cout << std::endl;
+  otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet);
+  otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk);
 
   return EXIT_SUCCESS;
 }
 
 
-
-
-// ********************************************************************************************************
-// ********************************************************************************************************
-// ********************************************************************************************************
-
-
-
-
 // NOT OPTIMIZED DS FUSION FROM CONFUSION MATRIX FILES
 int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[])
 {
@@ -2036,11 +1943,12 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[])
     // Vector containing the Mass of Belief of the universe for each classifier
     vectorUniverseMOBs.push_back(mobUniverseClk);
 
-    std::cout << "confusion matrix[Cl_" << itClk << "] = " << std::endl;
+    otbLogMacro(Debug, << "confusion matrix[Cl_" << itClk << "] = ");
+    std::ostringstream oss;
     for (itMapOfClassesClk = mapOfClassesClk.begin(); itMapOfClassesClk != mapOfClassesClk.end(); ++itMapOfClassesClk)
       {
       IntLabelPixelType classLabel = itMapOfClassesClk->first;
-      std::cout << "[" << classLabel << "] ";
+      oss << "[" << classLabel << "] ";
 
       // If the current classLabel has already been added to the universe
       if (universe.count(classLabel) > 0)
@@ -2052,15 +1960,13 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[])
         universe[classLabel] = 1;
         }
       }
-    std::cout << std::endl << confMatClk << std::endl;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << oss.str());
+    otbLogMacro(Debug, << confMatClk);
 
     for (itMapMOBClk = mapMOBClk.begin(); itMapMOBClk != mapMOBClk.end(); ++itMapMOBClk)
       {
-      std::cout << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second << std::endl;
+      otbLogMacro(Debug, << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second);
       }
-
-    std::cout << "*******************************************************************************" << std::endl;
     }
 
   // Number of classes in the universe
@@ -2072,19 +1978,16 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[])
   IntLabelSetMapType mapLabelSets;
   IntLabelSetMapType::iterator itMapLabelSets;
 
-  std::cout << "universe:" << std::endl;
+  otbLogMacro(Debug, << "universe:");
   for (itUniverse = universe.begin(); itUniverse != universe.end(); ++itUniverse)
     {
-    std::cout << "Class Label " << itUniverse->first;
-    std::cout << " present in " << itUniverse->second << " classifier(s)" << std::endl;
+    otbLogMacro(Debug, << "Class Label " << itUniverse->first
+      << " present in " << itUniverse->second << " classifier(s)");
     universeSet.insert(itUniverse->first);
     labelSet.clear();
     labelSet.insert(itUniverse->first);
     mapLabelSets[itUniverse->first] = labelSet;
     }
-  std::cout << std::endl;
-
-
 
   // Vector containing the std::maps of masses of ALL the singleton sets for each classifier k
   IntMassMapType mClk;
@@ -2160,13 +2063,8 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[])
   jointMassClkFilter->Update();
   IntMassOfBeliefFunctionType::Pointer jointMass = jointMassClkFilter->GetOutput();
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "jointMassClkFilter = " << jointMassClkFilter << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "jointMassOfBelief = " << jointMass << std::endl;
-  std::cout << "****************************************************************************" << std::endl;
+  otbLogMacro(Debug, << "jointMassClkFilter = " << jointMassClkFilter);
+  otbLogMacro(Debug, << "jointMassOfBelief = " << jointMass);
 
   // The decision for the DS Fusion is made with the MAXIMAL Belief function:
   // {Ai} is chosen if Bel({Ai}) = MAX(Bel({Aj}))
@@ -2193,10 +2091,9 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[])
         }
       }
 
-    std::cout << "Bel(" << labelSetClk << ") = " << jointMass->GetBelief(labelSetClk) << std::endl;
-    std::cout << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = "
-        << jointMass->GetBelief(labelSetClk_) << std::endl;
-    std::cout << std::endl;
+    otbLogMacro(Debug, << "Bel(" << labelSetClk << ") = " << jointMass->GetBelief(labelSetClk));
+    otbLogMacro(Debug, << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = "
+        << jointMass->GetBelief(labelSetClk_));
     }
 
   //If the DS VOTED LABEL is NOT unique
@@ -2209,10 +2106,8 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[])
       }
     }
 
-  std::cout << "****************************************************************************" << std::endl;
-  std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl;
-  std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl;
-  std::cout << std::endl;
+  otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet);
+  otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk);
 
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Learning/DempsterShafer/test/otbDempsterShaferTestDriver.cxx b/Modules/Learning/DempsterShafer/test/otbDempsterShaferTestDriver.cxx
index c38750c9cbd2443e8282a74b0005689c78455836..d8b30b333994660ead3a090f59519756a05a8330 100644
--- a/Modules/Learning/DempsterShafer/test/otbDempsterShaferTestDriver.cxx
+++ b/Modules/Learning/DempsterShafer/test/otbDempsterShaferTestDriver.cxx
@@ -24,7 +24,6 @@ void RegisterTests()
 {
   REGISTER_TEST(otbMassOfBeliefDSApplied);
   REGISTER_TEST(otbConfusionMatrixToMassOfBeliefTest);
-  REGISTER_TEST(otbVectorDataToDSValidatedVectorDataFilter);
   REGISTER_TEST(otbDempsterShaferFusionOptRecConfMatTest);
   REGISTER_TEST(otbDempsterShaferFusionOptRecTest);
   REGISTER_TEST(otbDempsterShaferFusionOptTest);
diff --git a/Modules/Learning/DempsterShafer/test/otbMassOfBelief.cxx b/Modules/Learning/DempsterShafer/test/otbMassOfBelief.cxx
index 209186c5da9d474ee8fcc91500a69a6bab5bbf09..23f076e55afd23989afa9b0a6f7df041bb10bdd2 100644
--- a/Modules/Learning/DempsterShafer/test/otbMassOfBelief.cxx
+++ b/Modules/Learning/DempsterShafer/test/otbMassOfBelief.cxx
@@ -21,6 +21,7 @@
 
 
 #include "otbMassOfBelief.h"
+#include "otbMacro.h"
 
 typedef otb::MassOfBelief<std::string> MassOfBeliefFunctionType;
 
@@ -44,56 +45,60 @@ int otbMassOfBelief(int itkNotUsed(argc), char* itkNotUsed(argv)[])
   massFunction->SetMass(set2, 0.3);
   massFunction->SetMass(set4, 0.1);
 
-  std::cout<<massFunction<<std::endl;
+  otbLogMacro(Debug, <<massFunction);
 
-  std::cout<<"Removing mass from set ";
-  MassOfBeliefFunctionType::PrintLabelSet(std::cout, set4);
-  std::cout<<std::endl;
+  std::ostringstream oss;
+  MassOfBeliefFunctionType::PrintLabelSet(oss, set4);
+  otbLogMacro(Info, << "Removing mass from set " << oss.str());
 
   massFunction->RemoveMass(set4);
 
-  std::cout<<massFunction<<std::endl;
+  otbLogMacro(Debug, <<massFunction);
 
-  std::cout<<"Estimating uncertainty "<<std::endl;
+  otbLogMacro(Info, <<"Estimating uncertainty");
   massFunction->EstimateUncertainty();
 
-  std::cout<<massFunction<<std::endl;
+  otbLogMacro(Debug, <<massFunction);
+
+  oss.str(std::string());
+  oss << "Removing mass ";
+  MassOfBeliefFunctionType::PrintLabelSet(oss, set2);
+  oss << " and adding mass ";
+  MassOfBeliefFunctionType::PrintLabelSet(oss, set3);
+  otbLogMacro(Info, << oss.str());
 
-  std::cout<<"Removing mass ";
-  MassOfBeliefFunctionType::PrintLabelSet(std::cout, set2);
-  std::cout<<" and adding mass ";
-  MassOfBeliefFunctionType::PrintLabelSet(std::cout, set3);
-  std::cout<<std::endl;
   massFunction->RemoveMass(set2);
   massFunction->SetMass(set3, 0.6);
 
-  std::cout<<massFunction<<std::endl;
+  otbLogMacro(Debug, <<massFunction);
 
-  std::cout<<"Normalizing masses "<<std::endl;
+  otbLogMacro(Info, <<"Normalizing masses ");
   massFunction->Normalize();
 
-  std::cout<<massFunction<<std::endl;
+  otbLogMacro(Debug, <<massFunction);
+
+  oss.str(std::string());
+  MassOfBeliefFunctionType::PrintLabelSet(oss, set3);
+  otbLogMacro(Info, <<"Belief of "<< oss.str()
+    << " is "<< massFunction->GetBelief(set3));
 
-  std::cout<<"Belief of ";
-  MassOfBeliefFunctionType::PrintLabelSet(std::cout, set3);
-  std::cout<<" is "<<massFunction->GetBelief(set3)<<std::endl;
-  
-  std::cout<<"Plausibility of ";
-  MassOfBeliefFunctionType::PrintLabelSet(std::cout, set3);
-  std::cout<<" is "<<massFunction->GetPlausibility(set3)<<std::endl;
+  oss.str(std::string());
+  MassOfBeliefFunctionType::PrintLabelSet(oss, set3);
+  otbLogMacro(Info, <<"Plausibility of " << oss.str()
+    << " is " << massFunction->GetPlausibility(set3));
 
   MassOfBeliefFunctionType::LabelSetType otherSet;
   otherSet.insert("cat");
   otherSet.insert("dog");
   otherSet.insert("bird");
 
-  std::cout<<"Initializing with power set from universal set ";
-  MassOfBeliefFunctionType::PrintLabelSet(std::cout, otherSet);
-  std::cout<<std::endl;
-  
+  oss.str(std::string());
+  MassOfBeliefFunctionType::PrintLabelSet(oss, otherSet);
+  otbLogMacro(Info, <<"Initializing with power set from universal set "<< oss.str());
+
   massFunction->InitializePowerSetMasses(otherSet);
 
-  std::cout<<massFunction<<std::endl;
+  otbLogMacro(Debug, <<massFunction);
 
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Learning/DempsterShafer/test/otbMassOfBeliefDSApplied.cxx b/Modules/Learning/DempsterShafer/test/otbMassOfBeliefDSApplied.cxx
index b39e2b5e0a8025c69dc99b77adf1c5c13af0fd3b..4ea8993fee118e879e9d976e6d2322297ca99548 100644
--- a/Modules/Learning/DempsterShafer/test/otbMassOfBeliefDSApplied.cxx
+++ b/Modules/Learning/DempsterShafer/test/otbMassOfBeliefDSApplied.cxx
@@ -24,6 +24,7 @@
 
 #include "otbFuzzyVariable.h"
 #include "otbJointMassOfBeliefFilter.h"
+#include "otbMacro.h"
 
 
 typedef float                           PrecisionType;
@@ -90,27 +91,23 @@ int otbMassOfBeliefDSApplied(int itkNotUsed(argc), char* argv[])
   jointMassFilter->Update();
   jointMass = jointMassFilter->GetOutput();
 
-  std::cout<<mass1<<std::endl;
+  otbLogMacro(Debug,<< "Mass 1:" <<mass1);
 
-  std::cout<<mass2<<std::endl;
+  otbLogMacro(Debug,<< "Mass 2:"<<mass2);
 
-  std::cout << jointMass << std::endl;
-  
-  std::cout << "Considered Hypothesis : ";
-  MassOfBeliefFunctionType::PrintLabelSet(std::cout, Hyp);
-  std::cout << std::endl;
+  otbLogMacro(Debug,<< "Joint mass :" << jointMass);
+
+  std::ostringstream oss;
+  MassOfBeliefFunctionType::PrintLabelSet(oss, Hyp);
+  otbLogMacro(Info, << "Considered Hypothesis : " << oss.str());
   
-  std::cout << "Belief(Hyp) : "
-            << jointMass->GetBelief(Hyp)
-            << "  -  Plausibility(Hyp) : "
-            << jointMass->GetPlausibility(Hyp)
-            << "  -  Score(Hyp) : "
-            << (jointMass->GetBelief(Hyp) + jointMass->GetPlausibility(Hyp))/2.0
-            << std::endl;
+  otbLogMacro(Info, << "Belief(Hyp) : " << jointMass->GetBelief(Hyp));
+  otbLogMacro(Info, << "Plausibility(Hyp) : " << jointMass->GetPlausibility(Hyp));
+  otbLogMacro(Info, << "Score(Hyp) : " << (jointMass->GetBelief(Hyp) + jointMass->GetPlausibility(Hyp))/2.0);
 
   if (jointMass->GetBelief(Hyp) > jointMass->GetPlausibility(Hyp))
     {
-    std::cout << "Belief > Plausibility" << std::endl;
+    otbLogMacro(Warning, << "Belief > Plausibility");
     return EXIT_FAILURE;
     }
   else
diff --git a/Modules/Learning/DempsterShafer/test/otbVectorDataToDSValidatedVectorDataFilter.cxx b/Modules/Learning/DempsterShafer/test/otbVectorDataToDSValidatedVectorDataFilter.cxx
deleted file mode 100644
index d237ea5d2f5de3a453a862dac05964355ea6d0c8..0000000000000000000000000000000000000000
--- a/Modules/Learning/DempsterShafer/test/otbVectorDataToDSValidatedVectorDataFilter.cxx
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-#include "otbVectorDataToDSValidatedVectorDataFilter.h"
-
-#include "otbVectorDataFileReader.h"
-#include "otbVectorDataFileWriter.h"
-
-
-int otbVectorDataToDSValidatedVectorDataFilter(int itkNotUsed(argc), char* argv[])
-{
-  const char * inputVD  = argv[1];
-  const char * outputVD = argv[2];
-
-  typedef float                           PrecisionType;
-  typedef otb::VectorData<PrecisionType>  VectorDataType;
-  typedef otb::VectorDataFileReader<VectorDataType>
-                                          VectorDataReaderType;
-  typedef otb::VectorDataFileWriter<VectorDataType>
-                                          VectorDataWriterType;
-
-  typedef otb::VectorDataToDSValidatedVectorDataFilter<VectorDataType, PrecisionType>
-                                          VectorDataValidationFilterType;
-  typedef VectorDataValidationFilterType::LabelSetType
-                                          LabelSetType;
-  typedef otb::FuzzyDescriptorsModelManager
-                                          FuzzyManagerType;
-  VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New();
-  VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New();
-
-  VectorDataValidationFilterType::Pointer filter =
-    VectorDataValidationFilterType::New();
-
-  vdReader->SetFileName(inputVD);
-  vdReader->Update();
-
-  filter->SetInput(vdReader->GetOutput());
-  //filter->GetDescriptorModels();
-  FuzzyManagerType::Print(filter->GetDescriptorModels());
-  LabelSetType plau, bel;
-  plau.insert("NONDVI");
-  plau.insert("ROADSA");
-  plau.insert("NOBUIL");
-  filter->SetPlausibilityHypothesis(plau);
-  bel.insert("ROADSA");
-  bel.insert("NONDVI");
-  bel.insert("NOBUIL");
-  filter->SetBeliefHypothesis(bel);
-
-  std::vector<double> stdModel;
-  stdModel.push_back(0.25);
-  stdModel.push_back(0.50);
-  stdModel.push_back(0.75);
-  stdModel.push_back(0.90);
-  filter->AddDescriptor("NONDVI", stdModel);
-  filter->AddDescriptor("ROADSA", stdModel);
-  filter->AddDescriptor("NOBUIL", stdModel);
-
-  FuzzyManagerType::Print(filter->GetDescriptorModels());
-
-  vdWriter->SetFileName(outputVD);
-  vdWriter->SetInput(filter->GetOutput());
-  vdWriter->Update();
-
-  std::cout << "Input VectorData Size : "
-            << vdReader->GetOutput()->Size() << std::endl
-            << "CriterionFormula : "
-            << filter->GetCriterionFormula() << std::endl
-            << "Output VecttorData Size : "
-            << filter->GetOutput()->Size()
-            << std::endl;
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Learning/LearningBase/include/otbMachineLearningModel.hxx b/Modules/Learning/LearningBase/include/otbMachineLearningModel.hxx
index 543453f5b9cae8f25ce88d244c2dfde2c9662693..392857b02bc6106fd3f474b0c4e169f186bca266 100644
--- a/Modules/Learning/LearningBase/include/otbMachineLearningModel.hxx
+++ b/Modules/Learning/LearningBase/include/otbMachineLearningModel.hxx
@@ -144,10 +144,13 @@ MachineLearningModel<TInputValue,TOutputValue,TConfidenceValue>
 {
   assert(input != nullptr);
   assert(targets != nullptr);
-  
-  assert(input->Size()==targets->Size()&&"Input sample list and target label list do not have the same size.");
-  assert(((quality==nullptr)||(quality->Size()==input->Size()))&&"Quality samples list is not null and does not have the same size as input samples list");
-  assert((proba==nullptr)||(input->Size()==proba->Size())&&"Proba sample list and target label list do not have the same size.");
+
+  assert(input->Size() == targets->Size()
+          && "Input sample list and target label list do not have the same size.");
+  assert(((quality == nullptr) || (quality->Size() == input->Size()))
+          && "Quality samples list is not null and does not have the same size as input samples list");
+  assert(((proba == nullptr) || (input->Size() == proba->Size()))
+          && "Proba sample list and target label list do not have the same size.");
 
   if(startIndex+size>input->Size())
     {
diff --git a/Modules/Learning/LearningBase/test/otbSharkUtilsTests.cxx b/Modules/Learning/LearningBase/test/otbSharkUtilsTests.cxx
index c393293300a13191943abd41fd4ce474a262b3dd..c11ee59e541a0a3068111155cbe20d02b5847fbf 100644
--- a/Modules/Learning/LearningBase/test/otbSharkUtilsTests.cxx
+++ b/Modules/Learning/LearningBase/test/otbSharkUtilsTests.cxx
@@ -25,8 +25,8 @@
 int otbSharkNormalizeLabels(int itkNotUsed(argc), char* itkNotUsed(argv) [])
 {
   std::vector<unsigned int> inLabels = {2, 2, 3, 20, 1};
-  std::vector<unsigned int> expectedDictionary = {2, 3, 20, 1};
-  std::vector<unsigned int> expectedLabels = {0, 0, 1, 2, 3};
+  std::vector<unsigned int> expectedDictionary = {1, 2, 3, 20};
+  std::vector<unsigned int> expectedLabels = {1, 1, 2, 3, 0};
 
   auto newLabels = inLabels;
   std::vector<unsigned int> labelDict;
diff --git a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.hxx b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.hxx
index cd5c2a6a7ae16064cc346f1010414e231c2f3e8a..b59e079182e4ac3ea894c203ee7c6350159bdebb 100644
--- a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.hxx
+++ b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.hxx
@@ -53,6 +53,7 @@ SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
   this->m_IsRegressionSupported = false;
   this->m_IsDoPredictBatchMultiThreaded = true;
   this->m_NormalizeClassLabels = true;
+  this->m_ComputeMargin = false;
 }
 
 
@@ -167,9 +168,12 @@ SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue>
   assert(input != nullptr);
   assert(targets != nullptr);
 
-  assert(input->Size()==targets->Size()&&"Input sample list and target label list do not have the same size.");
-  assert(((quality==nullptr)||(quality->Size()==input->Size()))&&"Quality samples list is not null and does not have the same size as input samples list");
-  assert((proba==nullptr)||(input->Size()==proba->Size())&&"Proba sample list and target label list do not have the same size.");
+  assert(input->Size() == targets->Size()
+          && "Input sample list and target label list do not have the same size.");
+  assert(((quality == nullptr) || (quality->Size() == input->Size()))
+          && "Quality samples list is not null and does not have the same size as input samples list");
+  assert(((proba == nullptr) || (input->Size() == proba->Size()))
+          && "Proba sample list and target label list do not have the same size.");
 
   if(startIndex+size>input->Size())
     {
diff --git a/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx b/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx
index df5cd21a5d24db67c8dac1c16d94f352f4e2cfe9..60f48c6e73daf1fa419d4a6e6e6418d4c8a03dee 100644
--- a/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx
+++ b/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx
@@ -22,6 +22,9 @@
 #include <fstream>
 #include <string>
 #include <algorithm>
+#include <chrono>
+
+#include "otbMacro.h"
 
 #include <otbMachineLearningModel.h>
 #include "otbConfusionMatrixCalculator.h"
@@ -48,10 +51,28 @@ typedef MachineLearningModelRegressionType::TargetListSampleType TargetListSampl
 
 typedef otb::ConfusionMatrixCalculator<TargetListSampleType, TargetListSampleType> ConfusionMatrixCalculatorType;
 
-#ifdef OTB_USE_LIBSVM
-#include "otbLibSVMMachineLearningModel.h"
+float GetConfusionMatrixResults(TargetListSampleType::Pointer predicted, TargetListSampleType::Pointer ref)
+{
+  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
+  cmCalculator->SetProducedLabels(predicted);
+  cmCalculator->SetReferenceLabels(ref);
+  cmCalculator->Compute();
 
-int otbLibSVMMachineLearningModel(int argc, char * argv[])
+  otbLogMacro(Debug, << "Confusion matrix:\n" << cmCalculator->GetConfusionMatrix());
+  otbLogMacro(Info, << "Kappa: "<< cmCalculator->GetKappaIndex());
+  otbLogMacro(Debug, << "Overall Accuracy: " << cmCalculator->GetOverallAccuracy());
+
+  return cmCalculator->GetKappaIndex();
+}
+
+template <class TModel>
+void SetupModel(TModel* /*model*/)
+{
+  // do nothing by default
+}
+
+template <class TModel>
+int otbGenericMachineLearningModel(int argc, char * argv[])
 {
   if (argc != 3)
     {
@@ -59,69 +80,50 @@ int otbLibSVMMachineLearningModel(int argc, char * argv[])
       std::cout<<"Usage : sample file, output file "<<std::endl;
       return EXIT_FAILURE;
     }
-
-
-  typedef otb::LibSVMMachineLearningModel<InputValueType, TargetValueType> SVMType;
   InputListSampleType::Pointer samples = InputListSampleType::New();
   TargetListSampleType::Pointer labels = TargetListSampleType::New();
-
   if (!otb::ReadDataFile(argv[1], samples, labels))
     {
     std::cout << "Failed to read samples file " << argv[1] << std::endl;
     return EXIT_FAILURE;
     }
 
-  SVMType::Pointer classifier = SVMType::New();
+  typename TModel::Pointer classifier = TModel::New();
   classifier->SetInputListSample(samples);
   classifier->SetTargetListSample(labels);
+  SetupModel<TModel>(classifier);
   classifier->Train();
-
-  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
-
-  cmCalculator->SetProducedLabels(predicted);
-  cmCalculator->SetReferenceLabels(labels);
-  cmCalculator->Compute();
-
-  std::cout << "Confusion matrix: " << std::endl;
-  std::cout << cmCalculator->GetConfusionMatrix() << std::endl;
-  const float kappaIdx = cmCalculator->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
-  std::cout << "Overall Accuracy: " << cmCalculator->GetOverallAccuracy() << std::endl;
-
   classifier->Save(argv[2]);
+  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
+  const float kappa = GetConfusionMatrixResults(predicted, labels);
 
-  //Load Model to new LibSVM
-  SVMType::Pointer classifierLoad = SVMType::New();
-
+  typename TModel::Pointer classifierLoad = TModel::New();
   classifierLoad->Load(argv[2]);
+  auto start = std::chrono::system_clock::now();
+  otbLogMacro(Debug, << "Predict loaded");
   TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL);
+  using TimeT = std::chrono::milliseconds;
+  auto duration = std::chrono::duration_cast< TimeT>
+    (std::chrono::system_clock::now() - start);
+  auto elapsed = duration.count();
+  otbLogMacro(Debug, << "PredictBatch took " << elapsed << " ms");
+  const float kappaLoad = GetConfusionMatrixResults(predictedLoad, labels);
 
-  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
-
-  cmCalculatorLoad->SetProducedLabels(predictedLoad);
-  cmCalculatorLoad->SetReferenceLabels(labels);
-  cmCalculatorLoad->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
-  const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
+  return (std::abs(kappaLoad - kappa) < 0.00000001 ? EXIT_SUCCESS : EXIT_FAILURE);
+}
 
+// -------------------------- LibSVM -------------------------------------------
+#ifdef OTB_USE_LIBSVM
+#include "otbLibSVMMachineLearningModel.h"
 
-  if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001)
-    {
-    return EXIT_SUCCESS;
-    }
-  else
-    {
-    return EXIT_FAILURE;
-    }
+using LibSVMType = otb::LibSVMMachineLearningModel<InputValueType, TargetValueType>;
+int otbLibSVMMachineLearningModel(int argc, char * argv[])
+{
+  return otbGenericMachineLearningModel<LibSVMType>(argc,argv);
 }
 #endif
 
+// -------------------------- OpenCV -------------------------------------------
 #ifdef OTB_USE_OPENCV
 #include "otbSVMMachineLearningModel.h"
 #include "otbKNearestNeighborsMachineLearningModel.h"
@@ -132,75 +134,10 @@ int otbLibSVMMachineLearningModel(int argc, char * argv[])
 #include "otbDecisionTreeMachineLearningModel.h"
 #include "otbKNearestNeighborsMachineLearningModel.h"
 
-
+using SVMType = otb::SVMMachineLearningModel<InputValueType, TargetValueType>;
 int otbSVMMachineLearningModel(int argc, char * argv[])
 {
-  if (argc != 3 )
-    {
-      std::cout<<"Wrong number of arguments "<<std::endl;
-      std::cout<<"Usage : sample file, output file "<<std::endl;
-      return EXIT_FAILURE;
-    }
-
-  typedef otb::SVMMachineLearningModel<InputValueType, TargetValueType> SVMType;
-
-  InputListSampleType::Pointer samples = InputListSampleType::New();
-  TargetListSampleType::Pointer labels = TargetListSampleType::New();
-
-  if(!otb::ReadDataFile(argv[1],samples,labels))
-    {
-    std::cout<<"Failed to read samples file "<<argv[1]<<std::endl;
-    return EXIT_FAILURE;
-    }
-
-  SVMType::Pointer classifier = SVMType::New();
-  classifier->SetInputListSample(samples);
-  classifier->SetTargetListSample(labels);
-  classifier->Train();
-
-  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
-
-  classifier->Save(argv[2]);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
-
-  cmCalculator->SetProducedLabels(predicted);
-  cmCalculator->SetReferenceLabels(labels);
-  cmCalculator->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl;
-  const float kappaIdx = cmCalculator->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl;
-
-  //Load Model to new SVM
-  SVMType::Pointer classifierLoad = SVMType::New();
-
-  classifierLoad->Load(argv[2]);
-  TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
-
-  cmCalculatorLoad->SetProducedLabels(predictedLoad);
-  cmCalculatorLoad->SetReferenceLabels(labels);
-  cmCalculatorLoad->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
-  const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
-
-
-  if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001)
-    {
-    return EXIT_SUCCESS;
-    }
-  else
-    {
-    return EXIT_FAILURE;
-    }
+  return otbGenericMachineLearningModel<SVMType>(argc,argv);
 }
 
 int otbSVMMachineLearningRegressionModel(int argc, char * argv[])
@@ -272,570 +209,93 @@ int otbSVMMachineLearningRegressionModel(int argc, char * argv[])
     }
 }
 
-
+using KNearestNeighborsType = otb::KNearestNeighborsMachineLearningModel<InputValueType,TargetValueType>;
 int otbKNearestNeighborsMachineLearningModel(int argc, char * argv[])
 {
-  if (argc != 3 )
-    {
-    std::cout<<"Wrong number of arguments "<<std::endl;
-    std::cout<<"Usage : sample file, output file"<<std::endl;
-    return EXIT_FAILURE;
-    }
-
-  typedef otb::KNearestNeighborsMachineLearningModel<InputValueType,TargetValueType> KNearestNeighborsType;
-  InputListSampleType::Pointer samples = InputListSampleType::New();
-  TargetListSampleType::Pointer labels = TargetListSampleType::New();
-
-  if(!otb::ReadDataFile(argv[1],samples,labels))
-    {
-    std::cout<<"Failed to read samples file "<<argv[1]<<std::endl;
-    return EXIT_FAILURE;
-    }
-
-  KNearestNeighborsType::Pointer classifier = KNearestNeighborsType::New();
-  classifier->SetInputListSample(samples);
-  classifier->SetTargetListSample(labels);
-  classifier->Train();
-  //write the model
-  classifier->Save(argv[2]);
-
-  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
-
-  cmCalculator->SetProducedLabels(predicted);
-  cmCalculator->SetReferenceLabels(labels);
-  cmCalculator->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl;
-  const float kappaIdx = cmCalculator->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl;
-
-
-  //Load Model to new KNN
-  KNearestNeighborsType::Pointer classifierLoad = KNearestNeighborsType::New();
-
-  classifierLoad->Load(argv[2]);
-  TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
-
-  cmCalculatorLoad->SetProducedLabels(predictedLoad);
-  cmCalculatorLoad->SetReferenceLabels(labels);
-  cmCalculatorLoad->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
-  const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
-
-
-  if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001)
-    {
-    return EXIT_SUCCESS;
-    }
-  else
-    {
-    return EXIT_FAILURE;
-    }
+  return otbGenericMachineLearningModel<KNearestNeighborsType>(argc,argv);
 }
 
-
+using RandomForestType = otb::RandomForestsMachineLearningModel<InputValueType,TargetValueType>;
 int otbRandomForestsMachineLearningModel(int argc, char * argv[])
 {
-  if (argc != 3 )
-    {
-    std::cout<<"Wrong number of arguments "<<std::endl;
-    std::cout<<"Usage : sample file, output file "<<std::endl;
-    return EXIT_FAILURE;
-    }
-
-  typedef otb::RandomForestsMachineLearningModel<InputValueType,TargetValueType> RandomForestType;
-  InputListSampleType::Pointer samples = InputListSampleType::New();
-  TargetListSampleType::Pointer labels = TargetListSampleType::New();
-
-  if(!otb::ReadDataFile(argv[1],samples,labels))
-    {
-    std::cout<<"Failed to read samples file "<<argv[1]<<std::endl;
-    return EXIT_FAILURE;
-    }
+  return otbGenericMachineLearningModel<RandomForestType>(argc,argv);
+}
 
+template <>
+void SetupModel(RandomForestType* model)
+{
   std::vector<float> priors(26,1.);
-
-
-  RandomForestType::Pointer classifier = RandomForestType::New();
-  classifier->SetInputListSample(samples);
-  classifier->SetTargetListSample(labels);
-
-  //set parameters
-  classifier->SetPriors(priors);
-  // classifier->SetMaxNumberOfTrees(30);
-  // classifier->SetMaxDepth(30);
-  // classifier->SetMaxNumberOfCategories(30);
-  // classifier->SetMaxNumberOfVariables(4);
-
-  classifier->Train();
-  classifier->Save(argv[2]);
-
-  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
-
-  cmCalculator->SetProducedLabels(predicted);
-  cmCalculator->SetReferenceLabels(labels);
-  cmCalculator->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl;
-  const float kappaIdx = cmCalculator->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl;
-
-  //Load Model to new RF
-  RandomForestType::Pointer classifierLoad = RandomForestType::New();
-
-  classifierLoad->Load(argv[2]);
-  TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
-
-  cmCalculatorLoad->SetProducedLabels(predictedLoad);
-  cmCalculatorLoad->SetReferenceLabels(labels);
-  cmCalculatorLoad->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
-  const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
-
-
-  if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001)
-    {
-    return EXIT_SUCCESS;
-    }
-  else
-    {
-    return EXIT_FAILURE;
-    }
+  model->SetPriors(priors);
 }
 
-
+using BoostType = otb::BoostMachineLearningModel<InputValueType, TargetValueType>;
 int otbBoostMachineLearningModel(int argc, char * argv[])
 {
-  if (argc != 3 )
-    {
-    std::cout<<"Wrong number of arguments "<<std::endl;
-    std::cout<<"Usage : sample file, output file "<<std::endl;
-    return EXIT_FAILURE;
-    }
-
-  typedef otb::BoostMachineLearningModel<InputValueType, TargetValueType> BoostType;
-
-  InputListSampleType::Pointer samples = InputListSampleType::New();
-  TargetListSampleType::Pointer labels = TargetListSampleType::New();
-
-  if(!otb::ReadDataFile(argv[1],samples,labels))
-    {
-    std::cout<<"Failed to read samples file "<<argv[1]<<std::endl;
-    return EXIT_FAILURE;
-    }
+  return otbGenericMachineLearningModel<BoostType>(argc,argv);
+}
 
+template <>
+void SetupModel(BoostType *model)
+{
   // Since otb::BoostMachineLearningModel ONLY handles 2-class classifications, then the
   // labels are split into 2 subsets: even (label = 1) and odd (label = 3) labels
+  TargetListSampleType::Pointer labels = model->GetTargetListSample();
   TargetSampleType currentLabel;
   for (unsigned itLabel = 0; itLabel < labels->Size(); ++itLabel)
     {
     currentLabel = labels->GetMeasurementVector(itLabel);
     labels->SetMeasurementVector(itLabel, (2 * (currentLabel[0] % 2)) + 1);
     }
-
-  BoostType::Pointer classifier = BoostType::New();
-  classifier->SetInputListSample(samples);
-  classifier->SetTargetListSample(labels);
-  classifier->Train();
-
-  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
-
-  classifier->Save(argv[2]);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
-
-  cmCalculator->SetProducedLabels(predicted);
-  cmCalculator->SetReferenceLabels(labels);
-  cmCalculator->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl;
-  const float kappaIdx = cmCalculator->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl;
-
-  //Load Model to new Boost model
-  BoostType::Pointer classifierLoad = BoostType::New();
-
-  classifierLoad->Load(argv[2]);
-  TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
-
-  cmCalculatorLoad->SetProducedLabels(predictedLoad);
-  cmCalculatorLoad->SetReferenceLabels(labels);
-  cmCalculatorLoad->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
-  const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
-
-
-  if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001)
-    {
-    return EXIT_SUCCESS;
-    }
-  else
-    {
-    return EXIT_FAILURE;
-    }
+  model->SetTargetListSample(labels);
 }
 
-
+using ANNType = otb::NeuralNetworkMachineLearningModel<InputValueType, TargetValueType>;
 int otbANNMachineLearningModel(int argc, char * argv[])
 {
-  if (argc != 3)
-    {
-      std::cout<<"Wrong number of arguments "<<std::endl;
-      std::cout<<"Usage : sample file, output file "<<std::endl;
-      return EXIT_FAILURE;
-    }
-
-
-  typedef otb::NeuralNetworkMachineLearningModel<InputValueType, TargetValueType> ANNType;
-  InputListSampleType::Pointer samples = InputListSampleType::New();
-  TargetListSampleType::Pointer labels = TargetListSampleType::New();
-
-  if (!otb::ReadDataFile(argv[1], samples, labels))
-    {
-    std::cout << "Failed to read samples file " << argv[1] << std::endl;
-    return EXIT_FAILURE;
-    }
+  return otbGenericMachineLearningModel<ANNType>(argc,argv);
+}
 
+template <>
+void SetupModel(ANNType* model)
+{
   std::vector<unsigned int> layerSizes;
   layerSizes.push_back(16);
   layerSizes.push_back(100);
   layerSizes.push_back(100);
   layerSizes.push_back(26);
-
-  ANNType::Pointer classifier = ANNType::New();
-  classifier->SetInputListSample(samples);
-  classifier->SetTargetListSample(labels);
-  classifier->SetLayerSizes(layerSizes);
-  /*classifier->SetTrainMethod(CvANN_MLP_TrainParams::RPROP);
-  classifier->SetRegPropDW0(0.1);
-  classifier->SetRegPropDWMin(0.1);
-  classifier->SetTermCriteriaType(CV_TERMCRIT_ITER);
-  classifier->SetMaxIter(300);
-  classifier->SetEpsilon(0.01); */
-  classifier->Train();
-
-  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
-
-  cmCalculator->SetProducedLabels(predicted);
-  cmCalculator->SetReferenceLabels(labels);
-  cmCalculator->Compute();
-
-  std::cout << "Confusion matrix: " << std::endl;
-  std::cout << cmCalculator->GetConfusionMatrix() << std::endl;
-  const float kappaIdx = cmCalculator->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
-  std::cout << "Overall Accuracy: " << cmCalculator->GetOverallAccuracy() << std::endl;
-
-  classifier->Save(argv[2]);
-
-  //Load Model to new ANN
-  ANNType::Pointer classifierLoad = ANNType::New();
-
-  classifierLoad->Load(argv[2]);
-  TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
-
-  cmCalculatorLoad->SetProducedLabels(predictedLoad);
-  cmCalculatorLoad->SetReferenceLabels(labels);
-  cmCalculatorLoad->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
-  const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
-
-
-  if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001)
-    {
-    return EXIT_SUCCESS;
-    }
-  else
-    {
-    return EXIT_FAILURE;
-    }
+  model->SetLayerSizes(layerSizes);
 }
 
-
+using NormalBayesType = otb::NormalBayesMachineLearningModel<InputValueType, TargetValueType>;
 int otbNormalBayesMachineLearningModel(int argc, char * argv[])
 {
-  if (argc != 3 )
-    {
-      std::cout<<"Wrong number of arguments "<<std::endl;
-      std::cout<<"Usage : sample file, output file "<<std::endl;
-      return EXIT_FAILURE;
-    }
-
-  typedef otb::NormalBayesMachineLearningModel<InputValueType, TargetValueType> NormalBayesType;
-
-  InputListSampleType::Pointer samples = InputListSampleType::New();
-  TargetListSampleType::Pointer labels = TargetListSampleType::New();
-
-  if(!otb::ReadDataFile(argv[1],samples,labels))
-    {
-    std::cout<<"Failed to read samples file "<<argv[1]<<std::endl;
-    return EXIT_FAILURE;
-    }
-
-  NormalBayesType::Pointer classifier = NormalBayesType::New();
-  classifier->SetInputListSample(samples);
-  classifier->SetTargetListSample(labels);
-  classifier->Train();
-
-  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
-
-  classifier->Save(argv[2]);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
-
-  cmCalculator->SetProducedLabels(predicted);
-  cmCalculator->SetReferenceLabels(labels);
-  cmCalculator->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl;
-  const float kappaIdx = cmCalculator->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl;
-
-  //Load Model to new Normal Bayes
-  NormalBayesType::Pointer classifierLoad = NormalBayesType::New();
-
-  classifierLoad->Load(argv[2]);
-  TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
-
-  cmCalculatorLoad->SetProducedLabels(predictedLoad);
-  cmCalculatorLoad->SetReferenceLabels(labels);
-  cmCalculatorLoad->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
-  const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
-
-
-  if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001)
-    {
-    return EXIT_SUCCESS;
-    }
-  else
-    {
-    return EXIT_FAILURE;
-    }
+  return otbGenericMachineLearningModel<NormalBayesType>(argc,argv);
 }
 
-
+using DecisionTreeType = otb::DecisionTreeMachineLearningModel<InputValueType, TargetValueType>;
 int otbDecisionTreeMachineLearningModel(int argc, char * argv[])
 {
-  if (argc != 3 )
-    {
-      std::cout<<"Wrong number of arguments "<<std::endl;
-      std::cout<<"Usage : sample file, output file "<<std::endl;
-      return EXIT_FAILURE;
-    }
-
-  typedef otb::DecisionTreeMachineLearningModel<InputValueType, TargetValueType> DecisionTreeType;
-
-  InputListSampleType::Pointer samples = InputListSampleType::New();
-  TargetListSampleType::Pointer labels = TargetListSampleType::New();
-
-  if(!otb::ReadDataFile(argv[1],samples,labels))
-    {
-    std::cout<<"Failed to read samples file "<<argv[1]<<std::endl;
-    return EXIT_FAILURE;
-    }
-
-  DecisionTreeType::Pointer classifier = DecisionTreeType::New();
-  classifier->SetInputListSample(samples);
-  classifier->SetTargetListSample(labels);
-  classifier->Train();
-
-  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
-
-  classifier->Save(argv[2]);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
-
-  cmCalculator->SetProducedLabels(predicted);
-  cmCalculator->SetReferenceLabels(labels);
-  cmCalculator->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl;
-  const float kappaIdx = cmCalculator->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl;
-
-  //Load Model to new Decision Tree
-  DecisionTreeType::Pointer classifierLoad = DecisionTreeType::New();
-
-  classifierLoad->Load(argv[2]);
-  TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
-
-  cmCalculatorLoad->SetProducedLabels(predictedLoad);
-  cmCalculatorLoad->SetReferenceLabels(labels);
-  cmCalculatorLoad->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
-  const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
-
-
-  if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001)
-    {
-    return EXIT_SUCCESS;
-    }
-  else
-    {
-    return EXIT_FAILURE;
-    }
+  return otbGenericMachineLearningModel<DecisionTreeType>(argc,argv);
 }
-
 #endif
 
+// -------------------------- Shark --------------------------------------------
 #ifdef OTB_USE_SHARK
-#include <chrono> // If shark is on, then we are using c++11
-
 #include "otbSharkRandomForestsMachineLearningModel.h"
 
+using SharkRandomForestType = otb::SharkRandomForestsMachineLearningModel<InputValueType,TargetValueType>;
 int otbSharkRFMachineLearningModel(int argc, char * argv[])
 {
-  if (argc != 3 )
-    {
-    std::cout<<"Wrong number of arguments "<<std::endl;
-    std::cout<<"Usage : sample file, output file "<<std::endl;
-    return EXIT_FAILURE;
-    }
-
-  typedef otb::SharkRandomForestsMachineLearningModel<InputValueType,TargetValueType> RandomForestType;
-  InputListSampleType::Pointer samples = InputListSampleType::New();
-  TargetListSampleType::Pointer labels = TargetListSampleType::New();
-
-  if(!otb::ReadDataFile(argv[1],samples,labels))
-    {
-    std::cout<<"Failed to read samples file "<<argv[1]<<std::endl;
-    return EXIT_FAILURE;
-    }
-
-
-  RandomForestType::Pointer classifier = RandomForestType::New();
-  classifier->SetInputListSample(samples);
-  classifier->SetTargetListSample(labels);
-  classifier->SetRegressionMode(false);
-  classifier->SetNumberOfTrees(100);
-  classifier->SetMTry(0);
-  classifier->SetNodeSize(25);
-  classifier->SetOobRatio(0.3);
-  std::cout << "Train\n";
-  classifier->Train();
-  std::cout << "Save\n";
-  classifier->Save(argv[2]);
-
-  std::cout << "Predict\n";
-  TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL);
-
-  ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New();
-
-  cmCalculator->SetProducedLabels(predicted);
-  cmCalculator->SetReferenceLabels(labels);
-  cmCalculator->Compute();
-
-  std::cout<<"Confusion matrix: "<<std::endl;
-  std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl;
-  const float kappaIdx = cmCalculator->GetKappaIndex();
-  std::cout<<"Kappa: "<<kappaIdx<<std::endl;
-  std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl;
-
-  // //Predict single samples. Written for benchmarking purposes, but
-  // too long for regression testing
-  // std::cout << "Predict single samples\n";
-  // auto sIt = samples->Begin();
-  // auto lIt = labels->Begin();
-  // auto start = std::chrono::system_clock::now();
-  // for(; sIt != samples->End(); ++sIt, ++lIt)
-  //   {
-  //   classifier->Predict(sIt.GetMeasurementVector())[0];
-  //   }
-  // auto duration = std::chrono::duration_cast< TimeT>
-  //   (std::chrono::system_clock::now() - start);
-  // auto elapsed = duration.count();
-  // std::cout << "Predict took " << elapsed << " ms\n";
-  //  std::cout << "Single sample OA = " << oa << '\n';
-//Load Model to new RF
-  RandomForestType::Pointer classifierLoad = RandomForestType::New();
-
-  std::cout << "Load\n";
-  classifierLoad->Load(argv[2]);
-  auto start = std::chrono::system_clock::now();
-  std::cout << "Predict loaded\n";
-  TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL);
-  using TimeT = std::chrono::milliseconds;
-  auto duration = std::chrono::duration_cast< TimeT>
-    (std::chrono::system_clock::now() - start);
-  auto elapsed = duration.count();
-  std::cout << "PredictBatch took " << elapsed << " ms\n";
-  ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New();
-
-   cmCalculatorLoad->SetProducedLabels(predictedLoad);
-   cmCalculatorLoad->SetReferenceLabels(labels);
-   cmCalculatorLoad->Compute();
-
-   std::cout<<"Confusion matrix: "<<std::endl;
-   std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl;
-   const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex();
-   std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl;
-   std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl;
-
-
-   if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001)
-     {
-     return EXIT_SUCCESS;
-     }
-   else
-     {
-     return EXIT_FAILURE;
-     }
-
-   return EXIT_SUCCESS;
+  return otbGenericMachineLearningModel<SharkRandomForestType>(argc,argv);
 }
 
-
+template <>
+void SetupModel(SharkRandomForestType* model)
+{
+  model->SetRegressionMode(false);
+  model->SetNumberOfTrees(100);
+  model->SetMTry(0);
+  model->SetNodeSize(25);
+  model->SetOobRatio(0.3);
+}
 #endif
diff --git a/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.h b/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.h
index 77e8691cf6eb6298639156171113bec261d0e6de..69574043779cf5b6144a34f5b6e446721047ec2e 100644
--- a/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.h
+++ b/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.h
@@ -48,6 +48,7 @@
 #include "shark/Models/Clustering/Centroids.h"
 #include "shark/Models/Clustering/ClusteringModel.h"
 #include "shark/Algorithms/KMeans.h"
+#include "shark/Models/Normalizer.h"
 
 #if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic pop
@@ -124,9 +125,14 @@ public:
   /** Set the number of class for the kMeans algorithm.*/
   itkSetMacro( K, unsigned );
 
-  /** If true, normalized input data sample list */
-  itkGetMacro( Normalized, bool );
-  itkSetMacro( Normalized, bool );
+  /** Initialize the centroids for the kmeans algorithm */
+  void SetCentroidsFromData(const shark::Data<shark::RealVector>& data)
+  {
+    m_Centroids.setCentroids(data);
+    this->Modified();
+  }
+
+  void ExportCentroids(const std::string& filename);
 
 protected:
   /** Constructor */
@@ -142,9 +148,6 @@ protected:
   virtual void DoPredictBatch(const InputListSampleType *, const unsigned int &startIndex, const unsigned int &size,
                               TargetListSampleType *, ConfidenceListSampleType * = nullptr, ProbaListSampleType * = nullptr) const override;
 
-  template<typename DataType>
-  DataType NormalizeData(const DataType &data) const;
-
   /** PrintSelf method */
   void PrintSelf(std::ostream &os, itk::Indent indent) const override;
 
@@ -153,16 +156,13 @@ private:
   void operator=(const Self &) = delete;
 
   // Parameters set by the user
-  bool m_Normalized;
   unsigned int m_K;
   unsigned int m_MaximumNumberOfIterations;
   bool m_CanRead;
 
-
   /** Centroids results form kMeans */
   shark::Centroids m_Centroids;
 
-
   /** shark Model could be SoftClusteringModel or HardClusteringModel */
   boost::shared_ptr<ClusteringModelType> m_ClusteringModel;
 
diff --git a/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.hxx b/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.hxx
index 3838d38aaa5e56bd4f69531711a7d6e1f45cc880..6554c67d318439e7f3d2f1560f9aa1eda5661957 100644
--- a/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.hxx
+++ b/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.hxx
@@ -35,11 +35,10 @@
 
 #include "otb_shark.h"
 #include "otbSharkUtils.h"
-#include "shark/Algorithms/Trainers/NormalizeComponentsUnitVariance.h" //normalize
 #include "shark/Algorithms/KMeans.h" //k-means algorithm
 #include "shark/Models/Clustering/HardClusteringModel.h"
 #include "shark/Models/Clustering/SoftClusteringModel.h"
-#include "shark/Algorithms/Trainers/NormalizeComponentsUnitVariance.h"
+#include <shark/Data/Csv.h> //load the csv file
 
 #if defined(__GNUC__) || defined(__clang__)
 #pragma GCC diagnostic pop
@@ -52,7 +51,7 @@ namespace otb
 template<class TInputValue, class TOutputValue>
 SharkKMeansMachineLearningModel<TInputValue, TOutputValue>
 ::SharkKMeansMachineLearningModel() :
-        m_Normalized( false ), m_K(2), m_MaximumNumberOfIterations( 10 )
+        m_K(2), m_MaximumNumberOfIterations( 10 )
 {
   // Default set HardClusteringModel
   this->m_ConfidenceIndex = true;
@@ -77,27 +76,11 @@ SharkKMeansMachineLearningModel<TInputValue, TOutputValue>
   otb::Shark::ListSampleToSharkVector( this->GetInputListSample(), vector_data );
   shark::Data<shark::RealVector> data = shark::createDataFromRange( vector_data );
 
-  // Normalized input value if necessary
-  if( m_Normalized )
-    data = NormalizeData( data );
-
   // Use a Hard Clustering Model for classification
   shark::kMeans( data, m_K, m_Centroids, m_MaximumNumberOfIterations );
   m_ClusteringModel = boost::make_shared<ClusteringModelType>( &m_Centroids );
 }
 
-template<class TInputValue, class TOutputValue>
-template<typename DataType>
-DataType
-SharkKMeansMachineLearningModel<TInputValue, TOutputValue>
-::NormalizeData(const DataType &data) const
-{
-  shark::Normalizer<> normalizer;
-  shark::NormalizeComponentsUnitVariance<> normalizingTrainer( true );//zero mean
-  normalizingTrainer.train( normalizer, data );
-  return normalizer( data );
-}
-
 template<class TInputValue, class TOutputValue>
 typename SharkKMeansMachineLearningModel<TInputValue, TOutputValue>
 ::TargetSampleType
@@ -258,6 +241,14 @@ SharkKMeansMachineLearningModel<TInputValue, TOutputValue>
   return true;
 }
 
+template<class TInputValue, class TOutputValue>
+void
+SharkKMeansMachineLearningModel<TInputValue, TOutputValue>
+::ExportCentroids(const std::string & filename)
+{
+  shark::exportCSV(m_Centroids.centroids(), filename, ' ');
+}
+
 template<class TInputValue, class TOutputValue>
 void
 SharkKMeansMachineLearningModel<TInputValue, TOutputValue>
diff --git a/Modules/OBIA/RCC8/CMakeLists.txt b/Modules/OBIA/RCC8/CMakeLists.txt
deleted file mode 100644
index 6fca751fa59c10469a9a3699bad9ee2b893dcd8b..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/CMakeLists.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-project(OTBRCC8)
-
-set(OTBRCC8_LIBRARIES OTBRCC8)
-otb_module_impl()
diff --git a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h b/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h
deleted file mode 100644
index 9169b4ecd88b7b116268d4e70297078ddd320348..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageListToRCC8GraphFilter_h
-#define otbImageListToRCC8GraphFilter_h
-
-#include "otbRCC8GraphSource.h"
-#include "otbImageList.h"
-
-namespace otb
-{
-/** \class ImageListToRCC8GraphFilter
- * \brief Base class for filters taking an images list as input to
- * produce a RCC8 graph.
- *
- * \ingroup OTBRCC8
- */
-template <class TInputImage, class TOutputGraph>
-class ITK_EXPORT ImageListToRCC8GraphFilter
-  : public RCC8GraphSource<TOutputGraph>
-{
-public:
-  /** Standard typedefs */
-  typedef ImageListToRCC8GraphFilter    Self;
-  typedef RCC8GraphSource<TOutputGraph> Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Type macro */
-  itkNewMacro(Self);
-  /** Creation through object factory macro */
-  itkTypeMacro(ImageListToRCC8GraphFilter, RCC8GraphSource);
-  /** Template input parameters typedefs */
-  typedef          TInputImage                      InputImageType;
-  typedef typename InputImageType::ConstPointer     InputImagePointer;
-  typedef typename InputImageType::RegionType       InputImageRegionType;
-  typedef typename InputImageType::PixelType        InputImagePixelType;
-  typedef typename InputImageType::SizeType         SizeType;
-  typedef typename InputImageType::ValueType        ValueType;
-  typedef ImageList<InputImageType>                 InputImageListType;
-  typedef typename InputImageListType::Pointer      InputImageListPointerType;
-  typedef typename InputImageListType::ConstPointer InputImageListConstPointer;
-  /** Template output parameters typedefs */
-  typedef TOutputGraph                                OutputGraphType;
-  typedef typename Superclass::OutputGraphPointerType OutputGraphPointerType;
-  typedef typename OutputGraphType::VertexType        VertexType;
-  typedef typename VertexType::Pointer                VertexPointerType;
-  typedef typename OutputGraphType::RCC8ValueType     RCC8ValueType;
-  /** InputImage dimension constant */
-  itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension);
-  /** Overriding the SetInput() and GetInput() methods */
-  using Superclass::SetInput;
-  virtual void SetInput(const InputImageListType * imageList);
-  virtual InputImageListType * GetInput(void);
-
-protected:
-  /** Constructor */
-  ImageListToRCC8GraphFilter();
-  /** Destructor */
-  ~ImageListToRCC8GraphFilter() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  ImageListToRCC8GraphFilter(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbImageListToRCC8GraphFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.hxx b/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.hxx
deleted file mode 100644
index cab322360e9c030331788328f1e7069c0dd3c63d..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.hxx
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageListToRCC8GraphFilter_hxx
-#define otbImageListToRCC8GraphFilter_hxx
-
-#include "otbImageListToRCC8GraphFilter.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputImage, class TOutputGraph>
-ImageListToRCC8GraphFilter<TInputImage, TOutputGraph>
-::ImageListToRCC8GraphFilter()
-{
-  this->SetNumberOfRequiredInputs(1);
-}
-/**
- * Input Connection
- * \param image The input image.
- */
-template <class TInputImage, class TOutputGraph>
-void
-ImageListToRCC8GraphFilter<TInputImage, TOutputGraph>
-::SetInput(const InputImageListType *imageList)
-{
-  // A single input image
-  this->itk::ProcessObject::SetNthInput(0, const_cast<InputImageListType*>(imageList));
-}
-/**
- * Input image retrieval
- * \return The input image.
- */
-template <class TInputImage, class TOutputGraph>
-typename ImageListToRCC8GraphFilter<TInputImage, TOutputGraph>::InputImageListType *
-ImageListToRCC8GraphFilter<TInputImage, TOutputGraph>
-::GetInput(void)
-{
-  // If there is no input
-  if (this->GetNumberOfInputs() < 1)
-    {
-    // exit
-    return nullptr;
-    }
-  // else return the first input
-  return static_cast<InputImageListType *>
-           (this->itk::ProcessObject::GetInput(0));
-}
-/**
- * PrintSelf Method
- */
-template <class TInputImage, class TOutputGraph>
-void
-ImageListToRCC8GraphFilter<TInputImage, TOutputGraph>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h b/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h
deleted file mode 100644
index 5c198e6720935e7699397a4132035b1b1a65f40f..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageMultiSegmentationToRCC8GraphFilter_h
-#define otbImageMultiSegmentationToRCC8GraphFilter_h
-
-#include "otbImageListToRCC8GraphFilter.h"
-
-namespace otb
-{
-/**
- * \class ImageMultiSegmentationToRCC8GraphFilter
- * \brief This class takes a list of labelled segmentation images
- * and build the RCC8 graph of the set of regions it represents.
- *
- * \ingroup OTBRCC8
- */
-template <class TInputImage, class TOutputGraph>
-class ITK_EXPORT ImageMultiSegmentationToRCC8GraphFilter
-  : public ImageListToRCC8GraphFilter<TInputImage, TOutputGraph>
-{
-public:
-  /** Standard class typedefs. */
-  typedef ImageMultiSegmentationToRCC8GraphFilter               Self;
-  typedef ImageListToRCC8GraphFilter<TInputImage, TOutputGraph> Superclass;
-  typedef itk::SmartPointer<Self>                               Pointer;
-  typedef itk::SmartPointer<const Self>                         ConstPointer;
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(ImageMultiSegmentationToRCC8GraphFilter, ImageListToRCC8GraphFilter);
-  /** Input related typedefs */
-  typedef TInputImage                                InputImageType;
-  typedef typename InputImageType::PixelType         PixelType;
-  typedef typename InputImageType::Pointer           InputImagePointerType;
-  typedef typename Superclass::InputImageListType    InputImageListType;
-  typedef typename InputImageListType::Pointer       InputImageListPointerType;
-  typedef typename InputImageListType::ConstIterator ConstListIteratorType;
-  /** Output related typedefs */
-  typedef TOutputGraph                                   OutputGraphType;
-  typedef typename OutputGraphType::Pointer              OutputGraphPointerType;
-  typedef typename OutputGraphType::VertexType           VertexType;
-  typedef typename VertexType::Pointer                   VertexPointerType;
-  typedef typename VertexType::PathType                  PathType;
-  typedef typename OutputGraphType::VertexDescriptorType VertexDescriptorType;
-  /** Knowledge enum typedef */
-  typedef typename OutputGraphType::RCC8ValueType      RCC8ValueType;
-  typedef enum {NO_INFO, LEVEL_1, LEVEL_3, FULL}       KnowledgeValueType;
-  typedef std::pair<KnowledgeValueType, RCC8ValueType> KnowledgeStateType;
-  /** Toogle optimisation flag */
-  itkBooleanMacro(Optimisation);
-  itkSetMacro(Optimisation, bool);
-
-  /**
-   * Get the number of occurrences of the given value
-   * \return The value.
-   */
-  unsigned int GetRelationsCount(RCC8ValueType val);
-
-  /**
-   * Get number of relations
-   * \return The number of relations.
-   */
-  unsigned int GetNumberOfRelations(void);
-
-protected:
-  /** Constructor */
-  ImageMultiSegmentationToRCC8GraphFilter();
-  /** Destructor */
-  ~ImageMultiSegmentationToRCC8GraphFilter() override;
-  /** Main computation method */
-  void GenerateData() override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /**
-   * Get the composition knowledge.
-   * \param r1 First RCC8 relation value,
-   * \param r2 Second RCC8 relation value,
-   * \return The knowledge associated with the composition.
-   */
-  KnowledgeStateType GetKnowledge(RCC8ValueType r1, RCC8ValueType r2);
-
-private:
-  /** Optimisation flag */
-  bool         m_Optimisation;
-  unsigned int m_Accumulator[8];
-
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbImageMultiSegmentationToRCC8GraphFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.hxx b/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.hxx
deleted file mode 100644
index 8b9906bc6b92547e7bf10d9696597b9ea6f8f296..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.hxx
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageMultiSegmentationToRCC8GraphFilter_hxx
-#define otbImageMultiSegmentationToRCC8GraphFilter_hxx
-
-#include "otbImageMultiSegmentationToRCC8GraphFilter.h"
-#include "itkMinimumMaximumImageCalculator.h"
-#include "otbPolygonToPolygonRCC8Calculator.h"
-#include "otbRCC8VertexIterator.h"
-#include "otbRCC8InEdgeIterator.h"
-#include "otbRCC8OutEdgeIterator.h"
-#include "itkProgressReporter.h"
-#include "otbImageToEdgePathFilter.h"
-#include "otbSimplifyPathListFilter.h"
-
-namespace otb
-{
-/**
- * Constructor.
- */
-template <class TInputImage, class TOutputGraph>
-ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph>
-::ImageMultiSegmentationToRCC8GraphFilter()
-{
-  m_Optimisation = false;
-}
-/**
- * Destructor.
- */
-template <class TInputImage, class TOutputGraph>
-ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph>
-::~ImageMultiSegmentationToRCC8GraphFilter()
-{}
-
-template <class TInputImage, class TOutputGraph>
-unsigned int
-ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph>
-::GetRelationsCount(RCC8ValueType val)
-{
-  return m_Accumulator[val];
-}
-
-template <class TInputImage, class TOutputGraph>
-unsigned int
-ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph>
-::GetNumberOfRelations()
-{
-  unsigned int result = 0;
-  for (unsigned int i = 0; i < 8; ++i)
-    {
-    result += m_Accumulator[i];
-
-    }
-  return result;
-}
-template <class TInputImage, class TOutputGraph>
-typename ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph>
-::KnowledgeStateType
-ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph>
-::GetKnowledge(RCC8ValueType r1, RCC8ValueType r2)
-{
-  m_Accumulator[0] = 0;
-  m_Accumulator[1] = 0;
-  m_Accumulator[2] = 0;
-  m_Accumulator[3] = 0;
-  m_Accumulator[4] = 0;
-  m_Accumulator[5] = 0;
-  m_Accumulator[6] = 0;
-  m_Accumulator[7] = 0;
-
-  // otbMsgDebugMacro(<<"RCC8GraphFilter: entering GetKnowledge method.");
-  // This is the RCC8 composition table
-  const int knowledge[8][8]
-    =
-    {
-    /**         DC  EC  PO TPP TPPi NTPP i  EQ */
-    /** DC */ {-3, -2, -2, -2,  0, -2,  0,  0},
-    /** EC  */ {-1, -3, -2, -3, -1, -3,  0,  1},
-    /** PO  */ {-1, -1, -3, -3, -1, -3, -1,  2},
-    /** TPP */ { 0, -1, -2, -3, -3,  5, -1,  3},
-    /** TPPi*/ {-1, -1, -1, -3, -1, -3,  6,  4},
-    /** NTPP*/ { 0,  0, -2,  5, -2,  5, -3,  5},
-    /** NTPPi*/ {-1, -1, -1, -1,  6, -3,  6,  6},
-    /** EQ  */ { 0,  1,  2,  3,  4,  5,  6,  7}
-    };
-
-  int value = knowledge[r1][r2];
-  // Each negative case correspond to a level of knowledge
-  if (value >= 0)
-    {
-    // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method: FULL");
-    return KnowledgeStateType(FULL, static_cast<RCC8ValueType>(value));
-    }
-  else if (value == -1)
-    {
-    // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method: LEVEL_1");
-    return KnowledgeStateType(LEVEL_1, OTB_RCC8_DC);
-    }
-  else if (value == -2)
-    {
-    // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method.LEVEL_3");
-    return KnowledgeStateType(LEVEL_3, OTB_RCC8_DC);
-    }
-  else
-    {
-    // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method.NO_INFO");
-    return KnowledgeStateType(NO_INFO, OTB_RCC8_DC);
-    }
-}
-/**
- * Main computation method.
- */
-template <class TInputImage, class TOutputGraph>
-void
-ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph>
-::GenerateData()
-{
-  // Input image list pointer
-  InputImageListPointerType segList = this->GetInput();
-
-  // Output graph pointer
-  OutputGraphPointerType graph = this->GetOutput();
-
-  // invert value vector
-  RCC8ValueType invert[8] = {OTB_RCC8_DC, OTB_RCC8_EC, OTB_RCC8_PO, OTB_RCC8_TPPI,
-                             OTB_RCC8_TPP, OTB_RCC8_NTPPI, OTB_RCC8_NTPP, OTB_RCC8_EQ};
-
-  // Some typedefs
-  typedef otb::ImageToEdgePathFilter<InputImageType, PathType> EdgeExtractionFilterType;
-  typedef otb::SimplifyPathListFilter<PathType>                SimplifyPathFilterType;
-  typedef typename SimplifyPathFilterType::InputListType       PathListType;
-
-  typedef itk::MinimumMaximumImageCalculator<InputImageType> MinMaxCalculatorType;
-  typedef PolygonToPolygonRCC8Calculator<PathType>           RCC8CalculatorType;
-  typedef RCC8VertexIterator<OutputGraphType>                VertexIteratorType;
-  typedef RCC8InEdgeIterator<OutputGraphType>                InEdgeIteratorType;
-
-
-  // Vector of label
-  std::vector<PixelType> maxLabelVector;
-
-  // Vertex indexes
-  unsigned int vertexIndex = 0;
-  unsigned int segmentationImageIndex = 0;
-  unsigned int nbVertices = 0;
-
-  // For each segmentation image
-  for (ConstListIteratorType it = segList->Begin(); it != segList->End(); ++it)
-    {
-    // Compute the maximum label
-    typename MinMaxCalculatorType::Pointer minMax = MinMaxCalculatorType::New();
-    minMax->SetImage(it.Get());
-    minMax->ComputeMaximum();
-    maxLabelVector.push_back(minMax->GetMaximum());
-    otbMsgDebugMacro(<< "Number of objects in image " << segmentationImageIndex << ": "
-                     << minMax->GetMaximum());
-
-    // then for each region of the images
-    for (PixelType label = 1; label <= maxLabelVector.back(); ++label)
-      {
-      typename PathListType::Pointer             region = PathListType::New();
-      typename EdgeExtractionFilterType::Pointer extraction = EdgeExtractionFilterType::New();
-      extraction->SetInput(it.Get());
-      extraction->SetForegroundValue(label);
-      extraction->Update();
-      region->PushBack(extraction->GetOutput());
-      typename SimplifyPathFilterType::Pointer simplifier = SimplifyPathFilterType::New();
-      simplifier->SetInput(region);
-      simplifier->GetFunctor().SetTolerance(0.1);
-      simplifier->Update();
-
-      // Create a new vertex
-      VertexPointerType vertex = VertexType::New();
-      // Set its properties
-      vertex->SetPath(simplifier->GetOutput()->GetNthElement(0));
-      vertex->SetSegmentationLevel(segmentationImageIndex / 2);
-      vertex->SetSegmentationType(segmentationImageIndex % 2);
-      // Put it in the graph
-      graph->SetVertex(vertexIndex, vertex);
-      ++vertexIndex;
-      ++nbVertices;
-      }
-    ++segmentationImageIndex;
-    }
-
-  itk::ProgressReporter progress(this, 0, nbVertices*nbVertices);
-
-  VertexIteratorType vIt1(graph);
-  VertexIteratorType vIt2(graph);
-
-  // For each couple of vertices
-  for (vIt1.GoToBegin(); !vIt1.IsAtEnd(); ++vIt1)
-    {
-    for (vIt2.GoToBegin(); !vIt2.IsAtEnd(); ++vIt2)
-      {
-      //We do not examine each couple because of the RCC8 symmetry
-      if (vIt1.GetIndex() < vIt2.GetIndex())
-        {
-
-        // Compute the RCC8 relation
-        typename RCC8CalculatorType::Pointer calc = RCC8CalculatorType::New();
-        calc->SetPolygon1(vIt1.Get()->GetPath());
-        calc->SetPolygon2(vIt2.Get()->GetPath());
-        RCC8ValueType value = OTB_RCC8_DC;
-
-        // if the optimisations are activated
-        if (m_Optimisation)
-          {
-          //  otbMsgDebugMacro(<<"RCC8GraphFilter: Entering optimisation loop");
-          InEdgeIteratorType inIt1(vIt1.GetIndex(), graph);
-          InEdgeIteratorType inIt2(vIt2.GetIndex(), graph);
-          // otbMsgDebugMacro(<<"Optimisation loop: iterators initialised");
-          VertexDescriptorType betweenIndex;
-          KnowledgeStateType know(NO_INFO, OTB_RCC8_DC);
-          inIt1.GoToBegin();
-
-          // Iterate through the edges going to the first vertex
-          while (!inIt1.IsAtEnd() && (know.first != FULL))
-            {
-            betweenIndex = inIt1.GetSourceIndex();
-            inIt2.GoToBegin();
-            bool edgeFound = false;
-            while (!inIt2.IsAtEnd() && (know.first != FULL))
-              {
-              // try to find an intermediate vertex between the two ones which
-              // we vant to compute the relationship
-              if (inIt2.GetSourceIndex() == betweenIndex)
-                {
-                // if an intermediate vertex is found
-                edgeFound = true;
-                // otbMsgDebugMacro(<<"Optimisation loop: found an intermediary vertex:" <<betweenIndex);
-                // See if it brings some info on the RCCC8 value
-                know = GetKnowledge(invert[inIt1.GetValue()], inIt2.GetValue());
-                calc->SetLevel1APrioriKnowledge(know.first == LEVEL_1);
-                calc->SetLevel3APrioriKnowledge(know.first == LEVEL_3);
-                //  otbMsgDebugMacro(<<"Optimisation loop: knowledge: "<<know.first<<","<<know.second);
-                }
-              ++inIt2;
-              }
-            // If no intermediate was found
-            if (!edgeFound)
-              {
-              //  otbMsgDebugMacro(<<"Optimisation loop: found an intermediary vertex:" <<betweenIndex);
-              // Try using a DC relationship
-              know = GetKnowledge(invert[inIt1.GetValue()], OTB_RCC8_DC);
-              calc->SetLevel1APrioriKnowledge(know.first == LEVEL_1);
-              calc->SetLevel3APrioriKnowledge(know.first == LEVEL_3);
-              // otbMsgDebugMacro(<<"Optimisation loop: knowledge: "<<know.first<<","<<know.second);
-              }
-            ++inIt1;
-            }
-          // If the search has fully determined the RCC8
-          if (know.first == FULL)
-            {
-            // Get the value
-            value = know.second;
-            }
-          else
-            {
-            // Else trigger the computation
-            // (which will take the optimisation phase info into account)
-            calc->Compute();
-            value = calc->GetValue();
-            }
-          // otbMsgDebugMacro(<<"RCC8GraphFilter: Leaving optimisation loop");
-          }
-        // If the optimisations are not activated
-        else
-          {
-          calc->Compute();
-          value = calc->GetValue();
-          }
-        m_Accumulator[value] += 1;
-        m_Accumulator[invert[value]] += 1;
-        // If the vertices are connected
-        if (value > OTB_RCC8_DC)
-          {
-          // Add the edge to the graph.
-          otbMsgDevMacro(<< "Adding edge: " << vIt1.GetIndex() << " -> " << vIt2.GetIndex() << ": " << value);
-          graph->AddEdge(vIt1.GetIndex(), vIt2.GetIndex(), value);
-          }
-        }
-      progress.CompletedPixel();
-      progress.CompletedPixel();
-      }
-    }
-}
-
-template <class TInputImage, class TOutputGraph>
-void
-ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // end namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.h b/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.h
deleted file mode 100644
index d2a4fb922a0b22534b1ee8e10775c094be823ddf..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageToImageRCC8Calculator_h
-#define otbImageToImageRCC8Calculator_h
-
-#include "itkImageToImageFilter.h"
-#include "itkObjectFactory.h"
-#include "otbRCC8Value.h"
-#include "otbImage.h"
-
-namespace otb
-{
-/**
- * \class ImageToImageRCC8Calculator
- * \brief This class compute the RCC8 relation between the regions from two segmentation images.
- *
- * The RCC8 system comes from qualitative spatial reasoning.
- * It is a set of pairwise disjoint exhaustive relation between two closed region of space.
- * There are 8 possible relations :
- * DC: Disconnected
- * EC: Externaly connected
- * PO: Partial overlap
- * TPP: Tangential proper part
- * NTPP: Non tangential proper part
- * TPPI: Tangential proper part inverse
- * NTPPI: Non tangential proper part inverse
- * EQ: Equivalence
- *
- * The goal of this class is to determine which of these 8 relations link the two inputs regions represented
- * by the segmentation images. Since this class will further be used iteratively on a possibly large set
- * of region, it is optimised : the decision is managed by a decision tree, and the input data size is reduced
- * to the smallest set needed to determine the relation.
- *
- * \ingroup OTBRCC8
- */
-template <class TInputImage>
-class ITK_EXPORT ImageToImageRCC8Calculator : public itk::ImageToImageFilter<TInputImage, TInputImage>
-{
-public:
-  /** Standard class typedefs. */
-  typedef ImageToImageRCC8Calculator                        Self;
-  typedef itk::ImageToImageFilter<TInputImage, TInputImage> Superclass;
-  typedef itk::SmartPointer<Self>                           Pointer;
-  typedef itk::SmartPointer<const Self>                     ConstPointer;
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(ImageToImageRCC8Calculator, ImageToImageFilter);
-  /** Types definitions for the input image. */
-  typedef TInputImage                      ImageType;
-  typedef typename ImageType::Pointer      ImagePointerType;
-  typedef typename ImageType::ConstPointer ImageConstPointerType;
-  typedef typename ImageType::PixelType    PixelType;
-  typedef typename ImageType::IndexType    IndexType;
-  typedef typename ImageType::RegionType   RegionType;
-  /** Internal bool image type */
-  typedef bool                                                 BoolPixelType;
-  typedef otb::Image<BoolPixelType, ImageType::ImageDimension> BoolImageType;
-  typedef typename BoolImageType::Pointer                      BoolImagePointerType;
-
-  /** RCC8 values type */
-  typedef RCC8Value RCC8ValueType;
-  /**
-   * Get the RCC8 relation.
-   * \return The RCC8 relation value.
-   */
-  RCC8ValueType GetValue(void);
-  /**
-   * Set the first input image.
-   * \param image
-   */
-  void SetInput1(ImageType * image);
-  /**
-   * Set the second input image.
-   * \param image
-   */
-  void SetInput2(ImageType * image);
-  /**
-   * Get the first input image.
-   * \return The first input image.
-   */
-  ImageType * GetInput1(void);
-  /**
-   * Get the second input image.
-   * \return The second input image.
-   */
-  ImageType * GetInput2(void);
-  /** Set/Get the inside value of the region of image 1*/
-  itkSetMacro(InsideValue1, PixelType);
-  itkGetMacro(InsideValue1, PixelType);
-  /** Set/Get the inside value of the region of image 2*/
-  itkSetMacro(InsideValue2, PixelType);
-  itkGetMacro(InsideValue2, PixelType);
-  /** Set external knowledge to help the decision process */
-  itkSetMacro(Level1APrioriKnowledge, bool);
-  itkSetMacro(Level3APrioriKnowledge, bool);
-  itkGetMacro(Level1APrioriKnowledge, bool);
-  itkGetMacro(Level3APrioriKnowledge, bool);
-protected:
-  /** Constructor */
-  ImageToImageRCC8Calculator();
-  /** Destructor */
-  ~ImageToImageRCC8Calculator() override {}
-  /**
-   * Compute the minimal image region required.
-   * \return The minimal region required.
-   */
-  RegionType ComputeMinimalRegion(void);
-  /**
-   * Compute the intersection between regions edges.
-   * \return true if the intersection is not empty.
-   */
-  bool ComputeEdgeEdgeBool(void);
-  /**
-   * Compute the intersection between exterior of region1 and
-   * interior of region2.
-   * \return true if the intersection is not empty.
-   */
-  bool ComputeExterInterBool(void);
-  /**
-   * Compute the intersection between interior of region1 and
-   * exterior of region2.
-   * \return true if the intersection is not empty.
-   */
-  bool ComputeInterExterBool(void);
-  /**
-   * Compute the intersection between regions interiors.
-   * \return true if the intersection is not empty.
-   */
-  bool ComputeInterInterBool(void);
-  /**
-   * Compute the relation value from the input booleans. Please note
-   * that the actual computed value is set to the m_Value parameters, and has
-   * nothing to do with the returned boolean, which indicates if the determination
-   * process was successful.
-   * \param edgeEdgeBool True if edge-edge intersection is not empty.
-   * \param interExterBool True if interior-exterior intersection is not empty.
-   * \param exterInterBool True if exterior-interior intersection is not empty.
-   * \return True if the decision process was successful.
-   */
-  bool ComputeRelation(bool edgeEdgeBool, bool interExterBool, bool exterInterBool);
-  /**
-   * Test if the boolean image is totally black or not. This is a based on the lazy operator
-   * paradigm.
-   * \param image The image to test.
-   * \return True or false.
-   */
-  bool IsBoolImageNotEmpty(BoolImagePointerType image);
-  /**
-   * Compute a bool image of minimal ROI size, surrounded by a false padding, and corresponding
-   * to the input image.
-   * \param image The image to convert.
-   * \param insideValue The inside value.
-   * \return The converted image
-   */
-  BoolImagePointerType ConvertToBoolImage(ImagePointerType image, PixelType insideValue);
-  /** Main computation method */
-  void GenerateData(void) override;
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  /** The RCC8 relation value */
-  RCC8ValueType m_Value;
-  /** The minimal ROI needed to compute the relation value */
-  RegionType m_MinimalROI;
-  /**  Decision tree Level 1 A priori knowledge */
-  bool m_Level1APrioriKnowledge;
-  /**  Decision tree Level 3 A priori knowledge */
-  bool m_Level3APrioriKnowledge;
-  /** Inside value 1 */
-  PixelType m_InsideValue1;
-  /** Inside value 2 */
-  PixelType m_InsideValue2;
-  /** Internal bool image representation*/
-  BoolImagePointerType m_BoolImage1;
-  BoolImagePointerType m_BoolImage2;
-};
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbImageToImageRCC8Calculator.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.hxx b/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.hxx
deleted file mode 100644
index decd905bf7c446e19bfd0206bea0e59bd43e77ed..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.hxx
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbImageToImageRCC8Calculator_hxx
-#define otbImageToImageRCC8Calculator_hxx
-
-#include "otbImageToImageRCC8Calculator.h"
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkBinaryDilateImageFilter.h"
-#include "itkBinaryBallStructuringElement.h"
-#include "itkInvertIntensityImageFilter.h"
-#include "itkSubtractImageFilter.h"
-#include "itkAndImageFilter.h"
-#include "itkImageRegionIterator.h"
-#include "otbBinaryImageMinimalBoundingRegionCalculator.h"
-#include "otbMacro.h"
-
-//TODELETE  #include "otbImageFileWriter.h"
-//TODELETE  #include "itkCastImageFilter.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template<class TInputImage>
-ImageToImageRCC8Calculator<TInputImage>
-::ImageToImageRCC8Calculator()
-{
-  m_Value        = OTB_RCC8_DC;
-  m_InsideValue1  = static_cast<PixelType>(255);
-  m_InsideValue2  = static_cast<PixelType>(255);
-  m_Level1APrioriKnowledge = false;
-  m_Level3APrioriKnowledge = false;
-  this->SetNumberOfRequiredInputs(2);
-}
-/**
- * Set the first input image.
- * \param image
- */
-template<class TInputImage>
-void
-ImageToImageRCC8Calculator<TInputImage>
-::SetInput1(ImageType * image)
-{
-  this->SetNthInput(0, const_cast<ImageType *>(image));
-}
-/**
- * Set the second input image.
- * \param image
- */
-template<class TInputImage>
-void
-ImageToImageRCC8Calculator<TInputImage>
-::SetInput2(ImageType * image)
-{
-  this->SetNthInput(1, const_cast<ImageType *>(image));
-}
-/**
- * Get the first input image.
- * \return The first input image.
- */
-template<class TInputImage>
-typename ImageToImageRCC8Calculator<TInputImage>
-::ImageType*
-ImageToImageRCC8Calculator<TInputImage>
-::GetInput1(void)
-{
-  return dynamic_cast<ImageType*>(this->itk::ProcessObject::GetInput(0));
-}
-/**
- * Get the second input image.
- * \return The second input image.
- */
-template<class TInputImage>
-typename ImageToImageRCC8Calculator<TInputImage>
-::ImageType*
-ImageToImageRCC8Calculator<TInputImage>
-::GetInput2(void)
-{
-  return dynamic_cast<ImageType*>(this->itk::ProcessObject::GetInput(1));
-}
-/**
- * Get the RCC8 relation.
- * \return The RCC8 relation value.
- */
-template <class TInputImage>
-typename ImageToImageRCC8Calculator<TInputImage>
-::RCC8ValueType
-ImageToImageRCC8Calculator<TInputImage>
-::GetValue(void)
-{
-  return m_Value;
-}
-/**
- * Compute the minimal image region required.
- * \return The minimal region required.
- */
-template <class TInputImage>
-typename ImageToImageRCC8Calculator<TInputImage>
-::RegionType
-ImageToImageRCC8Calculator<TInputImage>
-::ComputeMinimalRegion(void)
-{
-  // Input images pointers
-  typename ImageType::Pointer    image1 = this->GetInput1();
-  typename ImageType::Pointer    image2 = this->GetInput2();
-  typename ImageType::RegionType region1, region2, region;
-  typedef otb::BinaryImageMinimalBoundingRegionCalculator<ImageType> RegionCalculator;
-  typename RegionCalculator::Pointer rc = RegionCalculator::New();
-  rc->SetInput(image1);
-  rc->SetPad(2);
-  rc->SetInsideValue(this->GetInsideValue1());
-  rc->Update();
-  region1 = rc->GetRegion();
-  rc = RegionCalculator::New();
-  rc->SetInput(image2);
-  rc->SetPad(2);
-  rc->SetInsideValue(this->GetInsideValue2());
-  rc->Update();
-  region2 = rc->GetRegion();
-  // otbMsgDebugMacro(<<"RCC8Calculator->ComputeMinimalRegion() Region1: index: "<<region1.GetIndex()<<" size: "<<region1.GetSize());
-  // otbMsgDebugMacro(<<"RCC8Calculator->ComputeMinimalRegion() Region2: index: "<<region2.GetIndex()<<" size: "<<region2.GetSize());
-
-  //TODELETE     std::cout<<"RCC8Calculator->ComputeMinimalRegion() Region1: index: "<<region1.GetIndex()<<" size: "<<region1.GetSize()<<std::endl;
-//TODELETE      std::cout<<"RCC8Calculator->ComputeMinimalRegion() Region2: index: "<<region2.GetIndex()<<" size: "<<region2.GetSize()<<std::endl;
-
-  typename ImageType::SizeType  size;
-  typename ImageType::IndexType index;
-
-  for (unsigned int i = 0; i < ImageType::ImageDimension; ++i)
-    {
-    index[i] = std::min(region1.GetIndex()[i], region2.GetIndex()[i]);
-    int potSize = std::max(region1.GetIndex()[i] + region1.GetSize()[i],
-                           region2.GetIndex()[i] + region2.GetSize()[i]);
-    size[i] = (potSize - index[i] < 0 ? 0 : potSize - index[i]);
-    }
-  region.SetIndex(index);
-  region.SetSize(size);
-  region.PadByRadius(2);
-  region.Crop(image1->GetLargestPossibleRegion());
-  region.Crop(image2->GetLargestPossibleRegion());
-  // otbMsgDebugMacro(<<"RCC8Calculator->ComputeMinimalRegion(): index: "<<index<<" size: "<<size);
-  //TODELETE   std::cout<<"RCC8Calculator->ComputeMinimalRegion(): index: "<<index<<" size: "<<size<<std::endl;
-  return region;
-}
-/**
- * Compute a bool image of minimal ROI size, surrounded by a false padding, and corresponding
- * to the input image.
- * \param image The image to convert.
- * \param insideValue The inside value.
- * \return The converted image
- */
-template<class TInputImage>
-typename ImageToImageRCC8Calculator<TInputImage>
-::BoolImagePointerType
-ImageToImageRCC8Calculator<TInputImage>
-::ConvertToBoolImage(ImagePointerType image, PixelType insideValue)
-{
-  typedef itk::ImageRegionConstIterator<ImageType> ConstIterator;
-  typedef itk::ImageRegionIterator<BoolImageType>  Iterator;
-  typename BoolImageType::Pointer  output = BoolImageType::New();
-  typename BoolImageType::SizeType boolImageSize;
-  boolImageSize[0] = m_MinimalROI.GetSize()[0] + 2;
-  boolImageSize[1] = m_MinimalROI.GetSize()[1] + 2;
-  typename BoolImageType::IndexType boolImageIndex;
-  boolImageIndex[0] = m_MinimalROI.GetIndex()[0] - 1;
-  boolImageIndex[1] = m_MinimalROI.GetIndex()[1] - 1;
-  //otbMsgDebugMacro(<<"RCC8Calculator->ConvertToBoolImage() size: "<<boolImageSize<<" index: "<<boolImageIndex);
-
-  typename BoolImageType::RegionType boolRegion;
-  boolRegion.SetSize(boolImageSize);
-  boolRegion.SetIndex(boolImageIndex);
-  output->SetRegions(boolRegion);
-  output->Allocate();
-  output->FillBuffer(false);
-
-  ConstIterator inputIt(image, m_MinimalROI);
-  Iterator outputIt(output, m_MinimalROI);
-  inputIt.GoToBegin();
-  outputIt.GoToBegin();
-  while (!inputIt.IsAtEnd() && !outputIt.IsAtEnd())
-    {
-    outputIt.Set(inputIt.Get() == insideValue);
-    ++inputIt;
-    ++outputIt;
-    }
-
-  return output;
-}
-/**
- * Compute the intersection between regions edges.
- * \return true if the intersection is not empty.
- */
-template<class TInputImage>
-bool
-ImageToImageRCC8Calculator<TInputImage>
-::ComputeEdgeEdgeBool(void)
-{
-
-  /// Definition of the Filters used to compute the boolean
-  typedef itk::SubtractImageFilter<BoolImageType, BoolImageType,
-      BoolImageType>
-  SubtractFilterType;
-  typedef itk::BinaryBallStructuringElement<bool,
-      BoolImageType::ImageDimension>
-  BinaryBallStructuringElementType;
-  typedef itk::BinaryDilateImageFilter<BoolImageType, BoolImageType, BinaryBallStructuringElementType> DilateFilterType;
-  typedef itk::AndImageFilter<BoolImageType, BoolImageType, BoolImageType>                             AndFilterType;
-  /// Declaration and instantiation
-  typename DilateFilterType::Pointer   dilateFilter1 = DilateFilterType::New();
-  typename DilateFilterType::Pointer   dilateFilter2 = DilateFilterType::New();
-  typename SubtractFilterType::Pointer subtractFilter1 = SubtractFilterType::New();
-  typename SubtractFilterType::Pointer subtractFilter2 = SubtractFilterType::New();
-  typename AndFilterType::Pointer      andFilter = AndFilterType::New();
-  /// Configuration of the erosion filter
-  BinaryBallStructuringElementType structElement1, structElement2;
-  structElement1.SetRadius(1);
-  structElement2.SetRadius(1);
-  structElement1.CreateStructuringElement();
-  structElement2.CreateStructuringElement();
-  dilateFilter1->SetKernel(structElement1);
-  dilateFilter2->SetKernel(structElement2);
-  /// The erosion is performed to get the surrounding edge of this
-  /// region by subtraction to the original image
-  dilateFilter1->SetInput(m_BoolImage1);
-  dilateFilter1->Update();
-  subtractFilter1->SetInput2(m_BoolImage1);
-  subtractFilter1->SetInput1(dilateFilter1->GetOutput());
-  subtractFilter1->Update();
-  /// The erosion is performed to get the surrounding edge of this
-  /// region by subtraction to the original image
-  dilateFilter2->SetInput(m_BoolImage2);
-  dilateFilter2->Update();
-  subtractFilter2->SetInput2(m_BoolImage2);
-  subtractFilter2->SetInput1(dilateFilter2->GetOutput());
-  subtractFilter2->Update();
-  /// Now we can compute the intersection between the 2 edges
-  andFilter->SetInput1(subtractFilter1->GetOutput());
-  andFilter->SetInput2(subtractFilter2->GetOutput());
-  andFilter->Update();
-  /// test if the intersection is empty or not
-  return this->IsBoolImageNotEmpty(andFilter->GetOutput());
-}
-/**
- * Compute the intersection between exterior of region1 and
- * interior of region2.
- * \return true if the intersection is not empty.
- */
-template<class TInputImage>
-bool
-ImageToImageRCC8Calculator<TInputImage>
-::ComputeExterInterBool(void)
-{
-  /// Definition of the filters used
-  typedef itk::InvertIntensityImageFilter<BoolImageType, BoolImageType>    InvertFilterType;
-  typedef itk::AndImageFilter<BoolImageType, BoolImageType, BoolImageType> AndFilterType;
-  /// Declaration and instantiation
-  typename InvertFilterType::Pointer invert = InvertFilterType::New();
-  typename AndFilterType::Pointer    andFilter = AndFilterType::New();
-  /// The exterior is the inverted input image
-  invert->SetMaximum(true);
-  invert->SetInput(m_BoolImage1);
-  andFilter->SetInput1(m_BoolImage2);
-  andFilter->SetInput2(invert->GetOutput());
-  andFilter->Update();
-  /// test if the intersection is empty or not
-  return IsBoolImageNotEmpty(andFilter->GetOutput());
-}
-/**
- * Compute the intersection between interior of region1 and
- * exterior of region2.
- * \return true if the intersection is not empty.
- */
-template<class TInputImage>
-bool
-ImageToImageRCC8Calculator<TInputImage>
-::ComputeInterExterBool(void)
-{
-  /// Definition of the filters used
-  typedef itk::InvertIntensityImageFilter<BoolImageType, BoolImageType>    InvertFilterType;
-  typedef itk::AndImageFilter<BoolImageType, BoolImageType, BoolImageType> AndFilterType;
-//TODELETE     typedef otb::Image<unsigned char, 2> TmpImageType;
-//TODELETE     typedef itk::CastImageFilter<BoolImageType, TmpImageType> CastFilterType;
-
-//TODELETE     typedef ImageFileWriter<TmpImageType> WriterType;
-/// Declaration and instantiation
-  typename InvertFilterType::Pointer invert = InvertFilterType::New();
-  typename AndFilterType::Pointer    andFilter = AndFilterType::New();
-  /// The exterior is the inverted input image
-  invert->SetMaximum(true);
-  invert->SetInput(m_BoolImage2);
-
-//TODELETE     typename CastFilterType::Pointer caster = CastFilterType::New();
-//TODELETE    caster->SetInput(invert->GetOutput());
-//TODELETE     typename WriterType::Pointer writer = WriterType::New();
-//TODELETE      writer->SetFileName("invert.tif");
-//TODELETE     writer->SetInput(caster->GetOutput());
-//TODELETE      writer->Update();
-
-  andFilter->SetInput1(m_BoolImage1);
-  andFilter->SetInput2(invert->GetOutput());
-  andFilter->Update();
-
-//TODELETE     caster = CastFilterType::New();
-//TODELETE     caster->SetInput(andFilter->GetOutput());
-//TODELETE     writer = WriterType::New();
-//TODELETE     writer->SetFileName("and.tif");
-//TODELETE     writer->SetInput(caster->GetOutput());
-//TODELETE     writer->Update();
-
-  /// test if the intersection is empty or not
-  return IsBoolImageNotEmpty(andFilter->GetOutput());
-}
-/**
- * Compute the intersection between regions interiors.
- * \return true if the intersection is not empty.
- */
-template<class TInputImage>
-bool
-ImageToImageRCC8Calculator<TInputImage>
-::ComputeInterInterBool(void)
-{
-  /// Definition of the filters used
-  typedef itk::AndImageFilter<BoolImageType, BoolImageType, BoolImageType> AndFilterType;
-
-  /// Declaration and instantiation
-  typename AndFilterType::Pointer andFilter = AndFilterType::New();
-  /// The exterior is the inverted input image
-  andFilter->SetInput1(m_BoolImage1);
-  andFilter->SetInput2(m_BoolImage2);
-  andFilter->Update();
-  /// test if the intersection is empty or not
-  return IsBoolImageNotEmpty(andFilter->GetOutput());
-}
-/**
- * Compute the relation value from the input booleans. Please note
- * that the actual computed value is set to the m_Value parameters, and has
- * nothing to do with the returned boolean, which indicates if the determination
- * process was successful.
- * \param edgeEdgeBool True if edge-edge intersection is not empty.
- * \param interExterBool True if interior-exterior intersection is not empty.
- * \param exterInterBool True if exterior-interior intersection is not empty.
- * \return True if the decision process was successful.
- */
-template<class TInputImage>
-bool
-ImageToImageRCC8Calculator<TInputImage>
-::ComputeRelation(bool edgeEdgeBool, bool interExterBool, bool exterInterBool)
-{
-  // otbMsgDebugMacro(<<"RCC8Calculator->ComputeRelation()");
-  // This decision process is based on a decision tree
-  if ((!interExterBool) && (edgeEdgeBool) && (!exterInterBool))
-    {
-    m_Value = OTB_RCC8_EQ;
-    return true;
-    }
-  else if ((!interExterBool) && (edgeEdgeBool) && (exterInterBool))
-    {
-    m_Value = OTB_RCC8_TPP;
-    return true;
-    }
-  else if ((interExterBool) && (!edgeEdgeBool) && (!exterInterBool))
-    {
-    m_Value = OTB_RCC8_NTPPI;
-    return true;
-    }
-  else if ((interExterBool) && (!edgeEdgeBool) && (exterInterBool))
-    {
-    m_Value = OTB_RCC8_DC;
-    return true;
-    }
-  else if ((interExterBool) && (edgeEdgeBool) && (!exterInterBool))
-    {
-    m_Value = OTB_RCC8_TPPI;
-    return true;
-    }
-  else
-    {
-    return false;
-    }
-}
-/**
- * Test if the boolean image is totally black or not. This is a based on the lazy operator
- * paradigm.
- * \param image The image to test.
- * \return True or false.
- */
-template<class TInputImage>
-bool
-ImageToImageRCC8Calculator<TInputImage>
-::IsBoolImageNotEmpty(BoolImagePointerType image)
-{
-  typedef itk::ImageRegionConstIterator<BoolImageType> IteratorType;
-  // TODO : we'll eventually need to change something.
-  IteratorType it(image, image->GetLargestPossibleRegion());
-  it.GoToBegin();
-  while (!it.IsAtEnd())
-    {
-    if (it.Get())
-      {
-      return true;
-      }
-    ++it;
-    }
-  return false;
-}
-/**
- * Main computation method.
- */
-template <class TInputImage>
-void
-ImageToImageRCC8Calculator<TInputImage>
-::GenerateData(void)
-{
-  // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData()");
-  /// First we compute the minimal region of interest we will use for the relation computation
-  m_MinimalROI = this->ComputeMinimalRegion();
-  /// If they are disjoint, the answer is trivial
-  if ((m_MinimalROI.GetSize()[0] <= 1) || (m_MinimalROI.GetSize()[1] <= 1))
-    {
-    /// The relation is DC
-    m_Value = OTB_RCC8_DC;
-    // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): Disjoint regions");
-    }
-  else
-    {
-    /// else each input images is cast to boolean type and reduced to
-    // the minimal region
-    m_BoolImage1 = ConvertToBoolImage(this->GetInput1(), m_InsideValue1);
-    m_BoolImage2 = ConvertToBoolImage(this->GetInput2(), m_InsideValue2);
-    // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): Bool images computed: "<<m_BoolImage1->GetLargestPossibleRegion().GetSize());
-    /// Then the boolean which will be used to determine the relation
-    /// are declared
-    bool edgeEdgeBool, interExterBool, exterInterBool, interInterBool;
-    /// The boolean edgeEdge is needed in each case, so it si computed
-    /// now
-    edgeEdgeBool = ComputeEdgeEdgeBool();
-    // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): edgeEdge "<<edgeEdgeBool);
-    //TODELETE  std::cout<<"RCC8Calculator->GenerateData(): edgeEdge "<<edgeEdgeBool<<std::endl;
-    /// Here comes the outside knowledge
-    if (this->GetLevel1APrioriKnowledge())
-      {
-      /// If the Level1APrioriKnowledge is set, then the
-      /// interExterBool is set to true
-      // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): Level1APrioriKnowledge.");
-      interExterBool = true;
-      }
-    else
-      {
-      /// Else it must be computed
-      interExterBool = ComputeInterExterBool();
-      // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): interExter "<<interExterBool);
-      }
-    /// At this stage we can determine if the relation is of type NTPP
-    //TODELETE  std::cout<<"RCC8Calculator->GenerateData(): interExter "<<interExterBool<<std::endl;
-    if ((!interExterBool) && (!edgeEdgeBool))
-      {
-      m_Value = OTB_RCC8_NTPP;
-      }
-    else
-      {
-      /// If not, we must consider the intersection between exterior
-      if (this->GetLevel3APrioriKnowledge())
-        {
-        /// If the Level3APRioriKnowledge flag is set, this boolean
-        /// can be determined from the two others
-        // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): Level3APrioriKnowledge.");
-        exterInterBool = true;
-        }
-      else
-        {
-        /// Else it must be computed
-        exterInterBool = ComputeExterInterBool();
-        // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): ExterInter "<<exterInterBool);
-        }
-      //TODELETE      std::cout<<"RCC8Calculator->GenerateData(): ExterInter "<<exterInterBool<<std::endl;
-      /// If it is not sufficient to compute the relation
-      if (!ComputeRelation(edgeEdgeBool, interExterBool, exterInterBool))
-        {
-        /// Compute the last boolean
-        interInterBool = ComputeInterInterBool();
-        //TODELETE    std::cout<<"RCC8Calculator->GenerateData(): InterInter "<<interInterBool<<std::endl;
-        // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): InterInter "<<interInterBool);
-        /// Which allow the full determination
-        if ((interExterBool) && (edgeEdgeBool) && (exterInterBool) && (!interInterBool))
-          {
-          m_Value = OTB_RCC8_EC;
-          }
-        else
-          {
-          m_Value = OTB_RCC8_PO;
-          }
-        }
-      }
-    }
-}
-/**
-* PrintSelf method
-*/
-template<class TInputImage>
-void
-ImageToImageRCC8Calculator<TInputImage>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-
-} // end namespace itk
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h b/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h
deleted file mode 100644
index 7c2d8175a3cccfa6282af5e58125269886fd980b..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbPolygonListToRCC8GraphFilter_h
-#define otbPolygonListToRCC8GraphFilter_h
-
-#include "otbRCC8GraphSource.h"
-#include "otbPolygonToPolygonRCC8Calculator.h"
-#include "otbRCC8VertexIterator.h"
-#include "otbRCC8InEdgeIterator.h"
-#include "otbRCC8OutEdgeIterator.h"
-
-namespace otb
-{
-/**
- * \class PolygonListToRCC8GraphFilter
- * \brief This class computes an RCC8 graph from a set of polygons.
- * \sa ImageMultiSegmentationToRCC8GraphFilter
- *
- * \ingroup OTBRCC8
- */
-template <class TPolygonList, class TOutputGraph>
-class ITK_EXPORT PolygonListToRCC8GraphFilter
-  : public RCC8GraphSource<TOutputGraph>
-{
-public:
-  /** Standard class typedefs. */
-  typedef PolygonListToRCC8GraphFilter  Self;
-  typedef RCC8GraphSource<TOutputGraph> Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(PolygonListToRCC8GraphFilter, RCC8GraphSource);
-
-  /** Input related typedef */
-  typedef TPolygonList                           PolygonListType;
-  typedef typename PolygonListType::ConstPointer PolygonListConstPointerType;
-  typedef typename PolygonListType::ObjectType   PolygonType;
-  typedef typename PolygonType::Pointer          PolygonPointerType;
-
-  /** Output related typedefs */
-  typedef TOutputGraph                                   OutputGraphType;
-  typedef typename OutputGraphType::Pointer              OutputGraphPointerType;
-  typedef typename OutputGraphType::VertexType           VertexType;
-  typedef typename VertexType::Pointer                   VertexPointerType;
-  typedef typename VertexType::PathType                  PathType;
-  typedef typename OutputGraphType::VertexDescriptorType VertexDescriptorType;
-
-  /** Knowledge enum typedef */
-  typedef typename OutputGraphType::RCC8ValueType      RCC8ValueType;
-  typedef enum {NO_INFO, LEVEL_1, LEVEL_3, FULL}       KnowledgeValueType;
-  typedef std::pair<KnowledgeValueType, RCC8ValueType> KnowledgeStateType;
-
-  /** RCC8 calculator typedef */
-  typedef PolygonToPolygonRCC8Calculator<PolygonType> RCC8CalculatorType;
-
-  /** Graph iterators typedefs */
-  typedef RCC8VertexIterator<OutputGraphType>  VertexIteratorType;
-  typedef RCC8InEdgeIterator<OutputGraphType>  InEdgeIteratorType;
-  typedef RCC8OutEdgeIterator<OutputGraphType> OutEdgeIteratorType;
-
-  typedef typename VertexIteratorType::VertexDescriptorType EdgePairElementType;
-  typedef std::pair<EdgePairElementType, EdgePairElementType> EdgePairType;
-  typedef std::map<EdgePairType, RCC8ValueType> EdgeMapType;
-  typedef std::vector<EdgeMapType>              EdgeMapVectorType;
-
-  typedef std::vector<unsigned int> SegmentationRangesType;
-
-  /** Toogle optimisation flag */
-  itkBooleanMacro(Optimisation);
-  itkSetMacro(Optimisation, bool);
-  itkBooleanMacro(UseInverted);
-  itkSetMacro(UseInverted, bool);
-
-  void SetSegmentationRanges(SegmentationRangesType ranges)
-  {
-    m_SegmentationRanges = ranges;
-  }
-
-  const SegmentationRangesType& GetSegmentationRanges() const
-  {
-    return m_SegmentationRanges;
-  }
-
-  /**
-   * Get the number of occurrences of the given value
-   * \return The value.
-   */
-  unsigned int GetRelationsCount(RCC8ValueType val);
-
-  /**
-   * Get number of relations
-   * \return The number of relations.
-   */
-  unsigned int GetNumberOfRelations(void);
-
-  using Superclass::SetInput;
-  /** Set the input of the filter */
-  virtual void SetInput(const PolygonListType *input);
-  /** Get the input of the filter */
-  const PolygonListType * GetInput(void);
-
-protected:
-  /** Constructor */
-  PolygonListToRCC8GraphFilter();
-  /** Destructor */
-  ~PolygonListToRCC8GraphFilter() override;
-  /** Main computation method */
-  void GenerateData() override;
-
-  /** Multi-threading implementation */
-
-  virtual void BeforeThreadedGenerateData();
-
-  virtual void AfterThreadedGenerateData();
-
-  /** startIndex and stopIndex represent the indices of the vertex to
-  examine in thread threadId */
-  virtual void ThreadedGenerateData(unsigned int startIndex, unsigned int stopIndex, itk::ThreadIdType threadId);
-
-  /** Static function used as a "callback" by the MultiThreader.  The threading
-   * library will call this routine for each thread, which will delegate the
-   * control to ThreadedGenerateData(). */
-  static ITK_THREAD_RETURN_TYPE ThreaderCallback(void *arg);
-
-  /** Internal structure used for passing image data into the threading library */
-  struct ThreadStruct
-  {
-    Pointer Filter;
-  };
-
-  /** End Multi-threading implementation */
-
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /**
-   * Get the composition knowledge.
-   * \param r1 First RCC8 relation value,
-   * \param r2 Second RCC8 relation value,
-   * \return The knowledge associated with the composition.
-   */
-  KnowledgeStateType GetKnowledge(RCC8ValueType r1, RCC8ValueType r2);
-
-private:
-  /** Optimisation flag */
-  bool              m_Optimisation;
-  unsigned int      m_Accumulator[8];
-  EdgeMapVectorType m_EdgesPerThread;
-
-  /** This array stores the indices corresponding to each segmentation */
-  SegmentationRangesType m_SegmentationRanges;
-
-  /** If set to true, the filter will also add the invert relationship
-    * between v2 and v1 */
-  bool m_UseInverted;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbPolygonListToRCC8GraphFilter.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.hxx b/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.hxx
deleted file mode 100644
index 10842bf64866a0753828b9cf23f056173dd90ee1..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.hxx
+++ /dev/null
@@ -1,460 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbPolygonListToRCC8GraphFilter_hxx
-#define otbPolygonListToRCC8GraphFilter_hxx
-
-#include "otbPolygonListToRCC8GraphFilter.h"
-#include "itkProgressReporter.h"
-
-namespace otb
-{
-/**
- * Constructor.
- */
-template <class TPolygonList, class TOutputGraph>
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::PolygonListToRCC8GraphFilter()
-{
-  this->SetNumberOfRequiredInputs(1);
-  m_Optimisation = false;
-  m_UseInverted = false;
-}
-/**
- * Destructor.
- */
-template <class TPolygonList, class TOutputGraph>
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::~PolygonListToRCC8GraphFilter()
-{}
-
-template <class TPolygonList, class TOutputGraph>
-void
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::SetInput(const PolygonListType *input)
-{
-  // Process object is not const-correct so the const_cast is required here
-  this->itk::ProcessObject::SetNthInput(0,
-                                        const_cast<PolygonListType *>(input));
-}
-
-template <class TPolygonList, class TOutputGraph>
-const typename PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>::PolygonListType *
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::GetInput(void)
-{
-  if (this->GetNumberOfInputs() < 1)
-    {
-    return nullptr;
-    }
-
-  return static_cast<const TPolygonList *>
-           (this->itk::ProcessObject::GetInput(0));
-}
-
-template <class TPolygonList, class TOutputGraph>
-unsigned int
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::GetRelationsCount(RCC8ValueType val)
-{
-  return m_Accumulator[val];
-}
-
-template <class TPolygonList, class TOutputGraph>
-unsigned int
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::GetNumberOfRelations()
-{
-  unsigned int result = 0;
-  for (unsigned int i = 0; i < 8; ++i)
-    {
-    result += m_Accumulator[i];
-
-    }
-  return result;
-}
-template <class TPolygonList, class TOutputGraph>
-typename PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::KnowledgeStateType
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::GetKnowledge(RCC8ValueType r1, RCC8ValueType r2)
-{
-  m_Accumulator[0] = 0;
-  m_Accumulator[1] = 0;
-  m_Accumulator[2] = 0;
-  m_Accumulator[3] = 0;
-  m_Accumulator[4] = 0;
-  m_Accumulator[5] = 0;
-  m_Accumulator[6] = 0;
-  m_Accumulator[7] = 0;
-
-  // otbMsgDebugMacro(<<"RCC8GraphFilter: entering GetKnowledge method.");
-  // This is the RCC8 composition table
-  const int knowledge[8][8]
-    =
-    {
-    /**         DC  EC  PO TPP TPPi NTPP i  EQ */
-    /** DC */ {-3, -2, -2, -2,  0, -2,  0,  0},
-    /** EC  */ {-1, -3, -2, -3, -1, -3,  0,  1},
-    /** PO  */ {-1, -1, -3, -3, -1, -3, -1,  2},
-    /** TPP */ { 0, -1, -2, -3, -3,  5, -1,  3},
-    /** TPPi*/ {-1, -1, -1, -3, -1, -3,  6,  4},
-    /** NTPP*/ { 0,  0, -2,  5, -2,  5, -3,  5},
-    /** NTPPi*/ {-1, -1, -1, -1,  6, -3,  6,  6},
-    /** EQ  */ { 0,  1,  2,  3,  4,  5,  6,  7}
-    };
-
-  int value = knowledge[r1][r2];
-  // Each negative case correspond to a level of knowledge
-  if (value >= 0)
-    {
-    // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method: FULL");
-    return KnowledgeStateType(FULL, static_cast<RCC8ValueType>(value));
-    }
-  else if (value == -1)
-    {
-    // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method: LEVEL_1");
-    return KnowledgeStateType(LEVEL_1, OTB_RCC8_DC);
-    }
-  else if (value == -2)
-    {
-    // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method.LEVEL_3");
-    return KnowledgeStateType(LEVEL_3, OTB_RCC8_DC);
-    }
-  else
-    {
-    // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method.NO_INFO");
-    return KnowledgeStateType(NO_INFO, OTB_RCC8_DC);
-    }
-}
-/**
- * Main computation method.
- */
-template <class TPolygonList, class TOutputGraph>
-void
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::GenerateData()
-{
-  // Call a method that can be overridden by a subclass to perform
-  // some calculations prior to splitting the main computations into
-  // separate threads
-  this->BeforeThreadedGenerateData();
-
-  // Set up the multithreaded processing
-  ThreadStruct str;
-  str.Filter = this;
-
-  // // Initializing edges vectors per thread
-  EdgeMapType defaultEdgeMap;
-  m_EdgesPerThread = EdgeMapVectorType(this->GetNumberOfThreads(), defaultEdgeMap);
-
-  // Setting up multithreader
-  this->GetMultiThreader()->SetNumberOfThreads(this->GetNumberOfThreads());
-  this->GetMultiThreader()->SetSingleMethod(this->ThreaderCallback, &str);
-
-  // multithread the execution
-  this->GetMultiThreader()->SingleMethodExecute();
-
-  // Call a method that can be overridden by a subclass to perform
-  // some calculations after all the threads have completed
-  this->AfterThreadedGenerateData();
-}
-
-template <class TPolygonList, class TOutputGraph>
-void
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::BeforeThreadedGenerateData()
-{
-  // Output graph pointer
-  OutputGraphPointerType      graph = this->GetOutput();
-  PolygonListConstPointerType inputPtr = this->GetInput();
-
-// Initializing output graph
-  graph->SetNumberOfVertices(inputPtr->Size());
-  graph->Build();
-
-  // Vertex indexes
-  unsigned int nbVertices = 0;
-
-  typedef typename PolygonListType::ConstIterator PolygonListConstIteratorType;
-
-  // Loads the polygons list to graph nodes
-  for (PolygonListConstIteratorType it = inputPtr->Begin();
-       it != inputPtr->End(); ++it)
-    {
-    // Create a new vertex
-    VertexPointerType vertex = VertexType::New();
-    // Set its properties
-    vertex->SetPath(it.Get());
-
-    // look for the appropriate segmentation index
-
-    unsigned int segIndex = 1;
-
-    while (segIndex < m_SegmentationRanges.size() &&
-           (nbVertices < m_SegmentationRanges[segIndex - 1] || nbVertices >= m_SegmentationRanges[segIndex]))
-      {
-      ++segIndex;
-      }
-
-    vertex->SetSegmentationLevel(segIndex - 1);
-
-    // Put it in the graph
-    graph->SetVertex(nbVertices, vertex);
-    otbMsgDevMacro(<< "Adding vertex: " << nbVertices);
-    ++nbVertices;
-    }
-}
-
-template <class TPolygonList, class TOutputGraph>
-void
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::ThreadedGenerateData(unsigned int startIndex, unsigned int stopIndex, itk::ThreadIdType threadId)
-{
-  //std::cout<<"Starting thread "<<threadId <<" to work on range ["<<startIndex<<", "<<stopIndex<<"]"<<std::endl;
-
-  // Output graph pointer
-  OutputGraphPointerType      graph = this->GetOutput();
-  PolygonListConstPointerType inputPtr = this->GetInput();
-
-  // invert value vector
-  RCC8ValueType invert[8] = {OTB_RCC8_DC, OTB_RCC8_EC, OTB_RCC8_PO, OTB_RCC8_TPPI,
-                             OTB_RCC8_TPP, OTB_RCC8_NTPPI, OTB_RCC8_NTPP, OTB_RCC8_EQ};
-
-  unsigned int nbVertices = graph->GetNumberOfVertices();
-  itk::ProgressReporter progress(this, threadId, ((int) stopIndex - (int) startIndex)*nbVertices);
-
-  otbMsgDevMacro(<< "Adjacency matrix size: " << nbVertices * nbVertices);
-
-  VertexIteratorType vIt1(graph);
-  VertexIteratorType vIt2(graph);
-
-  unsigned int count = 0;
-
-  // For each couple of vertices
-  for (vIt1.GoToBegin(); !vIt1.IsAtEnd(); ++vIt1)
-    {
-    // TODO: this is not correct and should be replaced by a
-    // vIt1(graph, index1, index2), which does not exist for the moment
-    if ((count >= startIndex) && (count < stopIndex))
-      {
-      for (vIt2.GoToBegin(); !vIt2.IsAtEnd(); ++vIt2)
-        {
-        //We do not examine each couple because of the RCC8 symmetry
-        if (vIt1.GetIndex() < vIt2.GetIndex())
-          {
-
-          // Compute the RCC8 relation
-          typename RCC8CalculatorType::Pointer calc = RCC8CalculatorType::New();
-          calc->SetPolygon1(vIt1.Get()->GetPath());
-          calc->SetPolygon2(vIt2.Get()->GetPath());
-          RCC8ValueType value = OTB_RCC8_DC;
-
-          // if the optimisations are activated
-          if (m_Optimisation)
-            {
-            //  otbMsgDebugMacro(<<"RCC8GraphFilter: Entering optimisation loop");
-            InEdgeIteratorType inIt1(vIt1.GetIndex(), graph);
-            InEdgeIteratorType inIt2(vIt2.GetIndex(), graph);
-            // otbMsgDebugMacro(<<"Optimisation loop: iterators initialised");
-            VertexDescriptorType betweenIndex;
-            KnowledgeStateType know(NO_INFO, OTB_RCC8_DC);
-            inIt1.GoToBegin();
-
-            // Iterate through the edges going to the first vertex
-            while (!inIt1.IsAtEnd() && (know.first != FULL))
-              {
-              betweenIndex = inIt1.GetSourceIndex();
-              inIt2.GoToBegin();
-              bool edgeFound = false;
-              while (!inIt2.IsAtEnd() && (know.first != FULL))
-                {
-                // try to find an intermediate vertex between the two ones which
-                // we vant to compute the relationship
-                if (inIt2.GetSourceIndex() == betweenIndex)
-                  {
-                  // if an intermediate vertex is found
-                  edgeFound = true;
-                  // otbMsgDebugMacro(<<"Optimisation loop: found an intermediary vertex:" <<betweenIndex);
-                  // See if it brings some info on the RCCC8 value
-                  know = GetKnowledge(invert[inIt1.GetValue()], inIt2.GetValue());
-                  calc->SetLevel1APrioriKnowledge(know.first == LEVEL_1);
-                  calc->SetLevel3APrioriKnowledge(know.first == LEVEL_3);
-                  //  otbMsgDebugMacro(<<"Optimisation loop: knowledge: "<<know.first<<","<<know.second);
-                  }
-                ++inIt2;
-                }
-              // If no intermediate was found
-              if (!edgeFound)
-                {
-                //  otbMsgDebugMacro(<<"Optimisation loop: found an intermediary vertex:" <<betweenIndex);
-                // Try using a DC relationship
-                know = GetKnowledge(invert[inIt1.GetValue()], OTB_RCC8_DC);
-                calc->SetLevel1APrioriKnowledge(know.first == LEVEL_1);
-                calc->SetLevel3APrioriKnowledge(know.first == LEVEL_3);
-                // otbMsgDebugMacro(<<"Optimisation loop: knowledge: "<<know.first<<","<<know.second);
-                }
-              ++inIt1;
-              }
-            // If the search has fully determined the RCC8
-            if (know.first == FULL)
-              {
-              // Get the value
-              value = know.second;
-              }
-            else
-              {
-              // Else trigger the computation
-              // (which will take the optimisation phase info into account)
-              calc->Compute();
-              value = calc->GetValue();
-              }
-            // otbMsgDebugMacro(<<"RCC8GraphFilter: Leaving optimisation loop");
-            }
-          // If the optimisations are not activated
-          else
-            {
-            calc->Compute();
-            value = calc->GetValue();
-            }
-          m_Accumulator[value] += 1;
-          m_Accumulator[invert[value]] += 1;
-          // If the vertices are connected
-          if (value > OTB_RCC8_DC)
-            {
-            // Add the edge to the graph.
-            otbMsgDevMacro(<< "Adding edge: " << vIt1.GetIndex() << " -> " << vIt2.GetIndex() << ": " << value);
-            if (value == OTB_RCC8_NTPPI)
-              {
-              m_EdgesPerThread[threadId][EdgePairType(vIt2.GetIndex(), vIt1.GetIndex())] = OTB_RCC8_NTPP;
-              }
-            else if (value == OTB_RCC8_TPPI)
-              {
-              m_EdgesPerThread[threadId][EdgePairType(vIt2.GetIndex(), vIt1.GetIndex())] = OTB_RCC8_TPP;
-              }
-            else
-              {
-              m_EdgesPerThread[threadId][EdgePairType(vIt1.GetIndex(), vIt2.GetIndex())] = value;
-              }
-            if (m_UseInverted)
-              {
-              m_EdgesPerThread[threadId][EdgePairType(vIt2.GetIndex(), vIt1.GetIndex())] = invert[value];
-              }
-            }
-          }
-        progress.CompletedPixel();
-        progress.CompletedPixel();
-        }
-      }
-    ++count;
-    }
-  otbMsgDebugMacro(<< "End thread " << threadId);
-}
-
-template <class TPolygonList, class TOutputGraph>
-void
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::AfterThreadedGenerateData()
-{
-  // in order to have the same output graph whatever the number of
-  // thread is, we use a map to sort the edges in lexicographical
-  // order
-
-  OutputGraphPointerType graph = this->GetOutput();
-  EdgeMapType            globalEdgeMap;
-
-  // merge all edges
-  for (typename EdgeMapVectorType::iterator vIt = m_EdgesPerThread.begin();
-       vIt != m_EdgesPerThread.end(); ++vIt)
-    {
-    for (typename EdgeMapType::iterator mIt = (*vIt).begin();
-         mIt != (*vIt).end(); ++mIt)
-      {
-      globalEdgeMap[mIt->first] = mIt->second;
-      }
-    }
-
-  // Report edges to the graph
-  for (typename EdgeMapType::iterator mIt = globalEdgeMap.begin();
-       mIt != globalEdgeMap.end(); ++mIt)
-    {
-    graph->AddEdge(mIt->first.first, mIt->first.second, mIt->second);
-    }
-}
-
-// Callback routine used by the threading library. This routine just calls
-// the ThreadedGenerateData method after setting the correct region for this
-// thread.
-
-template <class TPolygonList, class TOutputGraph>
-ITK_THREAD_RETURN_TYPE
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::ThreaderCallback(void *arg)
-{
-  ThreadStruct *str;
-  int           threadId, threadCount;
-  unsigned int  total, start, stop;
-
-  threadId = ((itk::MultiThreader::ThreadInfoStruct *) (arg))->ThreadID;
-  threadCount = ((itk::MultiThreader::ThreadInfoStruct *) (arg))->NumberOfThreads;
-  str = (ThreadStruct *) (((itk::MultiThreader::ThreadInfoStruct *) (arg))->UserData);
-
-  total = str->Filter->GetOutput()->GetNumberOfVertices();
-
-  if (threadId < static_cast<int>(total))
-    {
-
-    // Split the adjacency matrix in strip of equal dimension
-    start =
-      static_cast<unsigned int>(std::floor(total *
-                                          std::sqrt(static_cast<double>(threadId) /
-                                                   static_cast<double>(threadCount)) + 0.5));
-    stop =
-      static_cast<unsigned int>(std::floor(total *
-                                          std::sqrt(static_cast<double>(threadId +
-                                                                       1) / static_cast<double>(threadCount)) + 0.5));
-    if (stop > total) stop = total;
-
-    // For very small graphs it might occur that start = stop. In this
-    // case the vertex at that index will be processed in the next strip.
-    if (start != stop)
-      {
-      str->Filter->ThreadedGenerateData(start, stop, threadId);
-      }
-    }
-  // else
-  //   {
-  //   otherwise don't use this thread. Sometimes the threads don't
-  //   break up very well and it is just as efficient to leave a
-  //   few threads idle.
-  //   }
-
-  return ITK_THREAD_RETURN_VALUE;
-}
-
-template <class TPolygonList, class TOutputGraph>
-void
-PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // end namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.h b/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.h
deleted file mode 100644
index b19cf4a7a31d6d30959b4fe39d193535021376f8..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbPolygonToPolygonRCC8Calculator_h
-#define otbPolygonToPolygonRCC8Calculator_h
-
-#include "itkObject.h"
-#include "otbRCC8Value.h"
-#include "otbImage.h"
-
-namespace otb
-{
-/**
- * \class PolygonToPolygonRCC8Calculator
- * \brief This class compute the RCC8 relation between the regions from two segmentation images.
- *
- * The RCC8 system comes from qualitative spatial reasoning.
- * It is a set of pairwise disjoint exhaustive relation between two closed region of space.
- * There are 8 possible relations :
- * DC: Disconnected
- * EC: Externaly connected
- * PO: Partial overlap
- * TPP: Tangential proper part
- * NTPP: Non tangential proper part
- * TPPI: Tangential proper part inverse
- * NTPPI: Non tangential proper part inverse
- * EQ: Equivalence
- *
- * The goal of this class is to determine which of these 8 relations link the two inputs regions represented
- * by the closed input path. Since this class will further be used iteratively on a possibly large set
- * of regiosn, it is optimised : the decision is managed by a decision tree.
- *
- * \ingroup OTBRCC8
- */
-template <class TInputPolygon>
-class ITK_EXPORT PolygonToPolygonRCC8Calculator : public itk::Object
-{
-public:
-  /** Standard class typedefs. */
-  typedef PolygonToPolygonRCC8Calculator Self;
-  typedef itk::Object                    Superclass;
-  typedef itk::SmartPointer<Self>        Pointer;
-  typedef itk::SmartPointer<const Self>  ConstPointer;
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(PolygonToPolygonRCC8Calculator, Object);
-  /** Types definitions for the input image. */
-  typedef TInputPolygon                                     PolygonType;
-  typedef typename PolygonType::Pointer                     PolygonPointerType;
-  typedef typename PolygonType::ConstPointer                PolygonConstPointerType;
-  typedef typename PolygonType::VertexListType              VertexListType;
-  typedef typename PolygonType::ContinuousIndexType         ContinuousIndexType;
-  typedef typename PolygonType::RegionType::ImageRegionType RegionType;
-  typedef typename VertexListType::ConstIterator            VertexListConstIteratorType;
-  typedef std::vector<bool>                                 BoolVectorType;
-
-  /** RCC8 values type */
-  typedef RCC8Value RCC8ValueType;
-
-  /**
-   * Get the RCC8 relation.
-   * \return The RCC8 relation value.
-   */
-  RCC8ValueType GetValue(void);
-
-  /** Set external knowledge to help the decision process */
-  itkSetMacro(Level1APrioriKnowledge, bool);
-  itkSetMacro(Level3APrioriKnowledge, bool);
-  itkGetMacro(Level1APrioriKnowledge, bool);
-  itkGetMacro(Level3APrioriKnowledge, bool);
-
-  itkSetObjectMacro(Polygon1, PolygonType);
-  itkSetObjectMacro(Polygon2, PolygonType);
-  itkGetObjectMacro(Polygon1, PolygonType);
-  itkGetObjectMacro(Polygon2, PolygonType);
-
-  /** Main computation method */
-  void Compute(void);
-
-  virtual bool ComputeRelation(bool edgeEdgeBool, bool interExterBool, bool exterInterBool);
-
-  virtual bool ComputeInterExter(PolygonPointerType path1, PolygonPointerType path2);
-
-  virtual bool ComputeEdgeEdge(PolygonPointerType path1, PolygonPointerType path2);
-
-  virtual bool ComputeInterInter(PolygonPointerType path1, PolygonPointerType path2);
-
-  virtual bool RegionsIntersectionIsNull(const RegionType& region1, const RegionType& region2);
-
-protected:
-  /** Constructor */
-  PolygonToPolygonRCC8Calculator();
-  /** Destructor */
-  ~PolygonToPolygonRCC8Calculator() override {}
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  /** The RCC8 relation value */
-  RCC8ValueType m_Value;
-  /**  Decision tree Level 1 A priori knowledge */
-  bool m_Level1APrioriKnowledge;
-  /**  Decision tree Level 3 A priori knowledge */
-  bool m_Level3APrioriKnowledge;
-  /** Polygon of region 1 */
-  PolygonPointerType m_Polygon1;
-  /** Polygon of region 2 */
-  PolygonPointerType m_Polygon2;
-  /** Epsilon */
-  double m_Epsilon;
-
-};
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbPolygonToPolygonRCC8Calculator.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.hxx b/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.hxx
deleted file mode 100644
index bcb836fa4c5baf6e07c9a9bb782b6d90042455d9..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.hxx
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbPolygonToPolygonRCC8Calculator_hxx
-#define otbPolygonToPolygonRCC8Calculator_hxx
-
-#include "otbPolygonToPolygonRCC8Calculator.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template<class TInputPolygon>
-PolygonToPolygonRCC8Calculator<TInputPolygon>
-::PolygonToPolygonRCC8Calculator()
-{
-  m_Value        = OTB_RCC8_DC;
-  m_Level1APrioriKnowledge = false;
-  m_Level3APrioriKnowledge = false;
-}
-/**
- * Get the RCC8 relation.
- * \return The RCC8 relation value.
- */
-template <class TInputPolygon>
-typename PolygonToPolygonRCC8Calculator<TInputPolygon>
-::RCC8ValueType
-PolygonToPolygonRCC8Calculator<TInputPolygon>
-::GetValue(void)
-{
-  return m_Value;
-}
-
-template<class TInputPolygon>
-void
-PolygonToPolygonRCC8Calculator<TInputPolygon>
-::Compute(void)
-{
-  // First check if bounding regions are disjoints
-  RegionType region1 = m_Polygon1->GetBoundingRegion().GetImageRegion();
-  RegionType region2 = m_Polygon2->GetBoundingRegion().GetImageRegion();
-
-  // If intersection is not null, we have to do the computation
-  if (!RegionsIntersectionIsNull(region1, region2))
-    {
-
-    bool edgeEdgeBool, interExterBool, exterInterBool, interInterBool;
-    /// The boolean edgeEdge is needed in each case, so it si computed
-    /// now
-    edgeEdgeBool = ComputeEdgeEdge(m_Polygon1, m_Polygon2);
-
-    //std::cout<<"EdgeEdge: "<<edgeEdgeBool<<std::endl;
-
-    if (this->GetLevel1APrioriKnowledge())
-      {
-      interExterBool = true;
-      }
-    else
-      {
-      /// Else it must be computed
-      interExterBool = ComputeInterExter(m_Polygon1, m_Polygon2);
-      }
-
-    //std::cout<<"InterExter: "<<interExterBool<<std::endl;
-
-    /// At this stage we can determine if the relation is of type NTPP
-    if ((!interExterBool) && (!edgeEdgeBool))
-      {
-      m_Value = OTB_RCC8_NTPP;
-      }
-    else
-      {
-      /// If not, we must consider the intersection between exterior
-      if (this->GetLevel3APrioriKnowledge())
-        {
-        /// If the Level3APRioriKnowledge flag is set, this boolean
-        /// can be determined from the two others
-        exterInterBool = true;
-        }
-      else
-        {
-        /// Else it must be computed
-        exterInterBool = ComputeInterExter(m_Polygon2, m_Polygon1);
-        }
-
-      //std::cout<<"ExterInter: "<<exterInterBool<<std::endl;
-
-      /// If it is not sufficient to compute the relation
-      if (!ComputeRelation(edgeEdgeBool, interExterBool, exterInterBool))
-        {
-        /// Compute the last boolean
-        interInterBool = ComputeInterInter(m_Polygon1, m_Polygon2);
-
-        //std::cout<<"InterInter: "<<interInterBool<<std::endl;
-
-        /// Which allow the full determination
-        if ((interExterBool) && (edgeEdgeBool) && (exterInterBool) && (!interInterBool))
-          {
-          m_Value = OTB_RCC8_EC;
-          }
-        else
-          {
-          m_Value = OTB_RCC8_PO;
-          }
-        }
-      }
-    }
-}
-
-template<class TInputPolygon>
-bool
-PolygonToPolygonRCC8Calculator<TInputPolygon>
-::RegionsIntersectionIsNull(const RegionType& region1, const RegionType& region2)
-{
-  for (unsigned int dim = 0; dim < RegionType::ImageDimension; ++dim)
-    {
-    if (region1.GetIndex()[dim] + static_cast<int>(region1.GetSize()[dim]) < region2.GetIndex()[dim])
-      {
-      return true;
-      }
-    else if (region2.GetIndex()[dim] + static_cast<int>(region2.GetSize()[dim]) < region1.GetIndex()[dim])
-      {
-      return true;
-      }
-    }
-  return false;
-}
-
-template<class TInputPolygon>
-bool
-PolygonToPolygonRCC8Calculator<TInputPolygon>
-::ComputeRelation(bool edgeEdgeBool, bool interExterBool, bool exterInterBool)
-{
-  // This decision process is based on a decision tree
-  if ((!interExterBool) && (edgeEdgeBool) && (!exterInterBool))
-    {
-    m_Value = OTB_RCC8_EQ;
-    return true;
-    }
-  else if ((!interExterBool) && (edgeEdgeBool) && (exterInterBool))
-    {
-    m_Value = OTB_RCC8_TPP;
-    return true;
-    }
-  else if ((interExterBool) && (!edgeEdgeBool) && (!exterInterBool))
-    {
-    m_Value = OTB_RCC8_NTPPI;
-    return true;
-    }
-  else if ((interExterBool) && (!edgeEdgeBool) && (exterInterBool))
-    {
-    m_Value = OTB_RCC8_DC;
-    return true;
-    }
-  else if ((interExterBool) && (edgeEdgeBool) && (!exterInterBool))
-    {
-    m_Value = OTB_RCC8_TPPI;
-    return true;
-    }
-  else
-    {
-    return false;
-    }
-}
-
-template<class TInputPolygon>
-bool
-PolygonToPolygonRCC8Calculator<TInputPolygon>
-::ComputeInterExter(PolygonPointerType polygon1, PolygonPointerType polygon2)
-{
-  bool                        resp = false;
-  VertexListConstIteratorType it = polygon1->GetVertexList()->Begin();
-  VertexListConstIteratorType it_end = polygon1->GetVertexList()->End();
-
-  ContinuousIndexType current = it.Value();
-  ContinuousIndexType first = current;
-  bool                isInside = polygon2->IsInside(current);
-  bool                firstIsInside = isInside;
-  bool                isExterior = !isInside && !polygon2->IsOnEdge(current);
-
-  //std::cout<<current<<" is inside: "<<isInside<<std::endl;
-  //std::cout<<current<<" is on edge: "<<polygon2->IsOnEdge(current)<<std::endl;
-
-  unsigned int index = 0;
-  if (isExterior)
-    {
-    resp = true;
-    }
-  ++it;
-  while (!resp && it != it_end)
-    {
-    bool nextIsInside = polygon2->IsInside(it.Value());
-
-    if (isInside && nextIsInside)
-      {
-      //std::cout<<current<<" is inside and "<<it.Value()<<" is inside, nb crossings: "<<polygon2->NbCrossing(current, it.Value())<<std::endl;
-      resp = polygon2->NbCrossing(current, it.Value()) > 0;
-      }
-    current = it.Value();
-    isInside  = nextIsInside;
-    isExterior = !isInside && !polygon2->IsOnEdge(current);
-    //std::cout<<current<<" is inside: "<<isInside<<std::endl;
-    //std::cout<<current<<" is on edge: "<<polygon2->IsOnEdge(current)<<std::endl;
-    if (isExterior)
-      {
-      resp = true;
-      }
-
-    ++index;
-    ++it;
-    }
-
-  if (!resp && isInside && firstIsInside)
-    {
-    resp = polygon2->NbCrossing(current, first) > 0;
-    //std::cout<<current<<" is inside and "<<first<<" is inside, nb crossings: "<<polygon2->NbCrossing(current, first)<<std::endl;
-    }
-
-  return resp;
-}
-
-template<class TInputPolygon>
-bool
-PolygonToPolygonRCC8Calculator<TInputPolygon>
-::ComputeInterInter(PolygonPointerType polygon1, PolygonPointerType polygon2)
-{
-  bool                        resp = false;
-  VertexListConstIteratorType it = polygon1->GetVertexList()->Begin();
-  VertexListConstIteratorType it_end = polygon1->GetVertexList()->End();
-  ContinuousIndexType         current = it.Value();
-  ContinuousIndexType         first = current;
-  bool                        currentIsInside = polygon2->IsInside(current);
-  bool                        firstIsInside = currentIsInside;
-
-  if (currentIsInside)
-    {
-    resp = true;
-    }
-  ++it;
-  while (!resp && it != it_end)
-    {
-    bool nextIsInside = polygon2->IsInside(it.Value());
-
-    if (!currentIsInside && !nextIsInside && !polygon2->IsOnEdge(current) && !polygon2->IsOnEdge(it.Value()))
-      {
-      unsigned int nbCrossings = polygon2->NbCrossing(current, it.Value());
-
-      resp = nbCrossings > 0;
-      }
-    currentIsInside = nextIsInside;
-    current = it.Value();
-
-    if (currentIsInside)
-      {
-      resp = true;
-      }
-    ++it;
-    }
-
-  if (!resp && !currentIsInside && !firstIsInside && !polygon2->IsOnEdge(current) && !polygon2->IsOnEdge(first))
-    {
-    unsigned int nbCrossings = polygon2->NbCrossing(current, first);
-
-    resp = nbCrossings > 0;
-    }
-  return resp;
-}
-template<class TInputPolygon>
-bool
-PolygonToPolygonRCC8Calculator<TInputPolygon>
-::ComputeEdgeEdge(PolygonPointerType polygon1, PolygonPointerType polygon2)
-{
-  bool                        resp = false;
-  VertexListConstIteratorType it = polygon1->GetVertexList()->Begin();
-  VertexListConstIteratorType it_end = polygon1->GetVertexList()->End();
-
-  ContinuousIndexType current = it.Value();
-  resp = polygon2->IsOnEdge(current);
-  //std::cout<<"IsOnEdge: "<<current<<": "<<polygon2->IsOnEdge(current)<<std::endl;
-  ContinuousIndexType first = current;
-  ++it;
-
-  while (!resp && it != it_end)
-    {
-    if (polygon2->NbTouching(current, it.Value()) > 0)
-      {
-      resp = true;
-      //std::cout<<"NbCrossing: "<<current<<" -> "<<it.Value()<<": "<<polygon2->NbCrossing(current, it.Value())<<std::endl;
-      }
-    if (polygon2->NbCrossing(current, it.Value()) > 0)
-      {
-      resp = true;
-      //std::cout<<"NbTouching: "<<current<<" -> "<<it.Value()<<": "<<polygon2->NbTouching(current, it.Value())<<std::endl;
-      }
-    current = it.Value();
-
-    if (polygon2->IsOnEdge(current))
-      {
-      resp = true;
-      //std::cout<<"IsOnEdge: "<<current<<": "<<polygon2->IsOnEdge(current)<<std::endl;
-      }
-    ++it;
-    }
-  if (!resp && polygon2->NbTouching(current, first) > 0)
-    {
-    resp = true;
-    //std::cout<<"NbCrossing: "<<current<<" -> "<<first<<": "<<polygon2->NbCrossing(current, first)<<std::endl;
-    }
-  if (polygon2->NbCrossing(current, first) > 0)
-    {
-    resp = true;
-    //std::cout<<"NbTouching: "<<current<<" -> "<<first<<": "<<polygon2->NbTouching(current, first)<<std::endl;
-    }
-
-  return resp;
-}
-/**
- * PrintSelf method
- */
-template<class TInputPolygon>
-void
-PolygonToPolygonRCC8Calculator<TInputPolygon>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // end namespace otb
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8Edge.h b/Modules/OBIA/RCC8/include/otbRCC8Edge.h
deleted file mode 100644
index e85d8d3c755e5bfb363551519bde0aafaab2ffbd..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8Edge.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8Edge_h
-#define otbRCC8Edge_h
-
-#include "itkDataObject.h"
-#include "itkObjectFactory.h"
-#include "otbRCC8Value.h"
-
-namespace otb
-{
-/** \class RCC8Edge
- *  \brief Base class to represent an edge in a RCC8 Graph.
- *
- * \sa RCC8Graph, RCC8VertexBase
- *
- * \ingroup OTBRCC8
- */
-class ITK_EXPORT RCC8Edge : public itk::DataObject
-{
-public:
-  /** Standard class typedefs */
-  typedef RCC8Edge                      Self;
-  typedef itk::DataObject               Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(RCC8Edge, DataObject);
-  /** RCC8 values typedef */
-  typedef RCC8Value RCC8ValueType;
-  /** RCC8 relation value accessors */
-  itkGetMacro(Value, RCC8ValueType);
-  itkSetMacro(Value, RCC8ValueType);
-
-protected:
-  /** Constructor */
-  RCC8Edge();
-  /** Desctructor */
-  ~RCC8Edge() override {}
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  /** The RCC8 value */
-  RCC8ValueType m_Value;
-};
-} // end namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h b/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h
deleted file mode 100644
index c7096be92632966c1df05f1c522c0c68f6baa411..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8EdgeIterator_h
-#define otbRCC8EdgeIterator_h
-
-#include "otbRCC8Graph.h"
-
-namespace otb
-{
-/**
- * \class RCC8EdgeIterator
- * \brief Iterates on the graph edges.
- *
- * \ingroup OTBRCC8
- */
-template <class TGraph>
-class ITK_EXPORT RCC8EdgeIterator
-{
-public:
-  /** self typedef */
-  typedef RCC8EdgeIterator Self;
-
-  /** Graph typedef */
-  typedef TGraph                                   GraphType;
-  typedef typename GraphType::InternalGraphType    InternalGraphType;
-  typedef typename GraphType::Pointer              GraphPointerType;
-  typedef typename GraphType::EdgePointerType      EdgePointerType;
-  typedef typename GraphType::VertexPointerType    VertexPointerType;
-  typedef typename GraphType::VertexDescriptorType VertexDescriptorType;
-  typedef typename GraphType::RCC8ValueType        RCC8ValueType;
-  /** typedef of the internal iterator */
-  typedef typename boost::graph_traits<InternalGraphType>::edge_iterator InternalIteratorType;
-  /** Typedef of the index map */
-  typedef typename boost::property_map<InternalGraphType, boost::vertex_index_t>::type IndexMapType;
-
-  /** Constructor */
-  RCC8EdgeIterator();
-  /** Copy constructor */
-  RCC8EdgeIterator(const Self &iter);
-  /**  Constructor with input graph */
-  RCC8EdgeIterator(TGraph * graph);
-  /**
-   * Get the current edge value.
-   * \return The value of the current edge pointed by the iterator.
-   */
-  RCC8ValueType GetValue(void);
-  /**
-    * Return the source vertex of the current edge.
-    * \return The source edge.
-    */
-  VertexPointerType GetSourceVertex(void);
-  /**
-   * Return the target vertex of the current edge.
-   * \return The target vertex.
-   */
-  VertexPointerType GetTargetVertex(void);
-  /**
-   * Return the source vertex index of the current edge.
-   * \return The source vertex index.
-   */
-  VertexDescriptorType GetSourceIndex(void);
-  /**
-   * Return the target vertex index of the current edge.
-   * \return The target vertex index.
-   */
-  VertexDescriptorType GetTargetIndex(void);
-
-  /**
-   * Return true if the iterator is at the end.
-   * \return True if the iterator is at the end.
-   */
-  bool IsAtEnd(void);
-  /**
-   * Go to the beginning.
-   */
-  void GoToBegin(void);
-  /**
-   * Increment.
-   */
-  Self& operator ++();
-  /**
-   * Decrement.
-   */
-  Self& operator --();
-  /**
-   * Add
-   */
-  Self& operator +(int i);
-
-  /**
-   * Remove
-   */
-  Self& operator -(int i);
-  /**
-   * Difference comparison operator.
-   */
-  bool operator !=(const Self& it);
-  /**
-   * Equality comparison operator.
-   */
-  bool operator ==(const Self& it);
-  /**
-   * Instantiation operator.
-   */
-  Self& operator =(const Self& it);
-private:
-  // End
-  InternalIteratorType m_End;
-  // Internal iterator.
-  InternalIteratorType m_Iter;
-  // Input graph pointer
-  GraphPointerType m_Graph;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8EdgeIterator.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.hxx b/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.hxx
deleted file mode 100644
index 43989016883e56e95e053e6e547d5b78e0e6ce99..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.hxx
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8EdgeIterator_hxx
-#define otbRCC8EdgeIterator_hxx
-
-#include "otbRCC8EdgeIterator.h"
-
-namespace otb
-{
-/** Constructor */
-template <class TGraph>
-RCC8EdgeIterator<TGraph>
-::RCC8EdgeIterator()
-{
-  m_Graph = GraphType::New();
-  boost::tuples::tie(m_Iter, m_End) = edges(*m_Graph->GetGraph());
-}
-/**
- * Copy operator.
- */
-template <class TGraph>
-RCC8EdgeIterator<TGraph>
-::RCC8EdgeIterator(const Self& iter)
-{
-  m_Iter = iter.m_Iter;
-  m_Graph = iter.m_Graph;
-  m_End = iter.m_End;
-}
-/**
- *Constructor with input graph
- */
-template <class TGraph>
-RCC8EdgeIterator<TGraph>
-::RCC8EdgeIterator(TGraph * graph)
-{
-  m_Graph = graph;
-  boost::tuples::tie(m_Iter, m_End) = edges(*m_Graph->GetGraph());
-}
-/**
- * Get the current edge value.
- * \return The value of the current edge pointed by the iterator.
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::RCC8ValueType
-RCC8EdgeIterator<TGraph>
-::GetValue(void)
-{
-  return (*m_Graph->GetGraph())[*m_Iter]->GetValue();
-}
-/**
- * Return the source vertex of the current edge.
- * \return The source edge.
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::VertexPointerType
-RCC8EdgeIterator<TGraph>
-::GetSourceVertex(void)
-{
-  return (*m_Graph->GetGraph())[source(*m_Iter, (*m_Graph->GetGraph()))];
-}
-/**
- * Return the target vertex of the current edge.
- * \return The target vertex.
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::VertexPointerType
-RCC8EdgeIterator<TGraph>
-::GetTargetVertex(void)
-{
-  return (*m_Graph->GetGraph())[target(*m_Iter, (*m_Graph->GetGraph()))];
-}
-/**
- * Return the source vertex index of the current edge.
- * \return The source vertex index.
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::VertexDescriptorType
-RCC8EdgeIterator<TGraph>
-::GetSourceIndex(void)
-{
-  IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph()));
-  return index[source(*m_Iter, (*m_Graph->GetGraph()))];
-}
-/**
- * Return the target vertex index of the current edge.
- * \return The target vertex index.
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::VertexDescriptorType
-RCC8EdgeIterator<TGraph>
-::GetTargetIndex(void)
-{
-  IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph()));
-  return index[target(*m_Iter, (*m_Graph->GetGraph()))];
-}
-/**
- * Return true if the iterator is at the end.
- * \return True if the iterator is at the end.
- */
-template <class TGraph>
-bool
-RCC8EdgeIterator<TGraph>
-::IsAtEnd(void)
-{
-  return (m_Iter == m_End);
-}
-/**
- * Go to the beginning.
- */
-template <class TGraph>
-void
-RCC8EdgeIterator<TGraph>
-::GoToBegin(void)
-{
-  boost::tuples::tie(m_Iter, m_End) = edges(*m_Graph->GetGraph());
-}
-/**
- * Increment.
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::Self&
-RCC8EdgeIterator<TGraph>
-::operator++ ()
-  {
-  ++m_Iter;
-  return *this;
-  }
-/**
- * Decrement.
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::Self&
-RCC8EdgeIterator<TGraph>
-::operator-- ()
-  {
-  --m_Iter;
-  return *this;
-  }
-/**
- * Add
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::Self&
-RCC8EdgeIterator<TGraph>
-::operator + (int i)
-  {
-  m_Iter = m_Iter + i;
-  return *this;
-  }
-/**
- * Remove
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::Self&
-RCC8EdgeIterator<TGraph>
-::operator - (int i)
-  {
-  m_Iter = m_Iter - i;
-  return *this;
-  }
-/**
- * Difference comparison operator.
- */
-template <class TGraph>
-bool
-RCC8EdgeIterator<TGraph>
-::operator != (const Self &iter)
-  {
-  return (m_Iter != iter.m_Iter);
-  }
-/**
- * Equality comparison operator.
- */
-template <class TGraph>
-bool
-RCC8EdgeIterator<TGraph>
-::operator == (const Self &iter)
-  {
-  return (m_Iter == iter.m_Iter);
-  }
-/**
- * Instantiation operator.
- */
-template <class TGraph>
-typename RCC8EdgeIterator<TGraph>
-::Self&
-RCC8EdgeIterator<TGraph>
-::operator = (const Self &iter)
-  {
-  m_Iter = iter.m_Iter;
-  return *this;
-  }
-} // End namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8Graph.h b/Modules/OBIA/RCC8/include/otbRCC8Graph.h
deleted file mode 100644
index 9caa3ef59626a55d833fda5aaebebd1b09a28f6e..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8Graph.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8Graph_h
-#define otbRCC8Graph_h
-
-#include "otbRCC8Edge.h"
-
-//fix compilation in VS7.1 for boost 1.42
-//similar to the fix in Monteverdi
-#ifndef BOOST_NO_0X_HDR_INITIALIZER_LIST
-#define BOOST_NO_0X_HDR_INITIALIZER_LIST
-#endif
-
-#include "otb_boost_graph_header.h"
-
-#include "otbImage.h"
-#include "otbImageList.h"
-
-namespace otb
-{
-/**
- * \class RCC8Graph
- * \brief This class is a data structure designed to store RCC8 Graph
- * computed from a pyramidal segmentation.
- *
- * A batch of boost operation has been embedded in order to provide
- * basic functionality such as adding a new edge, or retrieving the
- * number of vertices. A method is also provided to retrieve the boost
- * graph object, in case more advanced processing is required. One
- * should remember that if a peculiar operation is needed for some
- * applications, one should provide a patch for this class including
- * the new functionnalities, for consistency reason.
- *
- * \ingroup OTBRCC8
- */
-template <class TVertex>
-class ITK_EXPORT RCC8Graph  :
-  public itk::DataObject
-{
-public:
-  /** Standard class typedefs. */
-  typedef RCC8Graph                     Self;
-  typedef itk::DataObject               Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(RCC8Graph, itk::DataObject);
-  /** Vertex typedef */
-  typedef TVertex                      VertexType;
-  typedef typename VertexType::Pointer VertexPointerType;
-  /** Edge typedef */
-  typedef RCC8Edge                         EdgeType;
-  typedef typename EdgeType::Pointer       EdgePointerType;
-  typedef typename EdgeType::RCC8ValueType RCC8ValueType;
-  /** Typedef for the boost graph representation */
-  typedef boost::adjacency_list
-  <boost::vecS, boost::vecS, boost::bidirectionalS,
-      VertexPointerType, EdgePointerType> InternalGraphType;
-  /** Edges and vertices descriptors typedefs (boost objects)*/
-  typedef typename InternalGraphType::vertex_descriptor VertexDescriptorType;
-  typedef typename InternalGraphType::edge_descriptor   EdgeDescriptorType;
-
-  /** Getters and Setters for the number of vertices */
-  itkSetMacro(NumberOfVertices, unsigned int);
-  itkGetConstReferenceMacro(NumberOfVertices, unsigned int);
-
-  /**
-   *  Return the internal boost graph object.
-   *  \return The internal boost graph object
-   */
-  InternalGraphType * GetGraph(void)
-  {
-    return &m_Graph;
-  }
-  /**
-   * Since the number of vertices is mandatory to instantiate the
-   * internal boost representation, the build method has to be called
-   * once this parameter is set.
-   */
-  void Build(void);
-  /**
-   * Set a vertex.
-   * \param index The index of the vertex in the graph.
-   * \param vertex The vertex to set.
-   */
-  void SetVertex(unsigned int index, VertexPointerType vertex);
-  /**
-   * Get a vertex.
-   * \param index The index of the vertex in the graph
-   * \return The vertex.
-   */
-  VertexPointerType GetVertex(unsigned int index);
-  /**
-   * Add an edge in the graph.
-   * \param index1 The index of the source vertex.
-   * \param index2 The index of the target vertex.
-   * \param r The RCC8 value.
-   */
-  void AddEdge(unsigned int index1, unsigned int index2, RCC8ValueType r);
-  /**
-   * Get number of edges
-   * /return The number of edges.
-   */
-  unsigned int GetNumberOfEdges(void);
-
-protected:
-  /** Constructor */
-  RCC8Graph();
-  /** Destructor */
-  ~RCC8Graph() override {}
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /**
-   * Initialize a range of vertex.
-   * \param num The index of the last vertices to initialize.
-   */
-  void InitializeGraph(unsigned int num);
-
-private:
-
-  /** Defines the number of vertices (ie total number of segmentation regions)*/
-  unsigned int m_NumberOfVertices;
-  /** Internal representation using the boost graph library */
-  InternalGraphType m_Graph;
-};
-} // end namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8Graph.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8Graph.hxx b/Modules/OBIA/RCC8/include/otbRCC8Graph.hxx
deleted file mode 100644
index f429442c2dd820447bc547283af733bf68f448b4..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8Graph.hxx
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8Graph_hxx
-#define otbRCC8Graph_hxx
-
-#include "otbRCC8Graph.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TVertex>
-RCC8Graph<TVertex>
-::RCC8Graph()
-{
-  m_NumberOfVertices = 0;
-}
-/**
- * since the number of vertices is mandatory to instantiate the
- * internal boost representation, the build method has to be called
- * once this parameter is set.
- */
-template <class TVertex>
-void
-RCC8Graph<TVertex>
-::Build(void)
-{
-  this->InitializeGraph(m_NumberOfVertices - 1);
-}
-/**
- * Initialize a range of vertex.
- * \param num The index of the last vertices to initialize.
- */
-template <class TVertex>
-void
-RCC8Graph<TVertex>
-::InitializeGraph(unsigned int num)
-{
-  for (unsigned int i = boost::num_vertices(m_Graph); i <= num; ++i)
-    {
-    VertexDescriptorType id = boost::add_vertex(m_Graph);
-    VertexPointerType    vertex = VertexType::New();
-    m_Graph[id] = vertex;
-    }
-}
-/**
- * Set a vertex.
- * \param index The index of the vertex in the graph.
- * \param vertex The vertex to set.
- */
-template<class TVertex>
-void
-RCC8Graph<TVertex>
-::SetVertex(unsigned int index, VertexPointerType vertex)
-{
-  if (index >= m_NumberOfVertices)
-    {
-    this->InitializeGraph(index);
-    m_NumberOfVertices = index + 1;
-    }
-  VertexDescriptorType v = *boost::vertices(m_Graph).first;
-  m_Graph[v + index] = vertex;
-}
-/**
- * Get a vertex.
- * \param index The index of the vertex in the graph
- * \return The vertex.
- */
-template <class TVertex>
-typename RCC8Graph<TVertex>
-::VertexPointerType
-RCC8Graph<TVertex>
-::GetVertex(unsigned int index)
-{
-  VertexDescriptorType v = *boost::vertices(m_Graph).first;
-  return m_Graph[v + index];
-}
-/**
- * Add an edge in the graph.
- * \param index1 The index of the source vertex.
- * \param index2 The index of the target vertex.
- * \param r The rcc8 value associated to the edge.
- */
-template <class TVertex>
-void
-RCC8Graph<TVertex>
-::AddEdge(unsigned int index1, unsigned int index2, RCC8ValueType r)
-{
-  EdgeDescriptorType e = boost::add_edge(index1, index2, m_Graph).first;
-  EdgeType::Pointer  edge = EdgeType::New();
-  edge->SetValue(r);
-  m_Graph[e] = edge;
-}
-/**
-  * Get number of edges
-  * /return The number of edges.
-  */
-template <class TVertex>
-unsigned int
-RCC8Graph<TVertex>
-::GetNumberOfEdges(void)
-{
-  return num_edges(m_Graph);
-}
-/**
- * PrintSelf method
- */
-template <class TVertex>
-void
-RCC8Graph<TVertex>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // end namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.h b/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.h
deleted file mode 100644
index 0811898a0c6f4f3cbac0d80d93acb28481578bcd..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8GraphFileReader_h
-#define otbRCC8GraphFileReader_h
-
-#include "otbRCC8GraphSource.h"
-#include "itkMacro.h"
-#include <string>
-
-namespace otb
-{
-/** \class RCC8GraphFileReaderException
- * \brief Base exception class for IO problems during reading.
- *
- * \ingroup OTBRCC8
- */
-class ITK_EXPORT RCC8GraphFileReaderException
-  : public itk::ExceptionObject
-{
-public:
-  /** Run-time information. */
-  itkTypeMacro(RCC8GraphFileReaderException, ExceptionObject);
-
-  /** Constructor. */
-  RCC8GraphFileReaderException(const char *file, unsigned int line,
-                               const char* message = "Error in IO",
-                               const char* loc = "Unknown") :
-    ExceptionObject(file, line, message, loc) {}
-  /** Constructor. */
-  RCC8GraphFileReaderException(const std::string & file, unsigned int line,
-                               const char* message = "Error in IO",
-                               const char* loc = "Unknown") :
-    ExceptionObject(file, line, message, loc) {}
-};
-/**
- * \class RCC8GraphFileReader
- * \brief This class reads a RCC8 graph from a .dot file (graphviz format).
- *
- * The parsing algorithm reads the lines from the file, deciding if the line is
- * a vertex or edge line. It then call the correct parse method between ParseEdge
- * and ParseVertex. The ParseVertex use builds an AttributesMap and pass it to a new
- * vertex.
- *
- * \sa RCC8GraphFileWriter
- * \sa RCC8Graph
- *
- * \ingroup OTBRCC8
- */
-template <class TOutputGraph>
-class ITK_EXPORT RCC8GraphFileReader : public RCC8GraphSource<TOutputGraph>
-{
-public:
-  /** Standards typedef */
-  typedef RCC8GraphFileReader           Self;
-  typedef RCC8GraphSource<TOutputGraph> Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Creation through the object factory */
-  itkNewMacro(Self);
-  /** Runtime type information */
-  itkTypeMacro(RCC8GraphFileReader, RCC8GraphSource);
-  /** Output related typedefs */
-  typedef TOutputGraph                                OutputGraphType;
-  typedef typename Superclass::OutputGraphPointerType OutputGraphPointerType;
-  typedef typename OutputGraphType::VertexType        VertexType;
-  typedef typename VertexType::Pointer                VertexPointerType;
-  typedef typename OutputGraphType::RCC8ValueType     RCC8ValueType;
-
-  /** Set the filename  */
-  itkSetStringMacro(FileName);
-  /** Get the filename */
-  itkGetStringMacro(FileName);
-
-protected:
-  /** Constructor */
-  RCC8GraphFileReader();
-  /** Destructor */
-  ~RCC8GraphFileReader() override;
-  /** Main computation method */
-  void GenerateData() override;
-  /**
-   * Parse edge information from a given line.
-   * \param line The line to parse.
-   */
-  void ParseEdge(const std::string& line);
-  /**
-   * Parse vertex information from a given line.
-   * \param line The line to parse.
-   */
-  void  ParseVertex(const std::string& line);
-
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  /** File name */
-  std::string m_FileName;
-};
-}
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8GraphFileReader.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.hxx b/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.hxx
deleted file mode 100644
index 2bab0d9fc2e0ef0ce2398a2fcadff43e9426a21d..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.hxx
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8GraphFileReader_hxx
-#define otbRCC8GraphFileReader_hxx
-
-#include "otbRCC8GraphFileReader.h"
-#include "otbRCC8VertexIterator.h"
-#include "otbMacro.h"
-#include <fstream>
-#include <iostream>
-#include <string>
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TOutputGraph>
-RCC8GraphFileReader<TOutputGraph>
-::RCC8GraphFileReader()
-{
-  m_FileName = "";
-}
-/**
- * Destructor
- */
-template <class TOutputGraph>
-RCC8GraphFileReader<TOutputGraph>
-::~RCC8GraphFileReader()
-{
-}
-/**
- * Parse edge information from a given line.
- * \param line The line to parse.
- */
-template <class TOutputGraph>
-void
-RCC8GraphFileReader<TOutputGraph>
-::ParseEdge(const std::string& line)
-{
-  typename std::string::size_type pos1 = line.find_first_of(" ", 0);
-  typename std::string::size_type pos2 = line.find_first_of(" ", pos1 + 1);
-  typename std::string::size_type pos3 = line.find_first_of(" ", pos2 + 1);
-  unsigned int                    source = atoi(line.substr(0, pos1).c_str());
-  unsigned int                    target = atoi(line.substr(pos2 + 1, pos3 - pos2 - 1).c_str());
-  typename std::string::size_type pos4 = line.find_first_of("\"", 0);
-  typename std::string::size_type pos5 = line.find_first_of("\" ", pos4 + 1);
-  RCC8ValueType                   value = static_cast<RCC8ValueType>(atoi(line.substr(pos4 + 1, pos5 - pos4 - 1).c_str()));
-  otbMsgDevMacro(<< "RCC8GraphFileReader: Edge line parsed: " << source << " -> "
-                 << target << " " << value);
-  this->GetOutput()->AddEdge(source, target, value);
-}
-/**
- * Parse vertex information from a given line.
- * \param line The line to parse.
- */
-template <class TOutputGraph>
-void
-RCC8GraphFileReader<TOutputGraph>
-::ParseVertex(const std::string& line)
-{
-  typename VertexType::AttributesMapType attr;
-  typename std::string::size_type        pos = line.find_first_of(" ", 0);
-  unsigned int                           index = atoi(line.substr(0, pos).c_str());
-  otbMsgDevMacro(<< "RCC8GraphFileReader: Vertex index: " << index);
-  typename std::string::size_type midPos, nextPos;
-
-  midPos = line.find_first_of("\"", pos + 2);
-  nextPos = line.find_first_of("\"", midPos + 1);
-  std::string key, value;
-  while ((midPos != std::string::npos) && (nextPos != std::string::npos))
-    {
-    key = line.substr(pos + 2, midPos - pos - 3);
-    value = line.substr(midPos + 1, nextPos - midPos - 1);
-    attr[key] = value;
-    otbMsgDevMacro(<< "RCC8GraphFileReader: Vertex attribute: " << key << " " << value);
-    pos = nextPos;
-    midPos = line.find_first_of("\"", pos + 2);
-    nextPos = line.find_first_of("\"", midPos + 1);
-    }
-  typename VertexType::Pointer vertex  = VertexType::New();
-  vertex->SetAttributesMap(attr);
-  this->GetOutput()->SetVertex(index, vertex);
-}
-
-/**
- * Generate data method
- */
-template <class TOutputGraph>
-void
-RCC8GraphFileReader<TOutputGraph>
-::GenerateData()
-{
-  std::ifstream fin;
-  std::string   line;
-
-  // open file input stream
-  fin.open(m_FileName);
-
-  // Test if the file has been opened correctly
-  if (!fin)
-    {
-    RCC8GraphFileReaderException e(__FILE__, __LINE__);
-    std::ostringstream msg;
-    msg << " Could not create IO object for file ";
-    msg << m_FileName << "." << std::endl;
-    e.SetDescription(msg.str());
-    throw e;
-    return;
-    }
-
-  // if so, parse it
-  while (!fin.eof())
-    {
-    std::getline(fin, line);
-    if (line.find("->") != std::string::npos)
-      {
-      // edge line
-      this->ParseEdge(line);
-      }
-    else if (line.find("[") != std::string::npos)
-      {
-      // vertex line
-      this->ParseVertex(line);
-      }
-    }
-  fin.close();
-}
-/**
- * PrintSelf method
- */
-template <class TInputGraph>
-void
-RCC8GraphFileReader<TInputGraph>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // end namespace otb
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.h b/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.h
deleted file mode 100644
index 4e4284dde3abfd86f2f5dc5a5e996c98d82c924c..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8GraphFileWriter_h
-#define otbRCC8GraphFileWriter_h
-
-#include "itkProcessObject.h"
-#include "itkMacro.h"
-#include "otbRCC8Graph.h"
-#include <string>
-
-namespace otb
-{
-/** \class RCC8GraphFileWriterException
- * \brief Base exception class for IO problems during writing.
- *
- * \ingroup OTBRCC8
- */
-class ITK_EXPORT RCC8GraphFileWriterException
-  : public itk::ExceptionObject
-{
-public:
-  /** Run-time information. */
-  itkTypeMacro(RCC8GraphFileWriterException, ExceptionObject);
-
-  /** Constructor. */
-  RCC8GraphFileWriterException(const char *file, unsigned int line,
-                               const char* message = "Error in IO",
-                               const char* loc = "Unknown") :
-    ExceptionObject(file, line, message, loc) {}
-  /** Constructor. */
-  RCC8GraphFileWriterException(const std::string & file, unsigned int line,
-                               const char* message = "Error in IO",
-                               const char* loc = "Unknown") :
-    ExceptionObject(file, line, message, loc) {}
-};
-/**
- * \class RCC8GraphFileWriter
- * \brief This class writes a RCC8 Graph to a dot file (graphviz file format).
- *
- * The writer first loops on the vertices of the graph, getting the property map
- * from each vertex and printing it in a line.
- *
- * It then iterates on the edges of the graphs, printing source index, target index,
- * and RCC8 value in a line for each of them.
- *
- * \sa RCC8GraphFileReader
- * \sa RCC8Graph
- *
- * \ingroup OTBRCC8
- */
-template <class TInputGraph>
-class ITK_EXPORT RCC8GraphFileWriter
-  : public itk::ProcessObject
-{
-public:
-  /** Standards typedefs */
-  typedef RCC8GraphFileWriter           Self;
-  typedef itk::ProcessObject            Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Method for creation through the object factory */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(RCC8GraphFileWriter, ProcessObject);
-  /** Typedefs for the output graph type */
-  typedef TInputGraph                                   InputGraphType;
-  typedef typename InputGraphType::Pointer              InputGraphPointerType;
-  typedef typename InputGraphType::VertexType           VertexType;
-  typedef typename VertexType::Pointer                  VertexPointerType;
-  typedef typename InputGraphType::VertexDescriptorType VertexDescriptorType;
-  typedef typename InputGraphType::RCC8ValueType        RCC8ValueType;
-  typedef typename VertexType::AttributesMapType        AttributesMapType;
-  typedef typename AttributesMapType::iterator          IteratorType;
-
-  /** Set the filename */
-  itkSetStringMacro(FileName);
-  /** Get the filename */
-  itkGetStringMacro(FileName);
-
-  using Superclass::SetInput;
-  /**
-   * Set the input graph.
-   * \param inputGraph The graph to write.
-   */
-  virtual void SetInput(const InputGraphType* inputGraph);
-  /**
-   * Get the input graph.
-   * \return The input graph pointer.
-   */
-  virtual InputGraphPointerType GetInput();
-  /**
-   * Update method.
-   */
-  void Update(void) override;
-
-protected:
-  /** Constructor */
-  RCC8GraphFileWriter();
-  /** Destructor */
-  ~RCC8GraphFileWriter() override;
-  /**
-   * Main computation method.
-   */
-  void GenerateData(void) override;
-  /**
-   * Write Method.
-   * Performs checkings and invoke GenerateData().
-   */
-  virtual void Write(void);
-  /**
-   * Write an edge to file.
-   * \param of The output file stream.
-   * \param source The index of the source vertex.
-   * \param target The index of the target vertex.
-   * \param value  The value of the edge.
-   */
-  void WriteEdge(std::ofstream& of, VertexDescriptorType source,
-                 VertexDescriptorType target, RCC8ValueType value);
-  /**
-   * Write a vertex to file.
-   * \param of The output file stream.
-   * \param index The index of the edge to write.
-   * \param vertex The pointer to the vertex object.
-  */
-  void WriteVertex(std::ofstream& of, VertexDescriptorType index,
-                   VertexPointerType vertex);
-  /**
-   * PrintSelf method
-   */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  /** Filename of the graph file to write */
-  std::string m_FileName;
-};
-} // namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8GraphFileWriter.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.hxx b/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.hxx
deleted file mode 100644
index c864a7c47b9ee4b17f187ad5d0b7059c43cc575a..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.hxx
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8GraphFileWriter_hxx
-#define otbRCC8GraphFileWriter_hxx
-
-#include "otbRCC8GraphFileWriter.h"
-#include "otbRCC8VertexIterator.h"
-#include "otbRCC8EdgeIterator.h"
-#include "otbMacro.h"
-#include <fstream>
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TInputGraph>
-RCC8GraphFileWriter<TInputGraph>
-::RCC8GraphFileWriter()
-{
-  this->SetNumberOfRequiredInputs(1);
-  m_FileName = "";
-}
-/**
- * Destructor
- */
-template <class TInputGraph>
-RCC8GraphFileWriter<TInputGraph>
-::~RCC8GraphFileWriter()
-{
-}
-/**
- * Set the input graph.
- * \param graph The graph to write.
- */
-template <class TInputGraph>
-void
-RCC8GraphFileWriter<TInputGraph>
-::SetInput(const InputGraphType * graph)
-{
-  this->itk::ProcessObject::SetNthInput(0, const_cast<TInputGraph *>(graph));
-}
-/**
- * Get the input graph.
- * \return The input graph pointer.
- */
-template <class TInputGraph>
-typename RCC8GraphFileWriter<TInputGraph>
-::InputGraphPointerType
-RCC8GraphFileWriter<TInputGraph>
-::GetInput(void)
-{
-  return static_cast<TInputGraph*>(this->itk::ProcessObject::GetInput(0));
-}
-/**
- * Update method.
- * (Call the Write() method).
- */
-template <class TInputGraph>
-void
-RCC8GraphFileWriter<TInputGraph>
-::Update(void)
-{
-  this->Write();
-}
-/**
- * Write Method.
- * Performs checkings and invoke GenerateData().
- */
-template <class TInputGraph>
-void
-RCC8GraphFileWriter<TInputGraph>
-::Write(void)
-{
-  InputGraphType * input = this->GetInput();
-
-  itkDebugMacro(<< "Writing a RCC8Graph file");
-
-  // Make sure input is available
-  if (input == nullptr)
-    {
-    itkExceptionMacro(<< "No input to writer!");
-    }
-
-  // Make sure that we can write the file given the name
-  //
-  if (m_FileName == "")
-    {
-    itkExceptionMacro(<< "No filename was specified");
-    }
-
-  // Pipeline updating sequence
-  input->UpdateOutputInformation();
-  input->PropagateRequestedRegion();
-  input->UpdateOutputData();
-  // GenerateData (actually write file)
-  this->GenerateData();
-}
-/**
- * Main computation method.
- */
-template <class TInputGraph>
-void
-RCC8GraphFileWriter<TInputGraph>
-::GenerateData()
-{
-  otbMsgDevMacro(<< "RCC8GraphFileWriter: GenerateData call");
-  // input graph pointer
-  InputGraphPointerType input = this->GetInput();
-
-  // iterators typedefs
-  typedef otb::RCC8VertexIterator<InputGraphType> VertexIteratorType;
-  typedef otb::RCC8EdgeIterator<InputGraphType>   EdgeIteratorType;
-
-  // Output file stream
-  std::ofstream out;
-
-  // open the outputfile
-  out.open(m_FileName, std::ios::out);
-
-  // Test if the file has been opened correctly
-  if (!out)
-    {
-    RCC8GraphFileWriterException e(__FILE__, __LINE__);
-    std::ostringstream msg;
-    msg << " Could not create IO object for file ";
-    msg << m_FileName << "." << std::endl;
-    e.SetDescription(msg.str());
-    throw e;
-    return;
-    }
-
-  // Start writing the graph to file
-  out << "digraph G {" << std::endl;
-
-  // For each vertex in the graph
-  VertexIteratorType vIt(input);
-  for (vIt.GoToBegin(); !vIt.IsAtEnd(); ++vIt)
-    {
-    this->WriteVertex(out, vIt.GetIndex(), vIt.Get());
-    }
-
-  // For each edge in the graph
-  EdgeIteratorType eIt(input);
-  for (eIt.GoToBegin(); !eIt.IsAtEnd(); ++eIt)
-    {
-    this->WriteEdge(out, eIt.GetSourceIndex(),
-                    eIt.GetTargetIndex(),
-                    eIt.GetValue());
-    }
-
-  // Ends the graph writing
-  out << "}" << std::endl;
-
-  // Close the file
-  out.close();
-}
-/**
- * Write an edge to file.
- * \param of The output file stream.
- * \param source The index of the source vertex.
- * \param target The index of the target vertex.
- * \param value  The value of the edge.
- */
-template <class TInputGraph>
-void
-RCC8GraphFileWriter<TInputGraph>
-::WriteEdge(std::ofstream& of, VertexDescriptorType source,
-            VertexDescriptorType target, RCC8ValueType value)
-{
-  otbMsgDevMacro(<< "RCC8GraphFileWriter: WriteEdge call: " << source << " " << target << " " << value);
-  of << source << " -> " << target << " ";
-  of << "[Value=\"" << value << "\"];";
-  of << std::endl;
-}
-/**
- * Write a vertex to file.
- * \param of The output file stream.
- * \param index The index of the edge to write.
- * \param vertex The pointer to the vertex object.
- */
-template <class TInputGraph>
-void
-RCC8GraphFileWriter<TInputGraph>
-::WriteVertex(std::ofstream& of, VertexDescriptorType index,
-              VertexPointerType vertex)
-{
-  AttributesMapType attr = vertex->GetAttributesMap();
-  otbMsgDevMacro(<< "RCC8GraphFileWriter: WriteVertex call: " << index);
-  of << index << " [";
-  IteratorType it = attr.begin();
-  while (it != attr.end())
-    {
-    of << (*it).first << "=\"";
-    of << (*it).second << "\"";
-    ++it;
-    if (it == attr.end())
-      {
-      of << "];" << std::endl;
-      }
-    else
-      {
-      of << ",";
-      }
-    }
-}
-/**
- * PrintSelf method
- */
-template <class TInputGraph>
-void
-RCC8GraphFileWriter<TInputGraph>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h b/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h
deleted file mode 100644
index 2a893e4d6c653c67094e26ef0999723bc278878a..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8GraphSource_h
-#define otbRCC8GraphSource_h
-
-#include "itkProcessObject.h"
-
-namespace otb
-{
-/** \class RCC8GraphSource
- *  \brief Base class for all the filters producing an otbRCC8Graph
- * \ingroup DataSources
- *
- * \ingroup OTBRCC8
- */
-template <class TOutputGraph>
-class ITK_EXPORT RCC8GraphSource
-  : public itk::ProcessObject
-{
-public:
-  /** Standard typedefs */
-  typedef RCC8GraphSource               Self;
-  typedef itk::ProcessObject            Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Type macro */
-  itkNewMacro(Self);
-  /** Creation through object factory macro */
-  itkTypeMacro(RCC8GraphSource, itk::ProcessObject);
-  /** Data object pointer type */
-  typedef itk::DataObject::Pointer DataObjectPointer;
-  /** Template parameter typedef*/
-  typedef TOutputGraph                      OutputGraphType;
-  typedef typename OutputGraphType::Pointer OutputGraphPointerType;
-  /** Overriding of the GetOutput() method */
-  virtual OutputGraphType * GetOutput(void);
-
-protected:
-  /** Constructor */
-  RCC8GraphSource();
-  /** Destructor */
-  ~RCC8GraphSource() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  RCC8GraphSource(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8GraphSource.hxx"
-#endif
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.hxx b/Modules/OBIA/RCC8/include/otbRCC8GraphSource.hxx
deleted file mode 100644
index ce8d6b707213701de9078dc906c0d4ecedef81bc..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.hxx
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8GraphSource_hxx
-#define otbRCC8GraphSource_hxx
-
-#include "otbRCC8GraphSource.h"
-
-namespace otb
-{
-/**
- *   Constructor
- */
-template <class TOutputGraph>
-RCC8GraphSource<TOutputGraph>
-::RCC8GraphSource()
-{
-  this->Superclass::SetNumberOfRequiredOutputs(1);
-  this->Superclass::SetNthOutput(0, TOutputGraph::New().GetPointer());
-}
-/**
- * Get the output Graph
- * \return The output graph produced.
- */
-template <class TOutputGraph>
-typename RCC8GraphSource<TOutputGraph>::OutputGraphType *
-RCC8GraphSource<TOutputGraph>
-::GetOutput(void)
-{
-  if (this->GetNumberOfOutputs() < 1)
-    {
-    return nullptr;
-    }
-  return static_cast<OutputGraphType *> (this->ProcessObject::GetOutput(0));
-}
-/**
- * PrintSelf Method
- */
-template<class TOutputGraph>
-void
-RCC8GraphSource<TOutputGraph>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h b/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h
deleted file mode 100644
index 8c3242ed14651805c7eee908bb8edb18a5362ca4..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8InEdgeIterator_h
-#define otbRCC8InEdgeIterator_h
-
-#include "otbRCC8Graph.h"
-
-namespace otb
-{
-/**
- * \class RCC8InEdgeIterator
- * \brief Iterates on the graph in edges from a vertex.
- *
- * \ingroup OTBRCC8
- */
-template <class TGraph>
-class ITK_EXPORT RCC8InEdgeIterator
-{
-public:
-  /** self typedef */
-  typedef RCC8InEdgeIterator Self;
-
-  /** Graph typedef */
-  typedef TGraph                                   GraphType;
-  typedef typename GraphType::InternalGraphType    InternalGraphType;
-  typedef typename GraphType::Pointer              GraphPointerType;
-  typedef typename GraphType::EdgePointerType      EdgePointerType;
-  typedef typename GraphType::VertexPointerType    VertexPointerType;
-  typedef typename GraphType::VertexDescriptorType VertexDescriptorType;
-  typedef typename GraphType::RCC8ValueType        RCC8ValueType;
-  /** typedef of the internal iterator */
-  typedef typename boost::graph_traits<InternalGraphType>::in_edge_iterator InternalIteratorType;
-  /** Typedef of the index map */
-  typedef typename boost::property_map<InternalGraphType, boost::vertex_index_t>::type IndexMapType;
-
-  /** Constructor */
-  RCC8InEdgeIterator();
-  /** Copy constructor */
-  RCC8InEdgeIterator(const Self &iter);
-  /**  Constructor with input graph */
-  RCC8InEdgeIterator(VertexDescriptorType vertex, GraphType * graph);
-  /**
-   * Get the current edge value.
-   * \return The value of the current edge pointed by the iterator.
-   */
-  RCC8ValueType GetValue(void);
-  /**
-    * Return the source vertex of the current edge.
-    * \return The source edge.
-    */
-  VertexPointerType GetSourceVertex(void);
-  /**
-   * Return the source vertex index of the current edge.
-   * \return The source vertex index.
-   */
-  VertexDescriptorType GetSourceIndex(void);
-  /**
-   * Return true if the iterator is at the end.
-   * \return True if the iterator is at the end.
-   */
-  bool IsAtEnd(void);
-  /**
-   * Go to the beginning.
-   */
-  void GoToBegin(void);
-  /**
-   * Increment.
-   */
-  Self& operator ++();
-  /**
-   * Decrement.
-   */
-  Self& operator --();
-  /**
-   * Add
-   */
-  Self& operator +(int i);
-
-  /**
-   * Remove
-   */
-  Self& operator -(int i);
-  /**
-   * Difference comparison operator.
-   */
-  bool operator !=(const Self& it);
-  /**
-   * Equality comparison operator.
-   */
-  bool operator ==(const Self& it);
-  /**
-   * Instantiation operator.
-   */
-  Self& operator =(const Self& it);
-private:
-  // End
-  InternalIteratorType m_End;
-  // Internal iterator.
-  InternalIteratorType m_Iter;
-  // Input graph pointer
-  GraphPointerType m_Graph;
-  // Target vertex index
-  VertexDescriptorType m_VertexIndex;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8InEdgeIterator.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.hxx b/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.hxx
deleted file mode 100644
index 5fb34dce81bd7e9f27a2b24dc2e3c851bcce20da..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.hxx
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8InEdgeIterator_hxx
-#define otbRCC8InEdgeIterator_hxx
-
-#include "otbRCC8InEdgeIterator.h"
-
-namespace otb
-{
-/** Constructor */
-template <class TGraph>
-RCC8InEdgeIterator<TGraph>
-::RCC8InEdgeIterator()
-{
-  m_Graph = GraphType::New();
-  boost::tuples::tie(m_Iter, m_End) = in_edges(0, *m_Graph->GetGraph());
-}
-/**
- * Copy operator.
- */
-template <class TGraph>
-RCC8InEdgeIterator<TGraph>
-::RCC8InEdgeIterator(const Self& iter)
-{
-  m_Iter = iter.m_Iter;
-  m_Graph = iter.m_Graph;
-  m_VertexIndex = iter.m_VertexIndex;
-  m_End = iter.m_End;
-}
-/**
- *Constructor with input graph
- */
-template <class TGraph>
-RCC8InEdgeIterator<TGraph>
-::RCC8InEdgeIterator(VertexDescriptorType vertex, GraphType * graph)
-{
-  m_Graph = graph;
-  m_VertexIndex = vertex;
-  boost::tuples::tie(m_Iter, m_End) = in_edges(vertex, *m_Graph->GetGraph());
-}
-/**
- * Get the current edge value.
- * \return The value of the current edge pointed by the iterator.
- */
-template <class TGraph>
-typename RCC8InEdgeIterator<TGraph>
-::RCC8ValueType
-RCC8InEdgeIterator<TGraph>
-::GetValue(void)
-{
-  return (*m_Graph->GetGraph())[*m_Iter]->GetValue();
-}
-/**
- * Return the source vertex of the current edge.
- * \return The source edge.
- */
-template <class TGraph>
-typename RCC8InEdgeIterator<TGraph>
-::VertexPointerType
-RCC8InEdgeIterator<TGraph>
-::GetSourceVertex(void)
-{
-  return (*m_Graph->GetGraph())[source(*m_Iter, (*m_Graph->GetGraph()))];
-}
-/**
- * Return the source vertex index of the current edge.
- * \return The source vertex index.
- */
-template <class TGraph>
-typename RCC8InEdgeIterator<TGraph>
-::VertexDescriptorType
-RCC8InEdgeIterator<TGraph>
-::GetSourceIndex(void)
-{
-  IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph()));
-  return index[source(*m_Iter, (*m_Graph->GetGraph()))];
-}
-/**
- * Return true if the iterator is at the end.
- * \return True if the iterator is at the end.
- */
-template <class TGraph>
-bool
-RCC8InEdgeIterator<TGraph>
-::IsAtEnd(void)
-{
-  return (m_Iter == m_End);
-}
-/**
- * Go to the beginning.
- */
-template <class TGraph>
-void
-RCC8InEdgeIterator<TGraph>
-::GoToBegin(void)
-{
-  boost::tuples::tie(m_Iter, m_End) = in_edges(m_VertexIndex, *m_Graph->GetGraph());
-}
-/**
- * Increment.
- */
-template <class TGraph>
-typename RCC8InEdgeIterator<TGraph>
-::Self&
-RCC8InEdgeIterator<TGraph>
-::operator++ ()
-  {
-  ++m_Iter;
-  return *this;
-  }
-/**
- * Decrement.
- */
-template <class TGraph>
-typename RCC8InEdgeIterator<TGraph>
-::Self&
-RCC8InEdgeIterator<TGraph>
-::operator-- ()
-  {
-  --m_Iter;
-  return *this;
-  }
-/**
- * Add
- */
-template <class TGraph>
-typename RCC8InEdgeIterator<TGraph>
-::Self&
-RCC8InEdgeIterator<TGraph>
-::operator + (int i)
-  {
-  m_Iter = m_Iter + i;
-  return *this;
-  }
-/**
- * Remove
- */
-template <class TGraph>
-typename RCC8InEdgeIterator<TGraph>
-::Self&
-RCC8InEdgeIterator<TGraph>
-::operator - (int i)
-  {
-  m_Iter = m_Iter - i;
-  return *this;
-  }
-/**
- * Difference comparison operator.
- */
-template <class TGraph>
-bool
-RCC8InEdgeIterator<TGraph>
-::operator != (const Self &iter)
-  {
-  return (m_Iter != iter.m_Iter);
-  }
-/**
- * Equality comparison operator.
- */
-template <class TGraph>
-bool
-RCC8InEdgeIterator<TGraph>
-::operator == (const Self &iter)
-  {
-  return (m_Iter == iter.m_Iter);
-  }
-/**
- * Instantiation operator.
- */
-template <class TGraph>
-typename RCC8InEdgeIterator<TGraph>
-::Self&
-RCC8InEdgeIterator<TGraph>
-::operator = (const Self &iter)
-  {
-  m_Iter = iter.m_Iter;
-  return *this;
-  }
-} // End namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.h b/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.h
deleted file mode 100644
index 3d22bc092c7d8fcc56d71ccb350faca408442961..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8OutEdgeIterator_h
-#define otbRCC8OutEdgeIterator_h
-
-#include "otbRCC8Graph.h"
-
-namespace otb
-{
-/**
- * \class RCC8OutEdgeIterator
- * \brief Iterates on the graph out edges from a vertex.
- *
- * \ingroup OTBRCC8
- */
-template <class TGraph>
-class ITK_EXPORT RCC8OutEdgeIterator
-{
-public:
-  /** self typedef */
-  typedef RCC8OutEdgeIterator Self;
-
-  /** Graph typedef */
-  typedef TGraph                                   GraphType;
-  typedef typename GraphType::InternalGraphType    InternalGraphType;
-  typedef typename GraphType::Pointer              GraphPointerType;
-  typedef typename GraphType::EdgePointerType      EdgePointerType;
-  typedef typename GraphType::VertexPointerType    VertexPointerType;
-  typedef typename GraphType::VertexDescriptorType VertexDescriptorType;
-  typedef typename GraphType::RCC8ValueType        RCC8ValueType;
-  /** typedef of the internal iterator */
-  typedef typename boost::graph_traits<InternalGraphType>::out_edge_iterator InternalIteratorType;
-  /** Typedef of the index map */
-  typedef typename boost::property_map<InternalGraphType, boost::vertex_index_t>::type IndexMapType;
-
-  /** Constructor */
-  RCC8OutEdgeIterator();
-  /** Copy constructor */
-  RCC8OutEdgeIterator(const Self &iter);
-  /**  Constructor with input graph */
-  RCC8OutEdgeIterator(VertexDescriptorType vertex, TGraph * graph);
-  /**
-   * Get the current edge value.
-   * \return The value of the current edge pointed by the iterator.
-   */
-  RCC8ValueType GetValue(void);
-  /**
-   * Return the target vertex of the current edge.
-   * \return The target vertex.
-   */
-  VertexPointerType GetTargetVertex(void);
-  /**
-   * Return the target vertex index of the current edge.
-   * \return The target vertex index.
-   */
-  VertexDescriptorType GetTargetIndex(void);
-
-  /**
-   * Return true if the iterator is at the end.
-   * \return True if the iterator is at the end.
-   */
-  bool IsAtEnd(void);
-  /**
-   * Go to the beginning.
-   */
-  void GoToBegin(void);
-  /**
-   * Increment.
-   */
-  Self& operator ++();
-  /**
-   * Decrement.
-   */
-  Self& operator --();
-  /**
-   * Add
-   */
-  Self& operator +(int i);
-  /**
-   * Remove
-   */
-  Self& operator -(int i);
-  /**
-   * Difference comparison operator.
-   */
-  bool operator !=(const Self& it);
-  /**
-   * Equality comparison operator.
-   */
-  bool operator ==(const Self& it);
-  /**
-   * Instantiation operator.
-   */
-  Self& operator =(const Self& it);
-private:
-  // End
-  InternalIteratorType m_End;
-  // Internal iterator.
-  InternalIteratorType m_Iter;
-  // Input graph pointer
-  GraphPointerType m_Graph;
-  // source vertex descriptor
-  VertexDescriptorType m_VertexIndex;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8OutEdgeIterator.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.hxx b/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.hxx
deleted file mode 100644
index 811e850eda67dcac88f74c85c8f44369b92c413e..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.hxx
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8OutEdgeIterator_hxx
-#define otbRCC8OutEdgeIterator_hxx
-
-#include "otbRCC8OutEdgeIterator.h"
-
-namespace otb
-{
-/** Constructor */
-template <class TGraph>
-RCC8OutEdgeIterator<TGraph>
-::RCC8OutEdgeIterator()
-{
-  m_Graph = GraphType::New();
-  tie(m_Iter, m_End) = out_edges(0, *m_Graph->GetGraph());
-}
-/**
- * Copy operator.
- */
-template <class TGraph>
-RCC8OutEdgeIterator<TGraph>
-::RCC8OutEdgeIterator(const Self& iter)
-{
-  m_Iter = iter.m_Iter;
-  m_Graph = iter.m_Graph;
-  m_VertexIndex = iter.m_VertexIndex;
-  m_End = iter.m_End;
-}
-/**
- *Constructor with input graph
- */
-template <class TGraph>
-RCC8OutEdgeIterator<TGraph>
-::RCC8OutEdgeIterator(VertexDescriptorType vertex, TGraph * graph)
-{
-  m_Graph = graph;
-  m_VertexIndex = vertex;
-  tie(m_Iter, m_End) = out_edges(vertex, *m_Graph->GetGraph());
-}
-/**
- * Get the current edge value.
- * \return The value of the current edge pointed by the iterator.
- */
-template <class TGraph>
-typename RCC8OutEdgeIterator<TGraph>
-::RCC8ValueType
-RCC8OutEdgeIterator<TGraph>
-::GetValue(void)
-{
-  return (*m_Graph->GetGraph())[*m_Iter]->GetValue();
-}
-/**
- * Return the target vertex of the current edge.
- * \return The target vertex.
- */
-template <class TGraph>
-typename RCC8OutEdgeIterator<TGraph>
-::VertexPointerType
-RCC8OutEdgeIterator<TGraph>
-::GetTargetVertex(void)
-{
-  return (*m_Graph->GetGraph())[target(*m_Iter, (*m_Graph->GetGraph()))];
-}
-/**
- * Return the target vertex index of the current edge.
- * \return The target vertex index.
- */
-template <class TGraph>
-typename RCC8OutEdgeIterator<TGraph>
-::VertexDescriptorType
-RCC8OutEdgeIterator<TGraph>
-::GetTargetIndex(void)
-{
-  IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph()));
-  return index[target(*m_Iter, (*m_Graph->GetGraph()))];
-}
-/**
- * Return true if the iterator is at the end.
- * \return True if the iterator is at the end.
- */
-template <class TGraph>
-bool
-RCC8OutEdgeIterator<TGraph>
-::IsAtEnd(void)
-{
-  return (m_Iter == m_End);
-}
-/**
- * Go to the beginning.
- */
-template <class TGraph>
-void
-RCC8OutEdgeIterator<TGraph>
-::GoToBegin(void)
-{
-  tie(m_Iter, m_End) = out_edges(m_VertexIndex, *m_Graph->GetGraph());
-}
-/**
- * Increment.
- */
-template <class TGraph>
-typename RCC8OutEdgeIterator<TGraph>
-::Self&
-RCC8OutEdgeIterator<TGraph>
-::operator++ ()
-  {
-  ++m_Iter;
-  return *this;
-  }
-/**
- * Decrement.
- */
-template <class TGraph>
-typename RCC8OutEdgeIterator<TGraph>
-::Self&
-RCC8OutEdgeIterator<TGraph>
-::operator-- ()
-  {
-  --m_Iter;
-  return *this;
-  }
-/**
- * Add
- */
-template <class TGraph>
-typename RCC8OutEdgeIterator<TGraph>
-::Self&
-RCC8OutEdgeIterator<TGraph>
-::operator + (int i)
-  {
-  m_Iter = m_Iter + i;
-  return *this;
-  }
-/**
- * Remove
- */
-template <class TGraph>
-typename RCC8OutEdgeIterator<TGraph>
-::Self&
-RCC8OutEdgeIterator<TGraph>
-::operator - (int i)
-  {
-  m_Iter = m_Iter - i;
-  return *this;
-  }
-/**
- * Difference comparison operator.
- */
-template <class TGraph>
-bool
-RCC8OutEdgeIterator<TGraph>
-::operator != (const Self &iter)
-  {
-  return (m_Iter != iter.m_Iter);
-  }
-/**
- * Equality comparison operator.
- */
-template <class TGraph>
-bool
-RCC8OutEdgeIterator<TGraph>
-::operator == (const Self &iter)
-  {
-  return (m_Iter == iter.m_Iter);
-  }
-/**
- * Instantiation operator.
- */
-template <class TGraph>
-typename RCC8OutEdgeIterator<TGraph>
-::Self&
-RCC8OutEdgeIterator<TGraph>
-::operator = (const Self &iter)
-  {
-  m_Iter = iter.m_Iter;
-  return *this;
-  }
-} // End namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8Value.h b/Modules/OBIA/RCC8/include/otbRCC8Value.h
deleted file mode 100644
index 24bc9c96c1039c35daae218c76ebe8fe233ffee6..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8Value.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8Value_h
-#define otbRCC8Value_h
-
-namespace otb
-{
-// Coding enum system to represent the RCC8 relation values.
-typedef enum
-  {
-  OTB_RCC8_DC,
-  OTB_RCC8_EC,
-  OTB_RCC8_PO,
-  OTB_RCC8_TPP,
-  OTB_RCC8_TPPI,
-  OTB_RCC8_NTPP,
-  OTB_RCC8_NTPPI,
-  OTB_RCC8_EQ
-  }
-RCC8Value;
-} // End namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexBase.h b/Modules/OBIA/RCC8/include/otbRCC8VertexBase.h
deleted file mode 100644
index 3876c423319ecb4768529dbaa454a7d1f1e14bb4..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8VertexBase.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8VertexBase_h
-#define otbRCC8VertexBase_h
-
-#include "itkDataObject.h"
-#include "itkObjectFactory.h"
-#include <cstdlib>
-
-namespace otb
-{
-/** \class RCC8VertexBase
- *  \brief Base class to represent a vertex in a RCC8 Graph.
- *
- *  This class can be derived to add attributes to the vertices of the
- *  RCC8 graph.
- *
- * \sa RCC8Graph, RCC8Edge
- *
- * \ingroup OTBRCC8
- */
-template <class TPath>
-class ITK_EXPORT RCC8VertexBase
-  : public itk::DataObject
-{
-public:
-  /** Standard class typedefs */
-  typedef RCC8VertexBase                Self;
-  typedef itk::DataObject               Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(RCC8VertexBase, DataObject);
-  /** Input image associated typedefs*/
-  typedef TPath                                  PathType;
-  typedef typename PathType::Pointer             PathPointerType;
-  typedef typename PathType::ContinuousIndexType ContinuousIndexType;
-
-  /** char* vector attributes */
-  typedef std::map<std::string, std::string> AttributesMapType;
-
-  /** Segmentation image index accessors */
-  itkGetMacro(SegmentationLevel, unsigned int);
-  itkSetMacro(SegmentationLevel, unsigned int);
-  itkGetMacro(SegmentationType, bool);
-  itkSetMacro(SegmentationType, bool);
-  /** Object label in image accessor */
-  itkGetObjectMacro(Path, PathType);
-  itkSetObjectMacro(Path, PathType);
-  /**
-   * Set the VertexBase attributes from the attributes vector.
-   * \param attributes The vector containing the parsed attributes.
-   */
-  virtual void SetAttributesMap(AttributesMapType attributes);
-  /**
-   * Get an attributes vector representing the VertexBase attributes.
-   * \return The attributes vector
-   */
-  virtual AttributesMapType GetAttributesMap(void);
-
-protected:
-  /** Constructor */
-  RCC8VertexBase();
-  /** Desctructor */
-  ~RCC8VertexBase() override {}
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  /** The segmentation level */
-  unsigned int m_SegmentationLevel;
-  /** True if bright details, false otherwise */
-  bool m_SegmentationType;
-  /** The path of the edge of the region */
-  PathPointerType m_Path;
-};
-} // end namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8VertexBase.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexBase.hxx b/Modules/OBIA/RCC8/include/otbRCC8VertexBase.hxx
deleted file mode 100644
index 3464483c73676d4ef2b909bc129cfd34058570cb..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8VertexBase.hxx
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8VertexBase_hxx
-#define otbRCC8VertexBase_hxx
-
-#include "otbRCC8VertexBase.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TPath>
-RCC8VertexBase<TPath>
-::RCC8VertexBase()
-{
-  m_SegmentationLevel = 0;
-  m_SegmentationType = true;
-  m_Path = PathType::New();
-  m_Path->Initialize();
-}
-/**
- * Set the VertexBase attributes from the attributes vector.
- * \param attributes The vector containing the parsed attributes.
- */
-template <class TPath>
-void
-RCC8VertexBase<TPath>
-::SetAttributesMap(AttributesMapType attributes)
-{
-  m_SegmentationLevel = static_cast<unsigned int>(atoi(attributes["SegmentationLevel"].c_str()));
-  m_SegmentationType = static_cast<bool>(atoi(attributes["SegmentationType"].c_str()));
-  unsigned int nbPoints = static_cast<unsigned int>(atoi(attributes["NumberOfPointsInPath"].c_str()));
-
-  std::ostringstream oss;
-
-  m_Path = PathType::New();
-  m_Path->Initialize();
-
-  for (unsigned int i = 0; i < nbPoints; ++i)
-    {
-    ContinuousIndexType newPoint;
-    oss << "P" << i << "x";
-    newPoint[0] = atof(attributes[oss.str()].c_str());
-    oss.str("");
-    oss << "P" << i << "y";
-    newPoint[1] = atof(attributes[oss.str()].c_str());
-    oss.str("");
-    m_Path->AddVertex(newPoint);
-    }
-}
-/**
- * Get an attributes vector representing the VertexBase attributes.
- * \return The attributes vector
- */
-template <class TPath>
-typename RCC8VertexBase<TPath>::AttributesMapType
-RCC8VertexBase<TPath>
-::GetAttributesMap(void)
-{
-  std::ostringstream oss;
-  AttributesMapType  results;
-  oss << m_SegmentationLevel;
-  results["SegmentationLevel"] = oss.str();
-  oss.str("");
-  oss << m_SegmentationType;
-  results["SegmentationType"] = oss.str();
-  oss.str("");
-  oss << m_Path->GetVertexList()->Size();
-  results["NumberOfPointsInPath"] = oss.str();
-  oss.str("");
-
-  typename PathType::VertexListType::ConstIterator it;
-  unsigned int                                     index = 0;
-
-  for (it = m_Path->GetVertexList()->Begin(); it != m_Path->GetVertexList()->End(); ++it, ++index)
-    {
-    ContinuousIndexType point = it.Value();
-    oss << "P" << index << "x";
-    std::string key = oss.str();
-    oss.str("");
-    oss << point[0];
-    results[key] = oss.str();
-    oss.str("");
-    oss << "P" << index << "y";
-    key = oss.str();
-    oss.str("");
-    oss << point[1];
-    results[key] = oss.str();
-    oss.str("");
-    }
-  return results;
-}
-/**
- * PrintSelf method
- */
-template <class TPath>
-void
-RCC8VertexBase<TPath>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "SegmentationLevel: " << m_SegmentationLevel << std::endl;
-  os << indent << "SegmentationType: " << m_SegmentationType << std::endl;
-}
-} // end namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.h b/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.h
deleted file mode 100644
index 51d771e11ae2298f66fdacb4b2ec3c16e7a28cea..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8VertexIterator_h
-#define otbRCC8VertexIterator_h
-
-#include "otbRCC8Graph.h"
-
-namespace otb
-{
-/**
- * \class RCC8VertexIterator
- * \brief Iterates on the graph vertices
- *
- * \ingroup OTBRCC8
- */
-template <class TGraph>
-class ITK_EXPORT RCC8VertexIterator
-{
-public:
-  /** self typedef */
-  typedef RCC8VertexIterator Self;
-
-  /** Graph typedef */
-  typedef TGraph                                   GraphType;
-  typedef typename GraphType::InternalGraphType    InternalGraphType;
-  typedef typename GraphType::Pointer              GraphPointerType;
-  typedef typename GraphType::VertexPointerType    VertexPointerType;
-  typedef typename GraphType::VertexDescriptorType VertexDescriptorType;
-  /** typedef of the internal iterator */
-  typedef typename boost::graph_traits<InternalGraphType>::vertex_iterator InternalIteratorType;
-  /** Typedef of the index map */
-  typedef typename boost::property_map<InternalGraphType, boost::vertex_index_t>::type IndexMapType;
-  /** Constructor */
-  RCC8VertexIterator();
-  /** Copy constructor */
-  RCC8VertexIterator(const Self &iter);
-  /**  Constructor with input graph */
-  RCC8VertexIterator(TGraph * graph);
-  /**
-   * Get the current vertex.
-   * \return The current vertex pointed by the iterator.
-   */
-  VertexPointerType Get(void);
-  /**
-   * Set the current vertex.
-   * \param vertex The vertex to set.
-   */
-  void Set(VertexPointerType vertex);
-  /**
-   * Get the current vertex index.
-   * \return The current vertex index.
-   */
-  VertexDescriptorType GetIndex(void);
-  /**
-   * Return true if the iterator is at the end.
-   * \return True if the iterator is at the end.
-   */
-  bool IsAtEnd(void);
-  /**
-   * Go to the beginning.
-   */
-  void GoToBegin(void);
-  /**
-   * Increment.
-   */
-  Self& operator ++();
-  /**
-   * Decrement.
-   */
-  Self& operator --();
-  /**
-   * Add
-   */
-  Self& operator +(int i);
-
-  /**
-   * Remove
-   */
-  Self& operator -(int i);
-  /**
-   * Difference comparison operator.
-   */
-  bool operator !=(const Self& it);
-  /**
-   * Equality comparison operator.
-   */
-  bool operator ==(const Self& it);
-  /**
-   * Instantiation operator.
-   */
-  Self& operator =(const Self& it);
-private:
-  // End
-  InternalIteratorType m_End;
-  // Internal iterator.
-  InternalIteratorType m_Iter;
-  // Input graph pointer
-  GraphPointerType m_Graph;
-};
-} // End namespace otb
-
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8VertexIterator.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.hxx b/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.hxx
deleted file mode 100644
index 29d13da47d71fa201169c86f2c03f14a6fddbc21..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.hxx
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8VertexIterator_hxx
-#define otbRCC8VertexIterator_hxx
-
-#include "otbRCC8VertexIterator.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TGraph>
-RCC8VertexIterator<TGraph>
-::RCC8VertexIterator()
-{
-  m_Graph = GraphType::New();
-  boost::tie(m_Iter, m_End) = boost::vertices(*(m_Graph->GetGraph()));
-}
-/**
- * Copy operator.
- */
-template <class TGraph>
-RCC8VertexIterator<TGraph>
-::RCC8VertexIterator(const Self& iter)
-{
-  m_Iter = iter.m_Iter;
-  m_Graph = iter.m_Graph;
-  m_End = iter.m_End;
-}
-/**
- *Constructor with input graph
- */
-template <class TGraph>
-RCC8VertexIterator<TGraph>
-::RCC8VertexIterator(TGraph * graph)
-{
-  m_Graph = graph;
-  boost::tie(m_Iter, m_End) = boost::vertices(*(m_Graph->GetGraph()));
-}
-/**
- * Get the current object.
- * \return The current object pointed by the iterator.
- */
-template <class TGraph>
-typename RCC8VertexIterator<TGraph>
-::VertexPointerType
-RCC8VertexIterator<TGraph>
-::Get(void)
-{
-  return (*(m_Graph->GetGraph()))[*m_Iter];
-}
-/**
- * Set the current vertex.
- * \param vertex The vertex to set.
- */
-template <class TGraph>
-void
-RCC8VertexIterator<TGraph>
-::Set(VertexPointerType vertex)
-{
-  (*(m_Graph->GetGraph()))[*m_Iter] = vertex;
-}
-/**
- * Get the current vertex index.
- * \return The current vertex index.
- */
-template <class TGraph>
-typename RCC8VertexIterator<TGraph>
-::VertexDescriptorType
-RCC8VertexIterator<TGraph>
-::GetIndex(void)
-{
-  IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph()));
-  return index[*m_Iter];
-}
-/**
-  * Return true if the iterator is at the end.
-  * \return True if the iterator is at the end.
-  */
-template <class TGraph>
-bool
-RCC8VertexIterator<TGraph>
-::IsAtEnd(void)
-{
-  return (m_Iter == m_End);
-}
-/**
- * Go to the beginning.
- */
-template <class TGraph>
-void
-RCC8VertexIterator<TGraph>
-::GoToBegin(void)
-{
-  boost::tie(m_Iter, m_End) = boost::vertices(*(m_Graph->GetGraph()));
-}
-/**
- * Increment.
- */
-template <class TGraph>
-typename RCC8VertexIterator<TGraph>
-::Self&
-RCC8VertexIterator<TGraph>
-::operator++ ()
-  {
-  ++m_Iter;
-  return *this;
-  }
-/**
- * Decrement.
- */
-template <class TGraph>
-typename RCC8VertexIterator<TGraph>
-::Self&
-RCC8VertexIterator<TGraph>
-::operator-- ()
-  {
-  --m_Iter;
-  return *this;
-  }
-/**
- * Add
- */
-template <class TGraph>
-typename RCC8VertexIterator<TGraph>
-::Self&
-RCC8VertexIterator<TGraph>
-::operator + (int i)
-  {
-  m_Iter = m_Iter + i;
-  return *this;
-  }
-/**
- * Remove
- */
-template <class TGraph>
-typename RCC8VertexIterator<TGraph>
-::Self&
-RCC8VertexIterator<TGraph>
-::operator - (int i)
-  {
-  m_Iter = m_Iter - i;
-  return *this;
-  }
-/**
- * Difference comparison operator.
- */
-template <class TGraph>
-bool
-RCC8VertexIterator<TGraph>
-::operator != (const Self &iter)
-  {
-  return (m_Iter != iter.m_Iter);
-  }
-/**
- * Equality comparison operator.
- */
-template <class TGraph>
-bool
-RCC8VertexIterator<TGraph>
-::operator == (const Self &iter)
-  {
-  return (m_Iter == iter.m_Iter);
-  }
-/**
- * Instantiation operator.
- */
-template <class TGraph>
-typename RCC8VertexIterator<TGraph>
-::Self&
-RCC8VertexIterator<TGraph>
-::operator = (const Self &iter)
-  {
-  m_Iter = iter.m_Iter;
-  return *this;
-  }
-} // End namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.h b/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.h
deleted file mode 100644
index 8b87a877ad3b3c54111a4f66b9d4dd120cd36a62..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8VertexWithCompacity_h
-#define otbRCC8VertexWithCompacity_h
-
-#include "otbRCC8VertexBase.h"
-
-namespace otb
-{
-/** \class RCC8VertexWithCompacity
- *  \brief Class to represent a vertex in a RCC8 Graph with the compacity value of
- *  the represented region.
- *
- * \sa RCC8Graph, RCC8Edge, RCC8VertexBase
- *
- * \ingroup OTBRCC8
- */
-template <class TPath, class TPrecision = float>
-class ITK_EXPORT RCC8VertexWithCompacity
-  : public RCC8VertexBase<TPath>
-{
-public:
-  /** Standard class typedefs */
-  typedef RCC8VertexWithCompacity       Self;
-  typedef otb::RCC8VertexBase<TPath>    Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(RCC8VertexWithCompacity, RCC8VertexBase);
-  /** Input image associated typedefs*/
-  typedef TPath PathType;
-  /** Precision  typedef */
-  typedef TPrecision PrecisionType;
-  /** char* vector attributes */
-  typedef  typename Superclass::AttributesMapType AttributesMapType;
-
-  /** Segmentation image index accessors */
-  itkGetMacro(Compacity, PrecisionType);
-  itkSetMacro(Compacity, PrecisionType);
-  /**
-   * Set the VertexWithCompacity attributes from the attributes vector.
-   * \param attributes The vector containing the parsed attributes.
-   */
-  void SetAttributesMap(AttributesMapType attributes) override;
-  /**
-   * Get an attributes vector representing the VertexWithCompacity attributes.
-   * \return The attributes vector
-   */
-  AttributesMapType GetAttributesMap(void) override;
-
-protected:
-  /** Constructor */
-  RCC8VertexWithCompacity();
-  /** Desctructor */
-  ~RCC8VertexWithCompacity() override {}
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  /** The compacity */
-  PrecisionType m_Compacity;
-};
-} // end namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8VertexWithCompacity.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.hxx b/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.hxx
deleted file mode 100644
index 9ad40b3424598407c9686e51f24835f57ff3c6e8..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.hxx
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8VertexWithCompacity_hxx
-#define otbRCC8VertexWithCompacity_hxx
-
-#include "otbRCC8VertexWithCompacity.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TPath, class TPrecision>
-RCC8VertexWithCompacity<TPath, TPrecision>
-::RCC8VertexWithCompacity()
-{
-  m_Compacity = 0.0;
-}
-/**
- * Set the VertexWithCompacity attributes from the attributes vector.
- * \param attributes The vector containing the parsed attributes.
- */
-template <class TPath, class TPrecision>
-void
-RCC8VertexWithCompacity<TPath, TPrecision>
-::SetAttributesMap(AttributesMapType attributes)
-{
-  this->Superclass::SetAttributesMap(attributes);
-  m_Compacity = static_cast<TPrecision>(atof(attributes["Compacity"].c_str()));
-}
-/**
- * Get an attributes vector representing the VertexBase attributes.
- * \return The attributes vector
- */
-template <class TPath, class TPrecision>
-typename RCC8VertexWithCompacity<TPath, TPrecision>::AttributesMapType
-RCC8VertexWithCompacity<TPath, TPrecision>
-::GetAttributesMap(void)
-{
-  std::stringstream oss;
-  AttributesMapType results;
-  results = this->Superclass::GetAttributesMap();
-  oss << m_Compacity;
-  results["Compacity"] = oss.str();
-  oss.str("");
-  return results;
-}
-/**
- * PrintSelf method
- */
-template <class TPath, class TPrecision>
-void
-RCC8VertexWithCompacity<TPath, TPrecision>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "Compacity: " << m_Compacity << std::endl;
-}
-} // end namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.h b/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.h
deleted file mode 100644
index 6916c936f5fb7c376123c59e0801fb9623cd8105..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8VertexWithRegionCenter_h
-#define otbRCC8VertexWithRegionCenter_h
-
-#include "otbRCC8VertexBase.h"
-
-namespace otb
-{
-/** \class RCC8VertexWithRegionCenter
- *  \brief Class to represent a vertex in a RCC8 Graph with the compacity value of
- *  the represented region.
- *
- * \sa RCC8Graph, RCC8Edge, RCC8VertexBase
- *
- * \ingroup OTBRCC8
- */
-template <class TLabel, class TPrecision = float>
-class ITK_EXPORT RCC8VertexWithRegionCenter
-  : public RCC8VertexBase<TLabel>
-{
-public:
-  /** Standard class typedefs */
-  typedef RCC8VertexWithRegionCenter    Self;
-  typedef otb::RCC8VertexBase<TLabel>   Superclass;
-  typedef itk::SmartPointer<Self>       Pointer;
-  typedef itk::SmartPointer<const Self> ConstPointer;
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(RCC8VertexWithRegionCenter, RCC8VertexBase);
-  /** Input image associated typedefs*/
-  typedef TLabel LabelType;
-  /** Precision  typedef */
-  typedef TPrecision PrecisionType;
-  /** char* vector attributes */
-  typedef  typename Superclass::AttributesMapType AttributesMapType;
-
-  itkGetMacro(RegionCenterXCoordinate, PrecisionType);
-  itkSetMacro(RegionCenterXCoordinate, PrecisionType);
-  itkGetMacro(RegionCenterYCoordinate, PrecisionType);
-  itkSetMacro(RegionCenterYCoordinate, PrecisionType);
-  /**
-   * Set the VertexWithRegionCenter attributes from the attributes vector.
-   * \param attributes The vector containing the parsed attributes.
-   */
-  void SetAttributesMap(AttributesMapType attributes);
-  /**
-   * Get an attributes vector representing the VertexWithRegionCenter attributes.
-   * \return The attributes vector
-   */
-  AttributesMapType GetAttributesMap(void);
-
-protected:
-  /** Constructor */
-  RCC8VertexWithRegionCenter();
-  /** Desctructor */
-  ~RCC8VertexWithRegionCenter() {}
-  /** PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const;
-
-private:
-  /** The compacity */
-  PrecisionType m_RegionCenterXCoordinate;
-  PrecisionType m_RegionCenterYCoordinate;
-};
-} // end namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbRCC8VertexWithRegionCenter.hxx"
-#endif
-
-#endif
diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.hxx b/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.hxx
deleted file mode 100644
index 42f9c3adc5872e069ebefc923dec5faf5578069b..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.hxx
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbRCC8VertexWithRegionCenter_hxx
-#define otbRCC8VertexWithRegionCenter_hxx
-
-#include "otbRCC8VertexWithRegionCenter.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TLabel, class TPrecision>
-RCC8VertexWithRegionCenter<TLabel, TPrecision>
-::RCC8VertexWithRegionCenter()
-{
-  m_RegionCenterXCoordinate = 0.0;
-  m_RegionCenterYCoordinate = 0.0;
-}
-/**
- * Set the VertexWithRegionCenter attributes from the attributes vector.
- * \param attributes The vector containing the parsed attributes.
- */
-template <class TLabel, class TPrecision>
-void
-RCC8VertexWithRegionCenter<TLabel, TPrecision>
-::SetAttributesMap(AttributesMapType attributes)
-{
-  this->Superclass::SetAttributesMap(attributes);
-  m_RegionCenterXCoordinate = static_cast<TPrecision>(atof(attributes["RegionCenterXCoordinate"].c_str()));
-  m_RegionCenterYCoordinate = static_cast<TPrecision>(atof(attributes["RegionCenterYCoordinate"].c_str()));
-}
-/**
- * Get an attributes vector representing the VertexBase attributes.
- * \return The attributes vector
- */
-template <class TLabel, class TPrecision>
-typename RCC8VertexWithRegionCenter<TLabel, TPrecision>::AttributesMapType
-RCC8VertexWithRegionCenter<TLabel, TPrecision>
-::GetAttributesMap(void)
-{
-  std::stringstream oss;
-  AttributesMapType results;
-  results = this->Superclass::GetAttributesMap();
-  oss << m_RegionCenterXCoordinate;
-  results["RegionCenterXCoordinate"] = oss.str();
-  oss.str("");
-  oss << m_RegionCenterYCoordinate;
-  results["RegionCenterYCoordinate"] = oss.str();
-  oss.str("");
-  return results;
-}
-/**
- * PrintSelf method
- */
-template <class TLabel, class TPrecision>
-void
-RCC8VertexWithRegionCenter<TLabel, TPrecision>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "RegionCenterXCoordinate: " << m_RegionCenterXCoordinate << std::endl;
-  os << indent << "RegionCenterXCoordinate: " << m_RegionCenterYCoordinate << std::endl;
-}
-} // end namespace otb
-#endif
diff --git a/Modules/OBIA/RCC8/otb-module.cmake b/Modules/OBIA/RCC8/otb-module.cmake
deleted file mode 100644
index 5e9a368a74170e6094b54479d9477820fd6e7511..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/otb-module.cmake
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-set(DOCUMENTATION "The region connection calculus (RCC) is used for qualitative
-spatial representation and . RCC abstractly describes regions by their possible
-relations to each other (8 basic relations are possible between two regions). The
-RCC8 constraint language has been popularly adopted by the GIS communities. This
-module provides classes related to this purpose.")
-
-otb_module(OTBRCC8
-  DEPENDS
-    OTBITK
-    OTBImageBase
-    OTBRoadExtraction
-    OTBImageManipulation
-    OTBPath
-    OTBCommon
-    OTBBoostAdapters
-    OTBObjectList
-
-  TEST_DEPENDS
-    OTBVectorDataBase
-    OTBTestKernel
-    OTBImageIO
-
-  DESCRIPTION
-    "${DOCUMENTATION}"
-)
diff --git a/Modules/OBIA/RCC8/src/CMakeLists.txt b/Modules/OBIA/RCC8/src/CMakeLists.txt
deleted file mode 100644
index 1b18d1544cc6d894fe150c1c4efa644f2b875ae1..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/src/CMakeLists.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-set(OTBRCC8_SRC
-  otbRCC8Edge.cxx
-  )
-
-add_library(OTBRCC8 ${OTBRCC8_SRC})
-target_link_libraries(OTBRCC8 
-  ${OTBImageManipulation_LIBRARIES}
-  ${OTBImageBase_LIBRARIES}
-  ${OTBCommon_LIBRARIES}
-  ${OTBBoost_LIBRARIES}
-
-  )
-
-otb_module_target(OTBRCC8)
diff --git a/Modules/OBIA/RCC8/src/otbRCC8Edge.cxx b/Modules/OBIA/RCC8/src/otbRCC8Edge.cxx
deleted file mode 100644
index 361123310263e7d8c2b4165490e2cc799fd21f0a..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/src/otbRCC8Edge.cxx
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-#include "otbRCC8Edge.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-RCC8Edge::RCC8Edge()
-{
-  m_Value = OTB_RCC8_DC;
-}
-/**
- * PrintSelf method
- */
-void
-RCC8Edge::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-  os << indent << "RCC8 Value: " << m_Value << std::endl;
-}
-} // end namespace otb
diff --git a/Modules/OBIA/RCC8/test/CMakeLists.txt b/Modules/OBIA/RCC8/test/CMakeLists.txt
deleted file mode 100644
index 72b127feda0de107037af29017097f9bbde8b9c1..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/CMakeLists.txt
+++ /dev/null
@@ -1,170 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-otb_module_test()
-
-set(OTBRCC8Tests
-otbRCC8TestDriver.cxx
-otbRCC8GraphFileReader.cxx
-otbRCC8GraphIOEndToEnd.cxx
-otbPolygonListToRCC8GraphFilter.cxx
-otbRCC8VertexBase.cxx
-otbPolygonToPolygonRCC8Calculator.cxx
-otbImageToImageRCC8Calculator.cxx
-otbRCC8Edge.cxx
-otbRCC8VertexWithCompacity.cxx
-otbRCC8Graph.cxx
-otbRCC8GraphFileWriter.cxx
-otbImageMultiSegmentationToRCC8GraphFilter.cxx
-)
-
-add_executable(otbRCC8TestDriver ${OTBRCC8Tests})
-target_link_libraries(otbRCC8TestDriver ${OTBRCC8-Test_LIBRARIES})
-otb_module_target_label(otbRCC8TestDriver)
-
-# Tests Declaration
-
-otb_add_test(NAME srTvRCC8GraphFileReader COMMAND otbRCC8TestDriver
-  otbRCC8GraphFileReader
-  ${TEMP}/srRCC8GraphWriterOutput1.dot
-  )
-set_property(TEST srTvRCC8GraphFileReader PROPERTY DEPENDS srTvRCC8GraphFileWriter)
-
-otb_add_test(NAME srTvRCC8GraphIOEndToEnd COMMAND otbRCC8TestDriver
-  --compare-ascii        ${NOTOL}
-  ${BASELINE_FILES}/srRCC8GraphWriterOutput1.dot
-  ${TEMP}/srRCC8GraphIOEndToEndOut.dot
-  otbRCC8GraphIOEndToEnd
-  ${BASELINE_FILES}/srRCC8GraphWriterOutput1.dot
-  ${TEMP}/srRCC8GraphIOEndToEndOut.dot
-  )
-
-otb_add_test(NAME srTvPolygonListToRCC8GraphFilter COMMAND otbRCC8TestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/srTvPolygonListToRCC8GraphFilterOutput.dot
-  ${TEMP}/srTvPolygonListToRCC8GraphFilterOutput.dot
-  otbPolygonListToRCC8GraphFilter
-  ${TEMP}/srTvPolygonListToRCC8GraphFilterOutput.dot)
-
-otb_add_test(NAME srTvRCC8VertexBase COMMAND otbRCC8TestDriver
-  otbRCC8VertexBase
-  5
-  5
-  )
-
-otb_add_test(NAME srTvPolygonRCC8Calculator COMMAND otbRCC8TestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/srRCC8PolygonToPolygonCalculatorOutput.txt
-  ${TEMP}/srRCC8PolygonToPolygonCalculatorOutput.txt
-  otbPolygonToPolygonRCC8Calculator
-  4
-  ${TEMP}/srRCC8PolygonToPolygonCalculatorOutput.txt
-  ${INPUTDATA}/rcc8_mire1.png
-  ${INPUTDATA}/rcc8_mire2.png
-  ${INPUTDATA}/rcc8_mire3.png
-  ${INPUTDATA}/rcc8_mire4.png
-  )
-
-otb_add_test(NAME srTvRCC8Calculator COMMAND otbRCC8TestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/srRCC8CalculatorOutput.txt
-  ${TEMP}/srRCC8CalculatorOutput.txt
-  otbImageToImageRCC8Calculator
-  4
-  ${TEMP}/srRCC8CalculatorOutput.txt
-  ${INPUTDATA}/rcc8_mire1.png
-  ${INPUTDATA}/rcc8_mire2.png
-  ${INPUTDATA}/rcc8_mire3.png
-  ${INPUTDATA}/rcc8_mire4.png
-  )
-
-otb_add_test(NAME srTvRCC8Edge COMMAND otbRCC8TestDriver
-  otbRCC8Edge
-  )
-
-otb_add_test(NAME srTvRCC8VertexWithCompacity COMMAND otbRCC8TestDriver
-  otbRCC8VertexWithCompacity
-  5
-  5
-  0.125354
-  )
-
-otb_add_test(NAME srTvRCC8Graph COMMAND otbRCC8TestDriver
-  otbRCC8Graph
-  )
-
-otb_add_test(NAME srTvRCC8GraphFileWriter COMMAND otbRCC8TestDriver
-  --compare-ascii        ${NOTOL}
-  ${BASELINE_FILES}/srRCC8GraphWriterOutput1.dot
-  ${TEMP}/srRCC8GraphWriterOutput1.dot
-  otbRCC8GraphFileWriter
-  ${TEMP}/srRCC8GraphWriterOutput1.dot
-  )
-
-otb_add_test(NAME srTvMultiSegToRCC8GraphFilter1 COMMAND otbRCC8TestDriver
-  --compare-ascii        ${NOTOL}
-  ${BASELINE_FILES}/srRCC8GraphFilterOutput.dot
-  ${TEMP}/srRCC8GraphFilterOutput.dot
-  otbImageMultiSegmentationToRCC8GraphFilter
-  ${TEMP}/srRCC8GraphFilterOutput.dot
-  0
-  2
-  ${INPUTDATA}/Seg1InputForRCC8Graph.tif
-  ${INPUTDATA}/Seg2InputForRCC8Graph.tif
-  )
-
-otb_add_test(NAME srTvMultiSegToRCC8GraphFilter2 COMMAND otbRCC8TestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/srRCC8GraphFilterOutput2.dot
-  ${TEMP}/srRCC8GraphFilterOutput2.dot
-  otbImageMultiSegmentationToRCC8GraphFilter
-  ${TEMP}/srRCC8GraphFilterOutput2.dot
-  0
-  3
-  ${INPUTDATA}/Seg3InputForRCC8Graph.tif
-  ${INPUTDATA}/Seg4InputForRCC8Graph.tif
-  ${INPUTDATA}/Seg5InputForRCC8Graph.tif
-  )
-
-otb_add_test(NAME srTvMultiSegToRCC8GraphFilter2WithOpti COMMAND otbRCC8TestDriver
-  --compare-ascii ${NOTOL}
-  ${BASELINE_FILES}/srRCC8GraphFilterOutput2.dot
-  ${TEMP}/srRCC8GraphFilterOutput2WithOpti.dot
-  otbImageMultiSegmentationToRCC8GraphFilter
-  ${TEMP}/srRCC8GraphFilterOutput2WithOpti.dot
-  1
-  3
-  ${INPUTDATA}/Seg3InputForRCC8Graph.tif
-  ${INPUTDATA}/Seg4InputForRCC8Graph.tif
-  ${INPUTDATA}/Seg5InputForRCC8Graph.tif
-  )
-
-otb_add_test(NAME srTvMultiSegToRCC8GraphFilter1WithOpti COMMAND otbRCC8TestDriver
-  --compare-ascii        ${NOTOL}
-  ${BASELINE_FILES}/srRCC8GraphFilterOutput.dot
-  ${TEMP}/srRCC8GraphFilterOutputWithOpti.dot
-  otbImageMultiSegmentationToRCC8GraphFilter
-  ${TEMP}/srRCC8GraphFilterOutputWithOpti.dot
-  1
-  2
-  ${INPUTDATA}/Seg1InputForRCC8Graph.tif
-  ${INPUTDATA}/Seg2InputForRCC8Graph.tif
-  )
-
diff --git a/Modules/OBIA/RCC8/test/otbImageMultiSegmentationToRCC8GraphFilter.cxx b/Modules/OBIA/RCC8/test/otbImageMultiSegmentationToRCC8GraphFilter.cxx
deleted file mode 100644
index b212a1a3ff8e28f4d3d77959fb6765fdac815625..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbImageMultiSegmentationToRCC8GraphFilter.cxx
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbImageList.h"
-#include "otbPolygon.h"
-#include "otbRCC8VertexBase.h"
-#include "otbImageMultiSegmentationToRCC8GraphFilter.h"
-#include "otbImageFileReader.h"
-#include "otbRCC8GraphFileWriter.h"
-
-int otbImageMultiSegmentationToRCC8GraphFilter(int itkNotUsed(argc), char* argv[])
-{
-  const unsigned int Dimension = 2;
-  char *             outputFilename = argv[1];
-  int                useOptimisation = atoi(argv[2]);
-  unsigned int       nbImages = atoi(argv[3]);
-
-  // typedefs
-  typedef unsigned short                        LabelPixelType;
-  typedef otb::Image<LabelPixelType, Dimension> LabelImageType;
-  typedef otb::Polygon<>                        PolygonType;
-  typedef otb::RCC8VertexBase<PolygonType>      VertexType;
-  typedef otb::RCC8Graph<VertexType>            RCC8GraphType;
-  typedef otb::ImageMultiSegmentationToRCC8GraphFilter<LabelImageType, RCC8GraphType>
-  RCC8GraphFilterType;
-  typedef otb::ImageList<LabelImageType>          ImageListType;
-  typedef otb::ImageFileReader<LabelImageType>    ReaderType;
-  typedef otb::RCC8GraphFileWriter<RCC8GraphType> GraphWriterType;
-
-  ImageListType::Pointer inputList = ImageListType::New();
-
-  // Reading input images
-  for (unsigned int i = 0; i < nbImages; ++i)
-    {
-    ReaderType::Pointer reader = ReaderType::New();
-    reader->SetFileName(argv[4 + i]);
-    reader->Update();
-    inputList->PushBack(reader->GetOutput());
-    }
-  std::cout << "Input image loaded into images list." << std::endl;
-  // Instantiation
-  RCC8GraphFilterType::Pointer filter = RCC8GraphFilterType::New();
-  filter->SetInput(inputList);
-  filter->SetOptimisation(useOptimisation > 0);
-
-  // Writing output graph
-  GraphWriterType::Pointer writer = GraphWriterType::New();
-  writer->SetFileName(outputFilename);
-  writer->SetInput(filter->GetOutput());
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbImageToImageRCC8Calculator.cxx b/Modules/OBIA/RCC8/test/otbImageToImageRCC8Calculator.cxx
deleted file mode 100644
index 0a5d2e1f1c86ac6317c7c83a35d9711b73904d6c..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbImageToImageRCC8Calculator.cxx
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbImageToImageRCC8Calculator.h"
-#include "otbImageList.h"
-#include "otbImageFileReader.h"
-
-int otbImageToImageRCC8Calculator(int itkNotUsed(argc), char* argv[])
-{
-  const unsigned int Dimension = 2;
-
-  int    nbImages  = atoi(argv[1]);
-  char * outfile   = argv[2];
-
-  typedef unsigned char                              PixelType;
-  typedef otb::Image<PixelType, Dimension>           ImageType;
-  typedef otb::ImageFileReader<ImageType>            ReaderType;
-  typedef otb::ImageToImageRCC8Calculator<ImageType> CalculatorType;
-  typedef otb::ImageList<ImageType>                  ImageListType;
-  typedef ImageListType::Iterator                    IteratorType;
-  // reference image list
-  ImageListType::Pointer images = ImageListType::New();
-
-  // Reading input images
-  std::ofstream out;
-  out.open(outfile, std::ios::out);
-  out << "Test results from otbImageToImageRCC8calculator test." << std::endl;
-  for (int k = 1; k <= nbImages; ++k)
-    {
-    ReaderType::Pointer reader = ReaderType::New();
-    reader->SetFileName(argv[2 + k]);
-    reader->Update();
-    images->PushBack(reader->GetOutput());
-    }
-  // Declaration
-  CalculatorType::Pointer calc, calc1, calc2;
-  // Computing relations for each images couple
-  int i = 1;
-  int j = 1;
-  for (IteratorType it1 = images->Begin(); it1 != images->End(); ++it1)
-    {
-    for (IteratorType it2 = images->Begin(); it2 != images->End(); ++it2)
-      {
-      std::cout << "Test: computing relation " << i << "," << j << std::endl;
-      calc = CalculatorType::New();
-      calc->SetInput1(it1.Get());
-      calc->SetInput2(it2.Get());
-      calc->Update();
-      out << calc->GetValue() << "\t";
-
-      if (calc->GetValue() < 3
-          || calc->GetValue() == 4
-          || calc->GetValue() == 6)
-        {
-        calc1 = CalculatorType::New();
-        calc1->SetInput1(it1.Get());
-        calc1->SetInput2(it2.Get());
-        calc1->SetLevel1APrioriKnowledge(true);
-        calc1->Update();
-        if (calc1->GetValue() != calc->GetValue())
-          {
-          std::cout << "Test failed: Result with level1AprioriKnowledge ";
-          std::cout << "different from result without a priori knowledge" << std::endl;
-          std::cout << calc->GetValue() << "!=" << calc1->GetValue() << std::endl;
-          return EXIT_FAILURE;
-          }
-        }
-      if (calc->GetValue() < 4)
-        {
-        calc2 = CalculatorType::New();
-        calc2->SetInput1(it1.Get());
-        calc2->SetInput2(it2.Get());
-        calc2->SetLevel3APrioriKnowledge(true);
-        calc2->Update();
-        if (calc2->GetValue() != calc->GetValue())
-          {
-          std::cout << "Test failed: Result with level3AprioriKnowledge ";
-          std::cout << "different from result without a priori knowledge" << std::endl;
-          std::cout << calc->GetValue() << "!=" << calc2->GetValue() << std::endl;
-          return EXIT_FAILURE;
-          }
-        }
-      ++j;
-      }
-    j = 1;
-    ++i;
-    out << std::endl;
-    }
-  out.close();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbPolygonListToRCC8GraphFilter.cxx b/Modules/OBIA/RCC8/test/otbPolygonListToRCC8GraphFilter.cxx
deleted file mode 100644
index fd136fba08b08afb0be9a7e6ed23acf0ca4d9d6c..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbPolygonListToRCC8GraphFilter.cxx
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbPolygon.h"
-#include "otbObjectList.h"
-#include "otbRCC8VertexBase.h"
-#include "otbPolygonListToRCC8GraphFilter.h"
-#include "otbRCC8GraphFileWriter.h"
-
-// typedefs
-typedef otb::Polygon<>                                                    PolygonType;
-typedef otb::ObjectList<PolygonType>                                      PolygonListType;
-typedef otb::RCC8VertexBase<PolygonType>                                  VertexType;
-typedef otb::RCC8Graph<VertexType>                                        RCC8GraphType;
-typedef otb::PolygonListToRCC8GraphFilter<PolygonListType, RCC8GraphType> RCC8GraphFilterType;
-typedef otb::RCC8GraphFileWriter<RCC8GraphType>                           GraphWriterType;
-
-
-PolygonType::VertexType Vertex(double i,double j)
-{
-  PolygonType::VertexType vertex;
-  vertex[0] = i;
-  vertex[1] = j;
-
-  return vertex;
-}
-
-
-int otbPolygonListToRCC8GraphFilter(int itkNotUsed(argc), char* argv[])
-{
-  char * outfile = argv[1];
-
-  PolygonListType::Pointer regions = PolygonListType::New();
-
-  RCC8GraphFilterType::SegmentationRangesType ranges;
-
-  ranges.push_back(0);
-
-  PolygonType::Pointer polygon = PolygonType::New();
-  polygon->AddVertex(Vertex(0,0));
-  polygon->AddVertex(Vertex(2,0));
-  polygon->AddVertex(Vertex(2,6));
-  polygon->AddVertex(Vertex(0,6));
-  regions->PushBack(polygon);
-
-  polygon = PolygonType::New();
-  polygon->AddVertex(Vertex(1,1));
-  polygon->AddVertex(Vertex(4,1));
-  polygon->AddVertex(Vertex(4,5));
-  polygon->AddVertex(Vertex(1,5));
-  regions->PushBack(polygon);
-
-  ranges.push_back(2);
-
-  polygon = PolygonType::New();
-  polygon->AddVertex(Vertex(3,1));
-  polygon->AddVertex(Vertex(4,1));
-  polygon->AddVertex(Vertex(4,2));
-  polygon->AddVertex(Vertex(3,2));
-  regions->PushBack(polygon);
-
-  polygon = PolygonType::New();
-  polygon->AddVertex(Vertex(5,1));
-  polygon->AddVertex(Vertex(8,1));
-  polygon->AddVertex(Vertex(8,5));
-  polygon->AddVertex(Vertex(5,5));
-  regions->PushBack(polygon);
-
-  ranges.push_back(4);
-
-  polygon = PolygonType::New();
-  polygon->AddVertex(Vertex(6,2));
-  polygon->AddVertex(Vertex(7,2));
-  polygon->AddVertex(Vertex(7,3));
-  polygon->AddVertex(Vertex(6,3));
-  regions->PushBack(polygon);
-
-  polygon = PolygonType::New();
-  polygon->AddVertex(Vertex(8,1));
-  polygon->AddVertex(Vertex(9,1));
-  polygon->AddVertex(Vertex(9,5));
-  polygon->AddVertex(Vertex(8,5));
-  regions->PushBack(polygon);
-
-  // Filter instantiation
-  RCC8GraphFilterType::Pointer filter = RCC8GraphFilterType::New();
-
-  filter->SetInput(regions);
-  filter->SetSegmentationRanges(ranges);
-
-  GraphWriterType::Pointer writer = GraphWriterType::New();
-  writer->SetInput(filter->GetOutput());
-  writer->SetFileName(outfile);
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbPolygonToPolygonRCC8Calculator.cxx b/Modules/OBIA/RCC8/test/otbPolygonToPolygonRCC8Calculator.cxx
deleted file mode 100644
index 3f3aa4a6c1f9c203a7e0ae98d4b710a68786c9db..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbPolygonToPolygonRCC8Calculator.cxx
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbPolygonToPolygonRCC8Calculator.h"
-#include "otbImageFileReader.h"
-#include "otbPolygon.h"
-#include "otbImageToEdgePathFilter.h"
-#include "otbSimplifyPathListFilter.h"
-
-int otbPolygonToPolygonRCC8Calculator(int itkNotUsed(argc), char* argv[])
-{
-  const unsigned int Dimension = 2;
-
-  int    nbImages  = atoi(argv[1]);
-  char * outfile   = argv[2];
-
-  typedef unsigned char                                      PixelType;
-  typedef otb::Polygon<>                                     PolygonType;
-  typedef otb::Image<PixelType, Dimension>                   ImageType;
-  typedef otb::ImageToEdgePathFilter<ImageType, PolygonType> EdgeExtractionFilterType;
-  typedef otb::SimplifyPathListFilter<PolygonType>           SimplifyPathFilterType;
-  typedef SimplifyPathFilterType::InputListType              PathListType;
-  typedef otb::ImageFileReader<ImageType>                    ReaderType;
-  typedef otb::PolygonToPolygonRCC8Calculator<PolygonType>   CalculatorType;
-
-  PolygonType::Pointer path = PolygonType::New();
-
-  PolygonType::ContinuousIndexType a1, a2, a3, a4, a5, a6, a7;
-
-  a1[0] = 0;
-  a1[1] = 0;
-  a2[0] = 10;
-  a2[1] = 0;
-  a3[0] = 10;
-  a3[1] = 10;
-  a4[0] = 10;
-  a4[1] = 0;
-
-  a5[0] = 5;
-  a5[1] = 5;
-
-  a6[0] = 5;
-  a6[1] = 0;
-
-  a7[0] = 100;
-  a7[1] = 100;
-
-  path->AddVertex(a1);
-  path->AddVertex(a2);
-  path->AddVertex(a3);
-  path->AddVertex(a4);
-
-  CalculatorType::Pointer calc = CalculatorType::New();
-
-  typedef PathListType::Iterator IteratorType;
-
-  // reference image list
-  PathListType::Pointer regions = PathListType::New();
-
-  // Reading input images
-  std::ofstream out;
-  out.open(outfile, std::ios::out);
-  out << "Test results from otbPolygonToPolygonRCC8calculator test." << std::endl;
-  for (int cpt = 1; cpt <= nbImages; ++cpt)
-    {
-    ReaderType::Pointer reader = ReaderType::New();
-    reader->SetFileName(argv[2 + cpt]);
-    EdgeExtractionFilterType::Pointer extraction = EdgeExtractionFilterType::New();
-    extraction->SetInput(reader->GetOutput());
-    extraction->SetForegroundValue(255);
-    extraction->Update();
-    regions->PushBack(extraction->GetOutput());
-    }
-
-  SimplifyPathFilterType::Pointer simplifier = SimplifyPathFilterType::New();
-  simplifier->SetInput(regions);
-  simplifier->GetFunctor().SetTolerance(0.1);
-  simplifier->Update();
-
-  // Declaration
-  CalculatorType::Pointer calc1, calc2, calc3;
-  // Computing relations for each images couple
-  unsigned int i = 1;
-  unsigned int j = 1;
-  for (IteratorType it1 = simplifier->GetOutput()->Begin(); it1 != simplifier->GetOutput()->End(); ++it1)
-    {
-    for (IteratorType it2 = simplifier->GetOutput()->Begin(); it2 != simplifier->GetOutput()->End(); ++it2)
-      {
-      std::cout << "Test: computing relation " << i << "," << j << std::endl;
-      calc1 = CalculatorType::New();
-      calc1->SetPolygon1(it1.Get());
-      calc1->SetPolygon2(it2.Get());
-      calc1->Compute();
-      out << calc1->GetValue() << "\t";
-      std::cout << "Result without a priori knowledge " << calc1->GetValue() << std::endl;
-
-      if (calc1->GetValue() < 3
-          || calc1->GetValue() == 4
-          || calc1->GetValue() == 6)
-        {
-        calc2 = CalculatorType::New();
-        calc2->SetPolygon1(it1.Get());
-        calc2->SetPolygon2(it2.Get());
-        calc2->SetLevel1APrioriKnowledge(true);
-        calc2->Compute();
-        std::cout << "Result with level1 a priori knowledge " << calc2->GetValue() << std::endl;
-        if (calc2->GetValue() != calc1->GetValue())
-          {
-          std::cout << "Test failed: Result with level1AprioriKnowledge ";
-          std::cout << "different from result without a priori knowledge" << std::endl;
-          std::cout << calc1->GetValue() << "!=" << calc2->GetValue() << std::endl;
-          return EXIT_FAILURE;
-          }
-        }
-      if (calc1->GetValue() < 4)
-        {
-        calc3 = CalculatorType::New();
-        calc3->SetPolygon1(it1.Get());
-        calc3->SetPolygon2(it2.Get());
-        calc3->SetLevel3APrioriKnowledge(true);
-        calc3->Compute();
-        std::cout << "Result with level3 a priori knowledge " << calc3->GetValue() << std::endl;
-        if (calc3->GetValue() != calc1->GetValue())
-          {
-          std::cout << "Test failed: Result with level3AprioriKnowledge ";
-          std::cout << "different from result without a priori knowledge" << std::endl;
-          std::cout << calc1->GetValue() << "!=" << calc3->GetValue() << std::endl;
-          return EXIT_FAILURE;
-          }
-        }
-      ++j;
-      }
-    j = 1;
-    ++i;
-    out << std::endl;
-    }
-  out.close();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbRCC8Edge.cxx b/Modules/OBIA/RCC8/test/otbRCC8Edge.cxx
deleted file mode 100644
index 31087db07704262c17156a98e79155651fbbc707..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbRCC8Edge.cxx
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbRCC8Edge.h"
-#include <cstdlib>
-
-int otbRCC8Edge(int itkNotUsed(argc), char * itkNotUsed(argv) [])
-{
-  typedef otb::RCC8Edge               RCC8EdgeType;
-  typedef RCC8EdgeType::RCC8ValueType RCC8ValueType;
-  RCC8ValueType value = otb::OTB_RCC8_DC;
-
-  // Instantiation
-  RCC8EdgeType::Pointer edge = RCC8EdgeType::New();
-  edge->SetValue(value);
-
-  if (edge->GetValue() != value)
-    {
-    std::cout << "Test failed: edge->GetValue()!=value" << std::endl;
-    return EXIT_FAILURE;
-    }
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbRCC8Graph.cxx b/Modules/OBIA/RCC8/test/otbRCC8Graph.cxx
deleted file mode 100644
index 47e5bb08efc4b453abf16a9ab4d0c495b80ed239..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbRCC8Graph.cxx
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbRCC8VertexBase.h"
-#include "otbRCC8VertexIterator.h"
-#include "otbRCC8EdgeIterator.h"
-#include "otbRCC8InEdgeIterator.h"
-#include "otbRCC8OutEdgeIterator.h"
-#include "otbMacro.h"
-#include "otbPolygon.h"
-
-int otbRCC8Graph(int itkNotUsed(argc), char * itkNotUsed(argv) [])
-{
-  const unsigned int nbVertices = 2;
-  typedef otb::Polygon<>                          PathType;
-  typedef PathType::VertexType                    PointType;
-  typedef otb::RCC8VertexBase<PathType>           VertexType;
-  typedef otb::RCC8Graph<VertexType>              RCC8GraphType;
-  typedef otb::RCC8VertexIterator<RCC8GraphType>  VertexIteratorType;
-  typedef otb::RCC8EdgeIterator<RCC8GraphType>    EdgeIteratorType;
-
-  // Instantiation
-  RCC8GraphType::Pointer rcc8Graph = RCC8GraphType::New();
-  // Setting the number of vertices
-  rcc8Graph->SetNumberOfVertices(nbVertices - 1);
-  // Call to the build method
-  rcc8Graph->Build();
-
-  PointType p1, p2, p3, p4, p5, p6;
-
-  p1[0] = 0;
-  p1[1] = 0;
-  p2[0] = 10;
-  p2[1] = 10;
-  p3[0] = 10;
-  p3[1] = 0;
-  p4[0] = 20;
-  p4[1] = 20;
-  p5[0] = 20;
-  p5[1] = 10;
-  p6[0] = 10;
-  p6[1] = 20;
-
-  unsigned int vertex1SegLevel = 0;
-  unsigned int vertex2SegLevel = 10;
-  bool         vertex1SegType = true;
-  bool         vertex2SegType = false;
-
-  PathType::Pointer path1 = PathType::New();
-  path1->AddVertex(p1);
-  path1->AddVertex(p2);
-  path1->AddVertex(p3);
-
-  VertexType::Pointer vertex1 = VertexType::New();
-  vertex1->SetSegmentationLevel(vertex1SegLevel);
-  vertex1->SetSegmentationType(vertex1SegType);
-  vertex1->SetPath(path1);
-
-  PathType::Pointer path2 = PathType::New();
-  path2->AddVertex(p4);
-  path2->AddVertex(p5);
-  path2->AddVertex(p6);
-
-  VertexType::Pointer vertex2 = VertexType::New();
-  vertex2->SetSegmentationLevel(vertex2SegLevel);
-  vertex2->SetSegmentationType(vertex2SegType);
-  vertex2->SetPath(path2);
-
-  rcc8Graph->SetVertex(0, vertex1);
-  rcc8Graph->SetVertex(1, vertex2);
-
-  otbControlConditionTestMacro(rcc8Graph->GetNumberOfVertices() != nbVertices,
-                               "rcc8Graph->GetNumberOfVertices()!=nbVertices");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetSegmentationLevel() != vertex1SegLevel,
-                               "rcc8Graph->GetVertex(0)->GetSegmentationLevel()!=vertex1SegLevel");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetSegmentationType() != vertex1SegType,
-                               "rcc8Graph->GetVertex(0)->GetSegmentationType()!=vertex1SegType");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(0) != p1,
-                               "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(0)!=p1");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(1) != p2,
-                               "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(1)!=p2");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(2) != p3,
-                               "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(2)!=p3");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetSegmentationLevel() != vertex2SegLevel,
-                               "rcc8Graph->GetVertex(1)->GetSegmentationLevel()!=vertex2SegLevel");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetSegmentationType() != vertex2SegType,
-                               "rcc8Graph->GetVertex(1)->GetObjectLabelInImgage()!=vertex2SegType");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(0) != p4,
-                               "rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(0)!=p4");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(1) != p5,
-                               "rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(1)!=p5");
-  otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(2) != p6,
-                               "rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(2)!=p6");
-
-  VertexIteratorType v(rcc8Graph);
-  v.GoToBegin();
-  otbControlConditionTestMacro(v.Get()->GetSegmentationLevel() != vertex1SegLevel,
-                               "v.Get()->GetSegmentationLevel()!=vertex1SegLevel");
-  otbControlConditionTestMacro(v.Get()->GetSegmentationType() != vertex1SegType,
-                               "v.Get()->GetSegmentationType()!=vertex1SegType");
-  otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(0) != p1,
-                               "v.Get()->GetPath()->GetVertexList()->GetElement(0)!=p1");
-  otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(1) != p2,
-                               "v.Get()->GetPath()->GetVertexList()->GetElement(1)!=p2");
-  otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(2) != p3,
-                               "v.Get()->GetPath()->GetVertexList()->GetElement(2)!=p3");
-  ++v;
-  otbControlConditionTestMacro(v.Get()->GetSegmentationLevel() != vertex2SegLevel,
-                               "v.Get()->GetSegmentationLevel()!=vertex2SegLevel");
-  otbControlConditionTestMacro(v.Get()->GetSegmentationType() != vertex2SegType,
-                               "v.Get()->GetObjectLabelInImgage()!=vertex2SegType");
-  otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(0) != p4,
-                               "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(0)!=p4");
-  otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(1) != p5,
-                               "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(1)!=p5");
-  otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(2) != p6,
-                               "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(2)!=p6");
-
-  // Testing the edge iterator
-  rcc8Graph->AddEdge(0, 1, otb::OTB_RCC8_NTPPI);
-
-  otbControlConditionTestMacro(rcc8Graph->GetNumberOfEdges() != 1,
-                               "rcc8Graph->GetNumberOfEdges()!=1");
-
-  EdgeIteratorType e(rcc8Graph);
-  e.GoToBegin();
-  otbControlConditionTestMacro(e.GetValue() != otb::OTB_RCC8_NTPPI,
-                               "e.GetValue()!=otb::OTB_RCC8_NTPPI");
-  otbControlConditionTestMacro(e.GetSourceIndex() != 0,
-                               "e.GetSourceIndex()!=0");
-  otbControlConditionTestMacro(e.GetTargetIndex() != 1,
-                               "e.GetTargetIndex()!=1");
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbRCC8GraphFileReader.cxx b/Modules/OBIA/RCC8/test/otbRCC8GraphFileReader.cxx
deleted file mode 100644
index 6c6807946062948b332eab371e1f49f47f1eb599..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbRCC8GraphFileReader.cxx
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbRCC8VertexIterator.h"
-#include "otbRCC8EdgeIterator.h"
-#include "otbRCC8VertexBase.h"
-#include "otbRCC8GraphFileReader.h"
-#include "otbMacro.h"
-#include "otbPolygon.h"
-
-int otbRCC8GraphFileReader(int itkNotUsed(argc), char* argv[])
-{
-  char * inputFilename = argv[1];
-  typedef otb::Polygon<>                          PathType;
-  typedef otb::RCC8VertexBase<PathType>           VertexType;
-  typedef otb::RCC8Graph<VertexType>              RCC8GraphType;
-  typedef otb::RCC8GraphFileReader<RCC8GraphType> RCC8GraphFileReaderType;
-  typedef otb::RCC8VertexIterator<RCC8GraphType>  VertexIteratorType;
-  typedef otb::RCC8EdgeIterator<RCC8GraphType>    EdgeIteratorType;
-
-  // Instantiation
-  RCC8GraphFileReaderType::Pointer rcc8GraphReader = RCC8GraphFileReaderType::New();
-  rcc8GraphReader->SetFileName(inputFilename);
-
-  rcc8GraphReader->Update();
-
-  // Getting the output graph
-  RCC8GraphType::Pointer graph = rcc8GraphReader->GetOutput();
-
-  // Checking vertices
-  VertexIteratorType vIt(graph);
-  unsigned int       count = 0;
-
-  otbControlConditionTestMacro(graph->GetNumberOfVertices() != 4,
-                               "graph->GetNumberOfVertices()!=4");
-  otbControlConditionTestMacro(graph->GetNumberOfEdges() != 6,
-                               "graph->GetNumberOfEdges()!=6");
-
-  // Checking edges
-  EdgeIteratorType eIt(graph);
-  count = 0;
-  for (eIt.GoToBegin(); !eIt.IsAtEnd(); ++eIt, ++count)
-    {
-    switch (count)
-      {
-      case 0:
-        otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_EC,
-                                     "eIt.GetValue()!=otb::OTB_RCC8_EC");
-        otbControlConditionTestMacro(eIt.GetSourceIndex() != 0,
-                                     "eIt.GetSourceIndex()!=0");
-        otbControlConditionTestMacro(eIt.GetTargetIndex() != 1,
-                                     "eIt.GetTargetIndex()!=1");
-        break;
-      case 1:
-        otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_PO,
-                                     "eIt.GetValue()!=otb::OTB_RCC8_PO");
-        otbControlConditionTestMacro(eIt.GetSourceIndex() != 1,
-                                     "eIt.GetSourceIndex()!=1");
-        otbControlConditionTestMacro(eIt.GetTargetIndex() != 2,
-                                     "eIt.GetTargetIndex()!=2");
-        break;
-      case 2:
-        otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_TPP,
-                                     "eIt.GetValue()!=otb::OTB_RCC8_TPP");
-        otbControlConditionTestMacro(eIt.GetSourceIndex() != 2,
-                                     "eIt.GetSourceIndex()!=2");
-        otbControlConditionTestMacro(eIt.GetTargetIndex() != 3,
-                                     "eIt.GetTargetIndex()!=3");
-        break;
-      case 3:
-        otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_TPPI,
-                                     "eIt.GetValue()!=otb::OTB_RCC8_TPPI");
-        otbControlConditionTestMacro(eIt.GetSourceIndex() != 0,
-                                     "eIt.GetSourceIndex()!=0");
-        otbControlConditionTestMacro(eIt.GetTargetIndex() != 2,
-                                     "eIt.GetTargetIndex()!=2");
-        break;
-      case 4:
-        otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_NTPP,
-                                     "eIt.GetValue()!=otb::OTB_RCC8_NTPP");
-        otbControlConditionTestMacro(eIt.GetSourceIndex() != 1,
-                                     "eIt.GetSourceIndex()!=1");
-        otbControlConditionTestMacro(eIt.GetTargetIndex() != 3,
-                                     "eIt.GetTargetIndex()!=3");
-        break;
-      case 5:
-        otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_NTPPI,
-                                     "eIt.GetValue()!=otb::OTB_RCC8_NTPPI");
-        otbControlConditionTestMacro(eIt.GetSourceIndex() != 0,
-                                     "eIt.GetSourceIndex()!=0");
-        otbControlConditionTestMacro(eIt.GetTargetIndex() != 3,
-                                     "eIt.GetTargetIndex()!=3");
-        break;
-      default:
-        otbControlConditionTestMacro(true, "Error in graph reading.");
-        break;
-      }
-    }
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbRCC8GraphFileWriter.cxx b/Modules/OBIA/RCC8/test/otbRCC8GraphFileWriter.cxx
deleted file mode 100644
index 943183126a0653768d444a6c7ba0221443947b3c..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbRCC8GraphFileWriter.cxx
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbRCC8VertexBase.h"
-#include "otbRCC8GraphFileWriter.h"
-#include "otbPolygon.h"
-
-int otbRCC8GraphFileWriter(int itkNotUsed(argc), char* argv[])
-{
-  const char * outputFile = argv[1];
-
-  typedef otb::Polygon<>                          PathType;
-  typedef otb::RCC8VertexBase<PathType>           VertexType;
-  typedef otb::RCC8Graph<VertexType>              RCC8GraphType;
-  typedef otb::RCC8GraphFileWriter<RCC8GraphType> RCC8GraphFileWriterType;
-
-  // Graph instantiation
-  RCC8GraphType::Pointer rcc8Graph = RCC8GraphType::New();
-  rcc8Graph->SetNumberOfVertices(4);
-  rcc8Graph->Build();
-
-  // Vertex filling
-  PathType::Pointer path = PathType::New();
-  path->Initialize();
-
-  PathType::ContinuousIndexType p1, p2, p3;
-
-  p1[0] = 0;
-  p1[1] = 0;
-
-  p2[0] = 10;
-  p2[1] = 10;
-
-  p3[0] = -5;
-  p3[1] = 2;
-
-  path->AddVertex(p1);
-  path->AddVertex(p2);
-  path->AddVertex(p3);
-
-  VertexType::Pointer vertex1, vertex2, vertex3, vertex4;
-  vertex1 = VertexType::New();
-  vertex1->SetSegmentationLevel(0);
-  vertex1->SetSegmentationType(0);
-  vertex1->SetPath(path);
-  rcc8Graph->SetVertex(0, vertex1);
-
-  vertex2 = VertexType::New();
-  vertex2->SetSegmentationLevel(1);
-  vertex2->SetSegmentationType(1);
-  vertex2->SetPath(path);
-  rcc8Graph->SetVertex(1, vertex2);
-
-  vertex3 = VertexType::New();
-  vertex3->SetSegmentationLevel(2);
-  vertex3->SetSegmentationType(0);
-  vertex3->SetPath(path);
-  rcc8Graph->SetVertex(2, vertex3);
-
-  vertex4 = VertexType::New();
-  vertex4->SetSegmentationLevel(3);
-  vertex4->SetSegmentationType(0);
-  vertex4->SetPath(path);
-  rcc8Graph->SetVertex(3, vertex4);
-
-  // Edge filling
-  rcc8Graph->AddEdge(0, 1, otb::OTB_RCC8_EC);
-  rcc8Graph->AddEdge(1, 2, otb::OTB_RCC8_PO);
-  rcc8Graph->AddEdge(2, 3, otb::OTB_RCC8_TPP);
-  rcc8Graph->AddEdge(0, 2, otb::OTB_RCC8_TPPI);
-  rcc8Graph->AddEdge(1, 3, otb::OTB_RCC8_NTPP);
-  rcc8Graph->AddEdge(0, 3, otb::OTB_RCC8_NTPPI);
-
-  // Instantiation
-  RCC8GraphFileWriterType::Pointer rcc8GraphWriter
-    = RCC8GraphFileWriterType::New();
-  rcc8GraphWriter->SetFileName(outputFile);
-  rcc8GraphWriter->SetInput(rcc8Graph);
-  rcc8GraphWriter->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbRCC8GraphIOEndToEnd.cxx b/Modules/OBIA/RCC8/test/otbRCC8GraphIOEndToEnd.cxx
deleted file mode 100644
index 2e274dac4c304505e2b28b82a530fce9d4a45bc9..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbRCC8GraphIOEndToEnd.cxx
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbRCC8VertexBase.h"
-#include "otbRCC8GraphFileReader.h"
-#include "otbRCC8GraphFileWriter.h"
-#include "otbPolygon.h"
-
-int otbRCC8GraphIOEndToEnd(int itkNotUsed(argc), char* argv[])
-{
-  char * inputFilename = argv[1];
-  char * outputFilename = argv[2];
-  typedef otb::Polygon<>                          PathType;
-  typedef otb::RCC8VertexBase<PathType>           VertexType;
-  typedef otb::RCC8Graph<VertexType>              RCC8GraphType;
-  typedef otb::RCC8GraphFileReader<RCC8GraphType> RCC8GraphFileReaderType;
-  typedef otb::RCC8GraphFileWriter<RCC8GraphType> RCC8GraphFileWriterType;
-
-  // End to end test
-  RCC8GraphFileReaderType::Pointer rcc8GraphReader = RCC8GraphFileReaderType::New();
-  rcc8GraphReader->SetFileName(inputFilename);
-  RCC8GraphFileWriterType::Pointer rcc8GraphWriter = RCC8GraphFileWriterType::New();
-  rcc8GraphWriter->SetInput(rcc8GraphReader->GetOutput());
-  rcc8GraphWriter->SetFileName(outputFilename);
-  rcc8GraphWriter->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbRCC8TestDriver.cxx b/Modules/OBIA/RCC8/test/otbRCC8TestDriver.cxx
deleted file mode 100644
index 8a060d25bf7c343f4a8daa8d4e93f7415bae2507..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbRCC8TestDriver.cxx
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbTestMain.h"
-
-void RegisterTests()
-{
-  REGISTER_TEST(otbRCC8GraphFileReader);
-  REGISTER_TEST(otbRCC8GraphIOEndToEnd);
-  REGISTER_TEST(otbPolygonListToRCC8GraphFilter);
-  REGISTER_TEST(otbRCC8VertexBase);
-  REGISTER_TEST(otbPolygonToPolygonRCC8Calculator);
-  REGISTER_TEST(otbImageToImageRCC8Calculator);
-  REGISTER_TEST(otbRCC8Edge);
-  REGISTER_TEST(otbRCC8VertexWithCompacity);
-  REGISTER_TEST(otbRCC8Graph);
-  REGISTER_TEST(otbRCC8GraphFileWriter);
-  REGISTER_TEST(otbImageMultiSegmentationToRCC8GraphFilter);
-}
diff --git a/Modules/OBIA/RCC8/test/otbRCC8VertexBase.cxx b/Modules/OBIA/RCC8/test/otbRCC8VertexBase.cxx
deleted file mode 100644
index 6578e4f6ae038cad1485118ed773f18f7c757222..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbRCC8VertexBase.cxx
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbRCC8VertexBase.h"
-#include "otbPolygon.h"
-#include "otbMacro.h"
-
-int otbRCC8VertexBase(int itkNotUsed(argc), char* argv[])
-{
-  typedef otb::Polygon<> PathType;
-  unsigned int imageLevel = atoi(argv[1]);
-  bool         imageType = atoi(argv[2]);
-  typedef otb::RCC8VertexBase<PathType>     RCC8VertexType;
-  typedef RCC8VertexType::AttributesMapType AttributesMapType;
-  // Instantiation
-  RCC8VertexType::Pointer vertex1 = RCC8VertexType::New();
-
-  PathType::Pointer path = PathType::New();
-  path->Initialize();
-
-  PathType::ContinuousIndexType p1, p2, p3;
-
-  p1[0] = 0;
-  p1[1] = 0;
-
-  p2[0] = 10;
-  p2[1] = 10;
-
-  p3[0] = -5;
-  p3[1] = 2;
-
-  path->AddVertex(p1);
-  path->AddVertex(p2);
-  path->AddVertex(p3);
-
-  // Getters / setters tests
-  vertex1->SetSegmentationLevel(imageLevel);
-  vertex1->SetSegmentationType(imageType);
-  vertex1->SetPath(path);
-
-  otbControlConditionTestMacro(vertex1->GetSegmentationLevel() != imageLevel,
-                               "Test failed: vertex1->GetSegmentationLevel()!=imageLevel");
-  otbControlConditionTestMacro(vertex1->GetSegmentationType() != imageType,
-                               "Test failed: vertex1->GetSegmentationType()!=imageType");
-
-  otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(0) != p1,
-                               "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(0)!=p1");
-  otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(1) != p2,
-                               "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(1)!=p2");
-  otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(2) != p3,
-                               "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(2)!=p3");
-
-  // attributes vector set test
-  AttributesMapType attr1 = vertex1->GetAttributesMap();
-  otbControlConditionTestMacro(attr1["SegmentationLevel"].compare(std::string(argv[1])) != 0,
-                               "Test failed: vertex1->GetAttributesMap()[\"SegmentationLevel\"]!=std::string(argv[1])");
-  otbControlConditionTestMacro(atoi(attr1["SegmentationType"].c_str()) != static_cast<int>(imageType),
-                               "Test failed:atoi(attr1[\"SegmentationType\"].c_str())!=imageType ");
-
-  otbControlConditionTestMacro(atof(attr1["P0x"].c_str()) != p1[0],
-                               "Test failed: atof(attr1[\"P0x\"].c_str())!=p1[0]");
-  otbControlConditionTestMacro(atof(attr1["P0y"].c_str()) != p1[1],
-                               "Test failed: atof(attr1[\"P0y\"].c_str())!=p1[1]");
-  otbControlConditionTestMacro(atof(attr1["P1x"].c_str()) != p2[0],
-                               "Test failed: atof(attr1[\"P1x\"].c_str())!=p2[0]");
-  otbControlConditionTestMacro(atof(attr1["P1y"].c_str()) != p2[1],
-                               "Test failed: atof(attr1[\"P1y\"].c_str())!=p2[1]");
-  otbControlConditionTestMacro(atof(attr1["P2x"].c_str()) != p3[0],
-                               "Test failed: atof(attr1[\"P2x\"].c_str())!=p3[0]");
-  otbControlConditionTestMacro(atof(attr1["P2y"].c_str()) != p3[1],
-                               "Test failed: atof( attr1[\"P2y\"].c_str())!=p3[1]");
-
-  // attributes vector get test
-  RCC8VertexType::Pointer vertex2 = RCC8VertexType::New();
-  vertex2->SetAttributesMap(attr1);
-  otbControlConditionTestMacro(vertex1->GetSegmentationLevel() != vertex2->GetSegmentationLevel(),
-                               "Test failed: vertex1->GetSegmentationLevel()!=vertex2->GetSegmentationLevel()");
-  otbControlConditionTestMacro(vertex1->GetSegmentationType() != vertex2->GetSegmentationType(),
-                               "Test failed: vertex1->GetSegmentationType()!=vertex2->GetSegmentationType()");
-
-  otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(0) != p1,
-                               "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(0)!=p1");
-  otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(1) != p2,
-                               "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(1)!=p2");
-  otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(2) != p3,
-                               "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(2)!=p3");
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/OBIA/RCC8/test/otbRCC8VertexWithCompacity.cxx b/Modules/OBIA/RCC8/test/otbRCC8VertexWithCompacity.cxx
deleted file mode 100644
index 697aeda75e5b83da812d4ff32e112d5d88f34e70..0000000000000000000000000000000000000000
--- a/Modules/OBIA/RCC8/test/otbRCC8VertexWithCompacity.cxx
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbRCC8VertexWithCompacity.h"
-#include "otbMacro.h"
-#include "otbPolygon.h"
-
-int otbRCC8VertexWithCompacity(int itkNotUsed(argc), char* argv[])
-{
-  typedef otb::Polygon<> PathType;
-  typedef double         PrecisionType;
-
-  unsigned int  imageLevel = atoi(argv[1]);
-  bool          imageType = atoi(argv[2]);
-  PrecisionType compacity = atof(argv[3]);
-
-  typedef otb::RCC8VertexWithCompacity<PathType, PrecisionType> RCC8VertexType;
-  typedef RCC8VertexType::AttributesMapType                     AttributesMapType;
-  // Instantiation
-  RCC8VertexType::Pointer vertex1 = RCC8VertexType::New();
-
-  PathType::Pointer path = PathType::New();
-  path->Initialize();
-
-  PathType::ContinuousIndexType p1, p2, p3;
-
-  p1[0] = 0;
-  p1[1] = 0;
-
-  p2[0] = 10;
-  p2[1] = 10;
-
-  p3[0] = -5;
-  p3[1] = 2;
-
-  path->AddVertex(p1);
-  path->AddVertex(p2);
-  path->AddVertex(p3);
-
-  // Getters / setters tests
-  vertex1->SetSegmentationLevel(imageLevel);
-  vertex1->SetSegmentationType(imageType);
-  vertex1->SetPath(path);
-  vertex1->SetCompacity(compacity);
-
-  otbControlConditionTestMacro(vertex1->GetSegmentationLevel() != imageLevel,
-                               "Test failed: vertex1->GetSegmentationLevel()!=imageLevel");
-  otbControlConditionTestMacro(vertex1->GetSegmentationType() != imageType,
-                               "Test failed: vertex1->GetSegmentationType()!=imageType");
-
-  otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(0) != p1,
-                               "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(0)!=p1");
-  otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(1) != p2,
-                               "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(1)!=p2");
-  otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(2) != p3,
-                               "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(2)!=p3");
-  otbControlConditionTestMacro(vertex1->GetCompacity() != compacity,
-                               "Test failed: vertex1->GetSegmentationImageIndex()!=imageIndex");
-  // attributes vector set test
-  AttributesMapType attr1 = vertex1->GetAttributesMap();
-
-  std::ostringstream oss;
-  oss << p1[0];
-  otbControlConditionTestMacro(attr1["P0x"].compare(oss.str()) != 0,
-                               "Test failed:attr1[\"P0x\"].compare(std::string(p1[0]))!=0");
-  oss.str("");
-  oss << p1[1];
-  otbControlConditionTestMacro(attr1["P0y"].compare(oss.str()) != 0,
-                               "Test failed:attr1[\"P0y\"].compare(std::string(p1[1]))!=0");
-  oss.str("");
-  oss << p2[0];
-  otbControlConditionTestMacro(attr1["P1x"].compare(oss.str()) != 0,
-                               "Test failed:attr1[\"P1x\"].compare(std::string(p2[0]))!=0");
-  oss.str("");
-  oss << p2[1];
-  otbControlConditionTestMacro(attr1["P1y"].compare(oss.str()) != 0,
-                               "Test failed:attr1[\"P1y\"].compare(std::string(p2[1]))!=0");
-  oss.str("");
-  oss << p3[0];
-  otbControlConditionTestMacro(attr1["P2x"].compare(oss.str()) != 0,
-                               "Test failed:attr1[\"P2x\"].compare(std::string(p3[0]))!=0");
-  oss.str("");
-  oss << p3[1];
-  otbControlConditionTestMacro(attr1["P2y"].compare(oss.str()) != 0,
-                               "Test failed:attr1[\"P2y\"].compare(std::string(p3[1]))!=0");
-
-  otbControlConditionTestMacro(attr1["Compacity"].compare(std::string(argv[3])) != 0,
-                               "Test failed: vertex1->GetAttributesMap()[\"Compacity\"]!=std::string(argv[2])");
-  // attributes vector get test
-  RCC8VertexType::Pointer vertex2 = RCC8VertexType::New();
-  vertex2->SetAttributesMap(attr1);
-  otbControlConditionTestMacro(vertex1->GetSegmentationLevel() != vertex2->GetSegmentationLevel(),
-                               "Test failed: vertex1->GetSegmentationLevel()!=vertex2->GetSegmentationLevel()");
-  otbControlConditionTestMacro(vertex1->GetSegmentationType() != vertex2->GetSegmentationType(),
-                               "Test failed: vertex1->GetSegmentationType()!=vertex2->GetSegmentationType()");
-
-  otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(0) != p1,
-                               "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(0)!=p1");
-  otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(1) != p2,
-                               "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(1)!=p2");
-  otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(2) != p3,
-                               "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(2)!=p3");
-  otbControlConditionTestMacro(vertex1->GetCompacity() != vertex2->GetCompacity(),
-                               "Test failed: vertex1->GetCompacity()!=vertex2->GetCompacity()");
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Core/Metadata/include/otbBandName.h b/Modules/Radiometry/Indices/include/otbBandName.h
similarity index 83%
rename from Modules/Core/Metadata/include/otbBandName.h
rename to Modules/Radiometry/Indices/include/otbBandName.h
index 6bd25a144e5ac7a0506694035e591195a478e92c..118086139976cff411152658b054e26c59e93a44 100644
--- a/Modules/Core/Metadata/include/otbBandName.h
+++ b/Modules/Radiometry/Indices/include/otbBandName.h
@@ -27,11 +27,30 @@ namespace BandName
 {
 
 /**
-* Provides a way to identify bands when passing the parameters
-* to the radiometric functors.*
-*/
-enum BandName {BLUE, GREEN, RED, NIR, MIR};
-enum LandsatTMBandNames {TM1, TM2, TM3, TM4, TM5, TM60, TM61, TM62, TM7};
+ * Provides a way to identify bands when passing the parameters
+ * to the radiometric functors.*
+ */
+enum class CommonBandNames
+{
+  BLUE,
+  GREEN,
+  RED,
+  NIR,
+  MIR,
+  MAX
+};
+enum LandsatTMBandNames
+{
+  TM1,
+  TM2,
+  TM3,
+  TM4,
+  TM5,
+  TM60,
+  TM61,
+  TM62,
+  TM7
+};
 
 // Note for landsat equivalence
 // http://landsat.gsfc.nasa.gov/news/news-archive/sci_0017.html
@@ -57,8 +76,8 @@ enum LandsatTMBandNames {TM1, TM2, TM3, TM4, TM5, TM60, TM61, TM62, TM7};
 // 6              10.40-12.50 microm                Thermal IR
 // 7                2.08-2.35 microm                Mid-IR
 
-}
+} // namespace BandName
 
-}
+} // namespace otb
 
 #endif
diff --git a/Modules/Radiometry/Indices/include/otbBuiltUpIndicesFunctor.h b/Modules/Radiometry/Indices/include/otbBuiltUpIndicesFunctor.h
index ac8fff8d7e364ae00790595caaaeadada28ce211..426548fd5fc40aedf09bed790d64ccb4e2431d08 100644
--- a/Modules/Radiometry/Indices/include/otbBuiltUpIndicesFunctor.h
+++ b/Modules/Radiometry/Indices/include/otbBuiltUpIndicesFunctor.h
@@ -21,161 +21,12 @@
 #ifndef otbBuiltUpIndicesFunctor_h
 #define otbBuiltUpIndicesFunctor_h
 
-#include "otbVegetationIndicesFunctor.h"
-#include <string>
+#include "otbRadiometricIndex.h"
 
 namespace otb
 {
 namespace Functor
 {
-/**
-   * \class TM4AndTM5IndexBase
-   * \brief Base class for TM4 And TM5 channels of Land Sat
-   * (equivalent to Red and NIR of SPOT5)
-   *
-   *  Implement operators for UnaryFunctorImageFilter templated with a
-   *  VectorImage and BinaryFunctorImageFilter templated with single
-   *  images.
-   *  Subclasses should NOT overload operators, they must  re-implement
-   *  the Evaluate() method.
-   *
-   * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template<class TInput1, class TInput2, class TOutput>
-class TM4AndTM5IndexBase
-{
-public:
-  /// Vector pixel type used to support both vector images and multiple
-  /// input images
-  typedef itk::VariableLengthVector<TInput1> InputVectorType;
-
-  //operators !=
-  bool operator !=(const TM4AndTM5IndexBase&) const
-  {
-    return true;
-  }
-  //operator ==
-  bool operator ==(const TM4AndTM5IndexBase& other) const
-  {
-    return !(*this != other);
-  }
-
-  // Operator on vector pixel type
-  inline TOutput operator ()(const InputVectorType& inputVector) const
-  {
-    return this->Evaluate(inputVector[m_TM4Index - 1], static_cast<TInput2>(inputVector[m_TM5Index - 1]));
-  }
-
-  // Binary operator
-  inline TOutput operator ()(const TInput1& tm4, const TInput2& tm5) const
-  {
-    return this->Evaluate(tm4, tm5);
-  }
-  /// Constructor
-  TM4AndTM5IndexBase() : m_TM4Index(4), m_TM5Index(5) {}
-  /// Desctructor
-  virtual ~TM4AndTM5IndexBase() {}
-
-  /// Set TM4 Index
-  void SetIndex1(unsigned int channel)
-  {
-    m_TM4Index = channel;
-  }
-  /// Get TM4 Index
-  unsigned int GetIndex1() const
-  {
-    return m_TM4Index;
-  }
-  /// Set TM5 Index
-  void SetIndex2(unsigned int channel)
-  {
-    m_TM5Index = channel;
-  }
-  /// Get TM5 Index
-  unsigned int GetIndex2() const
-  {
-    return m_TM5Index;
-  }
-
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::RED)
-      {
-      m_TM4Index = channel;
-      }
-    if (band == BandName::NIR)
-      {
-      m_TM5Index = channel;
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::RED)
-      {
-      return m_TM4Index;
-      }
-    if (band == BandName::NIR)
-      {
-      return m_TM5Index;
-      }
-  }
-
-  /** Return the index name */
-  virtual std::string GetName() const = 0;
-
-protected:
-  // This method must be reimplemented in subclasses to actually
-  // compute the index value
-  virtual TOutput Evaluate(const TInput1& tm4, const TInput2& tm5) const = 0;
-
-private:
-  unsigned int m_TM4Index;
-  unsigned int m_TM5Index;
-};
-
-/** \class NDBI
- *  \brief This functor computes the Normalized Difference Built Up Index (NDBI)
- *
- *  [Zha 2003]
- *
- *  \ingroup Functor
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template <class TInput1, class TInput2, class TOutput>
-class NDBI : public TM4AndTM5IndexBase<TInput1, TInput2, TOutput>
-{
-public:
-  /** Return the index name */
-  std::string GetName() const override
-  {
-    return "NDBI";
-  }
-
-  /// Constructor
-  NDBI() {}
-  /// Desctructor
-  ~NDBI() override {}
-  // Operator on r and nir single pixel values
-protected:
-  inline TOutput Evaluate(const TInput1& pTM4, const TInput2& pTM5) const override
-  {
-    double dTM4 = static_cast<double>(pTM4);
-    double dTM5 = static_cast<double>(pTM5);
-    if (dTM5 + dTM4 == 0)
-      {
-      return static_cast<TOutput>(0.);
-      }
-
-    return (static_cast<TOutput>((dTM5 - dTM4) / (dTM5 + dTM4)));
-  }
-};
-
 /** \class ISU
  *  \brief This functor computes the Index surfaces built (ISU)
  *
@@ -186,56 +37,29 @@ protected:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class ISU : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class ISU : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  ISU() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "ISU";
   }
 
-  /// Constructor
-  ISU() : m_A(100.), m_B(25.) {}
-  /// Desctructor
-  ~ISU() override {}
-
-  /** Set/Get A correction */
-  void SetA(const double pA)
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    m_A = pA;
-  }
-  double GetA(void) const
-  {
-    return (m_A);
-  }
-  /** Set/Get B correction */
-  void SetB(const double pB)
-  {
-    m_B = pB;
-  }
-  double GetB(void) const
-  {
-    return (m_B);
-  }
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
 
-protected:
-  inline TOutput Evaluate(const TInput1& pRed, const TInput2& pNIR) const override
-  {
-    double dRed = static_cast<double>(pRed);
-    double dNIR = static_cast<double>(pNIR);
-    if (dNIR == 0)
-      {
+    if (nir == 0)
+    {
       return static_cast<TOutput>(0.);
       }
 
-    return (static_cast<TOutput>(m_A - (m_B * dRed) / (dNIR)));
+      return (static_cast<TOutput>(A - (B * red) / nir));
   }
 
-private:
-  double m_A;
-  double m_B;
+  static constexpr double A = 100.;
+  static constexpr double B = 25.;
 };
 
 } // namespace Functor
diff --git a/Modules/Radiometry/Indices/include/otbIndicesStackFunctor.h b/Modules/Radiometry/Indices/include/otbIndicesStackFunctor.h
new file mode 100644
index 0000000000000000000000000000000000000000..257f66a84dc7a581a14ad2e1133c2aedf142a7f2
--- /dev/null
+++ b/Modules/Radiometry/Indices/include/otbIndicesStackFunctor.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2005-2019 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.
+ */
+
+#ifndef otbIndicesStackFunctor_h
+#define otbIndicesStackFunctor_h
+
+#include <vector>
+#include <stdexcept>
+
+namespace otb
+{
+
+namespace Functor
+{
+/**
+ * \class IndicesStackFunctor
+ * \brief A class to compute a stack of radiometric indices
+ *
+ * This functor can be built from a vector of TIndice*. its operator()
+ * will apply each functor of this vector to the input pixel, and
+ * return a VariableLengthVector containing the list resulting
+ * values. It can be used with otb::FunctorImageFilter
+ *
+ * \sa FunctorImageFilter
+ *
+ * \ingroup OTBIndices
+ */
+template <typename TIndice>
+class IndicesStackFunctor
+{
+public:
+  /// Read input / output types from TIndice
+  using IndiceType = TIndice;
+  using PixelType  = typename IndiceType::PixelType;
+  // Output will be a VariableLengthVector of values return by
+  // radiometric indices
+  using OutputType = itk::VariableLengthVector<typename IndiceType::OutputType>;
+
+  /**
+   * \param indices A std::vector<IndiceType*> for indices to compute
+   * the indice stack
+   * \throw std::runtime_error if indices is empty
+   */
+  IndicesStackFunctor(const std::vector<IndiceType*>& indices) : m_Indices(std::move(indices))
+  {
+    if (indices.empty())
+    {
+      throw std::runtime_error("Can not build IndicesStackFunctor from an empty list of indices.");
+    }
+  }
+
+  /**
+   * \param input A itk::VariableLengthVector<TInput> holding the
+   * pixel values for each band
+   * \return A VariableLengthVector<TInput::OutputType> holding all
+   * the indices values
+   */
+  void operator()(OutputType& out, const PixelType& in) const
+  {
+    size_t idx = 0;
+    for (auto indice : m_Indices)
+    {
+      out[idx] = (*indice)(in);
+      ++idx;
+    }
+  }
+  /**
+   * \return the size of the indices list (to be used by FunctorImgeFilter)
+   */
+  size_t OutputSize(...) const
+  {
+    return m_Indices.size();
+  }
+
+private:
+  /// The list of indices to use
+  std::vector<IndiceType*> m_Indices;
+};
+
+} // End namespace Functor
+
+} // End namespace otb
+
+#endif
diff --git a/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h b/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h
index 8dfa9cb4649682049b04f36f20fe789c739724de..aeb68d40248b1d9ae364638a060f0e60fd327b48 100644
--- a/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h
+++ b/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h
@@ -22,8 +22,8 @@
 #define otbLandsatTMIndices_h
 
 #include "otbMath.h"
-#include "itkVariableLengthVector.h"
 #include "otbBandName.h"
+#include "itkVariableLengthVector.h"
 #include "otbFuzzyVariable.h"
 #include <vector>
 #include <algorithm>
diff --git a/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.h b/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.h
deleted file mode 100644
index 58120ad259a7666af506d883193f75299d85735a..0000000000000000000000000000000000000000
--- a/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNDVIDataNodeFeatureFunction_h
-#define otbNDVIDataNodeFeatureFunction_h
-
-#include "otbDataNodeImageFunction.h"
-
-#include "otbVegetationIndicesFunctor.h"
-#include "otbPolyLineImageConstIterator.h"
-
-namespace otb
-{
-/** \class NDVIDataNodeFeatureFunction
-  * \brief Compute a NDVI based feature alongside a
-  * datanode.
-  *
-  * This function compute a feature alongside a datanode.
-  * The feature is (NDVI >= threshold) per cent along the
-  * tested datanode.
-  *
-  * \ingroup Functions
-  * \sa DataNodeImageFunction
-  * \sa SpectralAngleDataNodeFeatureFunction
- *
- * \ingroup OTBIndices
-  */
-
-template <
-class TImage,
-class TCoordRep = double,
-class TPrecision = double
->
-class ITK_EXPORT NDVIDataNodeFeatureFunction :
-    public DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision>
-{
-public:
-  /** Standard class typedefs. */
-  typedef NDVIDataNodeFeatureFunction                         Self;
-  typedef DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision>
-                                                              Superclass;
-  typedef itk::SmartPointer<Self>                             Pointer;
-  typedef itk::SmartPointer<const Self>                       ConstPointer;
-
-  /** Method for creation through the object factory. */
-  itkNewMacro(Self);
-
-  /** Run-time type information (and related methods). */
-  itkTypeMacro(NDVIDataNodeFeatureFunction, DataNodeImageFunction);
-
-  /** Some typedefs. */
-  typedef typename Superclass::DataNodeType           DataNodeType;
-  typedef typename DataNodeType::LineType             LineType;
-
-  typedef TImage                                      InputImageType;
-  typedef typename InputImageType::ConstPointer       InputImageConstPointer;
-  typedef typename InputImageType::PixelType          PixelType;
-  typedef typename InputImageType::InternalPixelType  ScalarRealType;
-  typedef typename InputImageType::IndexType          IndexType;
-  typedef typename InputImageType::IndexValueType     IndexValueType;
-
-  typedef TCoordRep                                   CoordRepType;
-
-  typedef TPrecision                                  PrecisionType;
-
-  typedef PolyLineImageConstIterator<InputImageType, LineType>
-                                                      ImageLineIteratorType;
-
-  typedef Functor::NDVI<ScalarRealType, ScalarRealType, PrecisionType>
-                                                      NDVIFunctorType;
-
-  typedef std::vector<PrecisionType>                  OutputType;
-
-  OutputType Evaluate( const DataNodeType& node ) const override;
-
-  /** Set/Get methods */
-  itkGetConstMacro(NDVIThreshold, PrecisionType);
-  itkSetMacro(NDVIThreshold, PrecisionType);
-
-  //TODO replace by metadata parsing
-  unsigned int GetREDChannelIndex() const
-  {
-    return m_NDVIFunctor.GetRedIndex()+1;
-  }
-
-  void SetREDChannelIndex(unsigned int id)
-  {
-    m_NDVIFunctor.SetRedIndex(id-1);
-  }
-
-  unsigned int GetNIRChannelIndex() const
-  {
-    return m_NDVIFunctor.GetNIRIndex()+1;
-  }
-
-  void SetNIRChannelIndex(unsigned int id)
-  {
-    m_NDVIFunctor.SetNIRIndex(id-1);
-  }
-
-protected:
-  NDVIDataNodeFeatureFunction();
-  ~NDVIDataNodeFeatureFunction() override {}
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  NDVIDataNodeFeatureFunction(const Self&) = delete;
-  void operator=(const Self&) = delete;
-
-  /** NDVI Threshold & Functor */
-  PrecisionType               m_NDVIThreshold;
-  NDVIFunctorType             m_NDVIFunctor;
-};
-
-}
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbNDVIDataNodeFeatureFunction.hxx"
-#endif
-
-#endif
diff --git a/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.hxx b/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.hxx
deleted file mode 100644
index 910bc13c1f3baf276218f7af94ceb33a9fc0edb7..0000000000000000000000000000000000000000
--- a/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.hxx
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNDVIDataNodeFeatureFunction_hxx
-#define otbNDVIDataNodeFeatureFunction_hxx
-
-#include "otbNDVIDataNodeFeatureFunction.h"
-
-namespace otb
-{
-
-/**
- * Constructor
- */
-template <class TImage, class TCoordRep, class TPrecision>
-NDVIDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>
-::NDVIDataNodeFeatureFunction()
-{
-  m_NDVIThreshold = 0.3;    //Advised for QuickBird images
-  this->SetREDChannelIndex(3); //for QuickBird images
-  this->SetNIRChannelIndex(4); //for QuickBird images
-}
-
-/**
- * Standard "PrintSelf" method
- */
-template <class TImage, class TCoordRep, class TPrecision>
-void
-NDVIDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>
-::PrintSelf(
-  std::ostream& os,
-  itk::Indent indent) const
-{
-  Superclass::PrintSelf( os, indent );
-  os << indent << "NDVI Threshold: "    << m_NDVIThreshold << std::endl;
-  os << indent << "RED Channel Index: " << this->GetREDChannelIndex() << std::endl;
-  os << indent << "NIR Channel Index: " << this->GetNIRChannelIndex() << std::endl;
-}
-
-
-template <class TImage, class TCoordRep, class TPrecision>
-typename NDVIDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>
-::OutputType
- NDVIDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>
-::Evaluate( const DataNodeType& node ) const
-{
-  if(!((this->GetREDChannelIndex() <= this->GetInputImage()->GetNumberOfComponentsPerPixel())
-      && (this->GetNIRChannelIndex() <= this->GetInputImage()->GetNumberOfComponentsPerPixel())
-      && (this->GetREDChannelIndex() > 0)
-      && (this->GetNIRChannelIndex() > 0)))
-    {
-    itkExceptionMacro(<< "Invalid RED or NIR Channel Index");
-    }
-
-  const typename ImageLineIteratorType::PathType* path;
-
-  switch (node.GetNodeType())
-        {
-        case FEATURE_POINT:
-          {
-          itkExceptionMacro(<< "This DataNode type is not handle yet");
-          break;
-          }
-        case FEATURE_LINE:
-          {
-          path = node.GetLine();
-          break;
-          }
-        case FEATURE_POLYGON:
-          {
-          path = node.GetPolygonExteriorRing();
-          break;
-          }
-        default:
-          {
-          itkExceptionMacro(<< "This DataNode type is not handle yet");
-          break;
-          }
-        }
-
-  ImageLineIteratorType lineIt(this->GetInputImage(), path);
-  lineIt.GoToBegin();
-
-  double nbValidPixel=0.;
-  double nbVisitedPixel=0.;
-
-  while(!lineIt.IsAtEnd())
-    {
-    if(this->IsInsideBuffer(lineIt.GetIndex()))
-      {
-      PixelType pixel = this->GetInputImage()->GetPixel(lineIt.GetIndex());
-      if(m_NDVIFunctor(pixel [this->GetREDChannelIndex() - 1],
-                       pixel [this->GetNIRChannelIndex() - 1]) >= this->GetNDVIThreshold())
-        {
-        nbValidPixel += 1;
-        }
-      nbVisitedPixel += 1;
-      }
-    ++lineIt;
-    }
-
-  OutputType output;
-
-  if(nbVisitedPixel == 0)
-    {
-    //std::cout << "nbValidPixel: " << nbValidPixel << "nbVisitedPixel" << nbVisitedPixel << std::endl;
-    //itkExceptionMacro(<< "The DataNode and the Support Image are disjointed");
-    output.push_back(static_cast<PrecisionType>(0.));
-    }
-  else
-    {
-    output.push_back(static_cast<PrecisionType>(nbValidPixel/nbVisitedPixel));
-    }
-
-  output.push_back(static_cast<PrecisionType>(nbValidPixel));
-  output.push_back(static_cast<PrecisionType>(nbVisitedPixel));
-
-  return output;
-}
-
-
-} // end namespace otb
-
-#endif
diff --git a/Modules/Radiometry/Indices/include/otbRadiometricIndex.h b/Modules/Radiometry/Indices/include/otbRadiometricIndex.h
new file mode 100644
index 0000000000000000000000000000000000000000..15cdba6cade2b34deeda96c9ac8df401d7652992
--- /dev/null
+++ b/Modules/Radiometry/Indices/include/otbRadiometricIndex.h
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2005-2019 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.
+ */
+
+#ifndef otbRadiometricIndex_h
+#define otbRadiometricIndex_h
+
+#include "itkVariableLengthVector.h"
+#include "otbBandName.h"
+#include <array>
+#include <set>
+#include <string>
+#include <map>
+#include <stdexcept>
+
+using namespace otb::BandName;
+
+namespace otb
+{
+namespace Functor
+{
+/**
+ * \class RadiometricIndex
+ * \brief Base class for all radiometric indices
+ *
+ * This class is the base class for all radiometric indices.
+ *
+ * It offers services to:
+ * - Indicate which band are required among CommonBandNames enum
+ * - Set indices of each required band
+ * - Compute the indice response to a pixel by subclassing the pure
+ * virtual operator()
+ *
+ * This class is designed for performance on the critical path. For
+ * best performances use the Value() method when implementing
+ * operator() to avoid branches.
+ *
+ * \ingroup OTBIndices
+ */
+template <typename TInput, typename TOutput>
+class RadiometricIndex
+{
+public:
+  /// Types for input/output
+  using InputType  = TInput;
+  using PixelType  = itk::VariableLengthVector<InputType>;
+  using OutputType = TOutput;
+
+  /// Enum Among which bands are used
+  using BandNameType = CommonBandNames;
+
+  /// The number of bands, derived from the Enum MAX value
+  static constexpr size_t NumberOfBands = static_cast<size_t>(BandNameType::MAX);
+
+  static constexpr double Epsilon = 0.0000001;
+
+  /**
+   * \param requiredBands the set<CommonBandNames> of required bands
+   * \throw runtime_error if requiredBands contains CommonBandNames::MAX
+   */
+  RadiometricIndex(const std::set<BandNameType>& requiredBands) : m_RequiredBands(), m_BandIndices()
+  {
+    if (requiredBands.find(BandNameType::MAX) != requiredBands.end())
+    {
+      throw std::runtime_error("TBandNameEnum::MAX can not be used as a required band");
+    }
+
+    // Fill the required bands array
+    m_RequiredBands.fill(false);
+    m_BandIndices.fill(0);
+
+    for (auto b : requiredBands)
+    {
+      m_RequiredBands[static_cast<size_t>(b)] = true;
+    }
+  }
+
+  /**
+   * \return a set<CommandBandName> containing the required bands for
+   * this indice.
+   */
+  std::set<BandNameType> GetRequiredBands() const
+  {
+    std::set<BandNameType> resp;
+    for (size_t i = 0; i < NumberOfBands; ++i)
+    {
+      if (m_RequiredBands[i])
+      {
+        resp.insert(static_cast<BandNameType>(i));
+      }
+    }
+
+    return resp;
+  }
+
+  /**
+   * \param band The band to set (value in CommandBandName)
+   * \param index The index of the band to set (starts at 1 for first band)
+   * \throw runtime_error if band is CommandBandName::MAX
+   */
+  void SetBandIndex(BandNameType band, size_t index)
+  {
+    if (band == BandNameType::MAX)
+    {
+      throw std::runtime_error("Can not set index for CommandBandName::MAX");
+    }
+    m_BandIndices[static_cast<size_t>(band)] = index;
+  }
+
+  /**
+   * \param indicesMap a std::map<CommandBandName,size_t> containing all
+   * bands indices to set  (starts at 1 for first band)
+   * \throw runtime_error if indicesMap contains CommandBandName::MAX
+   */
+  void SetBandsIndices(const std::map<BandNameType, size_t>& indicesMap)
+  {
+    for (auto it : indicesMap)
+    {
+      SetBandIndex(it.first, it.second);
+    }
+  }
+
+  /**
+   * \param band The band for which to retrieve indice
+   * \return The indices of the band
+   * \throw runtime_error if band is CommandBandName::MAX
+   */
+  size_t GetBandIndex(BandNameType band) const
+  {
+    if (band == BandNameType::MAX)
+    {
+      throw std::runtime_error("Can not get index for CommandBandName::MAX");
+    }
+    return m_BandIndices[static_cast<size_t>(band)];
+  }
+
+  /**
+   * Astract method which will compute the radiometric indice
+   * \param input A itk::VariableLengthVector<TInput> holding the
+   * pixel values for each band
+   * \return The indice value as TOutput  (starts at 1 for first band)
+   */
+  virtual TOutput operator()(const itk::VariableLengthVector<TInput>& input) const = 0;
+
+protected:
+  /**
+   * Helper method to retrieve index for band name. With respect to
+   * the public method, this method will not throw an exception if
+   * CommandBandName::MAX is used as a parameter. Since it is meant for
+   * internal use in the critical path and not for client code, it
+   * will only assert that band is not CommandBandName::MAX in debug
+   * mode.
+   *
+   * \param band The band for which to retrieve indice
+   * \return The indices of the band
+   */
+  size_t UncheckedBandIndex(BandNameType band) const
+  {
+    assert(band != BandNameType::MAX && "Can not retrieve index for band CommandBandName::MAX");
+    return m_BandIndices[static_cast<size_t>(band)];
+  }
+
+  /**
+   * Helper method to parse input  itk::VariableLengthVector<TInput>
+   * and get the corresponding band value.
+   * For instance:
+   * \snippet auto red   = this->Value(CommonBandNamess::RED,input);
+   *
+   * As this function is on the critical performance path, no checks
+   * are made to see wether this band is really required for this
+   * indice. However an assertion will be raised in debug mode.
+   *
+   * \param band The band for which to retrieve the value
+   * \param input A itk::VariableLengthVector<TInput> holding the
+   * pixel values for each band
+   * \return The value of the band as double
+   *
+   */
+  double Value(BandNameType band, const itk::VariableLengthVector<TInput>& input) const
+  {
+    assert(m_RequiredBands[static_cast<size_t>(band)] && "Retrieving value for a band that is not in the required bands list");
+    return static_cast<double>(input[UncheckedBandIndex(band) - 1]);
+  }
+
+private:
+  // Explicitely disable default constructor
+  RadiometricIndex() = delete;
+
+  /// An array storing the required status for each band
+  using RequiredBandsContainer = std::array<bool, NumberOfBands>;
+  RequiredBandsContainer m_RequiredBands;
+
+  /// An array storing the indice for each band
+  using BandIndicesContainer = std::array<size_t, NumberOfBands>;
+  BandIndicesContainer m_BandIndices;
+};
+
+} // namespace Functor
+} // End namespace otb
+
+#endif
diff --git a/Modules/Radiometry/Indices/include/otbSoilIndicesFunctor.h b/Modules/Radiometry/Indices/include/otbSoilIndicesFunctor.h
index 1f8ee072431c31fbcd476db730c772ca2e80fec1..aaedbc7c0efe62610a54a97817c87e52ff26dd1d 100644
--- a/Modules/Radiometry/Indices/include/otbSoilIndicesFunctor.h
+++ b/Modules/Radiometry/Indices/include/otbSoilIndicesFunctor.h
@@ -22,255 +22,14 @@
 #define otbSoilIndicesFunctor_h
 
 #include "otbMath.h"
-#include "itkVariableLengthVector.h"
-#include "otbBandName.h"
-#include <string>
+#include "otbRadiometricIndex.h"
 
 namespace otb
 {
 namespace Functor
 {
-/**
- * \class GAndRIndexBase
- *
- * \brief Base class for Green And Red channels of Spot Images
- *  XS1 corresponds to the green channel
- *  XS2 corresponds to the red channel
- *  XS3 corresponds to the Nir channel
- *  XS4 corresponds to the Mir channel (for Spot 4 & 5)
- *  Implement operators for UnaryFunctorImageFilter templated with a
- *  VectorImage and BinaryFunctorImageFilter templated with single
- *  images.
- *  Subclasses should NOT overload operators, they must  re-implement
- *  the Evaluate() method.
- *
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
-*/
-template<class TInput1, class TInput2, class TOutput>
-class GAndRIndexBase
-{
-public:
-  /// Vector pixel type used to support both vector images and multiple
-  /// input images
-  typedef itk::VariableLengthVector<TInput1> InputVectorType;
-
-  //operators !=
-  bool operator !=(const GAndRIndexBase&) const
-  {
-    return true;
-  }
-  //operator ==
-  bool operator ==(const GAndRIndexBase& other) const
-  {
-    return !(*this != other);
-  }
-
-  // Operator on vector pixel type
-  inline TOutput operator ()(const InputVectorType& inputVector) const
-  {
-    return this->Evaluate(inputVector[m_GreenIndex - 1], static_cast<TInput2>(inputVector[m_RedIndex - 1]));
-  }
-
-  // Binary operator
-  inline TOutput operator ()(const TInput1& g, const TInput2& r) const
-  {
-    return this->Evaluate(g, r);
-  }
-  /// Constructor
-  GAndRIndexBase() : m_EpsilonToBeConsideredAsZero(0.0000001), m_GreenIndex(1), m_RedIndex(2) {}
-  /// Desctructor
-  virtual ~GAndRIndexBase() {}
-
-  /// Set Green Index
-  void SetGreenIndex(unsigned int channel)
-  {
-    m_GreenIndex = channel;
-  }
-  /// Get Green Index
-  unsigned int GetGreenIndex() const
-  {
-    return m_GreenIndex;
-  }
-  /// Set Red Index
-  void SetRedIndex(unsigned int channel)
-  {
-    m_RedIndex = channel;
-  }
-  /// Get Red Index
-  unsigned int GetRedIndex() const
-  {
-    return m_RedIndex;
-  }
-
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::RED)
-      {
-      m_RedIndex = channel;
-      }
-    if (band == BandName::GREEN)
-      {
-      m_GreenIndex = channel;
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::RED)
-      {
-      return m_RedIndex;
-      }
-    if (band == BandName::GREEN)
-      {
-      return m_GreenIndex;
-      }
-  }
-
-  /** Return the index name */
-  virtual std::string GetName() const = 0;
-
-protected:
-  // This method must be reimplemented in subclasses to actually
-  // compute the index value
-  virtual TOutput Evaluate(const TInput1& g, const TInput2& r) const = 0;
-  double m_EpsilonToBeConsideredAsZero;
-
-private:
-  unsigned int m_GreenIndex;
-  unsigned int m_RedIndex;
-};
-
-/**
- * \class GAndRAndNirIndexBase
- * \brief Base class for Green And Red And NIR channels of Spot Images
- *
- *
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template<class TInput1, class TInput2, class TInput3, class TOutput>
-class GAndRAndNirIndexBase
-{
-public:
-  /// Vector pixel type used to support both vector images and multiple
-  /// input images
-  typedef itk::VariableLengthVector<TInput1> InputVectorType;
-
-  //operators !=
-  bool operator !=(const GAndRAndNirIndexBase&) const
-  {
-    return true;
-  }
-  //operator ==
-  bool operator ==(const GAndRAndNirIndexBase& other) const
-  {
-    return !(*this != other);
-  }
-
-  // Operator on vector pixel type
-  inline TOutput operator ()(const InputVectorType& inputVector) const
-  {
-    return this->Evaluate(static_cast<TInput1>(inputVector[m_GreenIndex - 1]),
-                          static_cast<TInput2>(inputVector[m_RedIndex - 1]),
-                          static_cast<TInput3>(inputVector[m_NIRIndex - 1]));
-  }
-
-  // Binary operator
-  inline TOutput operator ()(const TInput1& g, const TInput2& r, const TInput2& nir) const
-  {
-    return this->Evaluate(g, r, nir);
-  }
-  /// Constructor
-  GAndRAndNirIndexBase() : m_EpsilonToBeConsideredAsZero(0.0000001), m_GreenIndex(1), m_RedIndex(2),  m_NIRIndex(3) {}
-  /// Desctructor
-  virtual ~GAndRAndNirIndexBase() {}
-
-  /// Set Green Index
-  void SetGreenIndex(unsigned int channel)
-  {
-    m_GreenIndex = channel;
-  }
-  /// Get Green Index
-  unsigned int GetGreenIndex() const
-  {
-    return m_GreenIndex;
-  }
-  /// Set Red Index
-  void SetRedIndex(unsigned int channel)
-  {
-    m_RedIndex = channel;
-  }
-  /// Get Red Index
-  unsigned int GetRedIndex() const
-  {
-    return m_RedIndex;
-  }
-  /// Set Nir Index
-  void SetNIRIndex(unsigned int channel)
-  {
-    m_NIRIndex = channel;
-  }
-  /// Get Nir Index
-  unsigned int GetNIRIndex() const
-  {
-    return m_NIRIndex;
-  }
-
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::RED)
-      {
-      m_RedIndex = channel;
-      }
-    if (band == BandName::GREEN)
-      {
-      m_GreenIndex = channel;
-      }
-    if (band == BandName::NIR)
-      {
-      m_NIRIndex = channel;
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::RED)
-      {
-      return m_RedIndex;
-      }
-    if (band == BandName::GREEN)
-      {
-      return m_GreenIndex;
-      }
-    if (band == BandName::NIR)
-      {
-      return m_NIRIndex;
-      }
-  }
-
-  /** Return the index name */
-  virtual std::string GetName() const = 0;
-
-protected:
-  // This method must be reimplemented in subclasses to actually
-  // compute the index value
-  virtual TOutput Evaluate(const TInput1& g, const TInput2& r, const TInput2& nir) const = 0;
-
-  double m_EpsilonToBeConsideredAsZero;
-
-private:
-  unsigned int m_GreenIndex;
-  unsigned int m_RedIndex;
-  unsigned int m_NIRIndex;
-};
-
-/** \class IR
- *  \brief This functor computes the Redness Index (IR)
+/** \class RI
+ *  \brief This functor computes the Redness Index (RI)
  *
  *  [Pouget et al., "Caracteristiques spectrales des surfaces sableuses
  *   de la region cotiere nord-ouest de l'Egypte: application aux donnees
@@ -283,36 +42,29 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class IR : public GAndRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class RI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  RI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN})
   {
-    return "IR";
   }
 
-  /// Constructor
-  IR() {}
-  /// Desctructor
-  ~IR() override {}
-  // Operator on r and nir single pixel values
-protected:
-  inline TOutput Evaluate(const TInput1& pGreen, const TInput2& pRed) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    double dGreen = static_cast<double>(pGreen);
-    double dRed = static_cast<double>(pRed);
-    if (std::abs(dGreen) < this->m_EpsilonToBeConsideredAsZero)
-      {
+    auto green = this->Value(CommonBandNames::GREEN, input);
+    auto red   = this->Value(CommonBandNames::RED, input);
+
+    if (std::abs(green) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       return static_cast<TOutput>(0.);
       }
 
-    return static_cast<TOutput>(dRed * dRed / (dGreen * dGreen * dGreen));
+      return static_cast<TOutput>(red * red / (green * green * green));
   }
 };
 
-/** \class IC
+/** \class CI
  *  \brief This functor computes the Color Index (IC)
  *
  *  [Pouget et al., "Caracteristiques spectrales des surfaces sableuses
@@ -326,37 +78,30 @@ protected:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class IC : public GAndRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class CI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  CI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN})
   {
-    return "IC";
   }
 
-  /// Constructor
-  IC() {}
-  /// Desctructor
-  ~IC() override {}
-  // Operator on r and nir single pixel values
-protected:
-  inline TOutput Evaluate(const TInput1& pGreen, const TInput2& pRed) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    double dGreen = static_cast<double>(pGreen);
-    double dRed = static_cast<double>(pRed);
-    if (std::abs(dGreen + dRed) < this->m_EpsilonToBeConsideredAsZero)
-      {
+    auto green = this->Value(CommonBandNames::GREEN, input);
+    auto red   = this->Value(CommonBandNames::RED, input);
+
+    if (std::abs(green + red) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       return static_cast<TOutput>(0.);
       }
 
-    return (static_cast<TOutput>((dRed - dGreen) / (dRed + dGreen)));
+      return (static_cast<TOutput>((red - green) / (red + green)));
   }
 };
 
-/** \class IB
- *  \brief This functor computes the Brilliance Index (IB)
+/** \class BI
+ *  \brief This functor computes the Brilliance Index (BI)
  *
  *  [ ]
  *
@@ -365,33 +110,25 @@ protected:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class IB : public GAndRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class BI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  BI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN})
   {
-    return "IB";
   }
 
-  /// Constructor
-  IB() {}
-  /// Desctructor
-  ~IB() override {}
-  // Operator on r and nir single pixel values
-protected:
-  inline TOutput Evaluate(const TInput1& pGreen, const TInput2& pRed) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    double dGreen = static_cast<double>(pGreen);
-    double dRed = static_cast<double>(pRed);
+    auto green = this->Value(CommonBandNames::GREEN, input);
+    auto red   = this->Value(CommonBandNames::RED, input);
 
-    return (static_cast<TOutput>(std::sqrt((dRed * dRed + dGreen * dGreen) / 2.)));
+    return (static_cast<TOutput>(std::sqrt((red * red + green * green) / 2.)));
   }
 };
 
-/** \class IB2
- *  \brief This functor computes the Brilliance Index (IB2)
+/** \class BI2
+ *  \brief This functor computes the Brilliance Index (BI2)
  *
  *  [ ]
  *
@@ -400,29 +137,21 @@ protected:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TInput3, class TOutput>
-class IB2 : public GAndRAndNirIndexBase<TInput1, TInput2, TInput3, TOutput>
+template <class TInput, class TOutput>
+class BI2 : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  BI2() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN, CommonBandNames::NIR})
   {
-    return "IB2";
   }
 
-  /// Constructor
-  IB2() {}
-  /// Desctructor
-  ~IB2() override {}
-  // Operator on r and nir single pixel values
-protected:
-  inline TOutput Evaluate(const TInput1& pGreen, const TInput2& pRed, const TInput2& pNir) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    double dGreen = static_cast<double>(pGreen);
-    double dRed = static_cast<double>(pRed);
-    double dNir = static_cast<double>(pNir);
+    auto green = this->Value(CommonBandNames::GREEN, input);
+    auto red   = this->Value(CommonBandNames::RED, input);
+    auto nir   = this->Value(CommonBandNames::NIR, input);
 
-    return (static_cast<TOutput>(std::sqrt((dRed * dRed + dGreen * dGreen + dNir * dNir) / 3.)));
+    return (static_cast<TOutput>(std::sqrt((red * red + green * green + nir * nir) / 3.)));
   }
 };
 
diff --git a/Modules/Radiometry/Indices/include/otbVegetationIndicesFunctor.h b/Modules/Radiometry/Indices/include/otbVegetationIndicesFunctor.h
index 7131e2cdc08cf575a0070e846b02ae172b0c516d..63bc7299527ad45a5ab829f6a69d53f6cab3ec94 100644
--- a/Modules/Radiometry/Indices/include/otbVegetationIndicesFunctor.h
+++ b/Modules/Radiometry/Indices/include/otbVegetationIndicesFunctor.h
@@ -22,383 +22,13 @@
 #define otbVegetationIndicesFunctor_h
 
 #include "otbMath.h"
-#include "itkVariableLengthVector.h"
-#include "otbBandName.h"
-#include <string>
+#include "otbRadiometricIndex.h"
 
 namespace otb
 {
 
 namespace Functor
 {
-
-/**
-   * \class RAndNIRIndexBase
-   * \brief Base class for R And NIR based Index
-   *
-   *  Implement operators for UnaryFunctorImageFilter templated with a
-   *  VectorImage and BinaryFunctorImageFilter templated with single
-   *  images.
-   *  Subclasses should NOT overload operators, they must  re-implement
-   *  the Evaluate() method.
-   *
-   * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template<class TInput1, class TInput2, class TOutput>
-class RAndNIRIndexBase
-{
-public:
-  /// Vector pixel type used to support both vector images and multiple
-  /// input images
-  typedef itk::VariableLengthVector<TInput1> InputVectorType;
-
-  //operators !=
-  bool operator !=(const RAndNIRIndexBase&) const
-  {
-    return true;
-  }
-  //operator ==
-  bool operator ==(const RAndNIRIndexBase& other) const
-  {
-    return !(*this != other);
-  }
-
-  // Operator on vector pixel type
-  inline TOutput operator ()(const InputVectorType& inputVector) const
-  {
-    return this->Evaluate(inputVector[m_RedIndex - 1], static_cast<TInput2>(inputVector[m_NIRIndex - 1]));
-  }
-
-  // Binary operator
-  inline TOutput operator ()(const TInput1& r, const TInput2& nir) const
-  {
-    return this->Evaluate(r, nir);
-  }
-  /// Constructor
-  RAndNIRIndexBase() :  m_EpsilonToBeConsideredAsZero(0.0000001), m_RedIndex(3), m_NIRIndex(4) {}
-  /// Desctructor
-  virtual ~RAndNIRIndexBase() {}
-
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::RED)
-      {
-      m_RedIndex = channel;
-      }
-    if (band == BandName::NIR)
-      {
-      m_NIRIndex = channel;
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::RED)
-      {
-      return m_RedIndex;
-      }
-    if (band == BandName::NIR)
-      {
-      return m_NIRIndex;
-      }
-  }
-
-  /// Set Red Index
-  void SetRedIndex(unsigned int channel)
-  {
-    m_RedIndex = channel;
-  }
-  /// Get Red Index
-  unsigned int GetRedIndex() const
-  {
-    return m_RedIndex;
-  }
-  /// Set NIR Index
-  void SetNIRIndex(unsigned int channel)
-  {
-    m_NIRIndex = channel;
-  }
-  /// Get NIR Index
-  unsigned int GetNIRIndex() const
-  {
-    return m_NIRIndex;
-  }
-
-  /** Return the index name */
-  virtual std::string GetName() const = 0;
-
-protected:
-  // This method must be reimplemented in subclasses to actually
-  // compute the index value
-  virtual TOutput Evaluate(const TInput1& r, const TInput2& nir) const = 0;
-  double m_EpsilonToBeConsideredAsZero;
-
-private:
-  unsigned int m_RedIndex;
-  unsigned int m_NIRIndex;
-};
-
-/**
- * \class RAndBAndNIRIndexBase
- * \brief base class for R, B And NIR based Index
- *  Implement operators for UnaryFunctorImageFilter templated with a
- *  VectorImage and BinaryFunctorImageFilter templated with single
- *  images.
- *  Subclasses should NOT overload operators, they must  re-implement
- *  the Evaluate() method.
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template<class TInput1, class TInput2, class TInput3, class TOutput>
-class RAndBAndNIRIndexBase
-{
-public:
-  /// Vector pixel type used to support both vector images and multiple
-  /// input images
-  typedef itk::VariableLengthVector<TInput1> InputVectorType;
-
-  //operators !=
-  bool operator !=(const RAndBAndNIRIndexBase&) const
-  {
-    return true;
-  }
-
-  //operator ==
-  bool operator ==(const RAndBAndNIRIndexBase& other) const
-  {
-    return !(*this != other);
-  }
-
-  // Operator on vector pixel type
-  inline TOutput operator ()(const InputVectorType& inputVector)
-  {
-    return this->Evaluate(inputVector[m_RedIndex - 1],
-                          static_cast<TInput2>(inputVector[m_BlueIndex - 1]),
-                          static_cast<TInput3>(inputVector[m_NIRIndex - 1]));
-  }
-  // Binary operator
-  inline TOutput operator ()(const TInput1& r, const TInput2& b, const TInput2& nir)
-  {
-    return this->Evaluate(r, b, nir);
-  }
-  /// Constructor
-  RAndBAndNIRIndexBase() : m_EpsilonToBeConsideredAsZero(0.0000001), m_RedIndex(3), m_BlueIndex(1), m_NIRIndex(4) {}
-  /// Desctructor
-  virtual ~RAndBAndNIRIndexBase() {}
-
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::RED)
-      {
-      m_RedIndex = channel;
-      }
-    if (band == BandName::BLUE)
-      {
-      m_BlueIndex = channel;
-      }
-    if (band == BandName::NIR)
-      {
-      m_NIRIndex = channel;
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::RED)
-      {
-      return m_RedIndex;
-      }
-    if (band == BandName::BLUE)
-      {
-      return m_BlueIndex;
-      }
-    if (band == BandName::NIR)
-      {
-      return m_NIRIndex;
-      }
-  }
-
-  /// Set Red Index
-  void SetRedIndex(unsigned int channel)
-  {
-    m_RedIndex = channel;
-  }
-  /// Get Red Index
-  unsigned int GetRedIndex() const
-  {
-    return m_RedIndex;
-  }
-  /// Set Blue Index
-  void SetBlueIndex(unsigned int channel)
-  {
-    m_BlueIndex = channel;
-  }
-  /// Get Blue Index
-  unsigned int GetBlueIndex() const
-  {
-    return m_BlueIndex;
-  }
-
-  /// Set NIR Index
-  void SetNIRIndex(unsigned int channel)
-  {
-    m_NIRIndex = channel;
-  }
-  /// Get NIR Index
-  unsigned int GetNIRIndex() const
-  {
-    return m_NIRIndex;
-  }
-
-  /** Return the index name */
-  virtual std::string GetName() const = 0;
-
-protected:
-  // This method must be reimplemented in subclasses to actually
-  // compute the index value
-  virtual TOutput Evaluate(const TInput1& r, const TInput2& b, const TInput3& nir) const = 0;
-  double m_EpsilonToBeConsideredAsZero;
-
-private:
-  unsigned int m_RedIndex;
-  unsigned int m_BlueIndex;
-  unsigned int m_NIRIndex;
-};
-
-/**
- * \class RAndGAndNIRIndexBase
- * \brief base class for R, G And NIR based Index
- *  Implement operators for UnaryFunctorImageFilter templated with a
- *  VectorImage and BinaryFunctorImageFilter templated with single
- *  images.
- *  Subclasses should NOT overload operators, they must  re-implement
- *  the Evaluate() method.
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template<class TInput1, class TInput2, class TInput3, class TOutput>
-class RAndGAndNIRIndexBase
-{
-public:
-  /// Vector pixel type used to support both vector images and multiple
-  /// input images
-  typedef itk::VariableLengthVector<TInput1> InputVectorType;
-
-  //operators !=
-  bool operator !=(const RAndGAndNIRIndexBase&) const
-  {
-    return true;
-  }
-  //operator ==
-  bool operator ==(const RAndGAndNIRIndexBase& other) const
-  {
-    return !(*this != other);
-  }
-
-  // Operator on vector pixel type
-  inline TOutput operator ()(const InputVectorType& inputVector)
-  {
-    return this->Evaluate(inputVector[m_RedIndex - 1],
-                          static_cast<TInput2>(inputVector[m_GreenIndex - 1]),
-                          static_cast<TInput3>(inputVector[m_NIRIndex - 1]));
-  }
-
-  // Binary operator
-  inline TOutput operator ()(const TInput1& r, const TInput2& g, const TInput2& nir)
-  {
-    return this->Evaluate(r, g, nir);
-  }
-  /// Constructor
-  RAndGAndNIRIndexBase() : m_EpsilonToBeConsideredAsZero(0.0000001), m_RedIndex(3), m_GreenIndex(2), m_NIRIndex(4)  {}
-  /// Desctructor
-  virtual ~RAndGAndNIRIndexBase() {}
-
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::RED)
-      {
-      m_RedIndex = channel;
-      }
-    if (band == BandName::GREEN)
-      {
-      m_GreenIndex = channel;
-      }
-    if (band == BandName::NIR)
-      {
-      m_NIRIndex = channel;
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::RED)
-      {
-      return m_RedIndex;
-      }
-    if (band == BandName::GREEN)
-      {
-      return m_GreenIndex;
-      }
-    if (band == BandName::NIR)
-      {
-      return m_NIRIndex;
-      }
-  }
-
-  /// Set Red Index
-  void SetRedIndex(unsigned int channel)
-  {
-    m_RedIndex = channel;
-  }
-  /// Get Red Index
-  unsigned int GetRedIndex() const
-  {
-    return m_RedIndex;
-  }
-  /// Set Green Index
-  void SetGreenIndex(unsigned int channel)
-  {
-    m_GreenIndex = channel;
-  }
-  /// Get Green Index
-  unsigned int GetGreenIndex() const
-  {
-    return m_GreenIndex;
-  }
-
-  /// Set NIR Index
-  void SetNIRIndex(unsigned int channel)
-  {
-    m_NIRIndex = channel;
-  }
-  /// Get NIR Index
-  unsigned int GetNIRIndex() const
-  {
-    return m_NIRIndex;
-  }
-
-  /** Return the index name */
-  virtual std::string GetName() const = 0;
-
-protected:
-  // This method must be reimplemented in subclasses to actually
-  // compute the index value
-  virtual TOutput Evaluate(const TInput1& r, const TInput2& g, const TInput3& nir) const = 0;
-  double m_EpsilonToBeConsideredAsZero;
-
-private:
-  unsigned int m_RedIndex;
-  unsigned int m_GreenIndex;
-  unsigned int m_NIRIndex;
-};
-
 /** \class NDVI
  *  \brief This functor computes the Normalized Difference Vegetation Index (NDVI)
  *
@@ -409,33 +39,31 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class NDVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class NDVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
+  NDVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
+  {
+  }
 
-  /** Return the index name */
-  std::string GetName() const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    return "NDVI";
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
+
+    return static_cast<TOutput>(Compute(red, nir));
   }
 
-  /// Constructor
-  NDVI() {}
-  /// Desctructor
-  ~NDVI() override {}
-  // Operator on r and nir single pixel values
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
+  // This static compute will be used in indices derived from NDVI
+  static double Compute(const double& red, const double& nir)
   {
-    double dr = static_cast<double>(r);
-    double dnir = static_cast<double>(nir);
-    if (std::abs(dnir + dr) < this->m_EpsilonToBeConsideredAsZero)
-      {
-      return static_cast<TOutput>(0.);
+    if (std::abs(nir + red) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
+      return 0.;
       }
 
-    return (static_cast<TOutput>((dnir - dr) / (dnir + dr)));
+      return (nir - red) / (nir + red);
   }
 };
 
@@ -449,29 +77,24 @@ protected:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class RVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class RVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-
-  /** Return the index name */
-  std::string GetName() const override
+  RVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "RVI";
   }
 
-  RVI() {}
-  ~RVI() override {}
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    double dr = static_cast<double>(r);
-    double dnir = static_cast<double>(nir);
-    if (std::abs(dr)  < this->m_EpsilonToBeConsideredAsZero)
-      {
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
+
+    if (std::abs(red) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       return static_cast<TOutput>(0.);
       }
-    return (static_cast<TOutput>(dnir / dr));
+      return (static_cast<TOutput>(nir / red));
   }
 };
 
@@ -484,57 +107,31 @@ protected:
  * C. L. Wiegand, A. J. Richardson, D. E. Escobar, and A. H. Gerbermann,
  * "Vegetation Indices in Crop Assessments", REMOTE SENS. ENVIRON. 35:105-119 (1991)
  *
- *  \ingroup Functor2
+ *  \ingroup Functor
  * \ingroup Radiometry
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class PVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class PVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  PVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "PVI";
   }
 
-  PVI() : m_A(0.90893), m_B(7.46216), m_Coeff(0.74) {}
-  ~PVI() override {}
-  /** Set/Get A and B parameters */
-  void SetA(const double A)
-  {
-    m_A = A;
-    m_Coeff = 1. / (std::sqrt(m_A * m_A + 1.));
-  }
-  double GetA(void) const
-  {
-    return (m_A);
-  }
-  void SetB(const double B)
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    m_B = B;
-  }
-  double GetB(void) const
-  {
-    return (m_B);
-  }
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
-  {
-    double dnir = static_cast<double>(nir);
-    double dr = static_cast<double>(r);
-    return (static_cast<TOutput>((dnir - m_A * dr - m_B) * m_Coeff));
-  }
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
 
-private:
+    return (static_cast<TOutput>((nir - A * red - B) * C));
+  }
 
   /** A and B parameters */
-  double m_A;
-  double m_B;
-  /** Denominator, pre-calculed when the A variable is set */
-  double m_Coeff;
-
+  static constexpr double A = 0.90893;
+  static constexpr double B = 7.46216;
+  static constexpr double C = 9.74;
 };
 
 /** \class SAVI
@@ -547,48 +144,28 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class SAVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class SAVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-
-  /** Return the index name */
-  std::string GetName() const override
+  SAVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "SAVI";
   }
 
-  SAVI() : m_L(0.5) {}
-  ~SAVI() override {}
-
-  /** Set/Get L correction */
-  void SetL(const double L)
-  {
-    m_L = L;
-  }
-  double GetL(void) const
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    return (m_L);
-  }
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
 
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
-  {
-    double dnir = static_cast<double>(nir);
-    double dr = static_cast<double>(r);
-    double denominator = dnir + dr + m_L;
-    if (std::abs(denominator)  < this->m_EpsilonToBeConsideredAsZero)
-      {
+    if (std::abs(nir + red + L) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       return static_cast<TOutput>(0.);
       }
-    return (static_cast<TOutput>(((dnir - dr) * (1 + m_L)) / denominator));
+      return (static_cast<TOutput>(((nir - red) * (1 + L)) / (nir + red + L)));
   }
 
-private:
-
   /** L correction */
-  double m_L;
-
+  static constexpr double L = 0.5;
 };
 
 /** \class TSAVI
@@ -601,68 +178,33 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class TSAVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class TSAVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-
-  /** Return the index name */
-  std::string GetName() const override
+  TSAVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "TSAVI";
   }
 
-  TSAVI() : m_A(0.7), m_S(0.9), m_X(0.08) {}
-  ~TSAVI() override {}
-
-  /** Set/Get S and A parameters */
-  void SetS(const double S)
-  {
-    m_S = S;
-  }
-  double GetS(void) const
-  {
-    return (m_S);
-  }
-  void SetA(const double A)
-  {
-    m_A = A;
-  }
-  double GetA(void) const
-  {
-    return (m_A);
-  }
-  /** Set/Get X parameter */
-  void SetX(const double X)
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    m_X = X;
-  }
-  double GetX(void) const
-  {
-    return (m_X);
-  }
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
 
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
-  {
-    double dnir = static_cast<double>(nir);
-    double dr = static_cast<double>(r);
-    double denominator = m_A * dnir + dr + m_X * (1. + m_A * m_A);
-    if (std::abs(denominator) < this->m_EpsilonToBeConsideredAsZero)
-      {
+    double denominator = A * nir + red + X * (1. + A * A);
+
+    if (std::abs(denominator) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       return static_cast<TOutput>(0.);
       }
-    return (static_cast<TOutput>((m_A * (dnir - m_A * dr - m_S)) / denominator));
+      return (static_cast<TOutput>((A * (nir - A * red - S)) / denominator));
   }
 
-private:
-
   /** A and S parameters */
-  double m_A;
-  double m_S;
+  static constexpr double A = 0.7;
+  static constexpr double S = 0.9;
   /** X parameter */
-  double m_X;
-
+  static constexpr double X = 0.08;
 };
 
 /** \class WDVI
@@ -675,41 +217,30 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class WDVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class WDVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  /// Constructor
+  WDVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "WDVI";
   }
 
-  /// Constructor
-  WDVI() : m_S(0.4) {}
-  /// Desctructor
-  ~WDVI() override {}
-  // Operator on r and nir single pixel values
-/** Set/Get Slop of soil line */
-  void SetS(const double s)
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    m_S = s;
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
+
+    return static_cast<TOutput>(Compute(red, nir));
   }
-  double GetS(void) const
+
+  static double Compute(const double& red, const double& nir)
   {
-    return (m_S);
+    return (nir - S * red);
   }
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
-  {
-    double dr = static_cast<double>(r);
-    double dnir = static_cast<double>(nir);
 
-    return (dnir - m_S * dr);
-  }
-private:
   /** Slope of soil line */
-  double m_S;
+  static constexpr double S = 0.4;
 };
 
 /** \class MSAVI
@@ -723,69 +254,37 @@ private:
  * \ingroup OTBIndices
  */
 
-template <class TInput1, class TInput2, class TOutput>
-class MSAVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class MSAVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  MSAVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "MSAVI";
   }
 
-  typedef NDVI<TInput1, TInput2, TOutput> NDVIFunctorType;
-  typedef SAVI<TInput1, TInput2, TOutput> SAVIFunctorType;
-  typedef WDVI<TInput1, TInput2, TOutput> WDVIFunctorType;
-  MSAVI() : m_S(0.4)
-  {
-    m_WDVIfunctor.SetS(m_S);
-  }
-  ~MSAVI() override {}
-/** Set/Get Slop of soil line */
-  void SetS(const double s)
-  {
-    m_S = s;
-    m_WDVIfunctor.SetS(m_S);
-  }
-  double GetS(void) const
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    return (m_S);
-  }
-  NDVIFunctorType GetNDVI(void) const
-  {
-    return (m_NDVIfunctor);
-  }
-  WDVIFunctorType GetWDVI(void) const
-  {
-    return (m_WDVIfunctor);
-  }
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
 
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
-  {
-    double dnir = static_cast<double>(nir);
-    double dr = static_cast<double>(r);
+    double ndvi = NDVI<TInput, TOutput>::Compute(red, nir);
+    double wdvi = WDVI<TInput, TOutput>::Compute(red, nir);
 
-    double dNDVI = this->GetNDVI() (r, nir);
-    double dWDVI = this->GetWDVI() (r, nir);
-    double dL = 1 - 2 * m_S * dNDVI * dWDVI;
+    double L = 1 - 2 * S * ndvi * wdvi;
 
-    double denominator = dnir + dr + dL;
+    double denominator = nir + red + L;
 
-    if (std::abs(denominator)  < this->m_EpsilonToBeConsideredAsZero)
-      {
+    if (std::abs(denominator) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       return static_cast<TOutput>(0.);
       }
 
-    return (static_cast<TOutput>(((dnir - dr) * (1 + dL)) / denominator));
+      return (static_cast<TOutput>(((nir - red) * (1 + L)) / denominator));
   }
 
 private:
   /** Slope of soil line */
-  double                m_S;
-  NDVIFunctorType m_NDVIfunctor;
-  WDVIFunctorType       m_WDVIfunctor;
-
+  static constexpr double S = 0.4;
 };
 
 /** \class MSAVI2
@@ -798,30 +297,25 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class MSAVI2 : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class MSAVI2 : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  MSAVI2() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "MSAVI2";
   }
 
-  MSAVI2() {}
-  ~MSAVI2() override {}
-
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    double dnir = static_cast<double>(nir);
-    double dr = static_cast<double>(r);
-    double sqrt_value = (2 * dnir + 1) * (2 * dnir + 1) - 8 * (dnir - dr);
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
+
+    double sqrt_value = (2 * nir + 1) * (2 * nir + 1) - 8 * (nir - red);
     if (sqrt_value < 0.)
       {
       return static_cast<TOutput>(0.);
       }
-    return (static_cast<TOutput>((2 * dnir + 1 - std::sqrt(sqrt_value)) / 2.));
+      return (static_cast<TOutput>((2 * nir + 1 - std::sqrt(sqrt_value)) / 2.));
   }
 
 };
@@ -836,44 +330,39 @@ protected:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class GEMI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class GEMI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  GEMI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "GEMI";
   }
 
-  GEMI() {}
-  ~GEMI() override {}
-
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    double dnir = static_cast<double>(nir);
-    double dr = static_cast<double>(r);
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
 
-    double dnu;
-    double dnumerateur_nu;
-    double ddenominateur_nu = dnir + dr + 0.5;
-    if (std::abs(ddenominateur_nu)  < this->m_EpsilonToBeConsideredAsZero)
-      {
-      dnu = 0;
+    double nu;
+    double num_nu;
+    double denom_nu = nir + red + 0.5;
+
+    if (std::abs(denom_nu) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
+      nu = 0;
       }
     else
       {
-      dnumerateur_nu = 2 * (dnir * dnir - dr * dr) + 1.5 * dnir + 0.5 * dr;
-      dnu = dnumerateur_nu / ddenominateur_nu;
+        num_nu = 2 * (nir * nir - red * red) + 1.5 * nir + 0.5 * red;
+        nu     = num_nu / denom_nu;
       }
 
-    double ddenominateur_GEMI = 1 - dr;
-    if (std::abs(ddenominateur_GEMI)  < this->m_EpsilonToBeConsideredAsZero)
+      double denom_GEMI = 1 - red;
+      if (std::abs(denom_GEMI) < RadiometricIndex<TInput, TOutput>::Epsilon)
       {
       return static_cast<TOutput>(0.);
       }
-    return (static_cast<TOutput>((dnu * (1 - 0.25 * dnu) - (dr - 0.125)) / ddenominateur_GEMI));
+      return (static_cast<TOutput>((nu * (1 - 0.25 * nu) - (red - 0.125)) / denom_GEMI));
   }
 
 };
@@ -890,87 +379,54 @@ protected:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TInput3, class TOutput>
-class AVI : public RAndGAndNIRIndexBase<TInput1, TInput2, TInput3, TOutput>
+template <class TInput, class TOutput>
+class AVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  AVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::GREEN, CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "AVI";
   }
 
-  AVI() : m_LambdaG(560.), m_LambdaR(660.), m_LambdaNir(830.) {}
-  ~AVI() override {}
-/** Set/Get Lambda red parameter*/
-  void SetLambdaR(const double lr)
-  {
-    m_LambdaR = lr;
-  }
-  double GetLambdaR(void) const
-  {
-    return (m_LambdaR);
-  }
-/** Set/Get Lambda green parameter */
-  void SetLambdaG(const double lg)
-  {
-    m_LambdaG = lg;
-  }
-  double GetLambdaG(void) const
-  {
-    return (m_LambdaG);
-  }
-/** Set/Get Lambda red parameter */
-  void SetLambdaNir(const double lnir)
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    m_LambdaNir = lnir;
-  }
-  double GetLambdaNir(void) const
-  {
-    return (m_LambdaNir);
-  }
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& g, const TInput3& nir) const override
-  {
-    double dr = static_cast<double>(r);
-    double dg = static_cast<double>(g);
-    double dnir = static_cast<double>(nir);
+    auto green = this->Value(CommonBandNames::GREEN, input);
+    auto red   = this->Value(CommonBandNames::RED, input);
+    auto nir   = this->Value(CommonBandNames::NIR, input);
 
-    double dfact1 = (m_LambdaNir - m_LambdaR) / m_LambdaR;
-    double dfact2 = (m_LambdaR - m_LambdaG) / m_LambdaR;
+    constexpr double dfact1 = (LambdaNir - LambdaR) / LambdaR;
+    constexpr double dfact2 = (LambdaR - LambdaG) / LambdaR;
     double dterm1;
     double dterm2;
-    if (std::abs(dnir - dr)  < this->m_EpsilonToBeConsideredAsZero)
-      {
+    if (std::abs(nir - red) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       dterm1 = 0;
       }
     else
       {
-      dterm1 = std::atan(dfact1 / (dnir - dr));
+        dterm1 = std::atan(dfact1 / (nir - red));
       }
 
-    if (std::abs(dg - dr)  < this->m_EpsilonToBeConsideredAsZero)
+      if (std::abs(green - red) < RadiometricIndex<TInput, TOutput>::Epsilon)
       {
       dterm2 = 0;
       }
     else
       {
-      dterm2 = std::atan(dfact2 / (dg - dr));
+        dterm2 = std::atan(dfact2 / (green - red));
       }
 
     return static_cast<TOutput>(dterm1 + dterm2);
 
   }
-private:
 
   /**  Central wavelength of the green channel (=Lambda1) */
-  double m_LambdaG;
+  static constexpr double LambdaG = 560;
 
   /**  Central wavelength of the red channel (=Lambda2) */
-  double m_LambdaR;
+  static constexpr double LambdaR = 660;
 
   /**  Central wavelength of the nir channel (=Lambda3) */
-  double m_LambdaNir;
+  static constexpr double LambdaNir = 830;
 };
 
 /** \class ARVI
@@ -985,134 +441,31 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TInput3, class TOutput>
-class ARVI : public RAndBAndNIRIndexBase<TInput1, TInput2, TInput3, TOutput>
-{
-public:
-  /** Return the index name */
-  std::string GetName() const override
-  {
-    return "ARVI";
-  }
-
-  ARVI() : m_Gamma(0.5) {}
-  ~ARVI() override {}
-
-  /** Set/Get Gamma parameter */
-  void SetGamma(const double gamma)
-  {
-    m_Gamma = gamma;
-  }
-  double GetGamma(void) const
-  {
-    return (m_Gamma);
-  }
-
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& b, const TInput3& nir) const override
-  {
-    double dr = static_cast<double>(r);
-    double db = static_cast<double>(b);
-    double dnir = static_cast<double>(nir);
-    double RHOrb = dr - m_Gamma * (db - dr);
-    double denominator = dnir + RHOrb;
-    if (std::abs(denominator)  < this->m_EpsilonToBeConsideredAsZero)
-      {
-      return static_cast<TOutput>(0.);
-      }
-    return (static_cast<TOutput>((dnir - RHOrb) / denominator));
-  }
-
-private:
-
-  /** Gamma parameter */
-  double m_Gamma;
-};
-
-/** \class TSARVI
- *  \brief This functor computes the Transformed Soil Atmospherical Resistant Vegetation Index (TSARVI)
- *
- *  [Yoram J. Kaufman and Didier Tanre, 1992]
- *
- *  \ingroup Functor
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template <class TInput1, class TInput2, class TInput3, class TOutput>
-class TSARVI : public RAndBAndNIRIndexBase<TInput1, TInput2, TInput3, TOutput>
+template <class TInput, class TOutput>
+class ARVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  ARVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::BLUE, CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "TSARVI";
   }
 
-  TSARVI() : m_A(0.0), m_B(0.0), m_X(0.08), m_Gamma(0.5) {}
-  ~TSARVI() override {}
-
-  /** Set/Get A and B parameters */
-  void SetA(const double A)
-  {
-    m_A = A;
-  }
-  double GetA(void) const
-  {
-    return (m_A);
-  }
-  void SetB(const double B)
-  {
-    m_B = B;
-  }
-  double GetB(void) const
-  {
-    return (m_B);
-  }
-  /** Set/Get X parameter */
-  void SetX(const double X)
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    m_X = X;
-  }
-  double GetX(void) const
-  {
-    return (m_X);
-  }
-  /** Set/Get the gamma parameter */
-  void SetGamma(const double gamma)
-  {
-    m_Gamma = gamma;
-  }
-  double GetGamma(void) const
-  {
-    return (m_Gamma);
-  }
+    auto blue = this->Value(CommonBandNames::BLUE, input);
+    auto red  = this->Value(CommonBandNames::RED, input);
+    auto nir  = this->Value(CommonBandNames::NIR, input);
 
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& b, const TInput3& nir) const override
-  {
-    double dr = static_cast<double>(r);
-    double db = static_cast<double>(b);
-    double dnir = static_cast<double>(nir);
-    double dRB = dr - m_Gamma * (db - dr);
-    double denominator = dRB + m_A * dnir - m_A * m_B + m_X * (1. + m_A * m_A);
-    if (std::abs(denominator)  < this->m_EpsilonToBeConsideredAsZero)
-      {
+    double RHOrb       = red - Gamma * (blue - red);
+    double denominator = nir + RHOrb;
+    if (std::abs(denominator) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       return static_cast<TOutput>(0.);
       }
-    return (static_cast<TOutput>((m_A * (dnir - m_A * dRB - m_B)) / denominator));
+      return (static_cast<TOutput>((nir - RHOrb) / denominator));
   }
 
-private:
-
-  /** A and B parameters */
-  double m_A;
-  double m_B;
-  /** X parameter */
-  double m_X;
   /** Gamma parameter */
-  double m_Gamma;
-
+  static constexpr double Gamma = 0.5;
 };
 
 /** \class EVI
@@ -1127,81 +480,39 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TInput3, class TOutput>
-class EVI : public RAndBAndNIRIndexBase<TInput1, TInput2, TInput3, TOutput>
+template <class TInput, class TOutput>
+class EVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  EVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::BLUE, CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "EVI";
   }
 
-  EVI() : m_G(2.5), m_C1(6.0), m_C2(7.5), m_L(1.0) {}
-  ~EVI() override {}
-/** Set/Get G parameter */
-  void SetG(const double g)
-  {
-    m_G = g;
-  }
-  double GetG(void) const
-  {
-    return (m_G);
-  }
-  /** Set/Get C1 parameter */
-  void SetC1(const double c1)
-  {
-    m_C1 = c1;
-  }
-  double GetC1(void) const
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    return (m_C1);
-  }
-  /** Set/Get C2 parameter */
-  void SetC2(const double c2)
-  {
-    m_C2 = c2;
-  }
-  double GetC2(void) const
-  {
-    return (m_C2);
-  }
-  /** Set/Get L parameter */
-  void SetL(const double l)
-  {
-    m_L = l;
-  }
-  double GetL(void) const
-  {
-    return (m_L);
-  }
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& b, const TInput3& nir) const override
-  {
-    double dr = static_cast<double>(r);
-    double db = static_cast<double>(b);
-    double dnir = static_cast<double>(nir);
-    double denominator = dnir + m_C1 * dr - m_C2 * db + m_L;
-    if (std::abs(denominator) < this->m_EpsilonToBeConsideredAsZero)
-      {
+    auto blue = this->Value(CommonBandNames::BLUE, input);
+    auto red  = this->Value(CommonBandNames::RED, input);
+    auto nir  = this->Value(CommonBandNames::NIR, input);
+
+    double denominator = nir + C1 * red - C2 * blue + L;
+    if (std::abs(denominator) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       return (static_cast<TOutput>(0.));
       }
-    return (static_cast<TOutput>(m_G * (dnir - dr) / denominator));
+      return (static_cast<TOutput>(G * (nir - red) / denominator));
   }
 
-private:
-
   /** Gain factor */
-  double m_G;
+  static constexpr double G = 2.5;
 
   /** Coefficient of the aerosol resistance term */
-  double m_C1;
+  static constexpr double C1 = 6.0;
 
   /** Coefficient of the aerosol resistance term */
-  double m_C2;
+  static constexpr double C2 = 7.5;
 
   /** Canopy background adjustment */
-  double m_L;
+  static constexpr double L = 1.0;
 };
 
 /** \class IPVI
@@ -1214,31 +525,26 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class IPVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class IPVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  IPVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "IPVI";
   }
 
-  IPVI() {}
-  ~IPVI() override {}
-
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    double dr = static_cast<double>(r);
-    double dnir = static_cast<double>(nir);
-    if (std::abs(dnir + dr)  < this->m_EpsilonToBeConsideredAsZero)
-      {
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
+
+    if (std::abs(nir + red) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
       return static_cast<TOutput>(0.);
       }
     else
       {
-      return (static_cast<TOutput>(dnir / (dnir + dr)));
+        return (static_cast<TOutput>(nir / (nir + red)));
       }
   }
 };
@@ -1253,40 +559,30 @@ protected:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class TNDVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class TNDVI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  TNDVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-    return "TNDVI";
   }
 
-  typedef NDVI<TInput1, TInput2, TOutput> NDVIFunctorType;
-  TNDVI() {}
-  ~TNDVI() override {}
-
-  NDVIFunctorType GetNDVI(void) const
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    return (m_NDVIfunctor);
-  }
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
 
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
-  {
-    double dval = this->GetNDVI() (r, nir) + 0.5;
-    if (dval < 0)
-      {
+    double val = NDVI<TInput, TOutput>::Compute(red, nir) + 0.5;
+
+    if (val < 0)
+    {
       return  (static_cast<TOutput>(0));
       }
     else
       {
-      return (static_cast<TOutput>(std::sqrt(dval)));
+        return (static_cast<TOutput>(std::sqrt(val)));
       }
   }
-private:
-  NDVIFunctorType m_NDVIfunctor;
 };
 
 /** \class LAIFromNDVILogarithmic
@@ -1305,69 +601,62 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class LAIFromNDVILogarithmic : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class LAIFromNDVILogarithmic : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  LAIFromNDVILogarithmic()
+    : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}), m_NdviSoil(0.1), m_NdviInf(0.89), m_ExtinctionCoefficient(0.71)
   {
-    return "LAIFromNDVILogarithmic";
   }
 
-  typedef NDVI<TInput1, TInput2, TOutput> NDVIFunctorType;
-  LAIFromNDVILogarithmic() : m_NdviSoil(0.10), m_NdviInf(0.89), m_ExtinctionCoefficient(0.71) {}
-  ~LAIFromNDVILogarithmic() override {}
-
-  NDVIFunctorType GetNDVI(void) const
-  {
-    return (m_NDVIfunctor);
-  }
-
-  void SetNdviSoil(const double val)
+  void SetNdviSoil(const double& val)
   {
     m_NdviSoil = val;
   }
-  double GetNdviSoil(void) const
+
+  const double& GetNdviSoil() const
   {
-    return (m_NdviSoil);
+    return m_NdviSoil;
   }
 
-  void SetNdviInf(const double val)
+  void SetNdviInf(const double& val)
   {
     m_NdviInf = val;
   }
-  double GetNdviInf(void) const
+
+  const double& GetNdviInf() const
   {
-    return (m_NdviInf);
+    return m_NdviInf;
   }
 
-  void SetExtinctionCoefficient(const double val)
+  void SetExtinctionCoefficient(const double& val)
   {
     m_ExtinctionCoefficient = val;
   }
-  double GetExtinctionCoefficient(void) const
+
+  const double& GetExtionctionCoefficient() const
   {
-    return (m_ExtinctionCoefficient);
+    return m_ExtinctionCoefficient;
   }
 
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    double dval = this->GetNDVI() (r, nir);
-    if (dval < 0)
-      {
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
+
+    double val = NDVI<TInput, TOutput>::Compute(red, nir);
+
+    if (val < 0)
+    {
       return  (static_cast<TOutput>(0));
       }
     else
       {
-      return (static_cast<TOutput>(
-    -(1.0/m_ExtinctionCoefficient)*std::log((dval- m_NdviInf)/(m_NdviSoil-m_NdviInf))
-    ));
+        return static_cast<TOutput>(-(1.0 / m_ExtinctionCoefficient) * std::log((val - m_NdviInf) / (m_NdviSoil - m_NdviInf)));
       }
   }
-private:
-  NDVIFunctorType m_NDVIfunctor;
+
   double m_NdviSoil;
   double m_NdviInf;
   double m_ExtinctionCoefficient;
@@ -1391,50 +680,42 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class LAIFromReflectancesLinear : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class LAIFromReflectancesLinear : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
-  {
-    return "LAIFromReflectancesLinear";
-  }
-
-  typedef NDVI<TInput1, TInput2, TOutput> NDVIFunctorType;
-  LAIFromReflectancesLinear() : m_RedCoef(-17.91), m_NirCoef(12.26) {}
-  ~LAIFromReflectancesLinear() override {}
-
-  NDVIFunctorType GetReflectances(void) const
+  LAIFromReflectancesLinear() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}), m_RedCoef(-17.91), m_NirCoef(12.26)
   {
-    return (m_NDVIfunctor);
   }
 
-  void SetRedCoef(const double val)
+  void SetRedCoef(const double& val)
   {
     m_RedCoef = val;
   }
-  double GetRedCoef(void) const
+
+  const double& GetRedCoef() const
   {
-    return (m_RedCoef);
+    return m_RedCoef;
   }
 
-  void SetNirCoef(const double val)
+  void SetNirCoef(const double& val)
   {
     m_NirCoef = val;
   }
-  double GetNirCoef(void) const
+
+  const double& GetNirCoef() const
   {
-    return (m_NirCoef);
+    return m_NirCoef;
   }
 
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-      return (static_cast<TOutput>(m_RedCoef*r+m_NirCoef*nir));
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
+
+    return (static_cast<TOutput>(m_RedCoef * red + m_NirCoef * nir));
   }
-private:
-  NDVIFunctorType m_NDVIfunctor;
+
   double m_RedCoef;
   double m_NirCoef;
 };
@@ -1459,40 +740,29 @@ private:
   */
 
 
-  template <class TInput1, class TInput2, class TOutput>
-  class LAIFromNDVIFormosat2Functor : public RAndNIRIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class LAIFromNDVIFormosat2Functor : public RadiometricIndex<TInput, TOutput>
+{
+public:
+  LAIFromNDVIFormosat2Functor() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR})
   {
-  public:
+  }
 
-    /** Return the index name */
-    std::string GetName() const override
-    {
-      return "LAIFromNDVIFormosat2Functor";
-    }
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
+  {
+    auto red = this->Value(CommonBandNames::RED, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
 
-    /// Constructor
-    LAIFromNDVIFormosat2Functor() {}
-    /// Desctructor
-    ~LAIFromNDVIFormosat2Functor() override {}
-    // Operator on r and nir single pixel values
-  protected:
-    inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override
+    if (std::abs(nir + red) < RadiometricIndex<TInput, TOutput>::Epsilon)
     {
-    double a = 0.1519;
-    double b = 3.9443;
-    double c = 0.13;
-
-      double dr = static_cast<double>(r);
-      double dnir = static_cast<double>(nir);
-      if (std::abs(dnir + dr) < this->m_EpsilonToBeConsideredAsZero)
-        {
-        return static_cast<TOutput>(0.);
-        }
-
-      return  static_cast<TOutput>(a*(std::exp(static_cast<double>(dnir-dr)/static_cast<double>(dr+dnir)*b)-std::exp(c*b)));
-    };
-
+      return static_cast<TOutput>(0.);
+    }
+    return static_cast<TOutput>(A * (std::exp((nir - red) / (red + nir) * B) - std::exp(C * B)));
+  }
 
+  static constexpr double A = 0.1519;
+  static constexpr double B = 3.9443;
+  static constexpr double C = 0.13;
 };
 
 
diff --git a/Modules/Radiometry/Indices/include/otbWaterIndicesFunctor.h b/Modules/Radiometry/Indices/include/otbWaterIndicesFunctor.h
index e68d884d721fbdbe9fe4cbf67b2f4c034c8e66c3..19acf0fb19bd6681451935869625f2b1267d0665 100644
--- a/Modules/Radiometry/Indices/include/otbWaterIndicesFunctor.h
+++ b/Modules/Radiometry/Indices/include/otbWaterIndicesFunctor.h
@@ -22,168 +22,12 @@
 #define otbWaterIndicesFunctor_h
 
 #include "otbMath.h"
-#include "itkVariableLengthVector.h"
-#include "otbSqrtSpectralAngleFunctor.h"
-#include "otbBandName.h"
-#include <string>
+#include "otbRadiometricIndex.h"
 
 namespace otb
 {
 namespace Functor
 {
-/**
-   * \class WaterIndexBase
-   * \brief Base class
-   *
-   *  Implement operators for UnaryFunctorImageFilter templated with a
-   *  VectorImage and BinaryFunctorImageFilter templated with single
-   *  images.
-   *  Subclasses should NOT overload operators, they must  re-implement
-   *  the Evaluate() method.
-   *
-   * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template<class TInput1, class TInput2, class TOutput>
-class WaterIndexBase
-{
-public:
-  /// Vector pixel type used to support both vector images and multiple
-  /// input images
-  typedef itk::VariableLengthVector<TInput1> InputVectorType;
-
-  //operators !=
-  bool operator !=(const WaterIndexBase&) const
-  {
-    return true;
-  }
-  //operator ==
-  bool operator ==(const WaterIndexBase& other) const
-  {
-    return !(*this != other);
-  }
-
-  // Operator on vector pixel type
-  inline TOutput operator ()(const InputVectorType& inputVector) const
-  {
-    return this->Evaluate(inputVector[m_Index1 - 1], static_cast<TInput2>(inputVector[m_Index2 - 1]));
-  }
-
-  // Binary operator
-  inline TOutput operator ()(const TInput1& id1, const TInput2& id2) const
-  {
-    return this->Evaluate(id1, id2);
-  }
-  /// Constructor
-  WaterIndexBase() {}
-  /// Desctructor
-  virtual ~WaterIndexBase() {}
-
-  /// Set Index 1
-  void SetIndex1(unsigned int channel)
-  {
-    m_Index1 = channel;
-  }
-  /// Get Index 1
-  unsigned int GetIndex1() const
-  {
-    return m_Index1;
-  }
-  /// Set Index 2
-  void SetIndex2(unsigned int channel)
-  {
-    m_Index2 = channel;
-  }
-  /// Get Index 2
-  unsigned int GetIndex2() const
-  {
-    return m_Index2;
-  }
-
-  /** Return the index name */
-  virtual std::string GetName() const = 0;
-
-protected:
-  // This method must be reimplemented in subclasses to actually
-  // compute the index value
-  virtual TOutput Evaluate(const TInput1& id1, const TInput2& id2) const = 0;
-
-private:
-  unsigned int m_Index1;
-  unsigned int m_Index2;
-};
-
-/** \class WaterIndexFunctor
- *  \brief This functor will be used for most of water index functors.
- *
- *  \ingroup Functor
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template <class TInput1, class TInput2, class TOutput>
-class WaterIndexFunctor : public WaterIndexBase<TInput1, TInput2, TOutput>
-{
-public:
-  /** Return the index name */
-  std::string GetName() const override
-  {
-    return "WaterIndexFunctor";
-  }
-
-  WaterIndexFunctor() {}
-  ~WaterIndexFunctor() override {}
-protected:
-  inline TOutput Evaluate(const TInput1& id1, const TInput2& id2) const override
-  {
-    double dindex1 = static_cast<double>(id1);
-    double dindex2 = static_cast<double>(id2);
-    double ddenom = dindex1 + dindex2;
-    if (ddenom == 0)
-      {
-      return static_cast<TOutput>(0.);
-      }
-    return (static_cast<TOutput>((dindex1 - dindex2) / ddenom));
-  }
-};
-
-/** \class SRWI
- *  \brief This functor computes the Simple Ratio Water Index (SRWI)
- *  \brief For MODIS bands 860 & 1240
- *
- *   [Zarco-Tejada 2001]
- *
- *  \ingroup Functor
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template <class TInput1, class TInput2, class TOutput>
-class SRWI : public WaterIndexBase<TInput1, TInput2, TOutput>
-{
-public:
-  /** Return the index name */
-  virtual std::string GetName() const
-  {
-    return "SRWI";
-  }
-
-  SRWI() {}
-  virtual ~SRWI() {}
-protected:
-  inline TOutput Evaluate(const TInput1& rho860, const TInput2& rho1240) const
-  {
-    double drho860 = static_cast<double>(rho860);
-    double drho1240 = static_cast<double>(rho1240);
-    if (drho1240 == 0)
-      {
-      return static_cast<TOutput>(0.);
-      }
-    return (static_cast<TOutput>(drho860 / drho1240));
-  }
-};
-
 /** \class NDWI
  *  \brief This functor computes the Normalized Difference Water Index (NDWI)
  *  \brief Also called :
@@ -198,79 +42,26 @@ protected:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class NDWI : public WaterIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class NDWI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  NDWI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::NIR, CommonBandNames::MIR})
   {
-    return "NDWI";
   }
 
-  typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType;
-  /// Constructor
-  NDWI() {}
-  /// Desctructor
-  ~NDWI() override {}
-  WIFunctorType GetWIFunctor(void) const
-  {
-    return (m_WIFunctor);
-  }
-  /// Set Index NIR
-  void SetNIRIndex(unsigned int channel)
-  {
-    this->SetIndex1(channel);
-  }
-  /// Get Index NIR
-  unsigned int GetNIRIndex() const
-  {
-    return this->GetIndex1();
-  }
-  /// Set Index MIR
-  void SetMIRIndex(unsigned int channel)
-  {
-    this->SetIndex2(channel);
-  }
-  /// Get Index MIR
-  unsigned int GetMIRIndex() const
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    return this->GetIndex2();
-  }
+    auto mir = this->Value(CommonBandNames::MIR, input);
+    auto nir = this->Value(CommonBandNames::NIR, input);
 
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::NIR)
-      {
-      this->SetIndex1(channel);
-      }
-    if (band == BandName::MIR)
-      {
-      this->SetIndex2(channel);
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::NIR)
-      {
-      return this->GetIndex1();
+    if (std::abs(nir + mir) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
+      return 0.;
       }
-    if (band == BandName::MIR)
-      {
-      return this->GetIndex2();
-      }
-  }
 
-protected:
-  inline TOutput Evaluate(const TInput1& nir, const TInput2& mir) const override
-  {
-    return (static_cast<TOutput>(GetWIFunctor() (nir, mir)));
+      return (nir - mir) / (nir + mir);
   }
-private:
-  // Water Index Classic Functor
-  WIFunctorType m_WIFunctor;
 };
 
 /** \class NDWI2
@@ -283,79 +74,26 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class NDWI2 : public WaterIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class NDWI2 : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  std::string GetName() const override
+  NDWI2() : RadiometricIndex<TInput, TOutput>({CommonBandNames::NIR, CommonBandNames::GREEN})
   {
-    return "NDWI2";
   }
 
-  typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType;
-  /// Constructor
-  NDWI2() {}
-  /// Desctructor
-  ~NDWI2() override {}
-  WIFunctorType GetWIFunctor(void) const
-  {
-    return (m_WIFunctor);
-  }
-  /// Set Index G
-  void SetGIndex(unsigned int channel)
-  {
-    this->SetIndex1(channel);
-  }
-  /// Get Index G
-  unsigned int GetGIndex() const
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    return this->GetIndex1();
-  }
-  /// Set Index NIR
-  void SetNIRIndex(unsigned int channel)
-  {
-    this->SetIndex2(channel);
-  }
-  /// Get Index NIR
-  unsigned int GetNIRIndex() const
-  {
-    return this->GetIndex2();
-  }
+    auto green = this->Value(CommonBandNames::GREEN, input);
+    auto nir   = this->Value(CommonBandNames::NIR, input);
 
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::GREEN)
-      {
-      this->SetIndex1(channel);
-      }
-    if (band == BandName::NIR)
-      {
-      this->SetIndex2(channel);
+    if (std::abs(nir + green) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
+      return 0.;
       }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::GREEN)
-      {
-      return this->GetIndex1();
-      }
-    if (band == BandName::NIR)
-      {
-      return this->GetIndex2();
-      }
-  }
 
-protected:
-  inline TOutput Evaluate(const TInput1& g, const TInput2& nir) const override
-  {
-    return (static_cast<TOutput>(GetWIFunctor() (g, nir)));
+      return (green - nir) / (green + nir);
   }
-private:
-  // Water Index Classic Functor
-  WIFunctorType m_WIFunctor;
 };
 
 /** \class MNDWI
@@ -363,88 +101,7 @@ private:
  *
  *  [Xu & al., 2006 ]
  *
- *  \ingroup Functor
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template <class TInput1, class TInput2, class TOutput>
-class MNDWI : public WaterIndexBase<TInput1, TInput2, TOutput>
-{
-public:
-  /** Return the index name */
-  virtual std::string GetName() const
-  {
-    return "MNDWI";
-  }
-
-  typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType;
-  /// Constructor
-  MNDWI() {}
-  /// Desctructor
-  virtual ~MNDWI() {}
-  WIFunctorType GetWIFunctor(void) const
-  {
-    return (m_WIFunctor);
-  }
-  /// Set Index G
-  void SetGIndex(unsigned int channel)
-  {
-    this->SetIndex1(channel);
-  }
-  /// Get Index G
-  unsigned int GetGIndex() const
-  {
-    return this->GetIndex1();
-  }
-  /// Set Index MIR
-  void SetMIRIndex(unsigned int channel)
-  {
-    this->SetIndex2(channel);
-  }
-  /// Get Index MIR
-  unsigned int GetMIRIndex() const
-  {
-    return this->GetIndex2();
-  }
-
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::GREEN)
-      {
-      this->SetIndex1(channel);
-      }
-    if (band == BandName::MIR)
-      {
-      this->SetIndex2(channel);
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::GREEN)
-      {
-      return this->GetIndex1();
-      }
-    if (band == BandName::MIR)
-      {
-      return this->GetIndex2();
-      }
-  }
-
-protected:
-  inline TOutput Evaluate(const TInput1& g, const TInput2& mir) const
-  {
-    return (static_cast<TOutput>(GetWIFunctor() (g, mir)));
-  }
-private:
-  // Water Index Classic Functor
-  WIFunctorType m_WIFunctor;
-};
-
-/** \class NDPI
- *  \brief This functor computes the Normalized Difference Pond Index (NDPI)
+ * Similar to Normalized Difference Pond Index (NDPI)
  *
  *  [J.P Lacaux & al., 2006 ]
  *
@@ -453,79 +110,26 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class NDPI : public WaterIndexBase<TInput1, TInput2, TOutput>
+template <class TInput, class TOutput>
+class MNDWI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  virtual std::string GetName() const
+  MNDWI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::MIR, CommonBandNames::GREEN})
   {
-    return "NDPI";
   }
 
-  typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType;
-  /// Constructor
-  NDPI() {}
-  /// Desctructor
-  virtual ~NDPI() {}
-  WIFunctorType GetWIFunctor(void) const
-  {
-    return (m_WIFunctor);
-  }
-  /// Set Index MIR
-  void SetMIRIndex(unsigned int channel)
-  {
-    this->SetIndex1(channel);
-  }
-  /// Get Index MIR
-  unsigned int GetMIRIndex() const
-  {
-    return this->GetIndex1();
-  }
-  /// Set Index G
-  void SetGIndex(unsigned int channel)
-  {
-    this->SetIndex2(channel);
-  }
-  /// Get Index G
-  unsigned int GetGIndex() const
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    return this->GetIndex2();
-  }
+    auto green = this->Value(CommonBandNames::GREEN, input);
+    auto mir   = this->Value(CommonBandNames::MIR, input);
 
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::MIR)
-      {
-      this->SetIndex1(channel);
-      }
-    if (band == BandName::GREEN)
-      {
-      this->SetIndex2(channel);
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::MIR)
-      {
-      return this->GetIndex1();
-      }
-    if (band == BandName::GREEN)
-      {
-      return this->GetIndex2();
+    if (std::abs(mir + green) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
+      return 0.;
       }
-  }
 
-protected:
-  inline TOutput Evaluate(const TInput1& mir, const TInput2& g) const
-  {
-    return (static_cast<TOutput>(GetWIFunctor() (mir, g)));
+      return (green - mir) / (green + mir);
   }
-private:
-  // Water Index Classic Functor
-  WIFunctorType m_WIFunctor;
 };
 
 /** \class NDTI
@@ -538,221 +142,26 @@ private:
  *
  * \ingroup OTBIndices
  */
-template <class TInput1, class TInput2, class TOutput>
-class NDTI : public WaterIndexBase<TInput1, TInput2, TOutput>
-{
-public:
-  /** Return the index name */
-  virtual std::string GetName() const
-  {
-    return "NDTI";
-  }
-
-  typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType;
-  /// Constructor
-  NDTI() {}
-  /// Desctructor
-  virtual ~NDTI() {}
-  WIFunctorType GetWIFunctor(void) const
-  {
-    return (m_WIFunctor);
-  }
-  // FIXME why now using Red and Green fully spelled as everywhere
-  //else ???
-  /// Set Index R
-  void SetRIndex(unsigned int channel)
-  {
-    this->SetIndex1(channel);
-  }
-  /// Get Index R
-  unsigned int GetRIndex() const
-  {
-    return this->GetIndex1();
-  }
-  /// Set Index G
-  void SetGIndex(unsigned int channel)
-  {
-    this->SetIndex2(channel);
-  }
-  /// Get Index G
-  unsigned int GetGIndex() const
-  {
-    return this->GetIndex2();
-  }
-
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::RED)
-      {
-      this->SetIndex1(channel);
-      }
-    if (band == BandName::GREEN)
-      {
-      this->SetIndex2(channel);
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::RED)
-      {
-      return this->GetIndex1();
-      }
-    if (band == BandName::GREEN)
-      {
-      return this->GetIndex2();
-      }
-  }
-
-protected:
-  inline TOutput Evaluate(const TInput1& r, const TInput2& g) const
-  {
-    return (static_cast<TOutput>(GetWIFunctor() (r, g)));
-  }
-private:
-  // Water Index Classic Functor
-  WIFunctorType m_WIFunctor;
-};
-
-/** \class WaterSqrtSpectralAngleFunctor
- *  \brief This functor uses a spectral angle with a particular reference pixel.
- *
- *
- *  \ingroup Functor
- * \ingroup Radiometry
- *
- * \ingroup OTBIndices
- */
-template <class TInputVectorPixel, class TOutputPixel>
-class WaterSqrtSpectralAngleFunctor : public SqrtSpectralAngleFunctor<TInputVectorPixel, TOutputPixel>
+template <class TInput, class TOutput>
+class NDTI : public RadiometricIndex<TInput, TOutput>
 {
 public:
-  /** Return the index name */
-  virtual std::string GetName() const
+  NDTI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN})
   {
-    return "WaterSqrtSpectralAngleFunctor";
-  }
-  typedef WaterSqrtSpectralAngleFunctor                             Self;
-  typedef SqrtSpectralAngleFunctor<TInputVectorPixel, TOutputPixel> Superclass;
-  typedef TInputVectorPixel                                         InputVectorPixelType;
-  WaterSqrtSpectralAngleFunctor()
-  {
-
-    //Set the channels indices
-    m_BlueIndex = 0;
-    m_GreenIndex = 1;
-    m_RedIndex = 2;
-    m_NIRIndex = 3;
-
-    //Set reference water value
-    InputVectorPixelType reference;
-    reference.SetSize(4);
-    reference[0] = 136.0; reference[1] = 132.0; reference[2] = 47.0; reference[3] = 24.0;
-    this->SetReferenceWaterPixel(reference);
   }
-  ~WaterSqrtSpectralAngleFunctor() override {}
 
-  /** Set Reference Pixel */
-  void SetReferenceWaterPixel(InputVectorPixelType ref)
+  TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override
   {
-    if (ref.GetSize() != 4)
-      {
-      }
-    InputVectorPixelType reference;
-    reference.SetSize(4);
-    reference[m_BlueIndex] = ref[0]; reference[m_GreenIndex] = ref[1]; reference[m_RedIndex] = ref[2];
-    reference[m_NIRIndex] = ref[3];
-    this->SetReferencePixel(reference);
-
-  }
+    auto green = this->Value(CommonBandNames::GREEN, input);
+    auto red   = this->Value(CommonBandNames::RED, input);
 
-  /** Getters and setters */
-  void SetBlueChannel(unsigned int channel)
-  {
-    m_BlueIndex = channel;
-  }
-  unsigned int GetBlueChannel() const
-  {
-    return m_BlueIndex;
-  }
-  void SetGreenChannel(unsigned int channel)
-  {
-    m_GreenIndex = channel;
-  }
-  unsigned int GetGreenChannel() const
-  {
-    return m_GreenIndex;
-  }
-  void SetRedChannel(unsigned int channel)
-  {
-    m_RedIndex = channel;
-  }
-  unsigned int GetRedChannel() const
-  {
-    return m_RedIndex;
-  }
-  void SetNIRChannel(unsigned int channel)
-  {
-    m_NIRIndex = channel;
-  }
-  unsigned int GetNIRChannel() const
-  {
-    return m_NIRIndex;
-  }
-
-  /** Set index, generic method */
-  void SetIndex(BandName::BandName band, unsigned int channel)
-  {
-    if (band == BandName::RED)
-      {
-      m_RedIndex = channel;
-      }
-    if (band == BandName::GREEN)
-      {
-      m_GreenIndex = channel;
-      }
-    if (band == BandName::BLUE)
-      {
-      m_BlueIndex = channel;
-      }
-    if (band == BandName::NIR)
-      {
-      m_NIRIndex = channel;
-      }
-  }
-  /** Get index, generic method */
-  unsigned int GetIndex(BandName::BandName band) const
-  {
-    if (band == BandName::RED)
-      {
-      return m_RedIndex;
+    if (std::abs(red + green) < RadiometricIndex<TInput, TOutput>::Epsilon)
+    {
+      return 0.;
       }
-    if (band == BandName::GREEN)
-      {
-      return m_GreenIndex;
-      }
-    if (band == BandName::BLUE)
-      {
-      return m_BlueIndex;
-      }
-    if (band == BandName::NIR)
-      {
-      return m_NIRIndex;
-      }
-  }
 
-protected:
-  inline TOutputPixel Evaluate(const TInputVectorPixel& inPix) const override
-  {
-    return static_cast<TOutputPixel>(Superclass::Evaluate(inPix));
+      return (red - green) / (green + red);
   }
-
-  /** Channels */
-  int m_BlueIndex;
-  int m_GreenIndex;
-  int m_RedIndex;
-  int m_NIRIndex;
 };
 
 } // namespace Functor
diff --git a/Modules/Radiometry/Indices/include/otbWaterSqrtSpectralAngleImageFilter.h b/Modules/Radiometry/Indices/include/otbWaterSqrtSpectralAngleImageFilter.h
index 0ac02c7d6fec990ecbf17b7f981dad2e00603300..adbe0dee543242d0156ac2aafb22444f32b52c60 100644
--- a/Modules/Radiometry/Indices/include/otbWaterSqrtSpectralAngleImageFilter.h
+++ b/Modules/Radiometry/Indices/include/otbWaterSqrtSpectralAngleImageFilter.h
@@ -21,12 +21,116 @@
 #ifndef otbWaterSqrtSpectralAngleImageFilter_h
 #define otbWaterSqrtSpectralAngleImageFilter_h
 
-#include "otbWaterIndicesFunctor.h"
+#include "otbSqrtSpectralAngleFunctor.h"
 #include "itkUnaryFunctorImageFilter.h"
 
 namespace otb
 {
 
+namespace Functor
+{
+/** \class WaterSqrtSpectralAngleFunctor
+ *  \brief This functor uses a spectral angle with a particular reference pixel.
+ *
+ *
+ *  \ingroup Functor
+ * \ingroup Radiometry
+ *
+ * \ingroup OTBIndices
+ */
+template <class TInputVectorPixel, class TOutputPixel>
+class WaterSqrtSpectralAngleFunctor : public SqrtSpectralAngleFunctor<TInputVectorPixel, TOutputPixel>
+{
+public:
+  typedef WaterSqrtSpectralAngleFunctor                             Self;
+  typedef SqrtSpectralAngleFunctor<TInputVectorPixel, TOutputPixel> Superclass;
+  typedef TInputVectorPixel                                         InputVectorPixelType;
+  WaterSqrtSpectralAngleFunctor()
+  {
+
+    // Set the channels indices
+    m_BlueIndex  = 0;
+    m_GreenIndex = 1;
+    m_RedIndex   = 2;
+    m_NIRIndex   = 3;
+
+    // Set reference water value
+    InputVectorPixelType reference;
+    reference.SetSize(4);
+    reference[0] = 136.0;
+    reference[1] = 132.0;
+    reference[2] = 47.0;
+    reference[3] = 24.0;
+    this->SetReferenceWaterPixel(reference);
+  }
+  ~WaterSqrtSpectralAngleFunctor() override
+  {
+  }
+
+  /** Set Reference Pixel */
+  void SetReferenceWaterPixel(InputVectorPixelType ref)
+  {
+    if (ref.GetSize() != 4)
+    {
+    }
+    InputVectorPixelType reference;
+    reference.SetSize(4);
+    reference[m_BlueIndex]  = ref[0];
+    reference[m_GreenIndex] = ref[1];
+    reference[m_RedIndex]   = ref[2];
+    reference[m_NIRIndex]   = ref[3];
+    this->SetReferencePixel(reference);
+  }
+
+  /** Getters and setters */
+  void SetBlueChannel(unsigned int channel)
+  {
+    m_BlueIndex = channel;
+  }
+  unsigned int GetBlueChannel() const
+  {
+    return m_BlueIndex;
+  }
+  void SetGreenChannel(unsigned int channel)
+  {
+    m_GreenIndex = channel;
+  }
+  unsigned int GetGreenChannel() const
+  {
+    return m_GreenIndex;
+  }
+  void SetRedChannel(unsigned int channel)
+  {
+    m_RedIndex = channel;
+  }
+  unsigned int GetRedChannel() const
+  {
+    return m_RedIndex;
+  }
+  void SetNIRChannel(unsigned int channel)
+  {
+    m_NIRIndex = channel;
+  }
+  unsigned int GetNIRChannel() const
+  {
+    return m_NIRIndex;
+  }
+
+protected:
+  inline TOutputPixel Evaluate(const TInputVectorPixel& inPix) const override
+  {
+    return static_cast<TOutputPixel>(Superclass::Evaluate(inPix));
+  }
+
+  /** Channels */
+  int m_BlueIndex;
+  int m_GreenIndex;
+  int m_RedIndex;
+  int m_NIRIndex;
+};
+} // End namespace Functor
+
+
 /** \class WaterSqrtSpectralAngleImageFilter
  *  \brief Compute a radiometric water indice
  *
@@ -46,7 +150,6 @@ namespace otb
  *
  * \ingroup OTBIndices
  */
-
 template <class TInputVectorImage, class TOutputImage,
     class TFunction = Functor::WaterSqrtSpectralAngleFunctor <
         typename TInputVectorImage::PixelType,
diff --git a/Modules/Radiometry/Indices/test/CMakeLists.txt b/Modules/Radiometry/Indices/test/CMakeLists.txt
index 3e5c8354670345f66bd113cf0c312d76dbcc88c9..1424624291fd33d8f96baac6b64d02de0418e5e8 100644
--- a/Modules/Radiometry/Indices/test/CMakeLists.txt
+++ b/Modules/Radiometry/Indices/test/CMakeLists.txt
@@ -22,13 +22,11 @@ otb_module_test()
 
 set(OTBIndicesTests
 otbIndicesTestDriver.cxx
-otbNDVIDataNodeFeatureFunction.cxx
+otbRadiometricIndicesTest.cxx
 otbLandsatTMIndexNDSITest.cxx
 otbLandsatTMIndexBIOTest.cxx
-otbLAIFromReflectancesLinearFunctorTest.cxx
 otbLandsatTMIndexMIR2Test.cxx
 otbLandsatTMIndexNDVITest.cxx
-otbLAIFromNDVILogarithmicFunctorTest.cxx
 otbLandsatTMIndexVisTest.cxx
 otbWaterSqrtSpectralAngleImageFilter.cxx
 otbLandsatTMIndexBrightTest.cxx
@@ -53,31 +51,6 @@ otb_module_target_label(otbIndicesTestDriver)
 
 # Tests Declaration
 
-otb_add_test(NAME bfTvNDVIDataNodeFeatureFunction_Polygon COMMAND otbIndicesTestDriver
-  --compare-ogr ${EPSILON_3}
-  ${BASELINE_FILES}/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp
-  ${TEMP}/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp
-  otbNDVIDataNodeFeatureFunction
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
-  ${INPUTDATA}/DEM/srtm_directory
-  ${TEMP}/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp
-  0
-  )
-
-otb_add_test(NAME bfTvNDVIDataNodeFeatureFunction_Line COMMAND otbIndicesTestDriver
-  --compare-ogr ${EPSILON_9}
-  ${BASELINE_FILES}/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp
-  ${TEMP}/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp
-  otbNDVIDataNodeFeatureFunction
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp
-  ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF
-  ${INPUTDATA}/DEM/srtm_directory
-  ${TEMP}/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp
-  0
-  )
-
-
 otb_add_test(NAME raTvLandsatTMIndexNDSITest COMMAND otbIndicesTestDriver
   otbLandsatTMIndexNDSI
   3   #TM1
@@ -102,14 +75,6 @@ otb_add_test(NAME raTvLandsatTMIndexBIOTest COMMAND otbIndicesTestDriver
   21  #TM7
   )
 
-otb_add_test(NAME raTvLAIFromReflectancesLinearFunctorTest COMMAND otbIndicesTestDriver
-  otbLAIFromReflectancesLinear
-  3   # red
-  4   # nir
-  -18   # red coef
-  13   # nir coef
-  )
-
 otb_add_test(NAME raTvLandsatTMIndexMIR2Test COMMAND otbIndicesTestDriver
   otbLandsatTMIndexMIR2
   3   #TM1
@@ -134,16 +99,6 @@ otb_add_test(NAME raTvLandsatTMIndexNDVITest COMMAND otbIndicesTestDriver
   21  #TM7
   )
 
-
-otb_add_test(NAME raTvLAIFromNDVILogarithmicFunctorTest COMMAND otbIndicesTestDriver
-  otbLAIFromNDVILogarithmic
-  3   # red
-  4   # nir
-  0.12   # ndvi soil
-  0.91   # ndvi infinity
-  0.70   # extinction coefficient
-  )
-
 otb_add_test(NAME raTvLandsatTMIndexVisTest COMMAND otbIndicesTestDriver
   otbLandsatTMIndexVis
   3   #TM1
@@ -340,3 +295,21 @@ otb_add_test(NAME raTvLandsatTMThickCloudTest COMMAND otbIndicesTestDriver
   ${TEMP}/raTvLandsatTMThickCloudTest_cloudImage.tif
   )
 
+
+otb_add_test(NAME raTvRadiometricIndexBaseClassTest COMMAND otbIndicesTestDriver
+                  otbRadiometricIndexTest)
+
+otb_add_test(NAME raTvVegetationIndicesTest COMMAND otbIndicesTestDriver
+                  otbVegetationIndicesTest)
+
+otb_add_test(NAME raTvWaterIndicesTest COMMAND otbIndicesTestDriver
+                  otbWaterIndicesTest)
+
+otb_add_test(NAME raTvBuiltUpIndicesTest COMMAND otbIndicesTestDriver
+                  otbBuiltUpIndicesTest)
+
+otb_add_test(NAME raTvSoilIndicesTest COMMAND otbIndicesTestDriver
+                  otbSoilIndicesTest)
+
+otb_add_test(NAME raTvIndicesStackFunctorTest COMMAND otbIndicesTestDriver
+                  otbIndicesStackFunctorTest)
diff --git a/Modules/Radiometry/Indices/test/otbIndicesTestDriver.cxx b/Modules/Radiometry/Indices/test/otbIndicesTestDriver.cxx
index d0b41d61e7d623c2690731cbc478ddb24253cdb8..111d5c05d0978f86930a277975e37ebd58393533 100644
--- a/Modules/Radiometry/Indices/test/otbIndicesTestDriver.cxx
+++ b/Modules/Radiometry/Indices/test/otbIndicesTestDriver.cxx
@@ -22,13 +22,10 @@
 
 void RegisterTests()
 {
-  REGISTER_TEST(otbNDVIDataNodeFeatureFunction);
   REGISTER_TEST(otbLandsatTMIndexNDSI);
   REGISTER_TEST(otbLandsatTMIndexBIO);
-  REGISTER_TEST(otbLAIFromReflectancesLinear);
   REGISTER_TEST(otbLandsatTMIndexMIR2);
   REGISTER_TEST(otbLandsatTMIndexNDVI);
-  REGISTER_TEST(otbLAIFromNDVILogarithmic);
   REGISTER_TEST(otbLandsatTMIndexVis);
   REGISTER_TEST(otbWaterSqrtSpectralAngleImageFilter);
   REGISTER_TEST(otbLandsatTMIndexBright);
@@ -46,4 +43,10 @@ void RegisterTests()
   REGISTER_TEST(otbLandsatTMKernelSpectralRulesWithImage);
   REGISTER_TEST(otbLandsatTMIndexNDBSI);
   REGISTER_TEST(otbLandsatTMThickCloudTest);
+  REGISTER_TEST(otbVegetationIndicesTest);
+  REGISTER_TEST(otbWaterIndicesTest);
+  REGISTER_TEST(otbBuiltUpIndicesTest);
+  REGISTER_TEST(otbSoilIndicesTest);
+  REGISTER_TEST(otbRadiometricIndexTest);
+  REGISTER_TEST(otbIndicesStackFunctorTest);
 }
diff --git a/Modules/Radiometry/Indices/test/otbLAIFromNDVILogarithmicFunctorTest.cxx b/Modules/Radiometry/Indices/test/otbLAIFromNDVILogarithmicFunctorTest.cxx
deleted file mode 100644
index 09a2f5ff71f4393797077b67c485e3b3777e5a45..0000000000000000000000000000000000000000
--- a/Modules/Radiometry/Indices/test/otbLAIFromNDVILogarithmicFunctorTest.cxx
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbVegetationIndicesFunctor.h"
-
-int otbLAIFromNDVILogarithmic(int itkNotUsed(argc), char * argv[])
-{
-  typedef double                           PixelType;
-
-  typedef otb::Functor::LAIFromNDVILogarithmic<PixelType, PixelType, PixelType> FunctorType;
-
-  FunctorType laiFunct = FunctorType();
-
-  double redValue = (::atof(argv[1]));
-  double nirValue = (::atof(argv[2]));
-  double ndviSoil(::atof(argv[3]));
-  double ndviInf(::atof(argv[4]));
-  double extCoef(::atof(argv[5]));
-
-  double ndvi = (nirValue-redValue)/(nirValue+redValue);
-  double goodResult = -1/extCoef*std::log((ndvi-ndviInf)/(ndviSoil-ndviInf));
-
-  laiFunct.SetNdviInf(ndviInf);
-  laiFunct.SetNdviSoil(ndviSoil);
-  laiFunct.SetExtinctionCoefficient(extCoef);
-
-  laiFunct.SetRedIndex(1);
-  laiFunct.SetNIRIndex(2);
-
-  itk::VariableLengthVector<PixelType> pixel;
-  pixel.Reserve(2);
-  pixel[0] = redValue;
-  pixel[1] = nirValue;
-
-  double result = laiFunct(pixel);
-
-  if( result!=goodResult ) return EXIT_FAILURE;
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Radiometry/Indices/test/otbLAIFromReflectancesLinearFunctorTest.cxx b/Modules/Radiometry/Indices/test/otbLAIFromReflectancesLinearFunctorTest.cxx
deleted file mode 100644
index 388b36a054b9054d3b362c29e148ee2bbd01e81f..0000000000000000000000000000000000000000
--- a/Modules/Radiometry/Indices/test/otbLAIFromReflectancesLinearFunctorTest.cxx
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "otbVegetationIndicesFunctor.h"
-
-int otbLAIFromReflectancesLinear(int itkNotUsed(argc), char * argv[])
-{
-  typedef double                           PixelType;
-
-  typedef otb::Functor::LAIFromReflectancesLinear<PixelType, PixelType, PixelType> FunctorType;
-
-  FunctorType laiFunct = FunctorType();
-
-  double redValue = (::atof(argv[1]));
-  double nirValue = (::atof(argv[2]));
-  double redCoef(::atof(argv[3]));
-  double nirCoef(::atof(argv[4]));
-
-  double goodResult = redCoef*redValue+nirCoef*nirValue;
-
-  laiFunct.SetRedCoef(redCoef);
-  laiFunct.SetNirCoef(nirCoef);
-
-  laiFunct.SetRedIndex(1);
-  laiFunct.SetNIRIndex(2);
-
-  itk::VariableLengthVector<PixelType> pixel;
-  pixel.Reserve(2);
-  pixel[0] = redValue;
-  pixel[1] = nirValue;
-
-  double result = laiFunct(pixel);
-
-  if( result!=goodResult ) return EXIT_FAILURE;
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Radiometry/Indices/test/otbNDVIDataNodeFeatureFunction.cxx b/Modules/Radiometry/Indices/test/otbNDVIDataNodeFeatureFunction.cxx
deleted file mode 100644
index 18289e76d7a4468aa04fa1057adca4764c42013c..0000000000000000000000000000000000000000
--- a/Modules/Radiometry/Indices/test/otbNDVIDataNodeFeatureFunction.cxx
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-
-#include "otbNDVIDataNodeFeatureFunction.h"
-
-#include "otbVectorImage.h"
-#include "otbImageFileReader.h"
-#include "otbVectorData.h"
-#include "otbVectorDataFileReader.h"
-#include "otbVectorDataIntoImageProjectionFilter.h"
-#include "otbVectorDataFileWriter.h"
-#include "itkPreOrderTreeIterator.h"
-
-
-int otbNDVIDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[])
-{
-  const char * inputVD  = argv[1];
-  const char * inputImg = argv[2];
-  const char * DEMDir   = argv[3];
-  const char * outputVD = argv[4];
-  int DisplayWarnings   = atoi(argv[5]);
-
-  typedef double                                      CoordRepType;
-  typedef double                                      PrecisionType;
-  typedef otb::VectorImage<PrecisionType>             ImageType;
-  typedef otb::ImageFileReader<ImageType>             ImageReaderType;
-  typedef otb::VectorData<CoordRepType, 2, PrecisionType>
-                                                      VectorDataType;
-  typedef VectorDataType::DataNodeType                DataNodeType;
-  typedef otb::VectorDataFileReader<VectorDataType>   VectorDataReaderType;
-  typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType>
-                                                      VectorDataReProjFilter;
-  typedef otb::VectorDataFileWriter<VectorDataType>   VectorDataWriterType;
-  typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType>
-                                                      TreeIteratorType;
-
-  typedef otb::NDVIDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType>
-                                         NDVIDataNodeFeaturefunctionType;
-  typedef NDVIDataNodeFeaturefunctionType::OutputType
-                                                      NDVIFeatureOutputType;
-
-  ImageReaderType::Pointer imgReader = ImageReaderType::New();
-  VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New();
-  VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New();
-  VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New();
-  NDVIDataNodeFeaturefunctionType::Pointer NDVIFeatureFunction = NDVIDataNodeFeaturefunctionType::New();
-
-  if (!DisplayWarnings)
-   {
-    imgReader->SetGlobalWarningDisplay(0);
-   }
-
-  otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDir);
-
-  vdReader->SetFileName(inputVD);
-  vdReader->Update();
-
-  imgReader->SetFileName(inputImg);
-  imgReader->UpdateOutputInformation();
-  imgReader->Update(); //Needed to set m_EndIndex, m_StartIndex in otbDataNodeImageFunction
-
-  vdReProjFilter->SetInputImage(imgReader->GetOutput());
-  vdReProjFilter->SetInputVectorData(vdReader->GetOutput());
-  vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true);
-  vdReProjFilter->Update();
-/*
-  std::cout<< "vdReProjFilter->GetOutput()->Size(): "
-        << vdReProjFilter->GetOutput()->Size() << std::endl;
-*/
-  NDVIFeatureFunction->SetREDChannelIndex(3);
-  NDVIFeatureFunction->SetNIRChannelIndex(4);
-  NDVIFeatureFunction->SetNDVIThreshold(0.047);
-  NDVIFeatureFunction->SetInputImage(imgReader->GetOutput());
-
-  // Output
-  VectorDataType::Pointer outVD = VectorDataType::New();
-  // Retrieving root node
-  DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get();
-  // Create the document node
-  DataNodeType::Pointer document = DataNodeType::New();
-  document->SetNodeType(otb::DOCUMENT);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(document, root);
-  // Create the folder node
-  DataNodeType::Pointer folder = DataNodeType::New();
-  folder->SetNodeType(otb::FOLDER);
-  // Adding the layer to the data tree
-  outVD->GetDataTree()->Add(folder, document);
-
-  TreeIteratorType itVector(vdReProjFilter->GetOutput()->GetDataTree());
-  itVector.GoToBegin();
-  while (!itVector.IsAtEnd())
-    {
-    if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature())
-         {
-          const DataNodeType::Pointer currentGeometry = itVector.Get();
-          NDVIFeatureOutputType currentResult;
-          currentResult = NDVIFeatureFunction->Evaluate(*(currentGeometry.GetPointer()));
-          currentGeometry->SetFieldAsDouble("NDVI", (double)(currentResult[0]));
-          outVD->GetDataTree()->Add(currentGeometry, folder);
-         }
-    ++itVector;
-    }
-
-  vdWriter->SetInput(outVD);
-  vdWriter->SetFileName(outputVD);
-  vdWriter->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Radiometry/Indices/test/otbRadiometricIndicesTest.cxx b/Modules/Radiometry/Indices/test/otbRadiometricIndicesTest.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..58f76ed98817ba7a2f33e291eb85f31a6e5edccd
--- /dev/null
+++ b/Modules/Radiometry/Indices/test/otbRadiometricIndicesTest.cxx
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2005-2019 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.
+ */
+
+#include "otbVegetationIndicesFunctor.h"
+#include "otbWaterIndicesFunctor.h"
+#include "otbBuiltUpIndicesFunctor.h"
+#include "otbSoilIndicesFunctor.h"
+#include "otbIndicesStackFunctor.h"
+
+#include <iomanip>
+
+template <typename T>
+itk::VariableLengthVector<T> build_pixel(const std::initializer_list<T>& il)
+{
+  itk::VariableLengthVector<T> res(il.size());
+  size_t                       idx = 0;
+
+  for (auto v : il)
+  {
+    res[idx] = v;
+    ++idx;
+  }
+  return res;
+}
+
+template <class TIndice>
+bool CheckResult(const std::string& testName, std::map<typename TIndice::BandNameType, size_t> bandMap,
+                 const std::initializer_list<typename TIndice::InputType>& input, const typename TIndice::OutputType& expected)
+{
+  TIndice indice;
+
+  indice.SetBandsIndices(bandMap);
+
+  auto pixel = build_pixel(input);
+
+  typename TIndice::OutputType v = indice(pixel);
+
+  if (std::abs(expected - v) > TIndice::Epsilon)
+  {
+    std::cerr << std::setprecision(10);
+    std::cerr << testName << "\t- failed: expected " << expected << ", got " << v << std::endl;
+    return false;
+  }
+  else
+  {
+    return true;
+  }
+}
+
+
+using namespace otb::Functor;
+
+int otbVegetationIndicesTest(int, char ** const)
+{
+
+  const std::map<CommonBandNames, size_t> bandMap = {
+      {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}};
+
+  // Syntax: CheckResult<Indice Class>("test_name",bandMap,{red_value,nir_value},expected_result)
+  bool res = CheckResult<NDVI<int, double>>("ndvi_null ", bandMap, {0, 0, 0, 0}, 0.);
+  res      = res & CheckResult<NDVI<int, double>>("ndvi_pixel", bandMap, {0, 0, 1, 2}, 0.3333333);
+  res      = res & CheckResult<RVI<int, double>>("rvi_null", bandMap, {0, 0, 0, 0}, 0.);
+  res      = res & CheckResult<RVI<int, double>>("rvi_pixel", bandMap, {0, 0, 2, 1}, 0.5);
+  res      = res & CheckResult<PVI<int, double>>("pvi_pixel", bandMap, {0, 0, 1, 2}, -62.0544166);
+  res      = res & CheckResult<SAVI<double, double>>("savi_null", bandMap, {0, 0, 0, -0.5}, 0.);
+  res      = res & CheckResult<SAVI<int, double>>("savi_pixel", bandMap, {0, 0, 1, 2}, 0.42857142857);
+  res      = res & CheckResult<TSAVI<double, double>>("tsavi_null", bandMap, {0, 0, -0.1192, 0.}, 0.);
+  res      = res & CheckResult<TSAVI<int, double>>("tsavi_pixel", bandMap, {0, 0, 1, 2}, 0.1111463957);
+  res      = res & CheckResult<WDVI<int, double>>("wdvi_pixel", bandMap, {0, 0, 1, 2}, 1.6);
+  res      = res & CheckResult<MSAVI<int, double>>("msavi_pixel", bandMap, {0, 0, 1, 2}, 0.4402985075);
+  res      = res & CheckResult<MSAVI2<int, double>>("msavi2_pixel", bandMap, {0, 0, 1, 2}, 0.4384471872);
+  res      = res & CheckResult<GEMI<int, double>>("gemi_pixel", bandMap, {1, 4, 3, 2}, 2.0625);
+  res      = res & CheckResult<AVI<int, double>>("avi_pixel", bandMap, {0, 0, 1, 2}, 0.1017245527);
+  res      = res & CheckResult<ARVI<int, double>>("arvi_pixel", bandMap, {0, 0, 1, 2}, 0.1428571429);
+  res      = res & CheckResult<EVI<int, double>>("evi_pixel", bandMap, {0, 0, 1, 2}, 0.2777777778);
+  res      = res & CheckResult<IPVI<int, double>>("ipvi_pixel", bandMap, {0, 0, 1, 2}, 0.6666666667);
+  res      = res & CheckResult<LAIFromNDVILogarithmic<int, double>>("lailog_pixel", bandMap, {0, 0, 1, 2}, 0.4930511672);
+  res      = res & CheckResult<LAIFromReflectancesLinear<int, double>>("lailog_pixel", bandMap, {0, 0, 1, 2}, 6.61);
+  res      = res & CheckResult<LAIFromNDVIFormosat2Functor<int, double>>("laifrom_pixel", bandMap, {0, 0, 1, 2}, 0.3120010659);
+
+  if (res)
+  {
+    return EXIT_SUCCESS;
+  }
+  else
+  {
+    return EXIT_FAILURE;
+  }
+}
+
+int otbWaterIndicesTest(int, char ** const)
+{
+  const std::map<CommonBandNames, size_t> bandMap = {
+      {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}, {CommonBandNames::MIR, 5}};
+
+  // Syntax: CheckResult<Indice Class>("test_name",bandMap,{red_value,nir_value},expected_result)
+  bool res = CheckResult<NDWI<int, double>>("ndwi_null ", bandMap, {0, 0, 0, 0, 0}, 0.);
+  res      = res & CheckResult<NDWI<int, double>>("ndwi_pixel", bandMap, {1, 2, 3, 4, 5}, -0.1111111111);
+  res      = res & CheckResult<NDWI2<int, double>>("ndwi2_null", bandMap, {0, 0, 0, 0, 0}, 0.);
+  res      = res & CheckResult<NDWI2<int, double>>("ndwi2_pixel", bandMap, {1, 2, 3, 4, 5}, -0.3333333333);
+  res      = res & CheckResult<MNDWI<int, double>>("mndwi_null", bandMap, {0, 0, 0, 0, 0}, 0.);
+  res      = res & CheckResult<MNDWI<int, double>>("mndwi_pixel", bandMap, {1, 2, 3, 4, 5}, -0.4285714286);
+  res      = res & CheckResult<NDTI<int, double>>("ndti_null", bandMap, {0, 0, 0, 0, 0}, 0.);
+  res      = res & CheckResult<NDTI<int, double>>("ndti_pixel", bandMap, {1, 2, 3, 4, 5}, 0.2);
+
+  if (res)
+  {
+    return EXIT_SUCCESS;
+  }
+  else
+  {
+    return EXIT_FAILURE;
+  }
+}
+
+int otbSoilIndicesTest(int, char ** const)
+{
+  const std::map<CommonBandNames, size_t> bandMap = {
+      {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}, {CommonBandNames::MIR, 5}};
+
+  // Syntax: CheckResult<Indice Class>("test_name",bandMap,{red_value,nir_value},expected_result)
+  bool res = CheckResult<CI<int, double>>("ci_null ", bandMap, {0, 0, 0, 0, 0}, 0.);
+  res      = res & CheckResult<CI<int, double>>("ci_pixel", bandMap, {1, 2, 3, 4, 5}, 0.2);
+  res      = res & CheckResult<BI<int, double>>("bi_pixel", bandMap, {1, 2, 3, 4, 5}, 2.549509757);
+  res      = res & CheckResult<BI2<int, double>>("bi2_pixel", bandMap, {1, 2, 3, 4, 5}, 3.109126351);
+
+  if (res)
+  {
+    return EXIT_SUCCESS;
+  }
+  else
+  {
+    return EXIT_FAILURE;
+  }
+}
+
+int otbBuiltUpIndicesTest(int, char ** const)
+{
+  const std::map<CommonBandNames, size_t> bandMap = {
+      {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}, {CommonBandNames::MIR, 5}};
+
+  // Syntax: CheckResult<Indice Class>("test_name",bandMap,{red_value,nir_value},expected_result)
+  bool res = CheckResult<ISU<int, double>>("isu_null", bandMap, {0, 0, 0, 0, 0}, 0.);
+  res      = res & CheckResult<ISU<int, double>>("isu_pixel", bandMap, {1, 2, 3, 4, 5}, 81.25);
+
+  if (res)
+  {
+    return EXIT_SUCCESS;
+  }
+  else
+  {
+    return EXIT_FAILURE;
+  }
+}
+
+
+int otbRadiometricIndexTest(int, char ** const)
+{
+  auto ndvi = NDVI<double, double>();
+
+  auto requiredBands = ndvi.GetRequiredBands();
+
+  bool success = true;
+
+  if (requiredBands.size() != 2 || requiredBands.find(CommonBandNames::RED) == requiredBands.end() ||
+      requiredBands.find(CommonBandNames::NIR) == requiredBands.end())
+  {
+    std::cerr << "Required bands is not {RED,NIR} for NDVI" << std::endl;
+    success = false;
+  }
+
+  ndvi.SetBandIndex(CommonBandNames::RED, 10);
+
+  if (ndvi.GetBandIndex(CommonBandNames::RED) != 10)
+  {
+    std::cerr << "Could not Set/Get band index properly" << std::endl;
+    success = false;
+  }
+
+  const std::map<CommonBandNames, size_t> bandMap = {{CommonBandNames::RED, 100}, {CommonBandNames::NIR, 200}};
+
+  ndvi.SetBandsIndices(bandMap);
+
+  if (ndvi.GetBandIndex(CommonBandNames::RED) != 100 || ndvi.GetBandIndex(CommonBandNames::NIR) != 200)
+  {
+    std::cerr << "Could not set all band indices at once with SetBandIndices" << std::endl;
+    success = false;
+  }
+
+  try
+  {
+    ndvi.SetBandIndex(CommonBandNames::MAX, 1);
+    std::cerr << "Calling SetBandIndices with ::MAX should raise a runtime_error exception." << std::endl;
+    success = false;
+  }
+  catch (const std::runtime_error& e)
+  {
+  }
+
+  if (success)
+  {
+    return EXIT_SUCCESS;
+  }
+  else
+  {
+    return EXIT_FAILURE;
+  }
+}
+
+int otbIndicesStackFunctorTest(int, char ** const)
+{
+  using IndicesType      = RadiometricIndex<double, int>;
+  using StackFunctorType = IndicesStackFunctor<IndicesType>;
+
+  auto ndvi = NDVI<double, int>();
+  auto ndwi = NDWI<double, int>();
+
+  std::vector<IndicesType*> indices = {&ndvi, &ndwi};
+
+  auto stack = StackFunctorType(indices);
+
+  bool success = true;
+
+  if (stack.OutputSize() != 2)
+  {
+    std::cerr << "Size of output pixel for stack functor should be 2" << std::endl;
+    success = false;
+  }
+
+  const std::map<CommonBandNames, size_t> bandMap = {
+      {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}, {CommonBandNames::MIR, 5}};
+
+  ndvi.SetBandsIndices(bandMap);
+  ndwi.SetBandsIndices(bandMap);
+
+  StackFunctorType::OutputType out(2);
+
+  auto in = build_pixel<double>({1, 2, 3, 4, 5});
+
+  stack(out, in);
+
+  if (out[0] != ndvi(in))
+  {
+    std::cerr << "First output band should correspond to ndvi" << std::endl;
+    success = false;
+  }
+
+  if (out[1] != ndwi(in))
+  {
+    std::cerr << "Second output band should correspond to ndwi" << std::endl;
+    success = false;
+  }
+
+  if (success)
+  {
+    return EXIT_SUCCESS;
+  }
+  else
+  {
+    return EXIT_FAILURE;
+  }
+}
diff --git a/Modules/Radiometry/OpticalCalibration/test/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.cxx b/Modules/Radiometry/OpticalCalibration/test/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.cxx
index c70da18dfa09004c57facbcc8a9fa3a8cecb319d..0b099fbd35c0481504aaa2835f3c923e907a9339 100644
--- a/Modules/Radiometry/OpticalCalibration/test/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.cxx
+++ b/Modules/Radiometry/OpticalCalibration/test/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.cxx
@@ -26,6 +26,7 @@
 #include "otbImageFileWriter.h"
 #include "otbAtmosphericCorrectionParameters.h"
 #include "otbAtmosphericRadiativeTerms.h"
+#include "otbMacro.h"
 #include <fstream>
 #include <iostream>
 
@@ -150,9 +151,9 @@ int otbSurfaceAdjacencyEffectCorrectionSchemeFilter(int itkNotUsed(argc), char *
       {
       value = atof(line.c_str());
       vect.push_back(value);
-      std::cout << "value " << value << std::endl;
+      otbLogMacro(Debug, << "value " << value);
       }
-    std::cout << "vec size " << vect.size()<< std::endl;
+    otbLogMacro(Debug, << "vec size " << vect.size());
     fin2.close();
     functionValues->SetFilterFunctionValues(vect);
     functionValues->SetMinSpectralValue(minSpectralValue);
diff --git a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.h b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.h
index ec0ef3d8264028aaa656959abc693b19f4eec0ae..ea82717f97b18260a1b5e281937b879903607081 100644
--- a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.h
+++ b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.h
@@ -52,47 +52,46 @@ namespace otb
  *
  * \ingroup OTBSimulation
  */
-  template <class TReduceSpectralResponse , class TFunction = Functor::NDVI< typename TReduceSpectralResponse::ValuePrecisionType, typename TReduceSpectralResponse::ValuePrecisionType,
-  typename TReduceSpectralResponse::ValuePrecisionType > >
-      class ReduceSpectralResponseClassifierRAndNIR
-  : public itk::DataObject
-      {
-        //friend class
-        public:
-          /** Standard class typedefs */
-          typedef ReduceSpectralResponseClassifierRAndNIR Self;
-          typedef itk::DataObject Superclass;
-          typedef itk::SmartPointer<Self> Pointer;
-          typedef itk::SmartPointer<const Self> ConstPointer;
-
-          /** Template parameters typedef */
-          typedef TReduceSpectralResponse InputReduceSpectralResponseType;
-          typedef TFunction   FunctorType;
-          typedef typename TReduceSpectralResponse::Pointer InputReduceSpectralResponsePointerType;
-          typedef typename InputReduceSpectralResponseType::ValuePrecisionType ValuePrecisionType;
-
-
-          /** Standard macros */
-          itkNewMacro(Self);
-          itkTypeMacro(ReduceSpectralResponseClassifierRAndNIR, DataObject);
-
-          itkGetConstObjectMacro(InputReduceSpectralResponse, InputReduceSpectralResponseType);
-          itkSetObjectMacro(InputReduceSpectralResponse, InputReduceSpectralResponseType);
-
-          itkGetConstMacro(RBandNumber, unsigned int);
-          itkSetMacro(RBandNumber, unsigned int);
-
-          itkGetConstMacro(NIRBandNumber, unsigned int);
-          itkSetMacro(NIRBandNumber, unsigned int);
-
-          /** Get the functor object.  The functor is returned by reference.
-           * (Functors do not have to derive from itk::LightObject, so they do
-           * not necessarily have a reference count. So we cannot return a
-           * SmartPointer.) */
-          FunctorType& GetFunctor()
-          {
-            return m_Functor;
-          };
+template <class TReduceSpectralResponse,
+          class TFunction = Functor::NDVI<typename TReduceSpectralResponse::ValuePrecisionType, typename TReduceSpectralResponse::ValuePrecisionType>>
+class ReduceSpectralResponseClassifierRAndNIR : public itk::DataObject
+{
+  // friend class
+public:
+  /** Standard class typedefs */
+  typedef ReduceSpectralResponseClassifierRAndNIR Self;
+  typedef itk::DataObject                         Superclass;
+  typedef itk::SmartPointer<Self>                 Pointer;
+  typedef itk::SmartPointer<const Self>           ConstPointer;
+
+  /** Template parameters typedef */
+  typedef TReduceSpectralResponse                                      InputReduceSpectralResponseType;
+  typedef TFunction                                                    FunctorType;
+  typedef typename TReduceSpectralResponse::Pointer                    InputReduceSpectralResponsePointerType;
+  typedef typename InputReduceSpectralResponseType::ValuePrecisionType ValuePrecisionType;
+
+
+  /** Standard macros */
+  itkNewMacro(Self);
+  itkTypeMacro(ReduceSpectralResponseClassifierRAndNIR, DataObject);
+
+  itkGetConstObjectMacro(InputReduceSpectralResponse, InputReduceSpectralResponseType);
+  itkSetObjectMacro(InputReduceSpectralResponse, InputReduceSpectralResponseType);
+
+  itkGetConstMacro(RBandNumber, unsigned int);
+  itkSetMacro(RBandNumber, unsigned int);
+
+  itkGetConstMacro(NIRBandNumber, unsigned int);
+  itkSetMacro(NIRBandNumber, unsigned int);
+
+  /** Get the functor object.  The functor is returned by reference.
+   * (Functors do not have to derive from itk::LightObject, so they do
+   * not necessarily have a reference count. So we cannot return a
+   * SmartPointer.) */
+  FunctorType& GetFunctor()
+  {
+    return m_Functor;
+  };
 
   /** Set the functor object.  This replaces the current Functor with a
            * copy of the specified Functor. This allows the user to specify a
diff --git a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.hxx b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.hxx
index 4d97fb2b292b4d8f62359b9497f19f4908de680c..bd43ed41d45b7c073210ead4443c3b1643dc35a2 100644
--- a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.hxx
+++ b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.hxx
@@ -50,7 +50,13 @@ namespace otb
       ReduceSpectralResponseClassifierRAndNIR<TReduceSpectralResponse , TFunction>
   ::operator()()
   {
-      return m_Functor((*m_InputReduceSpectralResponse)(m_RBandNumber), (*m_InputReduceSpectralResponse)(m_NIRBandNumber));
+    itk::VariableLengthVector<ValuePrecisionType> sr(2);
+    sr[0]=(*m_InputReduceSpectralResponse)(m_RBandNumber);
+    sr[1]=(*m_InputReduceSpectralResponse)(m_NIRBandNumber);
+    m_Functor.SetBandIndex(CommonBandNames::RED,1);
+    m_Functor.SetBandIndex(CommonBandNames::NIR,2);
+
+    return m_Functor(sr);
   }
 
 
diff --git a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx
index b5e61e7a7056980e76a758d5adabf0463d28cf86..154ee53f4a9d599310e92ea39f5585b70c50d0db 100644
--- a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx
+++ b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx
@@ -66,14 +66,13 @@ int otbReduceSpectralResponse(int argc, char * argv[])
   myReduceResponse->SetReflectanceMode(reflectanceMode);
   myReduceResponse->CalculateResponse();
   /** Print the Reduce SR*/
-  std::cout << myReduceResponse << std::endl;
+  otbLogMacro(Debug, << myReduceResponse);
   if (argc == 6)
     {
     char * outputName = argv[5];
     std::ofstream outputFile(outputName, std::ios::out);
     outputFile << myReduceResponse << std::endl;
     }
-  else std::cout << myReduceResponse << std::endl;
   return EXIT_SUCCESS;
 }
 
diff --git a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx
index 87fda203e2af13b01998c836307f0376f3199b7d..a0e0d61e169419bdc67eabee18589f0353b4f44f 100644
--- a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx
+++ b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx
@@ -45,7 +45,7 @@ int otbReduceSpectralResponseClassifierRAndNIR(int argc, char * argv[])
   typedef otb::ReduceSpectralResponse < ResponseType, SatRSRType>  ReduceResponseType;
   typedef ReduceResponseType::Pointer  ReduceResponseTypePointerType;
 
-  typedef otb::Functor::NDVI<double, double, double >               TFunctionType;
+  typedef otb::Functor::NDVI<double, double>                                               TFunctionType;
   typedef otb::ReduceSpectralResponseClassifierRAndNIR <ReduceResponseType, TFunctionType> ReduceSpectralResponseClassifierRAndNIRType;
   typedef ReduceSpectralResponseClassifierRAndNIRType::Pointer  ReduceSpectralResponseClassifierRAndNIRPointerType;
 
diff --git a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx
index b62fad816de6dc073338364c29c483ac41a6b2aa..7a707f714090b4f7d3592cd03ea7ea614ad2905a 100644
--- a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx
+++ b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx
@@ -19,7 +19,7 @@
  */
 
 
-
+#include "otbMacro.h"
 #include "otbSatelliteRSR.h"
 #include "otbReduceSpectralResponse.h"
 
@@ -89,7 +89,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
 
   for (unsigned int i = 0; i < dirSR.size(); ++i) //for each class (directory)
     {
-      std::cout << "dirSR[" << i << "] : " << dirSR[i] << std::endl;
+      otbLogMacro(Info, << "dirSR[" << i << "] : " << dirSR[i]);
 
       std::string fileExp = dirSR[i];
       // Find all .txt file in the directory
@@ -97,7 +97,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
       itksys::Glob glob;
       if ( glob.FindFiles( fileExp ) == false )
         {
-          std::cout<<"No .txt file found in "<<dirSR[i]<<"."<<std::endl;
+          otbLogMacro(Warning,<<"No .txt file found in "<<dirSR[i]<<".");
           return EXIT_FAILURE;
         }
 
@@ -122,14 +122,14 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
     //add to global training files and testing files
     for (unsigned int k = 0; k < testing.size(); ++k)
       {
-        std::cout << "testing[" << k << "] : " << testing[k] << std::endl;
+        otbLogMacro(Debug, << "testing[" << k << "] : " << testing[k]);
         testingFiles.push_back(testing[k]);
         testingGTClasses.push_back(i);
       }
 
     for (unsigned int l = 0; l < training.size(); ++l)
       {
-        std::cout << "training[" << l << "] : " << training[l] << std::endl;
+        otbLogMacro(Debug, << "training[" << l << "] : " << training[l]);
         trainingFiles.push_back(training[l]);
         trainingClasses.push_back(i); //class is the directory number
       }
@@ -141,7 +141,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
   for (unsigned int i = 0; i < trainingFiles.size(); ++i)
     {
     ResponsePointerType spectralResponse = ResponseType::New();
-    std::cout << "training file : " << trainingFiles[i] << std::endl;
+    otbLogMacro(Debug, << "training file : " << trainingFiles[i]);
     spectralResponse->Load(trainingFiles[i], 100.0);
 
     //Compute Reduce Spectral Response
@@ -156,17 +156,19 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
     SampleType sample;
     TrainingSampleType trainingSample;
     sample.SetSize(reduceResponse->GetReduceResponse()->Size());
-    std::cout << "reduce response : [";
+    std::ostringstream oss;
+    oss << "reduce response : [";
     for (unsigned int j = 0; j < reduceResponse->GetReduceResponse()->Size(); ++j)
       {
       sample[j] = reduceResponse->GetReduceResponse()->GetResponse()[j].second;
-      std::cout << reduceResponse->GetReduceResponse()->GetResponse()[j].second << " ";
+      oss << reduceResponse->GetReduceResponse()->GetResponse()[j].second << " ";
       }
-    std::cout << "]" << std::endl;
+    oss << "]";
+    otbLogMacro(Debug, << oss.str());
     sampleList->SetMeasurementVectorSize(nbBand);
     sampleList->PushBack(sample);
     trainingSample = trainingClasses[i];
-    std::cout << "training class : " << trainingSample << std::endl;
+    otbLogMacro(Debug, << "training class : " << trainingSample);
     trainingList->PushBack(trainingSample);
     }
 
@@ -191,7 +193,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
   for (unsigned int i = 0; i < testingFiles.size(); ++i)
     {
     ResponsePointerType spectralResponse = ResponseType::New();
-    std::cout << "testing file : " << testingFiles[i] << std::endl;
+    otbLogMacro(Debug, << "testing file : " << testingFiles[i]);
     spectralResponse->Load(testingFiles[i], 100.0);
 
     //Compute Reduce Spectral Response
@@ -222,12 +224,12 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
   TrainingSampleListType::ConstIterator it = classifierListLabel->Begin();
   while (it != classifierListLabel->End())
     {
-    std::cout << "class : " << it.GetMeasurementVector()[0] << std::endl;
+    otbLogMacro(Debug, << "class : " << it.GetMeasurementVector()[0]);
     ++it;
     }
   for (unsigned int i = 0; i < testingFiles.size(); ++i)
     {
-      std::cout << "ground truth class : " << testingGTClasses[i] << std::endl;
+    otbLogMacro(Debug, << "ground truth class : " << testingGTClasses[i]);
     }
 
   //Compute confusion matrix
@@ -236,9 +238,8 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[])
   confMatCalc->SetProducedLabels(classifierListLabel);
   confMatCalc->Compute();
 
-  std::cout << std::endl;
-  std::cout << "Confusion matrix: " << std::endl << confMatCalc->GetConfusionMatrix() << std::endl << std::endl;
-  std::cout << "Kappa Index: " << std::endl << confMatCalc->GetKappaIndex() << std::endl << std::endl;
+  otbLogMacro(Info, << "Confusion matrix: " << std::endl << confMatCalc->GetConfusionMatrix());
+  otbLogMacro(Info, << "Kappa Index: " << std::endl << confMatCalc->GetKappaIndex());
 
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Radiometry/Simulation/test/otbSatelliteRSR.cxx b/Modules/Radiometry/Simulation/test/otbSatelliteRSR.cxx
index 4fe40bf15f1301572a47391d9f85b45964c7f2a1..fb5b72baec1387016eef0cd863dd5b92dc592f78 100644
--- a/Modules/Radiometry/Simulation/test/otbSatelliteRSR.cxx
+++ b/Modules/Radiometry/Simulation/test/otbSatelliteRSR.cxx
@@ -44,13 +44,8 @@ int otbSatelliteRSR(int argc, char * argv[])
   unsigned int NumBand = atoi(argv[4]);
   double lambda = atof(argv[3]);
 
-  std::cout << myResponse <<std::endl;
-  std::cout << "RSR("<<lambda<<","<< NumBand <<")= " << (*myResponse)(lambda, NumBand) << std::endl;
-//   for(unsigned int i=0; i<myResponse->GetRSR()[NumBand]->GetResponse().size(); ++i)
-//   {
-//      std::cout << "RSR("<<myResponse->GetRSR()[NumBand]->GetResponse()[i]->first<<","<< NumBand <<")= " << myResponse->GetRSR()[NumBand]->GetResponse()[i]->second << std::endl;
-//   }
-
+  otbLogMacro(Debug, << myResponse);
+  otbLogMacro(Info, << "RSR("<<lambda<<","<< NumBand <<")= " << (*myResponse)(lambda, NumBand));
 
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Radiometry/Simulation/test/otbSpectralResponse.cxx b/Modules/Radiometry/Simulation/test/otbSpectralResponse.cxx
index cd1413d226f1b33a6e344ba2eb2a4b6a54402cd8..e0aaa4e94c446c310e18688dc977df90799f5b57 100644
--- a/Modules/Radiometry/Simulation/test/otbSpectralResponse.cxx
+++ b/Modules/Radiometry/Simulation/test/otbSpectralResponse.cxx
@@ -45,7 +45,7 @@ int otbSpectralResponse(int argc, char * argv[])
   ImageType::Pointer image = ImageType::New();
   myResponse->GetImage(image);
 
-  std::cout<<myResponse<<std::endl;
-  std::cout << "SpectResponse("<<lambda<<")= " << (*myResponse)(lambda) << std::endl;
+  otbLogMacro(Debug, << myResponse);
+  otbLogMacro(Info, << "SpectResponse("<<lambda<<")= " << (*myResponse)(lambda));
   return EXIT_SUCCESS;
 }
diff --git a/Modules/Registration/DisplacementField/CMakeLists.txt b/Modules/Registration/DisplacementField/CMakeLists.txt
deleted file mode 100644
index a8ad1a8e38bf22af2290f918ff38056abee5ba93..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-project(OTBDisplacementField)
-otb_module_impl()
diff --git a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.h
deleted file mode 100644
index 1e219346e5c7c37c4a32ea87b7dd0937d75325f1..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbBSplinesInterpolateDisplacementFieldGenerator_h
-#define otbBSplinesInterpolateDisplacementFieldGenerator_h
-
-#include "otbPointSetToDisplacementFieldGenerator.h"
-
-namespace otb
-{
-/** \class BSplinesInterpolateDisplacementFieldGenerator
- *  \brief This filters encapsulate the itk::DisplacementFieldSource to produce a BSpline interpolation of the point in point set whose metric values are
- * sufficient.
- * \sa itk::DisplacementFieldSource
- * \ingroup DisparityMap
- *
- * \ingroup OTBDisplacementField
- */
-template <class TPointSet, class TDisplacementField>
-class ITK_EXPORT BSplinesInterpolateDisplacementFieldGenerator
-  : public PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-{
-public:
-  /** Standard typedefs */
-  typedef BSplinesInterpolateDisplacementFieldGenerator                      Self;
-  typedef PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass;
-  typedef itk::SmartPointer<Self>                                           Pointer;
-  typedef itk::SmartPointer<const Self>                                     ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(BSplinesInterpolateDisplacementFieldGenerator, PointSetToDisplacementFieldGenerator);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PointSetType                PointSetType;
-  typedef typename Superclass::PointSetPointerType         PointSetPointerType;
-  typedef typename Superclass::DisplacementFieldType        DisplacementFieldType;
-  typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType;
-  typedef typename Superclass::IndexType                   IndexType;
-  typedef typename DisplacementFieldType::PixelType         PixelType;
-  typedef typename Superclass::ValueType                   ValueType;
-  typedef typename Superclass::PointType                   PointType;
-  typedef typename Superclass::IndexVectorType             IndexVectorType;
-  typedef typename Superclass::DistanceVectorType          DistanceVectorType;
-
-protected:
-  /** Constructor */
-  BSplinesInterpolateDisplacementFieldGenerator() {};
-  /** Destructor */
-  ~BSplinesInterpolateDisplacementFieldGenerator() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** Main computation method */
-  void GenerateData() override;
-
-private:
-  BSplinesInterpolateDisplacementFieldGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbBSplinesInterpolateDisplacementFieldGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.hxx
deleted file mode 100644
index 7b12fa7a1881970099fb35781b039856a397d18c..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.hxx
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbBSplinesInterpolateDisplacementFieldGenerator_hxx
-#define otbBSplinesInterpolateDisplacementFieldGenerator_hxx
-
-#include "otbBSplinesInterpolateDisplacementFieldGenerator.h"
-// Disabling deprecation warning if on visual
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable:4996)
-#endif
-#include "itkLandmarkDisplacementFieldSource.h"
-// Enabling remaining deprecation warning
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-#include "otbMacro.h"
-#include "otbImage.h"
-#include "itkImageRegionIterator.h"
-
-namespace otb
-{
-/** Main computation method */
-template <class TPointSet, class TDisplacementField>
-void
-BSplinesInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GenerateData(void)
-{
-  DisplacementFieldPointerType outputPtr = this->GetOutput();
-  typedef itk::Vector<ValueType, 2>                                      VectorType;
-  typedef otb::Image<VectorType, DisplacementFieldType::ImageDimension>  ImageType;
-  typedef itk::LandmarkDisplacementFieldSource<ImageType>                DisplacementFieldSourceType;
-  typedef typename DisplacementFieldSourceType::LandmarkContainer        LandmarkContainerType;
-  typedef typename DisplacementFieldSourceType::LandmarkPointType        LandmarkPointType;
-  typedef typename PointSetType::PointsContainer                         PointsContainer;
-  typedef typename PointsContainer::ConstIterator                        PointsIterator;
-  typedef typename PointSetType::PointDataContainer                      PointDataContainer;
-  typedef typename PointDataContainer::ConstIterator                     PointDataIterator;
-
-  typename LandmarkContainerType::Pointer sourceLandmarks = LandmarkContainerType::New();
-  typename LandmarkContainerType::Pointer targetLandmarks = LandmarkContainerType::New();
-  LandmarkPointType                       sourcePoint;
-  LandmarkPointType                       targetPoint;
-
-  PointsIterator pointIterator = this->GetPointSet()->GetPoints()->Begin();
-  PointsIterator end = this->GetPointSet()->GetPoints()->End();
-  unsigned int   pointId = 0;
-
-  PointDataIterator pointDataIterator = this->GetPointSet()->GetPointData()->Begin();
-
-  while (pointIterator != end)
-    {
-    typename PointDataContainer::Element valueAndDisplacements = pointDataIterator.Value();
-
-    if (std::abs(valueAndDisplacements[0]) >= this->GetMetricThreshold())
-      {
-      typename PointSetType::PointType p = pointIterator.Value();   // access the point
-      sourcePoint[0] = p[0];
-      sourcePoint[1] = p[1];
-      targetPoint[0] = p[0] - valueAndDisplacements[1];
-      targetPoint[1] = p[1] - valueAndDisplacements[2];
-      otbMsgDebugMacro(
-        << "Adding landmark " << pointId << ", source point: " << sourcePoint << ", targetpoint: " << targetPoint);
-      sourceLandmarks->InsertElement(pointId, sourcePoint);
-      targetLandmarks->InsertElement(pointId, targetPoint);
-      ++pointId;
-      }
-    ++pointIterator;
-    ++pointDataIterator;
-    }
-
-  typename DisplacementFieldSourceType::Pointer deformer = DisplacementFieldSourceType::New();
-  deformer->SetOutputSpacing(this->GetOutputSpacing());
-  deformer->SetOutputOrigin(this->GetOutputOrigin());
-  deformer->SetOutputRegion(outputPtr->GetRequestedRegion());
-  deformer->SetSourceLandmarks(sourceLandmarks.GetPointer());
-  deformer->SetTargetLandmarks(targetLandmarks.GetPointer());
-
-  deformer->Update();
-  outputPtr->Allocate();
-  PixelType defaultPixel;
-  defaultPixel.SetSize(2);
-  defaultPixel.Fill(this->GetDefaultValue());
-  outputPtr->FillBuffer(defaultPixel);
-  typedef itk::ImageRegionIterator<ImageType>            ImageIteratorType;
-  typedef itk::ImageRegionIterator<DisplacementFieldType> OutputIteratorType;
-
-  ImageIteratorType inIt(deformer->GetOutput(), outputPtr->GetRequestedRegion());
-  OutputIteratorType outIt(outputPtr, outputPtr->GetRequestedRegion());
-  int i = 0;
-  // Casting otb::Image<itt::Vector<ValueType, 2>, 2> to otb::VectorImage<ValueType, 2>
-  for (inIt.GoToBegin(), outIt.GoToBegin(); (!inIt.IsAtEnd()) && (!outIt.IsAtEnd()); ++inIt, ++outIt, ++i)
-    {
-    typename ImageType::PixelType inPixel;
-    inPixel = inIt.Get();
-    PixelType outPixel;
-    outPixel.SetSize(2);
-    outPixel[0] = -inPixel[0];
-    outPixel[1] = -inPixel[1];
-    outIt.Set(outPixel);
-    }
-}
-/**
- * PrintSelf Method
- */
-template <class TPointSet, class TDisplacementField>
-void
-BSplinesInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h
deleted file mode 100644
index 6528f55931f87ffab35c48cd7c806495ed13caba..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbBSplinesInterpolateTransformDisplacementFieldGenerator_h
-#define otbBSplinesInterpolateTransformDisplacementFieldGenerator_h
-
-#include "otbPointSetWithTransformToDisplacementFieldGenerator.h"
-#include "itkUnaryFunctorImageFilter.h"
-#include "itkBSplineScatteredDataPointSetToImageFilter.h"
-#include "itkBSplineControlPointImageFunction.h"
-#include "otbImage.h"
-#include "otbMath.h"
-#include <complex>
-
-namespace otb
-{
-/** \class BSplinesInterpolateTransformDisplacementFieldGenerator
- *  \brief This class generate the displacement field by using spline interpolation on the parameters of the transform.
- *
- *  Spline interpolation of non regularly scattered data is provided
- *  by the itk::BSplineScatteredDataPointSetToImageFilter. It allows interpolation using any spline order and implements a multi-level approach.
- *
- *  This filter is used for each parameter. One can also specify the indices of the angular parameters. Angular parameters are first
- *  converted to complex exponential, the interpolated and converted back to the angular space. This is done to avoid interpolating angular discontinuities,
- *  which is a non-sense.
- *
- *  \sa itk::BSplineScatteredDataPointSetToImageFilter
- *
- * \ingroup OTBDisplacementField
- */
-template <class TPointSet, class TDisplacementField>
-class ITK_EXPORT BSplinesInterpolateTransformDisplacementFieldGenerator
-  : public PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-{
-public:
-  /** Standard typedefs */
-  typedef BSplinesInterpolateTransformDisplacementFieldGenerator                          Self;
-  typedef PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass;
-  typedef itk::SmartPointer<Self>                                                        Pointer;
-  typedef itk::SmartPointer<const Self>                                                  ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(BSplinesInterpolateTransformDisplacementFieldGenerator, PointSetWithTransformsToDisplacementFieldGenerator);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PointSetType                PointSetType;
-  typedef typename Superclass::PointSetPointerType         PointSetPointerType;
-  typedef typename Superclass::DisplacementFieldType        DisplacementFieldType;
-  typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType;
-  typedef typename Superclass::IndexType                   IndexType;
-  typedef typename DisplacementFieldType::PixelType         PixelType;
-  typedef typename Superclass::ValueType                   ValueType;
-  typedef typename Superclass::PointType                   PointType;
-  typedef typename Superclass::IndexVectorType             IndexVectorType;
-  typedef typename Superclass::DistanceVectorType          DistanceVectorType;
-  typedef typename Superclass::ParametersType              ParametersType;
-
-  /** Filters definition */
-  typedef itk::Vector<ValueType, 2>                                          PointSetDataType;
-  typedef otb::Image<PointSetDataType, DisplacementFieldType::ImageDimension> InternalImageType;
-  typedef itk::PointSet<PointSetDataType, PointSetType::PointDimension>      InternalPointSetType;
-  typedef itk::BSplineScatteredDataPointSetToImageFilter<InternalPointSetType, InternalImageType>
-  SPlineInterpolateFilterType;
-  typedef typename SPlineInterpolateFilterType::Pointer SPlineInterpolateFilterPointerType;
-  typedef itk::BSplineControlPointImageFunction<InternalImageType>            BSplinerType;
-
-  /**
-   * Add an angular parameter. Angular parameters are transformed by complex exponential during interpolation so as to avoid discontinuity.
-   * \param index The index of the angular parameter.
-   */
-  void AddAngularParameter(unsigned int index);
-  /**
-   * Remove an angular parameter.
-   * \param index The index of the angular parameter.
-   */
-  void RemoveAngularParameter(unsigned int index);
-
-  itkSetMacro(SplineOrder, unsigned int);
-  itkGetMacro(SplineOrder, unsigned int);
-  itkSetMacro(NumberOfControlPoints, unsigned int);
-  itkGetMacro(NumberOfControlPoints, unsigned int);
-  itkSetMacro(NumberOfLevels, unsigned int);
-  itkGetMacro(NumberOfLevels, unsigned int);
-
-protected:
-  /** Constructor */
-  BSplinesInterpolateTransformDisplacementFieldGenerator();
-  /** Destructor */
-  ~BSplinesInterpolateTransformDisplacementFieldGenerator() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** Main computation method */
-  void GenerateData() override;
-
-  void GenerateOutputInformation() override;
-
-  /**
-   * Test whether a parameter is angular or not.
-   * \param index The index of the parameter to test.
-   */
-  bool IsAngular(unsigned int index);
-
-private:
-  BSplinesInterpolateTransformDisplacementFieldGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  IndexVectorType m_AngularParameters;
-
-  unsigned int m_SplineOrder;
-  unsigned int m_NumberOfControlPoints;
-  unsigned int m_NumberOfLevels;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbBSplinesInterpolateTransformDisplacementFieldGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.hxx
deleted file mode 100644
index 6d370825ef6140eead474b2ea98f6cd8f1ae2677..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.hxx
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbBSplinesInterpolateTransformDisplacementFieldGenerator_hxx
-#define otbBSplinesInterpolateTransformDisplacementFieldGenerator_hxx
-
-#include "otbBSplinesInterpolateTransformDisplacementFieldGenerator.h"
-#include "itkLandmarkDisplacementFieldSource.h"
-#include "otbObjectList.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-template <class TPointSet, class TDisplacementField>
-BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::BSplinesInterpolateTransformDisplacementFieldGenerator()
-{
-  m_SplineOrder = 3;
-  m_NumberOfControlPoints = 4;
-  m_NumberOfLevels = 6;
-}
-
-template <class TPointSet, class TDisplacementField>
-void
-BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GenerateOutputInformation()
-{
-  Superclass::GenerateOutputInformation();
-  this->GetOutput()->SetNumberOfComponentsPerPixel(2);
-}
-
-/** Main computation method */
-template <class TPointSet, class TDisplacementField>
-void
-BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GenerateData(void)
-{
-  DisplacementFieldPointerType outputPtr = this->GetOutput();
-
-  // Default displacement field
-  PixelType defaultValue(2);
-  defaultValue.Fill(this->GetDefaultValue());
-  outputPtr->Allocate();
-  outputPtr->FillBuffer(defaultValue);
-
-  typedef otb::ObjectList<BSplinerType>                         SPlineInterpolatorListType;
-  typedef typename PointSetType::PointsContainer::ConstIterator PointSetIteratorType;
-
-  // Initialization of the splines interpolator
-  typename SPlineInterpolatorListType::Pointer splineIntList = SPlineInterpolatorListType::New();
-
-  for (unsigned int paramIndex = 0; paramIndex < this->GetTransform()->GetNumberOfParameters(); ++paramIndex)
-    {
-    // Create a new interpolator
-    splineIntList->PushBack(BSplinerType::New());
-    // Create a new point set
-    typename InternalPointSetType::Pointer tmpPointSet = InternalPointSetType::New();
-    tmpPointSet->Initialize();
-    unsigned int pointDataCounter = 0;
-    for (PointSetIteratorType it = this->GetPointSet()->GetPoints()->Begin();
-         it != this->GetPointSet()->GetPoints()->End();
-         ++it)
-      {
-      if (std::abs(this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[0]) >= this->GetMetricThreshold())
-        {
-        typename InternalPointSetType::PixelType V(0.0);
-
-        if (!IsAngular(paramIndex))
-          {
-          V[0] = this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[paramIndex + 3];
-          V[1] = this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[paramIndex + 3];
-          }
-        else
-          {
-          V[0] =
-            static_cast<ValueType>(std::cos(this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[paramIndex
-                                                                                                             + 3]));
-          V[1] =
-            static_cast<ValueType>(std::sin(this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[paramIndex
-                                                                                                             + 3]));
-          }
-        unsigned long nbPoints = tmpPointSet->GetNumberOfPoints();
-        tmpPointSet->SetPoint(nbPoints, it.Value());
-        tmpPointSet->SetPointData(nbPoints, V);
-        }
-      ++pointDataCounter;
-      }
-
-    SPlineInterpolateFilterPointerType splineFilter = SPlineInterpolateFilterType::New();
-
-    // Set the interpolator parameters
-    splineFilter->SetInput(tmpPointSet);
-    splineFilter->SetSplineOrder(m_SplineOrder);
-    typename SPlineInterpolateFilterType::ArrayType ncps;
-    ncps.Fill(m_NumberOfControlPoints);
-    splineFilter->SetNumberOfControlPoints(ncps);
-    splineFilter->SetNumberOfLevels(m_NumberOfLevels);
-    // splineFilter->SetGenerateOutputImage(false);
-
-    // Define the parametric domain.
-    splineFilter->SetOrigin(this->GetOutput()->GetOrigin());
-    splineFilter->SetSpacing(this->GetOutput()->GetSpacing());
-    splineFilter->SetSize(this->GetOutput()->GetLargestPossibleRegion().GetSize());
-    splineFilter->Update();
-
-    // Image function
-    splineIntList->Back()->SetSplineOrder( splineFilter->GetSplineOrder() );
-    splineIntList->Back()->SetSize( splineFilter->GetSize() );
-    splineIntList->Back()->SetSpacing( splineFilter->GetSpacing() );
-    splineIntList->Back()->SetOrigin( splineFilter->GetOrigin() );
-    splineIntList->Back()->SetInputImage( static_cast<const InternalImageType*>(splineFilter->GetPhiLattice().GetPointer()) );
-    }
-
-  // Interpolation
-  typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType;
-  IteratorType outIt(outputPtr, outputPtr->GetRequestedRegion());
-
-  // main loop
-  for (outIt.GoToBegin(); !outIt.IsAtEnd(); ++outIt)
-    {
-    // Index of the pixel
-    IndexType index = outIt.GetIndex();
-    // parameters vector
-    ParametersType params(this->GetTransform()->GetNumberOfParameters());
-    // we iterate over the number of parameters of the transform
-    for (unsigned int paramIndex = 0; paramIndex < this->GetTransform()->GetNumberOfParameters(); ++paramIndex)
-      {
-      typename InternalPointSetType::PointType p;
-      this->GetOutput()->TransformIndexToPhysicalPoint(index, p);
-      typename InternalPointSetType::PixelType V(0.0);
-      // For each parameter we use the associated spline interpolator
-      if (!IsAngular(paramIndex))
-        {
-        V = splineIntList->GetNthElement(paramIndex)->EvaluateAtParametricPoint(p);
-        params[paramIndex] = V[0];
-        }
-      else
-        {
-        V = splineIntList->GetNthElement(paramIndex)->EvaluateAtParametricPoint(p);
-        params[paramIndex] = std::atan2(V[1], V[0]);
-        }
-      // We then compute the target point using the transform
-      this->GetTransform()->SetParameters(params);
-      PointType sourcePoint, targetPoint;
-      outputPtr->TransformIndexToPhysicalPoint(index, sourcePoint);
-      targetPoint = this->GetTransform()->TransformPoint(sourcePoint);
-
-      // And the displacement
-      PixelType pixel;
-      pixel.SetSize(2);
-      pixel[0] = static_cast<ValueType>(targetPoint[0] - sourcePoint[0]);
-      pixel[1] = static_cast<ValueType>(targetPoint[1] - sourcePoint[1]);
-      outIt.Set(pixel);
-      }
-    }
-}
-template <class TPointSet, class TDisplacementField>
-void
-BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::AddAngularParameter(unsigned int index)
-{
-  m_AngularParameters.push_back(index);
-}
-template <class TPointSet, class TDisplacementField>
-void
-BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::RemoveAngularParameter(unsigned int index)
-{
-  m_AngularParameters.erase(index);
-}
-template <class TPointSet, class TDisplacementField>
-bool
-BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::IsAngular(unsigned int index)
-{
-  bool resp = std::binary_search(m_AngularParameters.begin(), m_AngularParameters.end(), index);
-  return resp;
-}
-/**
- * PrintSelf Method
- */
-template <class TPointSet, class TDisplacementField>
-void
-BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h
deleted file mode 100644
index ab4f9d62f4f0a5f0d59b208bf584d7a7050619e9..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNNearestPointsLinearInterpolateDisplacementFieldGenerator_h
-#define otbNNearestPointsLinearInterpolateDisplacementFieldGenerator_h
-
-#include "otbPointSetToDisplacementFieldGenerator.h"
-
-namespace otb
-{
-/** \class NNearestPointsLinearInterpolateDisplacementFieldGenerator
- *  \brief This class generate the displacement field by performing a linear interpolation of the displacement induced by the n nearest point.
- * \ingroup DisparityMap
- *
- * \ingroup OTBDisplacementField
- */
-template <class TPointSet, class TDisplacementField>
-class ITK_EXPORT NNearestPointsLinearInterpolateDisplacementFieldGenerator
-  : public PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-{
-public:
-  /** Standard typedefs */
-  typedef NNearestPointsLinearInterpolateDisplacementFieldGenerator          Self;
-  typedef PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass;
-  typedef itk::SmartPointer<Self>                                           Pointer;
-  typedef itk::SmartPointer<const Self>                                     ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(NNearestPointsLinearInterpolateDisplacementFieldGenerator, PointSetToDisplacementFieldGenerator);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PointSetType                PointSetType;
-  typedef typename Superclass::PointSetPointerType         PointSetPointerType;
-  typedef typename Superclass::DisplacementFieldType        DisplacementFieldType;
-  typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType;
-  typedef typename Superclass::IndexType                   IndexType;
-  typedef typename DisplacementFieldType::PixelType         PixelType;
-  typedef typename Superclass::ValueType                   ValueType;
-  typedef typename Superclass::PointType                   PointType;
-  typedef typename Superclass::IndexVectorType             IndexVectorType;
-  typedef typename Superclass::DistanceVectorType          DistanceVectorType;
-
-  itkSetMacro(NumberOfPoints, unsigned int);
-  itkGetMacro(NumberOfPoints, unsigned int);
-
-protected:
-  /** Constructor */
-  NNearestPointsLinearInterpolateDisplacementFieldGenerator() {};
-  /** Destructor */
-  ~NNearestPointsLinearInterpolateDisplacementFieldGenerator() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** Main computation method */
-  void GenerateData() override;
-
-private:
-  NNearestPointsLinearInterpolateDisplacementFieldGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  unsigned int m_NumberOfPoints;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.hxx
deleted file mode 100644
index 873bca0b2efbf8f4588c634043bba2b004c5b534..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.hxx
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNNearestPointsLinearInterpolateDisplacementFieldGenerator_hxx
-#define otbNNearestPointsLinearInterpolateDisplacementFieldGenerator_hxx
-
-#define EPSILON 1e-15
-
-#include "otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h"
-#include "itkImageRegionIteratorWithIndex.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/** Main computation method */
-template <class TPointSet, class TDisplacementField>
-void
-NNearestPointsLinearInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GenerateData(void)
-{
-  DisplacementFieldPointerType outputPtr = this->GetOutput();
-  PixelType defaultValue(2);
-  defaultValue.Fill(this->GetDefaultValue());
-  outputPtr->Allocate();
-  outputPtr->FillBuffer(defaultValue);
-
-  typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType;
-  IteratorType it(outputPtr, outputPtr->GetRequestedRegion());
-
-  for (it.GoToBegin(); !it.IsAtEnd(); ++it)
-    {
-    IndexType       index = it.GetIndex();
-    IndexVectorType indexVector = this->GenerateNearestValidPointsPointSet(it.GetIndex(), m_NumberOfPoints);
-    PixelType pixel(2);
-    double xdisplacement, ydisplacement, normalization;
-    xdisplacement = 0;
-    ydisplacement = 0;
-    normalization = 0;
-
-    for (typename IndexVectorType::iterator indexIt = indexVector.begin(); indexIt != indexVector.end(); ++indexIt)
-      {
-      PointType point;
-      point[0] = static_cast<double>(this->GetPointSet()->GetPoints()->GetElement(*indexIt)[0]);
-      point[1] = static_cast<double>(this->GetPointSet()->GetPoints()->GetElement(*indexIt)[1]);
-      double distance = this->EuclideanDistanceMetric(index, point);
-      if (distance < EPSILON)
-        {
-        distance = EPSILON;
-        }
-      xdisplacement +=  this->GetPointSet()->GetPointData()->GetElement((*indexIt))[1] / distance;
-      ydisplacement +=  this->GetPointSet()->GetPointData()->GetElement((*indexIt))[2] / distance;
-      normalization += 1 / distance;
-      }
-
-    if (normalization > 0)
-      {
-      pixel[0] = static_cast<ValueType>(xdisplacement / normalization);
-      pixel[1] = static_cast<ValueType>(ydisplacement / normalization);
-      }
-    else
-      {
-      pixel = defaultValue;
-      }
-    it.Set(pixel);
-    }
-}
-/**
- * PrintSelf Method
- */
-template <class TPointSet, class TDisplacementField>
-void
-NNearestPointsLinearInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h
deleted file mode 100644
index 7ab027e0135ab84a80c67be3c8c76117d9283aa4..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator_h
-#define otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator_h
-
-#include "otbPointSetWithTransformToDisplacementFieldGenerator.h"
-
-namespace otb
-{
-/** \class NNearestTransformsLinearInterpolateDisplacementFieldGenerator
- *  \brief generate the displacement field by performing a linear interpolation
- *
- * This class generate the displacement field by performing a linear interpolation of
- * the displacements from the transforms induced by the n nearest points.
- *
- * \ingroup DisparityMap
- *
- * \ingroup OTBDisplacementField
- */
-template <class TPointSet, class TDisplacementField>
-class ITK_EXPORT NNearestTransformsLinearInterpolateDisplacementFieldGenerator
-  : public PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-{
-public:
-  /** Standard typedefs */
-  typedef NNearestTransformsLinearInterpolateDisplacementFieldGenerator                   Self;
-  typedef PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass;
-  typedef itk::SmartPointer<Self>                                                        Pointer;
-  typedef itk::SmartPointer<const Self>                                                  ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(NNearestTransformsLinearInterpolateDisplacementFieldGenerator,
-               PointSetWithTransformsToDisplacementFieldGenerator);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PointSetType                PointSetType;
-  typedef typename Superclass::PointSetPointerType         PointSetPointerType;
-  typedef typename Superclass::DisplacementFieldType        DisplacementFieldType;
-  typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType;
-  typedef typename Superclass::IndexType                   IndexType;
-  typedef typename DisplacementFieldType::PixelType         PixelType;
-  typedef typename Superclass::ValueType                   ValueType;
-  typedef typename Superclass::PointType                   PointType;
-  typedef typename Superclass::IndexVectorType             IndexVectorType;
-  typedef typename Superclass::DistanceVectorType          DistanceVectorType;
-  typedef typename Superclass::TransformType               TransformType;
-  typedef typename TransformType::ParametersType           ParametersType;
-
-  itkSetMacro(NumberOfPoints, unsigned int);
-  itkGetMacro(NumberOfPoints, unsigned int);
-
-protected:
-  /** Constructor */
-  NNearestTransformsLinearInterpolateDisplacementFieldGenerator() {};
-  /** Destructor */
-  ~NNearestTransformsLinearInterpolateDisplacementFieldGenerator() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** Main computation method */
-  void GenerateData() override;
-
-private:
-  NNearestTransformsLinearInterpolateDisplacementFieldGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  unsigned int m_NumberOfPoints;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.hxx
deleted file mode 100644
index dabb7ab6ded475512374a0794b65724fffb3b42b..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.hxx
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator_hxx
-#define otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator_hxx
-
-#define EPSILON 1e-15
-
-#include "otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h"
-#include "itkImageRegionIteratorWithIndex.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/** Main computation method */
-template <class TPointSet, class TDisplacementField>
-void
-NNearestTransformsLinearInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GenerateData(void)
-{
-  DisplacementFieldPointerType outputPtr = this->GetOutput();
-  PixelType defaultValue(2);
-  defaultValue.Fill(this->GetDefaultValue());
-  outputPtr->Allocate();
-  outputPtr->FillBuffer(defaultValue);
-
-  typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType;
-  IteratorType it(outputPtr, outputPtr->GetRequestedRegion());
-
-  for (it.GoToBegin(); !it.IsAtEnd(); ++it)
-    {
-    IndexType       index = it.GetIndex();
-    IndexVectorType indexVector = this->GenerateNearestValidPointsPointSet(it.GetIndex(), m_NumberOfPoints);
-    PixelType pixel(2);
-    double xdisplacement, ydisplacement, normalization;
-    xdisplacement = 0;
-    ydisplacement = 0;
-    normalization = 0;
-
-    for (typename IndexVectorType::iterator indexIt = indexVector.begin(); indexIt != indexVector.end(); ++indexIt)
-      {
-      PointType point;
-      point[0] = static_cast<double>(this->GetPointSet()->GetPoints()->GetElement(*indexIt)[0]);
-      point[1] = static_cast<double>(this->GetPointSet()->GetPoints()->GetElement(*indexIt)[1]);
-      double distance = this->EuclideanDistanceMetric(index, point);
-      if (distance < EPSILON)
-        {
-        distance = EPSILON;
-        }
-
-      ParametersType params(this->GetTransform()->GetNumberOfParameters());
-      for (unsigned int i = 0; i < this->GetTransform()->GetNumberOfParameters(); ++i)
-        {
-        params[i] = this->GetPointSet()->GetPointData()->GetElement((*indexIt))[i + 3];
-        }
-      this->GetTransform()->SetParameters(params);
-      PointType sourcePoint, targetPoint;
-
-      outputPtr->TransformIndexToPhysicalPoint(it.GetIndex(), sourcePoint);
-      targetPoint = this->GetTransform()->TransformPoint(sourcePoint);
-      xdisplacement += (targetPoint[0] - sourcePoint[0]) / distance;
-      ydisplacement += (targetPoint[1] - sourcePoint[1]) / distance;
-      normalization += 1 / distance;
-      }
-
-    if (normalization > 0)
-      {
-      pixel[0] = static_cast<ValueType>(xdisplacement / normalization);
-      pixel[1] = static_cast<ValueType>(ydisplacement / normalization);
-      }
-    else
-      {
-      pixel = defaultValue;
-      }
-    it.Set(pixel);
-    }
-}
-/**
- * PrintSelf Method
- */
-template <class TPointSet, class TDisplacementField>
-void
-NNearestTransformsLinearInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.h
deleted file mode 100644
index 158e21b2c13b79a65d8a1217ae3f75134c8da972..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNearestPointDisplacementFieldGenerator_h
-#define otbNearestPointDisplacementFieldGenerator_h
-
-#include "otbPointSetToDisplacementFieldGenerator.h"
-
-namespace otb
-{
-/** \class NearestPointDisplacementFieldGenerator
- *  \brief This class implements the simplest way to displacement field generation using a point set.
- *  In each pixel location, the displacement is considered to be the displacement of the nearest seed point in the point set.
- *
- * \ingroup DisparityMap
- *
- * \ingroup OTBDisplacementField
- */
-template <class TPointSet, class TDisplacementField>
-class ITK_EXPORT NearestPointDisplacementFieldGenerator
-  : public PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-{
-public:
-  /** Standard typedefs */
-  typedef NearestPointDisplacementFieldGenerator                             Self;
-  typedef PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass;
-  typedef itk::SmartPointer<Self>                                           Pointer;
-  typedef itk::SmartPointer<const Self>                                     ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(NearestPointDisplacementFieldGenerator, PointSetToDisplacementFieldGenerator);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PointSetType                PointSetType;
-  typedef typename Superclass::PointSetPointerType         PointSetPointerType;
-  typedef typename Superclass::DisplacementFieldType        DisplacementFieldType;
-  typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType;
-  typedef typename Superclass::IndexType                   IndexType;
-  typedef typename DisplacementFieldType::PixelType         PixelType;
-  typedef typename Superclass::ValueType                   ValueType;
-  typedef typename Superclass::IndexVectorType             IndexVectorType;
-
-protected:
-  /** Constructor */
-  NearestPointDisplacementFieldGenerator() {};
-  /** Destructor */
-  ~NearestPointDisplacementFieldGenerator() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** Main computation method */
-  void GenerateData() override;
-
-private:
-  NearestPointDisplacementFieldGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbNearestPointDisplacementFieldGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.hxx
deleted file mode 100644
index f7194ec39aa8364311fcd003859497361bece1f7..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.hxx
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNearestPointDisplacementFieldGenerator_hxx
-#define otbNearestPointDisplacementFieldGenerator_hxx
-
-#include "otbNearestPointDisplacementFieldGenerator.h"
-#include "itkImageRegionIteratorWithIndex.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/** Main computation method */
-template <class TPointSet, class TDisplacementField>
-void
-NearestPointDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GenerateData(void)
-{
-  DisplacementFieldPointerType outputPtr = this->GetOutput();
-  PixelType defaultValue(2);
-  defaultValue.Fill(this->GetDefaultValue());
-  outputPtr->Allocate();
-  outputPtr->FillBuffer(defaultValue);
-
-  typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType;
-  IteratorType it(outputPtr, outputPtr->GetRequestedRegion());
-
-  for (it.GoToBegin(); !it.IsAtEnd(); ++it)
-    {
-    IndexVectorType indexVector = this->GenerateNearestValidPointsPointSet(it.GetIndex(), 1);
-    PixelType p(2);
-    if (indexVector.size() >= 1)
-      {
-      p[0] = static_cast<ValueType>(this->GetPointSet()->GetPointData()->GetElement(indexVector[0])[1]);
-      p[1] = static_cast<ValueType>(this->GetPointSet()->GetPointData()->GetElement(indexVector[0])[2]);
-      }
-    else
-      {
-      p = defaultValue;
-      }
-    it.Set(p);
-    }
-}
-/**
- * PrintSelf Method
- */
-template <class TPointSet, class TDisplacementField>
-void
-NearestPointDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.h
deleted file mode 100644
index 6f4f907802a1b67017396b41c3674e74b95043a0..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNearestTransformDisplacementFieldGenerator_h
-#define otbNearestTransformDisplacementFieldGenerator_h
-
-#include "otbPointSetWithTransformToDisplacementFieldGenerator.h"
-
-namespace otb
-{
-/** \class NearestTransformDisplacementFieldGenerator
- *  \brief This class implements displacement field generation by taking into account the local transform of the
- *  nearest point in pointset.
- *
- * \ingroup DisparityMap
- *
- * \ingroup OTBDisplacementField
- */
-template <class TPointSet, class TDisplacementField>
-class ITK_EXPORT NearestTransformDisplacementFieldGenerator
-  : public PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-{
-public:
-  /** Standard typedefs */
-  typedef NearestTransformDisplacementFieldGenerator                                      Self;
-  typedef PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass;
-  typedef itk::SmartPointer<Self>                                                        Pointer;
-  typedef itk::SmartPointer<const Self>                                                  ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(NearestTransformDisplacementFieldGenerator, PointSetWithTransformToDisplacementFieldGenerator);
-
-  /** Template parameters typedefs */
-  typedef typename Superclass::PointSetType                PointSetType;
-  typedef typename Superclass::PointSetPointerType         PointSetPointerType;
-  typedef typename Superclass::DisplacementFieldType        DisplacementFieldType;
-  typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType;
-  typedef typename Superclass::IndexType                   IndexType;
-  typedef typename Superclass::PointType                   PointType;
-  typedef typename DisplacementFieldType::PixelType         PixelType;
-  typedef typename Superclass::ValueType                   ValueType;
-  typedef typename Superclass::IndexVectorType             IndexVectorType;
-  typedef typename Superclass::TransformType               TransformType;
-  typedef typename TransformType::ParametersType           ParametersType;
-
-protected:
-  /** Constructor */
-  NearestTransformDisplacementFieldGenerator() {};
-  /** Destructor */
-  ~NearestTransformDisplacementFieldGenerator() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** Main computation method */
-  void GenerateData() override;
-
-private:
-  NearestTransformDisplacementFieldGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbNearestTransformDisplacementFieldGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.hxx
deleted file mode 100644
index e43b4fe7da8daf535e3650bb663fa69b4893f56b..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.hxx
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbNearestTransformDisplacementFieldGenerator_hxx
-#define otbNearestTransformDisplacementFieldGenerator_hxx
-
-#include "otbNearestTransformDisplacementFieldGenerator.h"
-#include "itkImageRegionIteratorWithIndex.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/** Main computation method */
-template <class TPointSet, class TDisplacementField>
-void
-NearestTransformDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GenerateData(void)
-{
-  DisplacementFieldPointerType outputPtr = this->GetOutput();
-  PixelType defaultValue(2);
-  defaultValue.Fill(this->GetDefaultValue());
-  outputPtr->Allocate();
-  outputPtr->FillBuffer(defaultValue);
-
-  typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType;
-  IteratorType it(outputPtr, outputPtr->GetRequestedRegion());
-
-  for (it.GoToBegin(); !it.IsAtEnd(); ++it)
-    {
-    IndexVectorType indexVector = this->GenerateNearestValidPointsPointSet(it.GetIndex(), 1);
-    PixelType pixel(2);
-    if (indexVector.size() >= 1)
-      {
-      ParametersType params(this->GetTransform()->GetNumberOfParameters());
-      for (unsigned int i = 0; i < this->GetTransform()->GetNumberOfParameters(); ++i)
-        {
-        params[i] = this->GetPointSet()->GetPointData()->GetElement(indexVector[0])[i + 3];
-        }
-      this->GetTransform()->SetParameters(params);
-      PointType sourcePoint, targetPoint;
-
-      outputPtr->TransformIndexToPhysicalPoint(it.GetIndex(), sourcePoint);
-      targetPoint = this->GetTransform()->TransformPoint(sourcePoint);
-      pixel[0] = static_cast<ValueType>(targetPoint[0] - sourcePoint[0]);
-      pixel[1] = static_cast<ValueType>(targetPoint[1] - sourcePoint[1]);
-      }
-    else
-      {
-      pixel = defaultValue;
-      }
-    it.Set(pixel);
-    }
-}
-/**
- * PrintSelf Method
- */
-template <class TPointSet, class TDisplacementField>
-void
-NearestTransformDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.h
deleted file mode 100644
index 9624d8ebe16f1af7108870cfe13f54f3da8c2cd3..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbPointSetToDisplacementFieldGenerator_h
-#define otbPointSetToDisplacementFieldGenerator_h
-
-#include "itkImageSource.h"
-
-namespace otb
-{
-namespace Functor
-{
-/** \class DistanceComparisonFunctor
- *  \brief This functor is used in nearest neighborhood sorting.
- *  \ingroup DisparityMap
- *
- * \ingroup OTBDisplacementField
- */
-class DistanceComparisonFunctor
-{
-public:
-  DistanceComparisonFunctor() {}
-  virtual ~DistanceComparisonFunctor() {}
-  typedef std::vector<double> DistanceVectorType;
-
-  void SetDistanceVector(DistanceVectorType& vec)
-  {
-    m_DistanceVector = vec;
-  }
-  DistanceVectorType GetDistanceVector(void)
-  {
-    return m_DistanceVector;
-  }
-  inline bool operator ()(const unsigned int a1, const unsigned int a2)
-  {
-    return m_DistanceVector[a1] < m_DistanceVector[a2];
-  }
-
-private:
-  DistanceVectorType m_DistanceVector;
-};
-}
-/** \class PointSetToDisplacementFieldGenerator
- *  \brief Base class for filters generating a displacement field from a point set enriched with displacement and local transform information.
- *  The output of the filters deriving from this base class can be passed to the itk::WarpImageFilter for image resampling.
- *  \sa DisparityMapEstimationMethod
- *   \sa itk::WarpImageFilter
-   *  \ingroup DisparityMap
- *
- * \ingroup OTBDisplacementField
- */
-template <class TPointSet, class TDisplacementField>
-class ITK_EXPORT PointSetToDisplacementFieldGenerator
-  : public itk::ImageSource<TDisplacementField>
-{
-public:
-  /** Standard typedefs */
-  typedef PointSetToDisplacementFieldGenerator Self;
-  typedef itk::ImageSource<TDisplacementField> Superclass;
-  typedef itk::SmartPointer<Self>             Pointer;
-  typedef itk::SmartPointer<const Self>       ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(PointSetToDisplacementFieldGenerator, ImageSource);
-
-  /** Template parameters typedefs */
-  typedef TPointSet                      PointSetType;
-  typedef typename PointSetType::Pointer PointSetPointerType;
-
-  typedef TDisplacementField                                DisplacementFieldType;
-  typedef typename DisplacementFieldType::Pointer           DisplacementFieldPointerType;
-  typedef typename DisplacementFieldType::IndexType         IndexType;
-  typedef typename DisplacementFieldType::SizeType          SizeType;
-  typedef typename DisplacementFieldType::SpacingType       SpacingType;
-  typedef typename DisplacementFieldType::PointType         PointType;
-  typedef typename DisplacementFieldType::InternalPixelType ValueType;
-
-  /** More typedefs */
-  typedef std::vector<double>       DistanceVectorType;
-  typedef std::vector<unsigned int> IndexVectorType;
-
-  /**
-   * Set the pointset containing the disparity.
-   * \param pointset The pointset containing the disparity.
-   */
-  void SetPointSet(const TPointSet * pointset);
-  /**
-   * Get the pointset containing the disparity.
-   * \return The pointset containing the disparity.
-   */
-  const TPointSet * GetPointSet(void);
-
-  itkSetMacro(MetricThreshold, double);
-  itkGetMacro(MetricThreshold, double);
-  itkSetMacro(DefaultValue, ValueType);
-  itkGetMacro(DefaultValue, ValueType);
-  itkSetMacro(OutputSize, SizeType);
-  itkGetConstReferenceMacro(OutputSize, SizeType);
-  itkSetMacro(OutputSpacing, SpacingType);
-  itkGetConstReferenceMacro(OutputSpacing, SpacingType);
-  itkSetMacro(OutputOrigin, PointType);
-  itkGetConstReferenceMacro(OutputOrigin, PointType);
-
-protected:
-  /** Constructor */
-  PointSetToDisplacementFieldGenerator();
-  /** Destructor */
-  ~PointSetToDisplacementFieldGenerator() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-  /** Generate output information */
-  void GenerateOutputInformation(void) override;
-  /**
-   * Generate the n nearest valid point in point set, where a valid point has a sufficient metric value.
-   *  \param index The index of the pixel to compute.
-   *  \param n The number of nearest point to seek.
-   *  \return A vector containing the index of the nearest point from nearest to most far.
-   */
-  IndexVectorType GenerateNearestValidPointsPointSet(IndexType index, unsigned int n = 1);
-
-  /** Euclidean distance of point to index */
-  double EuclideanDistanceMetric(IndexType index, PointType p);
-
-private:
-  PointSetToDisplacementFieldGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  /**
-   * The threshold of metric value.
-   */
-  double m_MetricThreshold;
-  /** The output size */
-  SizeType m_OutputSize;
-  /** The output spacing. */
-  SpacingType m_OutputSpacing;
-  /** The output origin */
-  PointType m_OutputOrigin;
-  /** Default value */
-  ValueType m_DefaultValue;
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbPointSetToDisplacementFieldGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.hxx
deleted file mode 100644
index f0b69603156bf68220c8bb698ea2bcfabcd894c3..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.hxx
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbPointSetToDisplacementFieldGenerator_hxx
-#define otbPointSetToDisplacementFieldGenerator_hxx
-
-#include "otbPointSetToDisplacementFieldGenerator.h"
-#include "otbMacro.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TPointSet, class TDisplacementField>
-PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PointSetToDisplacementFieldGenerator()
-{
-  this->SetNumberOfRequiredInputs(1);
-  m_MetricThreshold = 0.;
-  m_OutputSize.Fill(100);
-  m_OutputSpacing.Fill(1.);
-  m_OutputOrigin.Fill(0.);
-  m_DefaultValue = 0;
-//  m_NearestPoints = PointSetType::New();
-}
-/**
- * Set the pointset containing the disparity.
- * \param pointset The pointset containing the disparity.
- */
-template <class TPointSet, class TDisplacementField>
-void
-PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::SetPointSet(const TPointSet * pointset)
-{
-  this->itk::ProcessObject::SetNthInput(0, const_cast<PointSetType *>(pointset));
-}
-/**
- * Get the pointset containing the disparity.
- * \return The pointset containing the disparity.
- */
-template <class TPointSet, class TDisplacementField>
-const TPointSet *
-PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GetPointSet(void)
-{
-  return static_cast<const PointSetType *>(this->itk::ProcessObject::GetInput(0));
-}
-/** Generate output information */
-template <class TPointSet, class TDisplacementField>
-void
-PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GenerateOutputInformation(void)
-{
-  DisplacementFieldPointerType               outputPtr = this->GetOutput();
-  typename DisplacementFieldType::RegionType largest;
-  largest.SetSize(m_OutputSize);
-  IndexType index;
-  index.Fill(0);
-  largest.SetIndex(index);
-  outputPtr->SetRegions(largest);
-  outputPtr->SetSignedSpacing(m_OutputSpacing);
-  outputPtr->SetOrigin(m_OutputOrigin);
-  // Force the displacement field to have vector pixel of size 2.
-  outputPtr->SetNumberOfComponentsPerPixel(2);
-}
-/**
- * Generate the n nearest point in point set
- *  \param index The index of the pixel to compute.
- *  \param n The number of nearest point to seek.
- *  \return A vector containing the index of the nearest point from nearest to most far.
- */
-template <class TPointSet, class TDisplacementField>
-typename PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::IndexVectorType
-PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::GenerateNearestValidPointsPointSet(IndexType index, unsigned int n)
-{
-  typedef Functor::DistanceComparisonFunctor ComparisonFunctorType;
-  DistanceVectorType distanceVector;
-  IndexVectorType    indexVector;
-  IndexVectorType    sortVector;
-  unsigned int       i =  0;
-  unsigned int       j = 0;
-
-  typedef typename PointSetType::PointsContainer::ConstIterator PointSetIteratorType;
-
-  PointSetIteratorType it = this->GetPointSet()->GetPoints()->Begin();
-  for (; it != this->GetPointSet()->GetPoints()->End(); ++it)
-    {
-    PointType p;
-    p[0] = it.Value()[0];
-    p[1] = it.Value()[1];
-    if (std::abs(this->GetPointSet()->GetPointData()->GetElement(j)[0]) >= m_MetricThreshold)
-      {
-
-      distanceVector.push_back(EuclideanDistanceMetric(index, p));
-      sortVector.push_back(i);
-      indexVector.push_back(j);
-      ++i;
-      }
-    ++j;
-    }
-
-  ComparisonFunctorType comp;
-  comp.SetDistanceVector(distanceVector);
-  sort(sortVector.begin(), sortVector.end(), comp);
-
-  // building output vector
-  unsigned int    nbElements = (n < indexVector.size() ? n : indexVector.size());
-  IndexVectorType output;
-  for (i = 0; i < nbElements; ++i)
-    {
-    output.push_back(indexVector[sortVector[i]]);
-    }
-  return output;
-}
-
-template <class TPointSet, class TDisplacementField>
-double
-PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::EuclideanDistanceMetric(IndexType index, PointType p)
-{
-  PointType pprime;
-  // our point are expressed in index and not in physical coordinates
-  //this->GetOutput()->TransformIndexToPhysicalPoint(index, pprime);
-  return std::sqrt(std::pow(index[0] - p[0], 2) + std::pow(index[1] - p[1], 2));
-}
-/**
- * PrintSelf Method
- */
-template <class TPointSet, class TDisplacementField>
-void
-PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h
deleted file mode 100644
index a947bb82cd939c29420ed9d917118a23558af2e6..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbPointSetWithTransformToDisplacementFieldGenerator_h
-#define otbPointSetWithTransformToDisplacementFieldGenerator_h
-
-#include "otbPointSetToDisplacementFieldGenerator.h"
-#include "itkTransform.h"
-
-namespace otb
-{
-/** \class PointSetWithTransformToDisplacementFieldGenerator
- *  \brief Base class for filters generating a displacement field from a point set enriched with local transform information.
- *
- *  The output of the filters deriving from this base class can be passed to the itk::WarpImageFilter for image resampling.
- *
- *  \sa DisparityMapEstimationMethod
- *  \sa itk::WarpImageFilter
- *
- *  \ingroup DisparityMap
- *
- * \ingroup OTBDisplacementField
- */
-template <class TPointSet, class TDisplacementField>
-class ITK_EXPORT PointSetWithTransformToDisplacementFieldGenerator
-  : public PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-{
-public:
-  /** Standard typedefs */
-  typedef PointSetWithTransformToDisplacementFieldGenerator                  Self;
-  typedef PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass;
-  typedef itk::SmartPointer<Self>                                           Pointer;
-  typedef itk::SmartPointer<const Self>                                     ConstPointer;
-
-  /** Type macro */
-  itkNewMacro(Self);
-
-  /** Creation through object factory macro */
-  itkTypeMacro(PointSetWithTransformToDisplacementFieldGenerator, PointSetToDisplacementFieldGenerator);
-
-  /** Template parameters typedefs */
-  typedef TPointSet                      PointSetType;
-  typedef typename PointSetType::Pointer PointSetPointerType;
-
-  typedef TDisplacementField                                DisplacementFieldType;
-  typedef typename DisplacementFieldType::Pointer           DisplacementFieldPointerType;
-  typedef typename DisplacementFieldType::IndexType         IndexType;
-  typedef typename DisplacementFieldType::SizeType          SizeType;
-  typedef typename DisplacementFieldType::SpacingType       SpacingType;
-  typedef typename DisplacementFieldType::PointType         PointType;
-  typedef typename DisplacementFieldType::InternalPixelType ValueType;
-
-  /** More typedefs */
-  typedef typename Superclass::DistanceVectorType DistanceVectorType;
-  typedef typename Superclass::IndexVectorType    IndexVectorType;
-
-  /** Transform typedefs */
-  typedef itk::Transform<double, 2, 2>           TransformType;
-  typedef typename TransformType::Pointer        TransformPointerType;
-  typedef typename TransformType::ParametersType ParametersType;
-
-  /** Set/Get the Transform. */
-  itkSetObjectMacro(Transform, TransformType);
-  itkGetObjectMacro(Transform, TransformType);
-
-protected:
-  /** Constructor */
-  PointSetWithTransformToDisplacementFieldGenerator();
-  /** Destructor */
-  ~PointSetWithTransformToDisplacementFieldGenerator() override {}
-  /**PrintSelf method */
-  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
-
-private:
-  PointSetWithTransformToDisplacementFieldGenerator(const Self &) = delete;
-  void operator =(const Self&) = delete;
-
-  /**
-   * The transform used for local registration.
-   */
-  TransformPointerType m_Transform;
-
-};
-} // End namespace otb
-#ifndef OTB_MANUAL_INSTANTIATION
-#include "otbPointSetWithTransformToDisplacementFieldGenerator.hxx"
-#endif
-
-#endif
diff --git a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.hxx
deleted file mode 100644
index 8cd221644a2d657e8127facbe434b852e4df869a..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.hxx
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbPointSetWithTransformToDisplacementFieldGenerator_hxx
-#define otbPointSetWithTransformToDisplacementFieldGenerator_hxx
-
-#include "otbPointSetWithTransformToDisplacementFieldGenerator.h"
-
-#include "otbMacro.h"
-
-namespace otb
-{
-/**
- * Constructor
- */
-template <class TPointSet, class TDisplacementField>
-PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PointSetWithTransformToDisplacementFieldGenerator()
-{
-  m_Transform = nullptr;    // has to be provided by the user
-}
-/**
- * PrintSelf Method
- */
-template <class TPointSet, class TDisplacementField>
-void
-PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField>
-::PrintSelf(std::ostream& os, itk::Indent indent) const
-{
-  Superclass::PrintSelf(os, indent);
-}
-} // End namespace otb
-#endif
diff --git a/Modules/Registration/DisplacementField/otb-module.cmake b/Modules/Registration/DisplacementField/otb-module.cmake
deleted file mode 100644
index b8efc64ea38e78fa5dbe0f82615e2abb88f26e59..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/otb-module.cmake
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-set(DOCUMENTATION "This module contains filters that generate a deformation
-field by using some interpolation criterion on the deformation values from the point
-set. Several interpolation methods are available (Nearest neighbours, linear,
-BSpline). The class otb::StereorectificationDisplacementFieldSource is specialized
-in generating a deformation field between two images in epipolar geometry
-(horizontal shifts).")
-
-otb_module(OTBDisplacementField
-  DEPENDS
-    OTBCommon
-    OTBITK
-    OTBImageBase
-    OTBObjectList
-
-  TEST_DEPENDS
-    OTBImageIO
-    OTBTestKernel
-
-  DESCRIPTION
-    "${DOCUMENTATION}"
-)
diff --git a/Modules/Registration/DisplacementField/test/CMakeLists.txt b/Modules/Registration/DisplacementField/test/CMakeLists.txt
deleted file mode 100644
index 440c6b130cf207b956ef74153868428e58bf8bbe..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/test/CMakeLists.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-#
-# Copyright (C) 2005-2019 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.
-#
-
-otb_module_test()
-
-set(OTBDisplacementFieldTests
-otbDisplacementFieldTestDriver.cxx
-otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.cxx
-otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.cxx
-otbNearestTransformDisplacementFieldGenerator.cxx
-otbNearestPointDisplacementFieldGenerator.cxx
-otbBSplinesInterpolateTransformDisplacementFieldGenerator.cxx
-otbBSplinesInterpolateDisplacementFieldGenerator.cxx
-)
-
-add_executable(otbDisplacementFieldTestDriver ${OTBDisplacementFieldTests})
-target_link_libraries(otbDisplacementFieldTestDriver ${OTBDisplacementField-Test_LIBRARIES})
-otb_module_target_label(otbDisplacementFieldTestDriver)
-
-# Tests Declaration
-
-otb_add_test(NAME dmTvNNearestTransformsLinearInterpolateDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver
-  --compare-image ${EPSILON_10}
-  ${BASELINE}/dmTvNNearestTransformsLinearInterpolateDeformationField.tif
-  ${TEMP}/dmTvNNearestTransformsLinearInterpolateDisplacementField.tif
-  otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator
-  ${TEMP}/dmTvNNearestTransformsLinearInterpolateDisplacementField.tif
-  )
-
-otb_add_test(NAME dmTvNNearestPointsLinearInterpolateDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver
-  --compare-image ${EPSILON_10}
-  ${BASELINE}/dmTvNNearestPointsLinearInterpolateDeformationField.tif
-  ${TEMP}/dmTvNNearestPointsLinearInterpolateDisplacementField.tif
-  otbNNearestPointsLinearInterpolateDisplacementFieldGenerator
-  ${TEMP}/dmTvNNearestPointsLinearInterpolateDisplacementField.tif
-  )
-
-
-
-otb_add_test(NAME dmTvNearestTransformDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver
-  --compare-image ${EPSILON_10}
-  ${BASELINE}/dmTvNearestTransformDeformationField.tif
-  ${TEMP}/dmTvNearestTransformDisplacementField.tif
-  otbNearestTransformDisplacementFieldGenerator
-  ${TEMP}/dmTvNearestTransformDisplacementField.tif
-  )
-
-otb_add_test(NAME dmTvNearestPointDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver
-  --compare-image ${EPSILON_10}
-  ${BASELINE}/dmTvNearestPointDeformationField.tif
-  ${TEMP}/dmTvNearestPointDisplacementField.tif
-  otbNearestPointDisplacementFieldGenerator
-  ${TEMP}/dmTvNearestPointDisplacementField.tif
-  )
-
-#otb_add_test(NAME dmTvBSplinesInterpolateTransformDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver
-  #--compare-image ${EPSILON_4}
-  #${BASELINE}/dmTvBSplinesInterpolateTransformDeformationFieldGenerator.tif
-  #${TEMP}/dmTvBSplinesInterpolateTransformDisplacementFieldGenerator.tif
-  #otbBSplinesInterpolateTransformDisplacementFieldGenerator
-  #${TEMP}/dmTvBSplinesInterpolateTransformDisplacementFieldGenerator.tif
-  #)
-
-otb_add_test(NAME dmTvBSplinesInterpolateDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver
-  --compare-image ${EPSILON_10}
-  ${BASELINE}/dmTvBSplinesInterpolateDeformationField.tif
-  ${TEMP}/dmTvBSplinesInterpolateDisplacementField.tif
-  otbBSplinesInterpolateDisplacementFieldGenerator
-  ${TEMP}/dmTvBSplinesInterpolateDisplacementField.tif
-  )
-
diff --git a/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateDisplacementFieldGenerator.cxx
deleted file mode 100644
index 9135073f0ccdadbf018d1f7b2761f1fd91b5d66b..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateDisplacementFieldGenerator.cxx
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "itkPointSet.h"
-#include "otbVectorImage.h"
-#include "otbBSplinesInterpolateDisplacementFieldGenerator.h"
-#include "otbImageFileWriter.h"
-
-int otbBSplinesInterpolateDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  const char *       outfname = argv[1];
-  typedef double                                                                     PixelType;
-  typedef otb::VectorImage<PixelType, Dimension>                                     ImageType;
-  typedef itk::Array<double>                                                         ParamType;
-  typedef itk::PointSet<ParamType, Dimension>                                        PointSetType;
-  typedef PointSetType::PointType                                                    PointType;
-  typedef otb::BSplinesInterpolateDisplacementFieldGenerator<PointSetType, ImageType> FilterType;
-  typedef otb::ImageFileWriter<ImageType>                                            WriterType;
-
-  ImageType::SizeType size;
-  size.Fill(100);
-  double thresh = 0.9;
-
-  // Preparing point set
-  PointSetType::Pointer ps = PointSetType::New();
-  PointType             p1, p2, p3, p4, p5;
-  ParamType             pd1(3), pd2(3), pd3(3), pd4(3), pd5(3);
-
-  p1[0] = 10;
-  p1[1] = 10;
-  p2[0] = 75;
-  p2[1] = 10;
-  p3[0] = 50;
-  p3[1] = 50;
-  p4[0] = 10;
-  p4[1] = 60;
-  p5[0] = 85;
-  p5[1] = 70;
-
-  pd1[0] = 0.95;
-  pd1[1] = 10;
-  pd1[2] = -5;
-  pd2[0] = 0.98;
-  pd2[1] = 2;
-  pd2[2] = 5;
-  pd3[0] = 0.5;
-  pd3[1] = 20;
-  pd3[2] = -20;
-  pd4[0] = 0.91;
-  pd4[1] = 15;
-  pd4[2] = -5;
-  pd5[0] = 0.91;
-  pd5[1] = 5;
-  pd5[2] = 5;
-
-  ps->SetPoint(0, p1);
-  ps->SetPointData(0, pd1);
-  ps->SetPoint(1, p2);
-  ps->SetPointData(1, pd2);
-  ps->SetPoint(2, p3);
-  ps->SetPointData(2, pd3);
-  ps->SetPoint(3, p4);
-  ps->SetPointData(3, pd4);
-  ps->SetPoint(4, p5);
-  ps->SetPointData(4, pd5);
-
-  // Instantiating object
-  FilterType::Pointer filter = FilterType::New();
-  filter->SetOutputSize(size);
-  filter->SetMetricThreshold(thresh);
-  filter->SetPointSet(ps);
-
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetInput(filter->GetOutput());
-  writer->SetFileName(outfname);
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateTransformDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateTransformDisplacementFieldGenerator.cxx
deleted file mode 100644
index df178d762b61e25893f176f9aa175645280ed5a3..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateTransformDisplacementFieldGenerator.cxx
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "itkPointSet.h"
-#include "otbVectorImage.h"
-#include "otbBSplinesInterpolateTransformDisplacementFieldGenerator.h"
-#include "otbImageFileWriter.h"
-#include "itkEuler2DTransform.h"
-
-int otbBSplinesInterpolateTransformDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  const char *       outfname = argv[1];
-  typedef double                                                                              PixelType;
-  typedef otb::VectorImage<PixelType, Dimension>                                              ImageType;
-  typedef itk::Array<double>                                                                  ParamType;
-  typedef itk::PointSet<ParamType, Dimension>                                                 PointSetType;
-  typedef PointSetType::PointType                                                             PointType;
-  typedef otb::BSplinesInterpolateTransformDisplacementFieldGenerator<PointSetType, ImageType> FilterType;
-  typedef otb::ImageFileWriter<ImageType>                                                     WriterType;
-  typedef itk::Euler2DTransform<double>                                                       TransformType;
-
-  ImageType::SizeType size;
-  size.Fill(100);
-  double thresh = 0.9;
-
-  // Preparing point set
-  PointSetType::Pointer ps = PointSetType::New();
-  PointType             p1, p2, p3, p4, p5;
-  ParamType             pd1(6), pd2(6), pd3(6), pd4(6), pd5(6);
-  itk::Point<double, 2> center;
-
-  p1[0] = 10;
-  p1[1] = 10;
-  p2[0] = 75;
-  p2[1] = 10;
-  p3[0] = 50;
-  p3[1] = 50;
-  p4[0] = 10;
-  p4[1] = 60;
-  p5[0] = 85;
-  p5[1] = 70;
-  center.Fill(50);
-
-  pd1[0] = 0.95;
-  pd1[1] = 0;
-  pd1[2] = 0;
-  pd1[3] = 0.03925;
-  pd1[4] = 5;
-  pd1[5] = 5;
-  pd2[0] = 0.98;
-  pd2[1] = 0;
-  pd2[2] = 0;
-  pd2[3] = -0.03925;
-  pd2[4] = 5;
-  pd2[5] = -5;
-  pd3[0] = 0.5;
-  pd3[1] = 0;
-  pd3[2] = 0;
-  pd3[3] = 0;
-  pd3[4] = 0;
-  pd3[5] = 0;
-  pd4[0] = 0.91;
-  pd4[1] = 0;
-  pd4[2] = 0;
-  pd4[3] = 0.03925;
-  pd4[4] = -5;
-  pd4[5] = 5;
-  pd5[0] = 0.91;
-  pd5[1] = 0;
-  pd5[2] = 0;
-  pd5[3] = -0.03925;
-  pd5[4] = -5;
-  pd5[5] = -5;
-
-  ps->SetPoint(0, p1);
-  ps->SetPointData(0, pd1);
-  ps->SetPoint(1, p2);
-  ps->SetPointData(1, pd2);
-  ps->SetPoint(2, p3);
-  ps->SetPointData(2, pd3);
-  ps->SetPoint(3, p4);
-  ps->SetPointData(3, pd4);
-  ps->SetPoint(4, p5);
-  ps->SetPointData(4, pd5);
-
-  TransformType::Pointer transform = TransformType::New();
-  transform->SetCenter(center);
-
-  // Instantiating object
-  FilterType::Pointer filter = FilterType::New();
-  filter->SetOutputSize(size);
-  filter->SetMetricThreshold(thresh);
-  filter->SetPointSet(ps);
-  filter->SetTransform(transform);
-  filter->AddAngularParameter(0);
-
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetInput(filter->GetOutput());
-  writer->SetFileName(outfname);
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Registration/DisplacementField/test/otbDisplacementFieldTestDriver.cxx b/Modules/Registration/DisplacementField/test/otbDisplacementFieldTestDriver.cxx
deleted file mode 100644
index 86d6641fce1b1b594048f20c2648a2e95eabdb88..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/test/otbDisplacementFieldTestDriver.cxx
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "otbTestMain.h"
-
-void RegisterTests()
-{
-  REGISTER_TEST(otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator);
-  REGISTER_TEST(otbNNearestPointsLinearInterpolateDisplacementFieldGenerator);
-  REGISTER_TEST(otbNearestTransformDisplacementFieldGenerator);
-  REGISTER_TEST(otbNearestPointDisplacementFieldGenerator);
-  REGISTER_TEST(otbBSplinesInterpolateTransformDisplacementFieldGenerator);
-  REGISTER_TEST(otbBSplinesInterpolateDisplacementFieldGenerator);
-}
diff --git a/Modules/Registration/DisplacementField/test/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.cxx
deleted file mode 100644
index b487435899319e9d6562802fe539a35a6240d0b4..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/test/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.cxx
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "itkPointSet.h"
-#include "otbVectorImage.h"
-#include "otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h"
-#include "otbImageFileWriter.h"
-
-int otbNNearestPointsLinearInterpolateDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  const char *       outfname = argv[1];
-  typedef double                                                                                 PixelType;
-  typedef otb::VectorImage<PixelType, Dimension>                                                 ImageType;
-  typedef itk::Array<double>                                                                     ParamType;
-  typedef itk::PointSet<ParamType, Dimension>                                                    PointSetType;
-  typedef PointSetType::PointType                                                                PointType;
-  typedef otb::NNearestPointsLinearInterpolateDisplacementFieldGenerator<PointSetType, ImageType> FilterType;
-  typedef otb::ImageFileWriter<ImageType>                                                        WriterType;
-
-  ImageType::SizeType size;
-  size.Fill(100);
-  double thresh = 0.9;
-
-  // Preparing point set
-  PointSetType::Pointer ps = PointSetType::New();
-  PointType             p1, p2, p3, p4, p5;
-  ParamType             pd1(3), pd2(3), pd3(3), pd4(3), pd5(3);
-
-  p1[0] = 10;
-  p1[1] = 10;
-  p2[0] = 75;
-  p2[1] = 10;
-  p3[0] = 50;
-  p3[1] = 50;
-  p4[0] = 10;
-  p4[1] = 60;
-  p5[0] = 85;
-  p5[1] = 70;
-
-  pd1[0] = 0.95;
-  pd1[1] = 10;
-  pd1[2] = -5;
-  pd2[0] = 0.98;
-  pd2[1] = 2;
-  pd2[2] = 5;
-  pd3[0] = 0.5;
-  pd3[1] = 20;
-  pd3[2] = -20;
-  pd4[0] = 0.91;
-  pd4[1] = 15;
-  pd4[2] = -5;
-  pd5[0] = 0.91;
-  pd5[1] = 5;
-  pd5[2] = 5;
-
-  ps->SetPoint(0, p1);
-  ps->SetPointData(0, pd1);
-  ps->SetPoint(1, p2);
-  ps->SetPointData(1, pd2);
-  ps->SetPoint(2, p3);
-  ps->SetPointData(2, pd3);
-  ps->SetPoint(3, p4);
-  ps->SetPointData(3, pd4);
-  ps->SetPoint(4, p5);
-  ps->SetPointData(4, pd5);
-
-  // Instantiating object
-  FilterType::Pointer filter = FilterType::New();
-  filter->SetOutputSize(size);
-  filter->SetMetricThreshold(thresh);
-  filter->SetNumberOfPoints(5);
-  filter->SetPointSet(ps);
-
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetInput(filter->GetOutput());
-  writer->SetFileName(outfname);
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Registration/DisplacementField/test/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.cxx
deleted file mode 100644
index fb3b638d83fb61f46aef76faa7204e906c5404f0..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/test/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.cxx
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "itkPointSet.h"
-#include "otbVectorImage.h"
-#include "otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h"
-#include "otbImageFileWriter.h"
-#include "itkEuler2DTransform.h"
-
-int otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  const char *       outfname = argv[1];
-  typedef double                                                                                     PixelType;
-  typedef otb::VectorImage<PixelType, Dimension>                                                     ImageType;
-  typedef itk::Array<double>                                                                         ParamType;
-  typedef itk::PointSet<ParamType, Dimension>                                                        PointSetType;
-  typedef PointSetType::PointType                                                                    PointType;
-  typedef otb::NNearestTransformsLinearInterpolateDisplacementFieldGenerator<PointSetType, ImageType> FilterType;
-  typedef otb::ImageFileWriter<ImageType>                                                            WriterType;
-  typedef itk::Euler2DTransform<double>                                                              TransformType;
-
-  ImageType::SizeType size;
-  size.Fill(100);
-  double thresh = 0.9;
-
-  // Preparing point set
-  PointSetType::Pointer ps = PointSetType::New();
-  PointType             p1, p2, p3, p4, p5;
-  ParamType             pd1(6), pd2(6), pd3(6), pd4(6), pd5(6);
-  itk::Point<double, 2> center;
-
-  p1[0] = 10;
-  p1[1] = 10;
-  p2[0] = 75;
-  p2[1] = 10;
-  p3[0] = 50;
-  p3[1] = 50;
-  p4[0] = 10;
-  p4[1] = 60;
-  p5[0] = 85;
-  p5[1] = 70;
-  center.Fill(50);
-
-  pd1[0] = 0.95;
-  pd1[1] = 0;
-  pd1[2] = 0;
-  pd1[3] = 5;
-  pd1[4] = 5;
-  pd1[5] = 0.001769;
-  pd2[0] = 0.98;
-  pd2[1] = 0;
-  pd2[2] = 0;
-  pd2[3] = -5;
-  pd2[4] = 5;
-  pd2[5] = -0.001769;
-  pd3[0] = 0.5;
-  pd3[1] = 0;
-  pd3[2] = 0;
-  pd3[3] = 0;
-  pd3[4] = 0;
-  pd3[5] = 0;
-  pd4[0] = 0.91;
-  pd4[1] = 0;
-  pd4[2] = 0;
-  pd4[3] = 5;
-  pd4[4] = -5;
-  pd4[5] = 0.001769;
-  pd5[0] = 0.91;
-  pd5[1] = 0;
-  pd5[2] = 0;
-  pd5[3] = -5;
-  pd5[4] = -5;
-  pd5[5] = -0.001769;
-
-  ps->SetPoint(0, p1);
-  ps->SetPointData(0, pd1);
-  ps->SetPoint(1, p2);
-  ps->SetPointData(1, pd2);
-  ps->SetPoint(2, p3);
-  ps->SetPointData(2, pd3);
-  ps->SetPoint(3, p4);
-  ps->SetPointData(3, pd4);
-  ps->SetPoint(4, p5);
-  ps->SetPointData(4, pd5);
-
-  TransformType::Pointer transform = TransformType::New();
-  transform->SetCenter(center);
-
-  // Instantiating object
-  FilterType::Pointer filter = FilterType::New();
-  filter->SetOutputSize(size);
-  filter->SetMetricThreshold(thresh);
-  filter->SetNumberOfPoints(5);
-  filter->SetPointSet(ps);
-  filter->SetTransform(transform);
-
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetInput(filter->GetOutput());
-  writer->SetFileName(outfname);
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Registration/DisplacementField/test/otbNearestPointDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbNearestPointDisplacementFieldGenerator.cxx
deleted file mode 100644
index b6de1e79ab945896a66ffd7b1ccf2685351a0d6e..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/test/otbNearestPointDisplacementFieldGenerator.cxx
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "itkPointSet.h"
-#include "otbVectorImage.h"
-#include "otbNearestPointDisplacementFieldGenerator.h"
-#include "otbImageFileWriter.h"
-
-int otbNearestPointDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  const char *       outfname = argv[1];
-  typedef double                                                              PixelType;
-  typedef otb::VectorImage<PixelType, Dimension>                              ImageType;
-  typedef itk::Array<double>                                                  ParamType;
-  typedef itk::PointSet<ParamType, Dimension>                                 PointSetType;
-  typedef PointSetType::PointType                                             PointType;
-  typedef otb::NearestPointDisplacementFieldGenerator<PointSetType, ImageType> FilterType;
-  typedef otb::ImageFileWriter<ImageType>                                     WriterType;
-
-  ImageType::SizeType size;
-  size.Fill(100);
-  double thresh = 0.9;
-
-  // Preparing point set
-  PointSetType::Pointer ps = PointSetType::New();
-  PointType             p1, p2, p3, p4, p5;
-  ParamType             pd1(3), pd2(3), pd3(3), pd4(3), pd5(3);
-
-  p1[0] = 10;
-  p1[1] = 10;
-  p2[0] = 75;
-  p2[1] = 10;
-  p3[0] = 50;
-  p3[1] = 50;
-  p4[0] = 10;
-  p4[1] = 60;
-  p5[0] = 85;
-  p5[1] = 70;
-
-  pd1[0] = 0.95;
-  pd1[1] = 10;
-  pd1[2] = -5;
-  pd2[0] = 0.98;
-  pd2[1] = 2;
-  pd2[2] = 5;
-  pd3[0] = 0.5;
-  pd3[1] = 20;
-  pd3[2] = -20;
-  pd4[0] = 0.91;
-  pd4[1] = 15;
-  pd4[2] = -5;
-  pd5[0] = 0.91;
-  pd5[1] = 5;
-  pd5[2] = 5;
-
-  ps->SetPoint(0, p1);
-  ps->SetPointData(0, pd1);
-  ps->SetPoint(1, p2);
-  ps->SetPointData(1, pd2);
-  ps->SetPoint(2, p3);
-  ps->SetPointData(2, pd3);
-  ps->SetPoint(3, p4);
-  ps->SetPointData(3, pd4);
-  ps->SetPoint(4, p5);
-  ps->SetPointData(4, pd5);
-
-  // Instantiating object
-  FilterType::Pointer filter = FilterType::New();
-  filter->SetOutputSize(size);
-  filter->SetMetricThreshold(thresh);
-  filter->SetPointSet(ps);
-
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetInput(filter->GetOutput());
-  writer->SetFileName(outfname);
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Registration/DisplacementField/test/otbNearestTransformDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbNearestTransformDisplacementFieldGenerator.cxx
deleted file mode 100644
index abf2463501a6ac807d68850cdf9b8c0e6748a21f..0000000000000000000000000000000000000000
--- a/Modules/Registration/DisplacementField/test/otbNearestTransformDisplacementFieldGenerator.cxx
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#include "itkMacro.h"
-#include "itkPointSet.h"
-#include "otbVectorImage.h"
-#include "otbNearestTransformDisplacementFieldGenerator.h"
-#include "otbImageFileWriter.h"
-#include "itkEuler2DTransform.h"
-
-int otbNearestTransformDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[])
-{
-  const unsigned int Dimension = 2;
-  const char *       outfname = argv[1];
-  typedef double                                                                  PixelType;
-  typedef otb::VectorImage<PixelType, Dimension>                                  ImageType;
-  typedef itk::Array<double>                                                      ParamType;
-  typedef itk::PointSet<ParamType, Dimension>                                     PointSetType;
-  typedef PointSetType::PointType                                                 PointType;
-  typedef otb::NearestTransformDisplacementFieldGenerator<PointSetType, ImageType> FilterType;
-  typedef otb::ImageFileWriter<ImageType>                                         WriterType;
-  typedef itk::Euler2DTransform<double>                                           TransformType;
-
-  ImageType::SizeType size;
-  size.Fill(100);
-  double thresh = 0.9;
-
-  // Preparing point set
-  PointSetType::Pointer ps = PointSetType::New();
-  PointType             p1, p2, p3, p4, p5;
-  ParamType             pd1(6), pd2(6), pd3(6), pd4(6), pd5(6);
-  itk::Point<double, 2> center;
-
-  p1[0] = 10;
-  p1[1] = 10;
-  p2[0] = 75;
-  p2[1] = 10;
-  p3[0] = 50;
-  p3[1] = 50;
-  p4[0] = 10;
-  p4[1] = 60;
-  p5[0] = 85;
-  p5[1] = 70;
-  center.Fill(50);
-
-  pd1[0] = 0.95;
-  pd1[1] = 0;
-  pd1[2] = 0;
-  pd1[3] = 5;
-  pd1[4] = 5;
-  pd1[5] = 0.001769;
-  pd2[0] = 0.98;
-  pd2[1] = 0;
-  pd2[2] = 0;
-  pd2[3] = -5;
-  pd2[4] = 5;
-  pd2[5] = -0.001769;
-  pd3[0] = 0.5;
-  pd3[1] = 0;
-  pd3[2] = 0;
-  pd3[3] = 0;
-  pd3[4] = 0;
-  pd3[5] = 0;
-  pd4[0] = 0.91;
-  pd4[1] = 0;
-  pd4[2] = 0;
-  pd4[3] = 5;
-  pd4[4] = -5;
-  pd4[5] = 0.001769;
-  pd5[0] = 0.91;
-  pd5[1] = 0;
-  pd5[2] = 0;
-  pd5[3] = -5;
-  pd5[4] = -5;
-  pd5[5] = -0.001769;
-
-  ps->SetPoint(0, p1);
-  ps->SetPointData(0, pd1);
-  ps->SetPoint(1, p2);
-  ps->SetPointData(1, pd2);
-  ps->SetPoint(2, p3);
-  ps->SetPointData(2, pd3);
-  ps->SetPoint(3, p4);
-  ps->SetPointData(3, pd4);
-  ps->SetPoint(4, p5);
-  ps->SetPointData(4, pd5);
-
-  TransformType::Pointer transform = TransformType::New();
-  transform->SetCenter(center);
-
-  // Instantiating object
-  FilterType::Pointer filter = FilterType::New();
-  filter->SetOutputSize(size);
-  filter->SetMetricThreshold(thresh);
-  filter->SetPointSet(ps);
-  filter->SetTransform(transform);
-
-  WriterType::Pointer writer = WriterType::New();
-  writer->SetInput(filter->GetOutput());
-  writer->SetFileName(outfname);
-  writer->Update();
-
-  return EXIT_SUCCESS;
-}
diff --git a/Modules/Registration/Stereo/test/otbMulti3DMapToDEMFilter.cxx b/Modules/Registration/Stereo/test/otbMulti3DMapToDEMFilter.cxx
index 7e8df6ab358066e14723bad5b162ad9778b56751..2263ed97cee6e57e9401b288077f538329408093 100644
--- a/Modules/Registration/Stereo/test/otbMulti3DMapToDEMFilter.cxx
+++ b/Modules/Registration/Stereo/test/otbMulti3DMapToDEMFilter.cxx
@@ -98,12 +98,10 @@ int otbMulti3DMapToDEMFilterEPSG(int argc, char* argv[])
   for(unsigned int i=0; i<mapSize; i++)
    {
     multiFilter->Set3DMapInput(i,mapReaderList->GetNthElement(i)->GetOutput());
-   // multiFilter->SetMapKeywordList(i,mapReaderList->GetNthElement(i)->GetOutput()->GetImageKeywordlist());
     multiFilter->SetMaskInput(i,maskReaderList->GetNthElement(i)->GetOutput());
    }
 
   //set output parameters
- // multiFilter->SetOutputParametersFrom3DMap();
  VectorImageType::IndexType start;
   start[0] =  atoi(argv[argc-9]);
   start[1] =  atoi(argv[argc-8]);
@@ -132,7 +130,6 @@ int otbMulti3DMapToDEMFilterEPSG(int argc, char* argv[])
   WriterType::Pointer writer = WriterType::New();
 
   multiFilter->SetNumberOfThreads(atoi(argv[argc-11]));
-  //multiFilter->Update();
 
   writer->SetInput(multiFilter->GetOutput());
 
@@ -141,153 +138,6 @@ int otbMulti3DMapToDEMFilterEPSG(int argc, char* argv[])
   writer->Update();
 
   return EXIT_SUCCESS;
-
-  /*
-  if (argc != 12)
-    {
-    std::cout << argv[0] <<
-    " <input filename> <output filename> <origin easting> <origin northing> <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>"
-              << std::endl;
-
-    return EXIT_FAILURE;
-    }
-
-  typedef otb::VectorImage<double, 2>                                               VectorImageType;
-  typedef otb::ImageFileReader<VectorImageType>                                     ReaderType;
-  typedef otb::ImageFileWriter<VectorImageType>                            WriterType;
-  typedef otb::UtmInverseProjection                                                 UtmMapProjectionType;
-  typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType, UtmMapProjectionType> OrthoRectifFilterType;
-
-  //Allocate pointer
-  ReaderType::Pointer reader = ReaderType::New();
-  WriterType::Pointer writer = WriterType::New();
-
-  OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New();
-  UtmMapProjectionType::Pointer  utmMapProjection = UtmMapProjectionType::New();
-
-  // Set parameters ...
-  reader->SetFileName(argv[1]);
-  writer->SetFileName(argv[2]);
-
-  reader->GenerateOutputInformation();
-  std::cout << reader->GetOutput() << std::endl;
-
-  orthoRectifFilter->SetInput(reader->GetOutput());
-
-  VectorImageType::IndexType start;
-  start[0] = 0;
-  start[1] = 0;
-  orthoRectifFilter->SetOutputStartIndex(start);
-
-  VectorImageType::SizeType size;
-  size[0] = atoi(argv[5]);      // X size
-  size[1] = atoi(argv[6]);            //Y size
-  orthoRectifFilter->SetOutputSize(size);
-
-  VectorImageType::SpacingType spacing;
-  spacing[0] = atof(argv[7]);
-  spacing[1] = atof(argv[8]);
-  orthoRectifFilter->SetOutputSpacing(spacing);
-
-  VectorImageType::PointType origin;
-  origin[0] = strtod(argv[3], NULL);         //Origin easting
-  origin[1] = strtod(argv[4], NULL);         //Origin northing
-  orthoRectifFilter->SetOutputOrigin(origin);
-
-  utmMapProjection->SetZone(atoi(argv[9]));
-  utmMapProjection->SetHemisphere(argv[10][0]);
-  orthoRectifFilter->SetMapProjection(utmMapProjection);
-
-  // Deformation Field spacing
-  VectorImageType::SpacingType  gridSpacing;
-  gridSpacing[0] = atof(argv[11]);
-  gridSpacing[1] = -atof(argv[11]);
-  orthoRectifFilter->SetDeformationFieldSpacing(gridSpacing);
-
-  VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel());
-  no_data.Fill(0);
-  orthoRectifFilter->SetEdgePaddingValue(no_data);
-
-  writer->SetInput(orthoRectifFilter->GetOutput());
-  writer->SetNumberOfDivisionsTiledStreaming(4);
-  writer->Update();
-
-  return EXIT_SUCCESS; */
-
-
-
-
-  /*
-  if (argc != 12)
-    {
-    std::cout << argv[0] <<
-    " <input filename> <output filename> <origin easting> <origin northing> <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>"
-              << std::endl;
-
-    return EXIT_FAILURE;
-    }
-
-  typedef otb::VectorImage<double, 2>                                               VectorImageType;
-  typedef otb::ImageFileReader<VectorImageType>                                     ReaderType;
-  typedef otb::ImageFileWriter<VectorImageType>                            WriterType;
-  typedef otb::UtmInverseProjection                                                 UtmMapProjectionType;
-  typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType, UtmMapProjectionType> OrthoRectifFilterType;
-
-  //Allocate pointer
-  ReaderType::Pointer reader = ReaderType::New();
-  WriterType::Pointer writer = WriterType::New();
-
-  OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New();
-  UtmMapProjectionType::Pointer  utmMapProjection = UtmMapProjectionType::New();
-
-  // Set parameters ...
-  reader->SetFileName(argv[1]);
-  writer->SetFileName(argv[2]);
-
-  reader->GenerateOutputInformation();
-  std::cout << reader->GetOutput() << std::endl;
-
-  orthoRectifFilter->SetInput(reader->GetOutput());
-
-  VectorImageType::IndexType start;
-  start[0] = 0;
-  start[1] = 0;
-  orthoRectifFilter->SetOutputStartIndex(start);
-
-  VectorImageType::SizeType size;
-  size[0] = atoi(argv[5]);      // X size
-  size[1] = atoi(argv[6]);            //Y size
-  orthoRectifFilter->SetOutputSize(size);
-
-  VectorImageType::SpacingType spacing;
-  spacing[0] = atof(argv[7]);
-  spacing[1] = atof(argv[8]);
-  orthoRectifFilter->SetOutputSpacing(spacing);
-
-  VectorImageType::PointType origin;
-  origin[0] = strtod(argv[3], NULL);         //Origin easting
-  origin[1] = strtod(argv[4], NULL);         //Origin northing
-  orthoRectifFilter->SetOutputOrigin(origin);
-
-  utmMapProjection->SetZone(atoi(argv[9]));
-  utmMapProjection->SetHemisphere(argv[10][0]);
-  orthoRectifFilter->SetMapProjection(utmMapProjection);
-
-  // Deformation Field spacing
-  VectorImageType::SpacingType  gridSpacing;
-  gridSpacing[0] = atof(argv[11]);
-  gridSpacing[1] = -atof(argv[11]);
-  orthoRectifFilter->SetDeformationFieldSpacing(gridSpacing);
-
-  VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel());
-  no_data.Fill(0);
-  orthoRectifFilter->SetEdgePaddingValue(no_data);
-
-  writer->SetInput(orthoRectifFilter->GetOutput());
-  writer->SetNumberOfDivisionsTiledStreaming(4);
-  writer->Update();
-
-  return EXIT_SUCCESS; */
 }
 
 int otbMulti3DMapToDEMFilterManual(int argc, char* argv[])
@@ -354,12 +204,10 @@ multiFilter->SetCellFusionMode(fusionMode);
 for(unsigned int i=0; i<mapSize; i++)
  {
   multiFilter->Set3DMapInput(i,mapReaderList->GetNthElement(i)->GetOutput());
- // multiFilter->SetMapKeywordList(i,mapReaderList->GetNthElement(i)->GetOutput()->GetImageKeywordlist());
   multiFilter->SetMaskInput(i,maskReaderList->GetNthElement(i)->GetOutput());
  }
 
 //set output parameters
-//multiFilter->SetOutputParametersFrom3DMap();
 VectorImageType::IndexType start;
 start[0] =  atoi(argv[argc-7]);
 start[1] =  atoi(argv[argc-8]);
@@ -385,7 +233,6 @@ multiFilter->SetOutputOrigin(origin);
 WriterType::Pointer writer = WriterType::New();
 
 multiFilter->SetNumberOfThreads(atoi(argv[argc-10]));
-//multiFilter->Update();
 
 writer->SetInput(multiFilter->GetOutput());
 
@@ -395,79 +242,6 @@ writer->Update();
 
 
 return EXIT_SUCCESS;
-
-/*
-if (argc != 12)
-  {
-  std::cout << argv[0] <<
-  " <input filename> <output filename> <origin easting> <origin northing> <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>"
-            << std::endl;
-
-  return EXIT_FAILURE;
-  }
-
-typedef otb::VectorImage<double, 2>                                               VectorImageType;
-typedef otb::ImageFileReader<VectorImageType>                                     ReaderType;
-typedef otb::ImageFileWriter<VectorImageType>                            WriterType;
-typedef otb::UtmInverseProjection                                                 UtmMapProjectionType;
-typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType, UtmMapProjectionType> OrthoRectifFilterType;
-
-//Allocate pointer
-ReaderType::Pointer reader = ReaderType::New();
-WriterType::Pointer writer = WriterType::New();
-
-OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New();
-UtmMapProjectionType::Pointer  utmMapProjection = UtmMapProjectionType::New();
-
-// Set parameters ...
-reader->SetFileName(argv[1]);
-writer->SetFileName(argv[2]);
-
-reader->GenerateOutputInformation();
-std::cout << reader->GetOutput() << std::endl;
-
-orthoRectifFilter->SetInput(reader->GetOutput());
-
-VectorImageType::IndexType start;
-start[0] = 0;
-start[1] = 0;
-orthoRectifFilter->SetOutputStartIndex(start);
-
-VectorImageType::SizeType size;
-size[0] = atoi(argv[5]);      // X size
-size[1] = atoi(argv[6]);            //Y size
-orthoRectifFilter->SetOutputSize(size);
-
-VectorImageType::SpacingType spacing;
-spacing[0] = atof(argv[7]);
-spacing[1] = atof(argv[8]);
-orthoRectifFilter->SetOutputSpacing(spacing);
-
-VectorImageType::PointType origin;
-origin[0] = strtod(argv[3], NULL);         //Origin easting
-origin[1] = strtod(argv[4], NULL);         //Origin northing
-orthoRectifFilter->SetOutputOrigin(origin);
-
-utmMapProjection->SetZone(atoi(argv[9]));
-utmMapProjection->SetHemisphere(argv[10][0]);
-orthoRectifFilter->SetMapProjection(utmMapProjection);
-
-// Deformation Field spacing
-VectorImageType::SpacingType  gridSpacing;
-gridSpacing[0] = atof(argv[11]);
-gridSpacing[1] = -atof(argv[11]);
-orthoRectifFilter->SetDeformationFieldSpacing(gridSpacing);
-
-VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel());
-no_data.Fill(0);
-orthoRectifFilter->SetEdgePaddingValue(no_data);
-
-writer->SetInput(orthoRectifFilter->GetOutput());
-writer->SetNumberOfDivisionsTiledStreaming(4);
-writer->Update();
-
-return EXIT_SUCCESS; */
-
 }
 
 
@@ -529,7 +303,7 @@ int otbMulti3DMapToDEMFilter(int argc, char* argv[])
   for(unsigned int i=0; i<mapSize; i++)
    {
     multiFilter->Set3DMapInput(i,mapReaderList->GetNthElement(i)->GetOutput());
-   // multiFilter->SetMapKeywordList(i,mapReaderList->GetNthElement(i)->GetOutput()->GetImageKeywordlist());
+
     multiFilter->SetMaskInput(i,maskReaderList->GetNthElement(i)->GetOutput());
    }
   multiFilter->SetOutputParametersFrom3DMap();
@@ -537,7 +311,6 @@ int otbMulti3DMapToDEMFilter(int argc, char* argv[])
   WriterType::Pointer writer = WriterType::New();
 
   multiFilter->SetNumberOfThreads(atoi(argv[argc-2]));
-  //multiFilter->Update();
 
   writer->SetInput(multiFilter->GetOutput());
 
diff --git a/Modules/Remote/temporal-gapfilling.remote.cmake b/Modules/Remote/temporal-gapfilling.remote.cmake
index 0939185711b629f2a54a2648ab9935c1759d20b2..6e7b1f77e7fa8e49fab0e3e141729f5083af4c62 100644
--- a/Modules/Remote/temporal-gapfilling.remote.cmake
+++ b/Modules/Remote/temporal-gapfilling.remote.cmake
@@ -26,6 +26,5 @@ A more detailed description can be found on the project website:
 https://gitlab.orfeo-toolbox.org/jinglada/temporalgapfilling
 "
   GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/jinglada/temporalgapfilling.git
-  # Commit on develop branch which includes patches for Windows support
-  GIT_TAG 9d97764f0411de1a32dd5e0a90bdcdd8adfa049f
+  GIT_TAG master
 )
diff --git a/Modules/Segmentation/Conversion/test/CMakeLists.txt b/Modules/Segmentation/Conversion/test/CMakeLists.txt
index fa65b73233189ee8f31ceda1981f381a827f8e7a..b704bd6275d83837200861e7448c820f89dda0ac 100644
--- a/Modules/Segmentation/Conversion/test/CMakeLists.txt
+++ b/Modules/Segmentation/Conversion/test/CMakeLists.txt
@@ -128,6 +128,7 @@ otb_add_test(NAME bfTvVectorDataRasterizeFilterSHP COMMAND otbConversionTestDriv
   --compare-image 0.0001
   ${BASELINE}/bfTvVectorDataRasterizeFilter_OutputSHP.tif
   ${TEMP}/bfTvVectorDataRasterizeFilter_OutputSHP.tif
+  --tolerance-ratio 0.01
   otbVectorDataRasterizeFilter
   ${INPUTDATA}/QB_Toulouse_Ortho_XS.tif
   ${INPUTDATA}/Capitole-Shadows.shp
@@ -194,19 +195,11 @@ otb_add_test(NAME bfTvVectorDataRasterizeFilterSHP COMMAND otbConversionTestDriv
   #4 25 0.1 100
   #)
 
-otb_add_test(NAME obTvLabelMapToVectorDataFilter2 COMMAND otbConversionTestDriver
-  --compare-ogr ${NOTOL}
-  ${BASELINE_FILES}/obTvLabelMapToVectorDataFilter.shp
-  ${TEMP}/obTvLabelMapToVectorDataFilter2.shp
-  otbLabelMapToVectorDataFilter
-  ${INPUTDATA}/rcc8_mire5.png
-  ${TEMP}/obTvLabelMapToVectorDataFilter2.shp)
-
 otb_add_test(NAME obTvLabelMapToVectorDataFilter COMMAND otbConversionTestDriver
   --compare-ogr ${NOTOL}
   ${BASELINE_FILES}/obTvLabelMapToVectorDataFilter.shp
   ${TEMP}/obTvLabelMapToVectorDataFilter.shp
   otbLabelMapToVectorDataFilter
-  ${INPUTDATA}/rcc8_mire1.png
+  ${INPUTDATA}/labelImage_UnsignedChar.tif
   ${TEMP}/obTvLabelMapToVectorDataFilter.shp)
 
diff --git a/Modules/Segmentation/Metrics/test/CMakeLists.txt b/Modules/Segmentation/Metrics/test/CMakeLists.txt
index 1b286013d0ad582630ea14378ed22f38afca90aa..63f104f6ca630af3b11dd5fb2bc1333a70caad3c 100644
--- a/Modules/Segmentation/Metrics/test/CMakeLists.txt
+++ b/Modules/Segmentation/Metrics/test/CMakeLists.txt
@@ -47,8 +47,8 @@ otb_add_test(NAME obTvHooverMatrixFilter COMMAND otbMetricsTestDriver
   ${BASELINE_FILES}/obTvHooverMatrixFilter.txt
   ${TEMP}/obTvHooverMatrixFilter.txt
   otbHooverMatrixFilter
-  ${INPUTDATA}/Seg1InputForRCC8Graph.tif
-  ${INPUTDATA}/Seg2InputForRCC8Graph.tif
+  ${INPUTDATA}/labelImage_UnsignedChar.tif
+  ${INPUTDATA}/labelImage_UnsignedChar.tif
   ${TEMP}/obTvHooverMatrixFilter.txt
   )
 
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbClosingOpeningMorphologicalFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbClosingOpeningMorphologicalFilter.h
index 458213a22aa04a63a47064c59030aedf6441e07c..570c6cd0ea1e29a0c77b90fa3019ae9245204711 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbClosingOpeningMorphologicalFilter.h
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbClosingOpeningMorphologicalFilter.h
@@ -39,8 +39,7 @@ namespace otb
  * of composition of the two basic morphological operation, the filtered details are dark
  * on a brighter background.
  *
- * \sa ClosingOpeningMorphologicalFilter,
- * MorphologicalPyramidAnalysisFilter
+ * \sa ClosingOpeningMorphologicalFilter
  *
  * \ingroup OTBMorphologicalProfiles
  */
diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbOpeningClosingMorphologicalFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbOpeningClosingMorphologicalFilter.h
index df47e1bd469765126ecabfb15e4a2a15163bf1a0..3a329241c20a8bfa13ad8771b3edb46c6d9b4d73 100644
--- a/Modules/Segmentation/MorphologicalProfiles/include/otbOpeningClosingMorphologicalFilter.h
+++ b/Modules/Segmentation/MorphologicalProfiles/include/otbOpeningClosingMorphologicalFilter.h
@@ -39,8 +39,7 @@ namespace otb
  * of composition of the two basic morphological operation, the filtered details are dark
  * on a brighter background.
  *
- * \sa ClosingOpeningMorphologicalFilter,
- * MorphologicalPyramidAnalyseFilter
+ * \sa ClosingOpeningMorphologicalFilter
  *
  * \ingroup OTBMorphologicalProfiles
  */
diff --git a/Modules/ThirdParty/MPI/otb-module-init.cmake b/Modules/ThirdParty/MPI/otb-module-init.cmake
index 6d4f3673db59cee99a7ac83d0e0ae6a0483276cd..39665d6ad48fe54fdc175fca64c45c0529dbe738 100644
--- a/Modules/ThirdParty/MPI/otb-module-init.cmake
+++ b/Modules/ThirdParty/MPI/otb-module-init.cmake
@@ -19,3 +19,5 @@
 #
 
 find_package ( MPI REQUIRED )
+
+set(OTB_MPIEXEC_OPT "" CACHE STRING "Additional options for mpiexec tests")
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp
index e57304fb7751a2ff0e330741cc179a2cb75c81d9..40aebcad27a6c1d6f3c9cbd86fee36a47b0b1c48 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp
@@ -1058,29 +1058,39 @@ bool ossimSarSensorModel::worldToAzimuthRangeTime(const ossimGpt& worldPt, TimeT
 
       theAzimuthTimeOffset = count > 0 ? cumulAzimuthTime / count : DurationType(0);
 
-      // Then, fix the range time
-      count=0;
+      // Patch_locS1 : do not fix the range time
+      // This fix takes GCPs as inputs to calculate an offset in range dimension. 
+      // However for recent S1 products (after March 2017 with IPF >= 2.82), GCPs contain wrong values 
+      // for lat/lon coordinates => the range time offset is wrong and shift the localization.
+      // To avoid wrong offset, fixRangeTimeWithGCPs is always set to false
+      bool fixRangeTimeWithGCPs = false;
+
+      if (fixRangeTimeWithGCPs)
+	{
+	  // Then, fix the range time
+	  count=0;
 
-      for(std::vector<GCPRecordType>::const_iterator gcpIt = theGCPRecords.begin(); gcpIt!=theGCPRecords.end();++gcpIt)
-      {
-         ossimDpt estimatedImPt;
-         TimeType estimatedAzimuthTime;
-         double   estimatedRangeTime;
+	  for(std::vector<GCPRecordType>::const_iterator gcpIt = theGCPRecords.begin(); gcpIt!=theGCPRecords.end();++gcpIt)
+	  {
+	     ossimDpt estimatedImPt;
+	     TimeType estimatedAzimuthTime;
+	     double   estimatedRangeTime;
 
-         ossimEcefPoint sensorPos;
-         ossimEcefVector sensorVel;
+	     ossimEcefPoint sensorPos;
+	     ossimEcefVector sensorVel;
 
-         // Estimate times
-         const bool s1 = this->worldToAzimuthRangeTime(gcpIt->worldPt,estimatedAzimuthTime,estimatedRangeTime, sensorPos, sensorVel);
+	     // Estimate times
+	     const bool s1 = this->worldToAzimuthRangeTime(gcpIt->worldPt,estimatedAzimuthTime,estimatedRangeTime, sensorPos, sensorVel);
 
-         if(s1)
-         {
-            cumulRangeTime+=-estimatedRangeTime+gcpIt->slantRangeTime;
-            ++count;
-         }
-      }
+	     if(s1)
+	     {
+	        cumulRangeTime+=-estimatedRangeTime+gcpIt->slantRangeTime;
+	        ++count;
+	     }
+	  }
 
-      theRangeTimeOffset = count > 0 ? cumulRangeTime/count : 0;
+	  theRangeTimeOffset = count > 0 ? cumulRangeTime/count : 0;
+	}
    }
 
    void get(
@@ -1268,7 +1278,6 @@ bool ossimSarSensorModel::worldToAzimuthRangeTime(const ossimGpt& worldPt, TimeT
       for (std::size_t idx=0 ; idx!=nbCoords ; ++idx)
       {
          const int pos = s_printf(prefix_, "%s[%d].", sr_gr_prefix.c_str(), idx);
-         assert(pos >= sizeof(SR_PREFIX)+4 && pos < sizeof(prefix_));
          std::string prefix(prefix_, pos);
 
          ossimSarSensorModel::CoordinateConversionRecordType coordRecord;
@@ -1301,7 +1310,6 @@ bool ossimSarSensorModel::worldToAzimuthRangeTime(const ossimGpt& worldPt, TimeT
      for (std::size_t idx=0 ; idx!=conversionRecords.size() ; ++idx)
        {
        const int pos = s_printf(prefix_, "%s[%d].", sr_gr_prefix.c_str(), idx);
-       assert(pos >= sizeof(SR_PREFIX)+4 && pos < sizeof(prefix_));
        std::string prefix(prefix_, pos);
 
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
index 8f428aacada11d02b5b9f4557d96f1c635d13eec..3832701fe39a34a17079a43d8ff1a38a85aa6877 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
@@ -1114,7 +1114,7 @@ namespace ossimplugins
       for(std::vector<ossimRefPtr<ossimXmlNode> >::iterator itNode = xnodes.begin(); itNode!=xnodes.end();++itNode, ++idx)
       {
          int pos = s_printf(prefix, "%s[%d].", sr_gr_prefix.c_str(), idx);
-         assert(pos >= sizeof(SR_PREFIX)+4 && pos < sizeof(prefix));
+         assert(pos >= SR_PREFIX.size()+4 && pos < sizeof(prefix));
 
          addMandatory(theProductKwl, prefix + keyAzimuthTime,**itNode, attAzimuthTime);
          addMandatory(theProductKwl, prefix + rg0_xpath,     **itNode, rg0_xpath);
@@ -1153,7 +1153,7 @@ namespace ossimplugins
       for(std::vector<ossimRefPtr<ossimXmlNode> >::iterator itNode = xnodes.begin(); itNode!=xnodes.end();++itNode,++idx)
       {
          int pos = s_printf(prefix, "%s[%d].", GCP_PREFIX.c_str(), idx);
-         assert(pos >= sizeof(SR_PREFIX)+4 && pos < 1024);
+         assert(pos >= GCP_PREFIX.size()+4 && pos < sizeof(prefix));
 #if defined(USE_BOOST_TIME)
          const TimeType azimuthTime = getTimeFromFirstNode(**itNode, attAzimuthTime);
          add(theProductKwl, prefix, attAzimuthTime, azimuthTime);
diff --git a/Modules/ThirdParty/Shark/include/otbSharkUtils.h b/Modules/ThirdParty/Shark/include/otbSharkUtils.h
index da56981943b33203ea3f2d5cc442d3bd737395e3..4ab8c0fdfe62e2f8a97638271354f684ea6b9f87 100644
--- a/Modules/ThirdParty/Shark/include/otbSharkUtils.h
+++ b/Modules/ThirdParty/Shark/include/otbSharkUtils.h
@@ -135,13 +135,18 @@ template <class T> void ListSampleToSharkVector(const T * listSample, std::vecto
 }
 
 /** Shark assumes that labels are 0 ... (nbClasses-1). This function modifies the labels contained in the input vector and returns a vector with size = nbClasses which allows the translation from the normalised labels to the new ones oldLabel = dictionary[newLabel].
+When we want to generate the image containing the probability for each class, we need to ensure that the probabilities are in the correct order wrt the incoming labels. We therefore sort the labels before building the encoding.
 */
 template <typename T> void NormalizeLabelsAndGetDictionary(std::vector<T>& labels, 
                                                            std::vector<T>& dictionary)
 {
+  std::vector<T> sorted_labels = labels;
+  std::sort(std::begin(sorted_labels), std::end(sorted_labels));
+  auto last = std::unique(std::begin(sorted_labels), std::end(sorted_labels));
+  sorted_labels.erase(last, std::end(sorted_labels));
   std::unordered_map<T, T> dictMap;
   T labelCount{0};
-  for(const auto& l : labels)
+  for(const auto& l : sorted_labels)
     {
     if(dictMap.find(l)==dictMap.end())
       dictMap.insert({l, labelCount++});
diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
index bc26e07f5895a108c5fe37dfa81407d5f3fd2190..35070d00b1d89ea7befc6c61d6253681905d1c8b 100644
--- a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
+++ b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
@@ -1372,56 +1372,6 @@ MainWindow
 {
   assert( e!=NULL );
 
-  {
-    //
-    // List OTB-application widgets.
-    typedef QList< mvd::Wrapper::QtWidgetView * > QtWidgetViewList;
-
-    QtWidgetViewList c( findChildren< mvd::Wrapper::QtWidgetView * >() );
-
-    QStringList names;
-
-    //
-    // Find out which OTB-applications are running.
-    for( QtWidgetViewList::iterator it( c.begin() );
-	 it!=c.end();
-	 ++ it )
-      {
-      assert( *it );
-
-      if( !( *it )->IsClosable() )
-	{
-	assert( ( *it )->GetModel()->GetApplication() );
-
-	// qDebug() << "OTB-application:" << ( *it )->GetApplication()->GetDocName();
-
-	names.push_back( ( *it )->GetModel()->GetApplication()->GetDocName() );
-	}
-      }
-
-    //
-    // If some OTB-application is running, display warning, names and
-    // prevent to close.
-    if( !names.isEmpty() )
-      {
-      QMessageBox::warning(
-	this,
-	tr( "Warning!" ),
-	tr(
-	  PROJECT_NAME
-	  " cannot exit while some OTB-application is running!\n\n"
-	  "Please wait for following OTB-applicatio(s) to exit:\n- %1"
-	)
-	.arg( names.join( "\n- " ) )
-      );
-
-      e->ignore();
-
-      return;
-      }
-  }
-
-
   {
     assert( I18nCoreApplication::Instance()!=NULL );
     assert( I18nCoreApplication::Instance()->GetModel()==
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h b/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h
index 378e76108c3abb7f40d031bf23bef5fd2f94fcb4..2d58061ed4eb36ab42cc460e65d639898badb32a 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h
@@ -62,7 +62,7 @@ public:
 
   otb::Wrapper::Application::Pointer PrepareApplication(const QString& appName, bool isStandalone = false) const;
 
-  otb::Wrapper::QtMainWindow* NewOtbApplicationWindow(const QString& appName, bool isStandalone = false, QWidget* p = nullptr, Qt::WindowFlags = 0) const;
+  otb::Wrapper::QtMainWindow* NewOtbApplicationWindow(const QString& appName, bool isStandalone = false, QWidget* p = nullptr) const;
 };
 
 } // namespace mvd
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h
index 313f8f1537af75ef500d0bff91a93d1b94bd204f..1be6f7514f2db902f0194de47ce26f78e8ac99a2 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h
@@ -90,7 +90,7 @@ namespace Wrapper
  */
 template< typename W >
 void
-SetupForFilenameDrop( W* widget, const char* text =NULL );
+SetupForFilenameDrop( W* widget );
 
 /**
  */
@@ -376,7 +376,7 @@ FileSelectionInitializer
 {
   assert( widget!=NULL );
 
-  SetupForFilenameDrop( widget, "You can drop filename here." );
+  SetupForFilenameDrop( widget );
 }
 
 /*****************************************************************************/
@@ -387,7 +387,7 @@ InputImageInitializer
 {
   assert( widget!=NULL );
 
-  SetupForFilenameDrop( widget, "You can drop filename here." );
+  SetupForFilenameDrop( widget );
 }
 
 /*****************************************************************************/
@@ -409,7 +409,7 @@ InputFilenameInitializer
 {
   assert( widget!=NULL );
 
-  SetupForFilenameDrop( widget, "You can drop filename here." );
+  SetupForFilenameDrop( widget );
 }
 
 /*****************************************************************************/
@@ -431,7 +431,7 @@ InputVectorDataInitializer
 {
   assert( widget!=NULL );
 
-  SetupForFilenameDrop( widget, "You can drop filename here." );
+  SetupForFilenameDrop( widget );
 }
 
 /*****************************************************************************/
@@ -453,7 +453,7 @@ InputProcessXMLInitializer
 {
   assert( widget!=NULL );
 
-  SetupForFilenameDrop( widget, "You can drop filename here." );
+  SetupForFilenameDrop( widget );
 }
 
 /*****************************************************************************/
@@ -494,7 +494,7 @@ OutputImageInitializer
 
   if( m_Prefix.isEmpty() )
     {
-    SetupForFilenameDrop( widget, "You can drop filename here." );
+    SetupForFilenameDrop( widget );
 
     assert( qApp!=NULL );
     assert( !qApp->arguments().empty() );
@@ -518,7 +518,7 @@ OutputVectorDataInitializer
 {
   assert( widget!=NULL );
 
-  SetupForFilenameDrop( widget, "You can drop filename here." );
+  SetupForFilenameDrop( widget );
 
   assert( qApp!=NULL );
   assert( !qApp->arguments().empty() );
@@ -534,7 +534,7 @@ OutputFilenameInitializer
 {
   assert( widget!=NULL );
 
-  SetupForFilenameDrop( widget, "You can drop filename here." );
+  SetupForFilenameDrop( widget );
 
   assert( qApp!=NULL );
   assert( !qApp->arguments().empty() );
@@ -550,7 +550,7 @@ OutputProcessXMLInitializer
 {
   assert( widget!=NULL );
 
-  SetupForFilenameDrop( widget, "You can drop filename here." );
+  SetupForFilenameDrop( widget );
 
   assert( qApp!=NULL );
   assert( !qApp->arguments().empty() );
@@ -592,7 +592,7 @@ ParameterListInitializer
 /*****************************************************************************/
 template< typename W >
 void
-SetupForFilenameDrop( W* widget, const char* text )
+SetupForFilenameDrop( W* widget )
 {
   assert( widget!=NULL );
 
@@ -602,15 +602,12 @@ SetupForFilenameDrop( W* widget, const char* text )
   // Setup widget.
   bool signalsBlocked = lineEdit->blockSignals( true );
   {
-  if( text!=NULL )
-    {
     lineEdit->setPlaceholderText(
       QCoreApplication::translate(
         "mvd::Wrapper::QtWidgetView",
-        text
+        "You can drop a file here"
       )
     );
-    }
 
   // lineEdit->setReadOnly( true );
 
diff --git a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h
index 146c4c250d0682939f48d03327d329cde971f7e6..931a561b2d9c358e6e6ecea635bcde0d8d78dad5 100644
--- a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h
+++ b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h
@@ -64,18 +64,10 @@ namespace Wrapper
 class OTBMonteverdiGUI_EXPORT QtWidgetView :
     public otb::Wrapper::QtWidgetView
 {
-  /*-[ QOBJECT SECTION ]-----------------------------------------------------*/
-
   Q_OBJECT
 
-  /*-[ PUBLIC SECTION ]------------------------------------------------------*/
-
-//
-// Public methods.
 public:
 
-  /**
-   */
   static char const * const OBJECT_NAME;
 
   /** \brief Constructor. */
@@ -86,30 +78,18 @@ public:
   /** \brief Destructor. */
   ~QtWidgetView() override;
 
-protected:
+  bool BeforeExecuteButtonClicked() override;
 
+protected:
   QWidget* CreateInputWidgets() override;
 
-protected slots:
-
-  /** extend the behaviour of base class OnExecButtonClicked */
-  void OnExecButtonClicked() override;
-
-  /** modify the behaviour of base class OnExceptionRaised
-   */
-  void OnExceptionRaised( QString what ) override;
-
 private:
 
   QtWidgetView(const QtWidgetView&) = delete;
   void operator=(const QtWidgetView&) = delete;
 
-  /**
-   */
   void SetupParameterWidgets( QWidget* widget );
 
-  /**
-   */
   void SetupFileSelectionWidget( QWidget * );
 
 private slots:
@@ -119,12 +99,8 @@ private slots:
   // image filename{s} set by the user in this OTB application (if any).
   void OnApplicationExecutionDone( int );
 
-  /**
-   */
   inline void OnFileSelectionWidgetAdded0( QWidget * );
 
-  /**
-   */
   inline void OnFileSelectionWidgetAdded1( QWidget * );
 };
 
@@ -132,16 +108,12 @@ private slots:
 
 } // end namespace 'mvd'
 
-/*****************************************************************************/
-/* INLINE SECTION                                                            */
-
 namespace mvd
 {
 
 namespace Wrapper
 {
 
-/*******************************************************************************/
 inline
 void
 QtWidgetView
@@ -150,7 +122,6 @@ QtWidgetView
   SetupFileSelectionWidget( widget );
 }
 
-/*******************************************************************************/
 inline
 void
 QtWidgetView
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx b/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx
index 61a40b9e6996dbddaabc9c9b12d4121d54244da3..b3ef6b7baf8217938c4edebc1e13e0aa1b4b4d0a 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx
@@ -179,12 +179,7 @@ ApplicationLauncher
 }
 
 
-otb::Wrapper::QtMainWindow*
-ApplicationLauncher
-::NewOtbApplicationWindow( const QString & appName,
-			   bool isStandalone,
-			   QWidget* parent,
-			   Qt::WindowFlags flags ) const
+otb::Wrapper::QtMainWindow* ApplicationLauncher ::NewOtbApplicationWindow(const QString& appName, bool isStandalone, QWidget* parent) const
 {
   // Setup the otb application
   auto otbApp = PrepareApplication(appName, isStandalone);
@@ -194,7 +189,7 @@ ApplicationLauncher
   gui->CreateGui();
 
   // Make the application window
-  auto window = new ::otb::Wrapper::QtMainWindow(otbApp, gui, parent, flags | Qt::Window);
+  auto window = new ::otb::Wrapper::QtMainWindow(otbApp, gui, parent);
 
   return window;
 }
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx b/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx
index 53c723bc811bc7fba33e89e8d032f9c74df110bc..d074c1aae4c92205f06daacdc0420222233930dc 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx
@@ -116,13 +116,6 @@ char const * const
 QtWidgetView
 ::OBJECT_NAME = "mvd::Wrapper::QtWidgetView";
 
-/*****************************************************************************/
-/* STATIC IMPLEMENTATION SECTION                                             */
-
-
-/*****************************************************************************/
-/* CLASS IMPLEMENTATION SECTION                                              */
-/*****************************************************************************/
 QtWidgetView
 ::QtWidgetView( const otb::Wrapper::Application::Pointer & otbApp,
 		QWidget* p,
@@ -131,10 +124,6 @@ QtWidgetView
 {
   setObjectName( QtWidgetView::OBJECT_NAME );
 
-  m_IconPathDone = std::string("<img src=\":/icons/done\" width=\"16\" height=\"16\" />");
-  m_IconPathFailed = std::string("<img src=\":/icons/failed\" width=\"16\" height=\"16\" />");
-
-  //
   // need to be connected to the end of a process
   QObject::connect(
     GetModel(),
@@ -158,10 +147,7 @@ QtWidgetView
 {
   QWidget * widget = otb::Wrapper::QtWidgetView::CreateInputWidgets();
 
-  otb::Wrapper::QtWidgetParameterBase *paramWidget =
-    widget->findChild<otb::Wrapper::QtWidgetParameterBase*>();
-
-  SetupParameterWidgets(paramWidget);
+  SetupParameterWidgets(widget);
 
   return widget;
 }
@@ -211,197 +197,90 @@ QtWidgetView
   initialize( qobject_cast< FileSelectionInitializer::argument_type >( widget ) );
 }
 
-/*******************************************************************************/
-/* SLOTS                                                                       */
-/*******************************************************************************/
-void
-QtWidgetView
-::OnExecButtonClicked()
+bool QtWidgetView::BeforeExecuteButtonClicked()
 {
-  if ( !IsRunning() )
+  assert(GetModel() != NULL);
+  assert(GetModel()->GetApplication() != NULL);
+  assert(I18nCoreApplication::Instance() != NULL);
+
+  // Get layer-stack, if any
+  StackedLayerModel* layerStack = I18nCoreApplication::Instance()->GetModel<StackedLayerModel>();
+
+  otb::Wrapper::Application::Pointer otbApp(GetModel()->GetApplication());
+
+  // Check output parameters of OTB-application
+  StringVector paramKeys(otbApp->GetParametersKeys());
+  QStringList  filenames1;
+
+  KeyLayerAccumulator::KeyLayerPairList layers;
+
+  for (StringVector::const_iterator it(paramKeys.begin()); it != paramKeys.end(); ++it)
+  {
+    if (otbApp->IsParameterEnabled(*it, true) && otbApp->HasValue(*it))
     {
-    assert( GetModel()!=NULL );
-    assert( GetModel()->GetApplication()!=NULL );
-  
-  
-    assert( I18nCoreApplication::Instance()!=NULL );
-  
-    //
-    // Get layer-stack, if any.
-    StackedLayerModel * layerStack =
-      I18nCoreApplication::Instance()->GetModel< StackedLayerModel >();
-  
-    otb::Wrapper::Application::Pointer otbApp( GetModel()->GetApplication() );
-  
-    //
-    // Check output parameters of OTB-application.
-    StringVector paramKeys( otbApp->GetParametersKeys() );
-    QStringList filenames1;
-  
-    KeyLayerAccumulator::KeyLayerPairList layers;
-    QStringList filenames2;
-  
-    for( StringVector::const_iterator it( paramKeys.begin() );
-         it!=paramKeys.end();
-         ++it )
+      otb::Wrapper::Parameter::Pointer param(otbApp->GetParameterByKey(*it));
+      assert(!param.IsNull());
+
+      std::string filename;
+
+      switch (otbApp->GetParameterType(*it))
       {
-      if( otbApp->IsParameterEnabled( *it, true ) &&
-          otbApp->HasValue( *it ) )
-        {
-        otb::Wrapper::Parameter::Pointer param( otbApp->GetParameterByKey( *it ) );
-        assert( !param.IsNull() );
-  
-        // qDebug()
-        // 	<< it->c_str() << ": type" << otbApp->GetParameterType( *it );
-  
-        // const char* filename = NULL;
-        std::string filename;
-  
-        switch( otbApp->GetParameterType( *it ) )
-    {
-    case otb::Wrapper::ParameterType_OutputFilename:
-      filename =
-        otb::DynamicCast< otb::Wrapper::OutputFilenameParameter >( param )
-        ->GetValue();
-      break;
-    //
-    // FILENAME.
-    //
-    // IMAGE.
-    case otb::Wrapper::ParameterType_OutputImage:
-      filename =
-        otb::DynamicCast< otb::Wrapper::OutputImageParameter >( param )
-        ->GetFileName();
-      break;
-    //
-    // VECTOR-DATA.
-    case otb::Wrapper::ParameterType_OutputVectorData:
-      filename =
-        otb::DynamicCast< otb::Wrapper::OutputVectorDataParameter >( param )
-        ->GetFileName();
-      break;
-    //
-    // NONE.
-    default:
-      break;
+      case otb::Wrapper::ParameterType_OutputFilename:
+        filename = otb::DynamicCast<otb::Wrapper::OutputFilenameParameter>(param)->GetValue();
+        break;
+
+      case otb::Wrapper::ParameterType_OutputImage:
+        filename = otb::DynamicCast<otb::Wrapper::OutputImageParameter>(param)->GetFileName();
+        break;
+
+      case otb::Wrapper::ParameterType_OutputVectorData:
+        filename = otb::DynamicCast<otb::Wrapper::OutputVectorDataParameter>(param)->GetFileName();
+        break;
+
+      default:
+        break;
+      }
+
+      if (QFileInfo(filename.c_str()).exists())
+        filenames1.push_back(filename.c_str());
+
+      if (layerStack != NULL)
+      {
+        KeyLayerAccumulator accumulator(std::for_each(layerStack->Begin(), layerStack->End(), KeyLayerAccumulator(filename, layers)));
+      }
     }
-  
-        if( QFileInfo( filename.c_str() ).exists() )
-    filenames1.push_back( filename.c_str() );
-  
-        if( layerStack!=NULL )
+  }
+
+  {
+    QString message;
+
+    if (filenames1.size() == 1)
     {
-    KeyLayerAccumulator accumulator(
-      std::for_each(
-        layerStack->Begin(),
-        layerStack->End(), KeyLayerAccumulator( filename, layers )
-      )
-    );
-  
-    if( accumulator.GetCount()>0 )
-      filenames2.push_back( filename.c_str() );
+      message = tr("Are you sure you want to overwrite file '%1'?").arg(filenames1.front());
     }
-        }
-      }
-  
+    else if (filenames1.size() > 1)
     {
-    QString message;
-  
-    if( filenames1.size()==1 )
-      {
-      // qDebug()
-      //   << it->c_str() << ":" << QString( filename.c_str() );
-  
-      message =
-        tr( "Are you sure you want to overwrite file '%1'?" )
-        .arg( filenames1.front() );
-      }
-    else if( filenames1.size()>1 )
-      {
-      message =
-        tr( "Following files will be overwritten. Are you sure you want to continue?\n- %1" )
-        .arg( filenames1.join( "\n- " ) );
-      }
-  
-    if( !message.isEmpty() )
-      {
-      QMessageBox::StandardButton button =
-        QMessageBox::question(
-    this,
-    PROJECT_NAME,
-    message,
-    QMessageBox::Yes | QMessageBox::No,
-    QMessageBox::No
-        );
-  
-      if( button==QMessageBox::No )
-        return;
-      }
+      message = tr("Following files will be overwritten. Are you sure you want to continue?\n- %1").arg(filenames1.join("\n- "));
     }
-  
+
+    if (!message.isEmpty())
     {
-    QString message;
-  
-    if( filenames2.size()==1 )
-      {
-      // qDebug()
-      //   << it->c_str() << ":" << QString( filename.c_str() );
-  
-      message =
-        tr( "File '%1' is being viewed in " PROJECT_NAME " and will be concurrently overwritten by running this %2. File will be removed from layer-stack before running %2 and reloaded after.\n\nDo you want to continue?" )
-        .arg( filenames2.front() )
-        .arg( otbApp->GetDocName() );
-      }
-    else if( filenames2.size()>1 )
-      {
-      message =
-        tr( "Following files are being viewed in " PROJECT_NAME " and will be concurrently overwritter by running %2. Files will be removed from layer-stack before running %2. Do you want to continue?\n- %1" )
-        .arg( filenames2.join( "\n- " ) )
-        .arg( otbApp->GetDocName() );
-      }
-  
-    if( !message.isEmpty() )
-      {
-      QMessageBox::StandardButton button =
-        QMessageBox::question(
-    this,
-    PROJECT_NAME,
-    message,
-    QMessageBox::Yes | QMessageBox::No,
-    QMessageBox::No
-        );
-  
-      if( button==QMessageBox::No )
-        return;
-  
-      while( !layers.empty() )
-        {
-        layerStack->Delete( layers.front().first );
-  
-        layers.pop_front();
-        }
-      }
+      QMessageBox::StandardButton button = QMessageBox::question(this, PROJECT_NAME, message, QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
+
+      if (button == QMessageBox::No)
+        return false;
     }
   }
 
-  otb::Wrapper::QtWidgetView::OnExecButtonClicked();
-}
+  // Delete from layer stack the images that will be overwritten and reloaded
+  while (!layers.empty())
+  {
+    layerStack->Delete(layers.front().first);
 
-/*******************************************************************************/
-void
-QtWidgetView
-::OnExceptionRaised( QString what  )
-{
-  qWarning() << what;
+    layers.pop_front();
+  }
 
-#if defined( OTB_DEBUG )
-  QMessageBox::warning(
-    this,
-    PROJECT_NAME,
-    what,
-    QMessageBox::Ok
-  );
-#endif
+  return true;
 }
 
 /*******************************************************************************/
@@ -429,18 +308,6 @@ QtWidgetView
     return;
     }
 
-  /*
-  // Removed as per MVDX-259.
-  QMessageBox::information(
-    this,
-    PROJECT_NAME,
-    tr( "'%1' has succeeded.\n"
-	"Result(s) will be imported as dataset(s).\n")
-    .arg( otbApp->GetName() ),
-    QMessageBox::Ok
-  );
-  */
-
   CountType count = 0;
 
   //
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
index d53f70c266f4b9e8f59aa68ee033ba2fd384dfb8..3baadd6f0f747b5f640b284fd3bd6a7aeab79254 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
@@ -765,13 +765,13 @@ public:
   void SetParameterImageBase(const std::string & key, ImageBaseType* img, unsigned int idx = 0);
 
   /**
-  Register all ProcessObject that are linked to parameters : 
+  Register all ProcessObject that are linked to parameters :
     \li ParameterType_OutputImage
     \li ParameterType_OutputVectorData
 
-    Those ProcessObjects are stored in the m_Filters set and are deleted at the 
+    Those ProcessObjects are stored in the m_Filters set and are deleted at the
   end of ExecuteAndWriteOutput (if there are only held by the set)
-  This method can be called just before the end of a DoExecute in a derived 
+  This method can be called just before the end of a DoExecute in a derived
   class of Application.
   */
   void RegisterPipeline();
@@ -850,21 +850,7 @@ protected:
    * \li ParameterType_InputImage
    */
   template <class TImageType>
-    TImageType* GetParameterImage(std::string parameter)
-  {
-    typename TImageType::Pointer ret;
-    Parameter* param = GetParameterByKey(parameter);
-    InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param);
-    if (paramDown)
-    {
-      return paramDown->GetImage<TImageType>();
-    }
-    else
-    {
-      itkExceptionMacro(<<parameter << " parameter can't be casted to ImageType");
-      return nullptr;
-    }
-  }
+  TImageType* GetParameterImage(std::string parameter);
 
   /** Declare a parameter as having an automatic value */
   void AutomaticValueOn(std::string paramKey);
@@ -878,16 +864,7 @@ protected:
    * \li ParameterType_OutputImage
    */
   template <class TImageType>
-    void SetParameterOutputImage(std::string parameter, TImageType* value)
-  {
-    Parameter* param = GetParameterByKey(parameter);
-
-    if (dynamic_cast<OutputImageParameter*>(param))
-      {
-      OutputImageParameter* paramDown = dynamic_cast<OutputImageParameter*>(param);
-      paramDown->SetValue(value);
-      }
-  }
+  void SetParameterOutputImage(std::string parameter, TImageType* value);
 
 private:
   /* Implement this method to add parameters */
@@ -963,9 +940,90 @@ private:
 } //end namespace otb
 
 
-//#ifndef OTB_MANUAL_INSTANTIATION
-//#include "otbWrapperApplication.hxx"
-//#endif
+#ifndef OTB_MANUAL_INSTANTIATION
+#include "otbWrapperApplication.hxx"
+#endif
+
+
+namespace otb
+{
+namespace Wrapper
+{
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt8VectorImageType* Application::GetParameterImage<UInt8VectorImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE Int16VectorImageType* Application::GetParameterImage<Int16VectorImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt16VectorImageType* Application::GetParameterImage<UInt16VectorImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE Int32VectorImageType* Application::GetParameterImage<Int32VectorImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt32VectorImageType* Application::GetParameterImage<UInt32VectorImageType>(std::string);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE FloatVectorImageType* Application::GetParameterImage<FloatVectorImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE DoubleVectorImageType* Application::GetParameterImage<DoubleVectorImageType>(std::string);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexInt16VectorImageType* Application::GetParameterImage<ComplexInt16VectorImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexInt32VectorImageType* Application::GetParameterImage<ComplexInt32VectorImageType>(std::string);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexFloatVectorImageType* Application::GetParameterImage<ComplexFloatVectorImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexDoubleVectorImageType* Application::GetParameterImage<ComplexDoubleVectorImageType>(std::string);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt8RGBImageType* Application::GetParameterImage<UInt8RGBImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt8RGBAImageType* Application::GetParameterImage<UInt8RGBAImageType>(std::string);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt8ImageType* Application::GetParameterImage<UInt8ImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE Int16ImageType* Application::GetParameterImage<Int16ImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt16ImageType* Application::GetParameterImage<UInt16ImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE Int32ImageType* Application::GetParameterImage<Int32ImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt32ImageType* Application::GetParameterImage<UInt32ImageType>(std::string);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE FloatImageType* Application::GetParameterImage<FloatImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE DoubleImageType* Application::GetParameterImage<DoubleImageType>(std::string);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexInt16ImageType* Application::GetParameterImage<ComplexInt16ImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexInt32ImageType* Application::GetParameterImage<ComplexInt32ImageType>(std::string);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexFloatImageType* Application::GetParameterImage<ComplexFloatImageType>(std::string);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexDoubleImageType* Application::GetParameterImage<ComplexDoubleImageType>(std::string);
+
+//
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt8VectorImageType>(std::string, UInt8VectorImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<Int16VectorImageType>(std::string, Int16VectorImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt16VectorImageType>(std::string, UInt16VectorImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<Int32VectorImageType>(std::string, Int32VectorImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt32VectorImageType>(std::string, UInt32VectorImageType*);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<FloatVectorImageType>(std::string, FloatVectorImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<DoubleVectorImageType>(std::string, DoubleVectorImageType*);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt16VectorImageType>(std::string,
+                                                                                                                            ComplexInt16VectorImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt32VectorImageType>(std::string,
+                                                                                                                            ComplexInt32VectorImageType*);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexFloatVectorImageType>(std::string,
+                                                                                                                            ComplexFloatVectorImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexDoubleVectorImageType>(std::string,
+                                                                                                                             ComplexDoubleVectorImageType*);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt8RGBImageType>(std::string, UInt8RGBImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt8RGBAImageType>(std::string, UInt8RGBAImageType*);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt8ImageType>(std::string, UInt8ImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<Int16ImageType>(std::string, Int16ImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt16ImageType>(std::string, UInt16ImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<Int32ImageType>(std::string, Int32ImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt32ImageType>(std::string, UInt32ImageType*);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<FloatImageType>(std::string, FloatImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<DoubleImageType>(std::string, DoubleImageType*);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt16ImageType>(std::string, ComplexInt16ImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt32ImageType>(std::string, ComplexInt32ImageType*);
+
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexFloatImageType>(std::string, ComplexFloatImageType*);
+extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexDoubleImageType>(std::string, ComplexDoubleImageType*);
+
+} // namespace Wrapper
+} // namespace otb
 
 
 #endif // otbWrapperApplication_h_
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.hxx b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.hxx
new file mode 100644
index 0000000000000000000000000000000000000000..33330cd2418fa7c81e506806d6a43b3d9d583f23
--- /dev/null
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.hxx
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2005-2019 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.
+ */
+
+#ifndef otbWrapperApplication_hxx
+#define otbWrapperApplication_hxx
+
+
+#include "otbWrapperApplication.h"
+
+
+namespace otb
+{
+
+
+namespace Wrapper
+{
+
+
+template <class TImageType>
+TImageType*
+Application
+::GetParameterImage(std::string parameter)
+
+{
+  typename TImageType::Pointer ret;
+  Parameter* param = GetParameterByKey(parameter);
+  InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param);
+  if (paramDown)
+    {
+    return paramDown->GetImage<TImageType>();
+    }
+  else
+    {
+    itkExceptionMacro(<<parameter << " parameter can't be casted to ImageType");
+    return nullptr;
+    }
+}
+
+
+template <class TImageType>
+void
+Application
+::SetParameterOutputImage(std::string parameter, TImageType* value)
+{
+  Parameter* param = GetParameterByKey(parameter);
+
+  if (dynamic_cast<OutputImageParameter*>(param))
+    {
+    OutputImageParameter* paramDown = dynamic_cast<OutputImageParameter*>(param);
+    paramDown->SetValue(value);
+    }
+}
+
+
+} // End namespace Wrapper
+
+} // End namespace otb
+
+#endif
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperCastImage.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperCastImage.h
new file mode 100644
index 0000000000000000000000000000000000000000..0e975d7adc2fea303e776ad7202cda5e7852f689
--- /dev/null
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperCastImage.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2005-2019 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.
+ */
+
+#ifndef otbWrapperCastimage_h
+#define otbWrapperCastimage_h
+
+
+#include "otbClampImageFilter.h"
+
+#include "OTBApplicationEngineExport.h"
+
+#include "otbWrapperTypes.h"
+
+
+namespace otb
+{
+namespace Wrapper
+{
+namespace details
+{
+
+/** \class CastImage
+ *  \brief Helper class (private) which casts and clamps input-image type into
+ *  output-image type.
+ *
+ * \ingroup OTBApplicationEngine
+ */
+template <typename TOutputImage, typename TInputImage>
+struct OTBApplicationEngine_EXPORT_TEMPLATE CastImage
+{
+  /** Input clamping */
+  using InputClampImageFilter = ClampImageFilter<TInputImage, DoubleVectorImageType>;
+
+  /** Output clamping */
+  using OutputClampImageFilter = ClampImageFilter<DoubleVectorImageType, TOutputImage>;
+
+
+  /** Constructor. */
+  CastImage(TInputImage* in) : icif(InputClampImageFilter::New()), ocif(OutputClampImageFilter::New()), out(ocif->GetOutput())
+  {
+    assert(in);
+
+    icif->SetInput(in);
+
+    ocif->SetInput(icif->GetOutput());
+  }
+
+  /** Input-image clamp filter. */
+  typename InputClampImageFilter::Pointer icif;
+
+  /** Output-image clamp filter. */
+  typename OutputClampImageFilter::Pointer ocif;
+
+  /** Output image. */
+  TOutputImage* out;
+};
+
+
+/** \class CastImage
+ *  \brief Partial template specialization which optimizes processing
+ * pipeline when input-image is DoubleVectorImageType.
+ *
+ * \ingroup OTBApplicationEngine
+ */
+template <typename TOutputImage>
+struct OTBApplicationEngine_EXPORT_TEMPLATE CastImage<TOutputImage, DoubleVectorImageType>
+{
+  /** Output clamping */
+  using OutputClampImageFilter = ClampImageFilter<DoubleVectorImageType, TOutputImage>;
+
+
+  /** Constructor. */
+  CastImage(DoubleVectorImageType* in) : ocif(OutputClampImageFilter::New()), out(ocif->GetOutput())
+  {
+    assert(in);
+
+    ocif->SetInput(in);
+  }
+
+  /** Input-image clamp filter. */
+  itk::ProcessObject::Pointer icif;
+
+  /** Output-image clamp filter. */
+  typename OutputClampImageFilter::Pointer ocif;
+
+  /** Output image. */
+  TOutputImage* out;
+};
+
+
+/** \class CastImage
+ *  \brief Template specialization which optimizes the processing
+ *  pipeline when input-image and output-image types are identical.
+ *
+ * \ingroup OTBApplicationEngine
+ */
+template <typename T>
+struct OTBApplicationEngine_EXPORT_TEMPLATE CastImage<T, T>
+{
+  CastImage(T* in) : out(in)
+  {
+    assert(in);
+  }
+
+  itk::ProcessObject::Pointer icif;
+  itk::ProcessObject::Pointer ocif;
+  T*                          out;
+};
+
+
+/** \class CastImage
+ *  \brief Template specialization which optimizes the processing
+ *  pipeline when input-image and output-image types are identical.
+ *
+ * \ingroup OTBApplicationEngine
+ */
+template <>
+struct OTBApplicationEngine_EXPORT_TEMPLATE CastImage<DoubleVectorImageType, DoubleVectorImageType>
+{
+  CastImage(DoubleVectorImageType* in) : out(in)
+  {
+    assert(in);
+  }
+
+  itk::ProcessObject::Pointer icif;
+  itk::ProcessObject::Pointer ocif;
+  DoubleVectorImageType*      out;
+};
+
+} // namespace details.
+
+} // namespace Wrapper
+
+} // namespace otb
+
+#endif
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h
index 80aefb371880dc53c0272de0496152b26f0c7a79..a49e4c2bfb477da878372e778b3174755361d5d3 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h
@@ -21,9 +21,13 @@
 #ifndef otbWrapperInputImageParameter_h
 #define otbWrapperInputImageParameter_h
 
+
 #include "otbImageFileReader.h"
-#include "itkImageBase.h"
+#include "otbClampImageFilter.h"
 #include "otbWrapperParameter.h"
+
+#include "itkImageBase.h"
+
 #include <string>
 
 namespace otb
@@ -56,27 +60,28 @@ public:
   itkGetConstReferenceMacro( FileName, std::string );
 
 
-  /** Get the input image as FloatVectorImageType. */
-  FloatVectorImageType* GetImage();
+  /** Get input-image as ImageBaseType. */
+  ImageBaseType const* GetImage() const;
+  ImageBaseType*       GetImage();
 
   /** Get the input image as XXXImageType */
-  UInt8ImageType* GetUInt8Image();
+  UInt8ImageType*  GetUInt8Image();
   UInt16ImageType* GetUInt16Image();
-  Int16ImageType* GetInt16Image();
+  Int16ImageType*  GetInt16Image();
   UInt32ImageType* GetUInt32Image();
-  Int32ImageType* GetInt32Image();
-  FloatImageType* GetFloatImage();
+  Int32ImageType*  GetInt32Image();
+  FloatImageType*  GetFloatImage();
   DoubleImageType* GetDoubleImage();
 
-  UInt8VectorImageType* GetUInt8VectorImage();
+  UInt8VectorImageType*  GetUInt8VectorImage();
   UInt16VectorImageType* GetUInt16VectorImage();
-  Int16VectorImageType* GetInt16VectorImage();
+  Int16VectorImageType*  GetInt16VectorImage();
   UInt32VectorImageType* GetUInt32VectorImage();
-  Int32VectorImageType* GetInt32VectorImage();
-  FloatVectorImageType* GetFloatVectorImage();
+  Int32VectorImageType*  GetInt32VectorImage();
+  FloatVectorImageType*  GetFloatVectorImage();
   DoubleVectorImageType* GetDoubleVectorImage();
 
-  UInt8RGBImageType* GetUInt8RGBImage();
+  UInt8RGBImageType*  GetUInt8RGBImage();
   UInt8RGBAImageType* GetUInt8RGBAImage();
 
   // Complex image
@@ -94,12 +99,8 @@ public:
   template <class TImageType>
     TImageType* GetImage();
 
-  /** Set a FloatVectorImageType image.*/
-  void SetImage(FloatVectorImageType* image);
-
   /** Set a templated image.*/
-  template <class TImageType>
-    void SetImage(TImageType* image);
+  void SetImage(ImageBaseType* image);
 
 
   /** Generic cast method that will be specified for each image type. */
@@ -120,48 +121,30 @@ protected:
   /** Destructor */
   ~InputImageParameter() override;
 
-  ImageBaseType::Pointer m_Image;
-  std::string m_FileName;
-
-  /** Readers typedefs */
-
-  typedef otb::ImageFileReader<UInt8ImageType> UInt8ReaderType;
-  typedef otb::ImageFileReader<Int16ImageType> Int16ReaderType;
-  typedef otb::ImageFileReader<UInt16ImageType> UInt16ReaderType;
-  typedef otb::ImageFileReader<Int32ImageType> Int32ReaderType;
-  typedef otb::ImageFileReader<UInt32ImageType> UInt32ReaderType;
-  typedef otb::ImageFileReader<FloatImageType> FloatReaderType;
-  typedef otb::ImageFileReader<DoubleImageType> DoubleReaderType;
-
-  typedef otb::ImageFileReader<UInt8VectorImageType> UInt8VectorReaderType;
-  typedef otb::ImageFileReader<Int16VectorImageType> Int16VectorReaderType;
-  typedef otb::ImageFileReader<UInt16VectorImageType> UInt16VectorReaderType;
-  typedef otb::ImageFileReader<Int32VectorImageType> Int32VectorReaderType;
-  typedef otb::ImageFileReader<UInt32VectorImageType> UInt32VectorReaderType;
-  typedef otb::ImageFileReader<FloatVectorImageType> FloatVectorReaderType;
-  typedef otb::ImageFileReader<DoubleVectorImageType> DoubleVectorReaderType;
+private:
+  InputImageParameter(const Parameter&) = delete;
+  void operator=(const Parameter&) = delete;
 
+  std::string                 m_FileName;
+  itk::ProcessObject::Pointer m_Reader;
 
-  typedef otb::ImageFileReader<UInt8RGBImageType>  UInt8RGBReaderType;
-  typedef otb::ImageFileReader<UInt8RGBAImageType> UInt8RGBAReaderType;
+  ImageBaseType::Pointer m_Image;
 
-  // Complex
-  typedef otb::ImageFileReader<ComplexInt16ImageType> ComplexInt16ReaderType;
-  typedef otb::ImageFileReader<ComplexInt32ImageType> ComplexInt32ReaderType;
-  typedef otb::ImageFileReader<ComplexFloatImageType> ComplexFloatReaderType;
-  typedef otb::ImageFileReader<ComplexDoubleImageType> ComplexDoubleReaderType;
+  itk::ProcessObject::Pointer m_InputCaster;
+  itk::ProcessObject::Pointer m_OutputCaster;
 
-  typedef otb::ImageFileReader<ComplexInt16VectorImageType> ComplexInt16VectorReaderType;
-  typedef otb::ImageFileReader<ComplexInt32VectorImageType> ComplexInt32VectorReaderType;
-  typedef otb::ImageFileReader<ComplexFloatVectorImageType> ComplexFloatVectorReaderType;
-  typedef otb::ImageFileReader<ComplexDoubleVectorImageType> ComplexDoubleVectorReaderType;
+private:
+  /** */
+  template <typename T>
+  using InputClampImageFilter = ClampImageFilter<T, otb::Wrapper::DoubleVectorImageType>;
 
-  itk::ProcessObject::Pointer m_Reader;
-  itk::ProcessObject::Pointer m_Caster;
+  /** */
+  template <typename T>
+  using OutputClampImageFilter = ClampImageFilter<otb::Wrapper::DoubleVectorImageType, T>;
 
-private:
-  InputImageParameter(const Parameter &) = delete;
-  void operator =(const Parameter&) = delete;
+  /** */
+  template <typename TOutputImage, typename TInputImage>
+  TOutputImage* Cast(TInputImage*);
 
   /** Store the loaded image filename */
   std::string m_PreviousFileName;
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.hxx b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.hxx
index eb0f507910c6baf093bcb2297784fa6bad00f35c..37ffbd7efae807466a60d05f708ea29ac271c49f 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.hxx
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.hxx
@@ -23,7 +23,7 @@
 
 #include "otbWrapperInputImageParameter.h"
 
-#include "otbClampImageFilter.h"
+#include "otbWrapperCastImage.h"
 
 namespace otb
 {
@@ -31,7 +31,70 @@ namespace Wrapper
 {
 
 
-#define INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION 0
+#define CLAMP_IMAGE_IF( Out, In, image_base )	\
+  {							\
+    In * in_image = dynamic_cast< In * >( image_base );	\
+							\
+    if( in_image )						\
+      return Cast< Out, In >( in_image );			\
+  }
+
+#define CLAMP_IMAGE_BASE( T, image_base )				\
+  {									\
+    CLAMP_IMAGE_IF( T, UInt8VectorImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, Int16VectorImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, UInt16VectorImageType, image_base );	\
+    CLAMP_IMAGE_IF( T, Int32VectorImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, UInt32VectorImageType, image_base );	\
+									\
+    CLAMP_IMAGE_IF( T, FloatVectorImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, DoubleVectorImageType, image_base );	\
+									\
+    CLAMP_IMAGE_IF( T, ComplexInt16VectorImageType, image_base );	\
+    CLAMP_IMAGE_IF( T, ComplexInt32VectorImageType, image_base );	\
+									\
+    CLAMP_IMAGE_IF( T, ComplexFloatVectorImageType, image_base );	\
+    CLAMP_IMAGE_IF( T, ComplexDoubleVectorImageType, image_base );	\
+    									\
+    CLAMP_IMAGE_IF( T, UInt8RGBImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, UInt8RGBAImageType, image_base );		\
+									\
+    CLAMP_IMAGE_IF( T, UInt8ImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, Int16ImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, UInt16ImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, Int32ImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, UInt32ImageType, image_base );		\
+									\
+    CLAMP_IMAGE_IF( T, FloatImageType, image_base );		\
+    CLAMP_IMAGE_IF( T, DoubleImageType, image_base );		\
+									\
+    CLAMP_IMAGE_IF( T, ComplexInt16ImageType, image_base );	\
+    CLAMP_IMAGE_IF( T, ComplexInt32ImageType, image_base );	\
+									\
+    CLAMP_IMAGE_IF( T, ComplexFloatImageType, image_base );	\
+    CLAMP_IMAGE_IF( T, ComplexDoubleImageType, image_base );	\
+									\
+    return nullptr;							\
+  }
+
+
+template< typename TOutputImage,
+	  typename TInputImage >
+TOutputImage *
+InputImageParameter
+::Cast( TInputImage * image )
+{
+  details::CastImage< TOutputImage, TInputImage > clamp( image );
+
+  if( clamp.ocif )
+    clamp.ocif->UpdateOutputInformation();
+
+  m_InputCaster = clamp.icif;
+  m_OutputCaster = clamp.ocif;
+
+  return clamp.out;
+}
+
 
 template <class TImageType>
 TImageType*
@@ -68,10 +131,6 @@ InputImageParameter::GetImage()
       }
     else
       {
-#if INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION
-      return dynamic_cast< TImageType* >( m_Image.GetPointer() );
-
-#else // INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION
       // In this case, the reader and the image should already be there
       if (m_Image.IsNull())
         {
@@ -89,7 +148,6 @@ InputImageParameter::GetImage()
           itkExceptionMacro("Cannot ask a different image type");
           }
         }
-#endif // INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION
       }
     }
 
@@ -98,119 +156,10 @@ InputImageParameter::GetImage()
     //////////////////////// Image case:
     if (m_Image.IsNull())
       {
-#if INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION
-      itkExceptionMacro("No input image or filename detected...");
-#else
       return nullptr;
-#endif
       }
     else
-      {
-      if (dynamic_cast<UInt8ImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt8ImageType, TImageType> ();
-        }
-      else if (dynamic_cast<Int16ImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<Int16ImageType, TImageType> ();
-        }
-      else if (dynamic_cast<UInt16ImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt16ImageType, TImageType> ();
-        }
-      else if (dynamic_cast<Int32ImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<Int32ImageType, TImageType> ();
-        }
-      else if (dynamic_cast<UInt32ImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt32ImageType, TImageType> ();
-        }
-      else if (dynamic_cast<FloatImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<FloatImageType, TImageType> ();
-        }
-      else if (dynamic_cast<DoubleImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<DoubleImageType, TImageType> ();
-        }
-      else if (dynamic_cast<ComplexInt16ImageType*>(m_Image.GetPointer()))
-        {
-        return CastImage<ComplexInt16ImageType, TImageType>();
-        }
-      else if (dynamic_cast<ComplexInt32ImageType*>(m_Image.GetPointer()))
-        {
-        return CastImage<ComplexInt32ImageType, TImageType>();
-        }
-      else if (dynamic_cast<ComplexFloatImageType*>(m_Image.GetPointer()))
-        {
-        return CastImage<ComplexFloatImageType, TImageType>();
-        }
-      else if (dynamic_cast<ComplexDoubleImageType*>(m_Image.GetPointer()))
-        {
-        return CastImage<ComplexDoubleImageType, TImageType>();
-        }
-      else if (dynamic_cast<UInt8VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt8VectorImageType, TImageType> ();
-        }
-      else if (dynamic_cast<Int16VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<Int16VectorImageType, TImageType> ();
-        }
-      else if (dynamic_cast<UInt16VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt16VectorImageType, TImageType> ();
-        }
-      else if (dynamic_cast<Int32VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<Int32VectorImageType, TImageType> ();
-        }
-      else if (dynamic_cast<UInt32VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt32VectorImageType, TImageType> ();
-        }
-      else if (dynamic_cast<FloatVectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<FloatVectorImageType, TImageType> ();
-        }
-      else if (dynamic_cast<DoubleVectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<DoubleVectorImageType, TImageType> ();
-        }
-      else if (dynamic_cast<UInt8RGBAImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt8RGBAImageType, TImageType> ();
-        }
-      else if (dynamic_cast<UInt8RGBImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt8RGBImageType, TImageType> ();
-        }
-      else if (dynamic_cast<ComplexInt16VectorImageType*>(m_Image.GetPointer()))
-        {
-        return CastImage<ComplexInt16VectorImageType, TImageType>();
-        }
-      else if (dynamic_cast<ComplexInt32VectorImageType*>(m_Image.GetPointer()))
-        {
-        return CastImage<ComplexInt32VectorImageType, TImageType>();
-        }
-      else if (dynamic_cast<ComplexFloatVectorImageType*>(m_Image.GetPointer()))
-        {
-        return CastImage<ComplexFloatVectorImageType, TImageType>();
-        }
-      else if (dynamic_cast<ComplexDoubleVectorImageType*>(m_Image.GetPointer()))
-        {
-        return CastImage<ComplexDoubleVectorImageType, TImageType>();
-        }
-      else
-        {
-#if INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION
-        itkExceptionMacro("Unknown image type");
-#else
-	return nullptr;
-#endif
-        }
-      }
+      CLAMP_IMAGE_BASE( TImageType, m_Image.GetPointer() );
     }
 }
 
@@ -221,41 +170,6 @@ ImageBaseType*
 InputImageParameter::GetImage<ImageBaseType>();
 
 
-template <class TInputImage, class TOutputImage>
-TOutputImage*
-InputImageParameter::CastImage()
-{
-  if ( dynamic_cast<TOutputImage*> (m_Image.GetPointer()) )
-    {
-    return dynamic_cast<TOutputImage*> (m_Image.GetPointer());
-    }
-  else
-    {
-    TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer());
-
-    typedef ClampImageFilter<TInputImage, TOutputImage> CasterType;
-    typename CasterType::Pointer caster = CasterType::New();
-
-    caster->SetInput(realInputImage);
-    caster->UpdateOutputInformation();
-
-    m_Image = caster->GetOutput();
-    m_Caster = caster;
-
-    return caster->GetOutput();
-    } 
-  // itkExceptionMacro("Cast from "<<typeid(TInputImage).name()<<" to "<<typeid(TOutputImage).name()<<" not authorized.");
-}
-
-template <class TInputImage>
-void
-InputImageParameter::SetImage(TInputImage* image)
-{
-  m_UseFilename = false;
-  m_Image = image;
-}
-
-
 } // End namespace Wrapper
 } // End namespace otb
 
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
index 5a454d57bae108501f0822770616775ed914034e..ec7a1a8f859118d6d63c12872476647fe54b062d 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
@@ -27,6 +27,7 @@
 #include "otbImageFileWriter.h"
 #include <string>
 
+
 namespace otb
 {
 namespace Wrapper
@@ -126,36 +127,34 @@ protected:
   /** Destructor */
   ~OutputImageParameter() override;
 
-  template <class TInput>
-    int SwitchInput(TInput *img);
-
-  //FloatVectorImageType::Pointer m_Image;
-  ImageBaseType::Pointer m_Image;
-  std::string            m_FileName;
-  ImagePixelType         m_PixelType;
-  ImagePixelType         m_DefaultPixelType;
-
 private:
   OutputImageParameter(const Parameter &) = delete;
   void operator =(const Parameter&) = delete;
 
-  unsigned int                  m_RAMValue;
+  /** Switch TInputImage according to expected output type. */
+  template <typename TInputImage>
+  void SwitchInput(TInputImage*);
+
+  /** */
+  template <typename TOutputImage, typename TInputImage>
+  void ClampAndWriteVectorImage(TInputImage*);
 
-  itk::ProcessObject::Pointer m_Caster;
+  // FloatVectorImageType::Pointer m_Image;
+  ImageBaseType::Pointer m_Image;
+
+  itk::ProcessObject::Pointer m_InputCaster;
+  itk::ProcessObject::Pointer m_OutputCaster;
 
   itk::ProcessObject::Pointer m_Writer;
 
-}; // End class OutputImage Parameter
+  std::string m_FileName;
 
-// Declare specialisation for UInt8RGBAImageType
-template <>
-int
-OutputImageParameter::SwitchInput(UInt8RGBAImageType *img);
+  ImagePixelType m_PixelType;
+  ImagePixelType m_DefaultPixelType;
 
-// Declare specialisation for UInt8RGBImageType
-template <>
-int
-OutputImageParameter::SwitchInput(UInt8RGBImageType *img);
+  unsigned int m_RAMValue;
+
+}; // End class OutputImage Parameter
 
 } // End namespace Wrapper
 } // End namespace otb
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h
index 5b19add53105b36ef412e459231f76179d7c4396..136489e96ba1cfc9acfff1d4a29f89ed9083d471 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h
@@ -105,6 +105,8 @@ public:
 
   TiXmlElement* ParseApplication(Application::Pointer app);
 
+  static std::string MakeCommandLine(otb::Wrapper::Application::Pointer application);
+
 protected:
 
   OutputProcessXMLParameter();
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h
index 0a93e62995f0dba21b7f35d89457d963d29b9c7e..6ab769e5eca20ac6d8c7b575680e32ca0b0de784 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h
@@ -21,13 +21,18 @@
 #ifndef otbWrapperParameter_h
 #define otbWrapperParameter_h
 
-#include "otbMacro.h"
-#include "itkObjectFactory.h"
 
-#include "otbWrapperTypes.h"
 #include "OTBApplicationEngineExport.h"
+#include "otbMacro.h"
+#include "otbWrapperTypes.h"
+
+
+#include <itkObjectFactory.h>
+
+
 #include <string>
 
+
 namespace otb
 {
 namespace Wrapper
@@ -65,11 +70,11 @@ public:
   /** Set/get the parameter key */
   virtual void SetKey(const std::string&);
   virtual const char* GetKey() const;
-  
+
   /** Set the parameter Active flag */
   virtual void SetActive(bool flag);
   bool GetActive(bool recurseParents = false) const;
-  
+
   /** Set the parameter Mandatory flag */
   virtual void SetMandatory(bool flag);
   virtual bool GetMandatory() const;
@@ -78,19 +83,19 @@ public:
 
   /** Set the parameter AutomaticValue flag (which is the opposite of UserValue)*/
   virtual void SetAutomaticValue(bool flag);
- 
+
   /** Get the parameter AutomaticValue flag */
   virtual bool GetAutomaticValue() const;
-  
+
   /** Toogle ON the parameter AutomaticValue flag */
   void AutomaticValueOn();
-  
+
   /** Toogle OFF the parameter AutomaticValue flag */
   void AutomaticValueOff();
 
   /** Set the user access level */
   virtual void SetUserLevel(const UserLevel level);
-  
+
   /** Get the user access level */
   virtual UserLevel GetUserLevel() const;
 
@@ -104,7 +109,7 @@ public:
    * nothing
    */
   virtual void Reset();
-  
+
   virtual bool HasValue() const = 0;
 
   virtual bool HasUserValue() const;
diff --git a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt
index 6f0b8809cb026b1b4143277ac45e41c4d9d62529..fb220c564fbe628d9e9469f6f3f438352caa6454 100644
--- a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt
+++ b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt
@@ -1,3 +1,4 @@
+
 #
 # Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES)
 #
@@ -57,6 +58,7 @@ set( OTBApplicationEngine_SRC
   otbWrapperBoolParameter.cxx
   otbWrapperMetaDataHelper.cxx
   otbWrapperParameter.cxx
+  otbWrapperCastImage.cxx
   otbWrapperTypes.cxx
   )
 
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
index 8c0d624ae5e2f79bf323b3c41d3821d0ad38a5b3..4297ae946d62476a88847a9974cd5aff72526fb3 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
@@ -71,6 +71,80 @@ ExceptionObject(file, line, message, loc)
 namespace Wrapper
 {
 
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt8VectorImageType* Application::GetParameterImage<UInt8VectorImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE Int16VectorImageType* Application::GetParameterImage<Int16VectorImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt16VectorImageType* Application::GetParameterImage<UInt16VectorImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE Int32VectorImageType* Application::GetParameterImage<Int32VectorImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt32VectorImageType* Application::GetParameterImage<UInt32VectorImageType>(std::string);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE FloatVectorImageType* Application::GetParameterImage<FloatVectorImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE DoubleVectorImageType* Application::GetParameterImage<DoubleVectorImageType>(std::string);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexInt16VectorImageType* Application::GetParameterImage<ComplexInt16VectorImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexInt32VectorImageType* Application::GetParameterImage<ComplexInt32VectorImageType>(std::string);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexFloatVectorImageType* Application::GetParameterImage<ComplexFloatVectorImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexDoubleVectorImageType* Application::GetParameterImage<ComplexDoubleVectorImageType>(std::string);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt8RGBImageType* Application::GetParameterImage<UInt8RGBImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt8RGBAImageType* Application::GetParameterImage<UInt8RGBAImageType>(std::string);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt8ImageType* Application::GetParameterImage<UInt8ImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE Int16ImageType* Application::GetParameterImage<Int16ImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt16ImageType* Application::GetParameterImage<UInt16ImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE Int32ImageType* Application::GetParameterImage<Int32ImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt32ImageType* Application::GetParameterImage<UInt32ImageType>(std::string);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE FloatImageType* Application::GetParameterImage<FloatImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE DoubleImageType* Application::GetParameterImage<DoubleImageType>(std::string);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexInt16ImageType* Application::GetParameterImage<ComplexInt16ImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexInt32ImageType* Application::GetParameterImage<ComplexInt32ImageType>(std::string);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexFloatImageType* Application::GetParameterImage<ComplexFloatImageType>(std::string);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexDoubleImageType* Application::GetParameterImage<ComplexDoubleImageType>(std::string);
+
+//
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt8VectorImageType>(std::string, UInt8VectorImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<Int16VectorImageType>(std::string, Int16VectorImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt16VectorImageType>(std::string, UInt16VectorImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<Int32VectorImageType>(std::string, Int32VectorImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt32VectorImageType>(std::string, UInt32VectorImageType*);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<FloatVectorImageType>(std::string, FloatVectorImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<DoubleVectorImageType>(std::string, DoubleVectorImageType*);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt16VectorImageType>(std::string,
+                                                                                                                              ComplexInt16VectorImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt32VectorImageType>(std::string,
+                                                                                                                              ComplexInt32VectorImageType*);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexFloatVectorImageType>(std::string,
+                                                                                                                              ComplexFloatVectorImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexDoubleVectorImageType>(std::string,
+                                                                                                                               ComplexDoubleVectorImageType*);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt8RGBImageType>(std::string, UInt8RGBImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt8RGBAImageType>(std::string, UInt8RGBAImageType*);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt8ImageType>(std::string, UInt8ImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<Int16ImageType>(std::string, Int16ImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt16ImageType>(std::string, UInt16ImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<Int32ImageType>(std::string, Int32ImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt32ImageType>(std::string, UInt32ImageType*);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<FloatImageType>(std::string, FloatImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<DoubleImageType>(std::string, DoubleImageType*);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt16ImageType>(std::string, ComplexInt16ImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt32ImageType>(std::string, ComplexInt32ImageType*);
+
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexFloatImageType>(std::string, ComplexFloatImageType*);
+template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexDoubleImageType>(std::string, ComplexDoubleImageType*);
+
+
 void Application::SetName( const std::string & name )
 {
   m_Name = name;
@@ -466,8 +540,7 @@ Application::RegisterPipeline()
     if ( GetParameterType(key) == ParameterType_OutputImage )
       {
       Parameter* param = GetParameterByKey(key);
-      OutputImageParameter * outP = 
-        dynamic_cast< OutputImageParameter * >( param );
+      OutputImageParameter* outP    = dynamic_cast<OutputImageParameter*>(param);
       itk::ImageBase< 2 > * outData = outP->GetValue();
       if ( outData )
         dataStack.push(outData);
@@ -475,8 +548,7 @@ Application::RegisterPipeline()
     else if ( GetParameterType(key) == ParameterType_OutputVectorData )
       {
       Parameter* param = GetParameterByKey(key);
-      OutputVectorDataParameter * outP = 
-        dynamic_cast< OutputVectorDataParameter * >( param );
+      OutputVectorDataParameter* outP    = dynamic_cast<OutputVectorDataParameter*>(param);
       VectorDataType * outData = outP->GetValue();
       if ( outData )
         dataStack.push(outData);
@@ -484,8 +556,7 @@ Application::RegisterPipeline()
     else if ( GetParameterType(key) == ParameterType_InputImage )
       {
       Parameter* param = GetParameterByKey(key);
-      InputImageParameter * inP = 
-        dynamic_cast< InputImageParameter * >( param );
+      InputImageParameter* inP   = dynamic_cast<InputImageParameter*>(param);
       if ( !inP->HasValue() )
         continue;
       ImageBaseType * inData = inP->GetImage< ImageBaseType >();
@@ -495,13 +566,12 @@ Application::RegisterPipeline()
     else if ( GetParameterType(key) == ParameterType_InputImageList )
       {
       Parameter * param = GetParameterByKey(key);
-      InputImageListParameter * inP = 
-        dynamic_cast< InputImageListParameter * > ( param );
+      InputImageListParameter* inP   = dynamic_cast<InputImageListParameter*>(param);
       if ( !inP->HasValue() )
         continue;
       const FloatVectorImageListType * list = inP->GetImageList();
-      for ( auto it = list->Begin() ; it != list->End() ; ++it ) 
-        {
+      for (auto it = list->Begin(); it != list->End(); ++it)
+      {
         FloatVectorImageType * inData = it.Get().GetPointer();
         if ( inData && !inputData.count(inData) )
           inputData.insert(inData);
@@ -546,10 +616,9 @@ Application::RegisterPipeline()
     // if current is a list push every of its members in datastack
     if ( dynamic_cast< DataObjectListInterface *> (current) )
       {
-      DataObjectListInterface * list = 
-        dynamic_cast< DataObjectListInterface *> (current);
-      int length = list->Size();
-      for ( int i = 0 ; i < length ; i++ )
+        DataObjectListInterface* list   = dynamic_cast<DataObjectListInterface*>(current);
+        int                      length = list->Size();
+        for (int i = 0; i < length; i++)
         {
         itk::DataObject * newData = list->GetNthDataObject(i);
         if ( !current || inputData.count( current ) )
@@ -627,10 +696,9 @@ void Application::FreeRessources()
       // If input is a list
       if ( dynamic_cast< DataObjectListInterface *> (data.GetPointer()) )
         {
-        DataObjectListInterface * list = 
-          dynamic_cast< DataObjectListInterface *> (data.GetPointer());
-        int length = list->Size();
-        for ( int i = 0 ; i < length ; i++ )
+          DataObjectListInterface* list   = dynamic_cast<DataObjectListInterface*>(data.GetPointer());
+          int                      length = list->Size();
+          for (int i = 0; i < length; i++)
           {
           itk::DataObject * newData = list->GetNthDataObject(i);
           if ( !newData || dataSet.count( newData ) )
@@ -693,7 +761,7 @@ int Application::Execute()
   m_IsInPrivateDo = true;
   this->DoExecute();
   m_IsInPrivateDo = false;
-  
+
   // Ensure that all output image parameter have called UpdateOutputInformation()
   for (auto it = paramList.begin(); it != paramList.end(); ++it)
     {
@@ -806,7 +874,7 @@ int Application::ExecuteAndWriteOutput()
 
   this->AfterExecuteAndWriteOutputs();
   m_Chrono.Stop();
-  
+
   FreeRessources();
   m_Filters.clear();
   return status;
@@ -1513,7 +1581,7 @@ Application::SetParameterImageBase(const std::string & key, ImageBaseType* img,
   if (dynamic_cast<InputImageParameter*>(param))
     {
     InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param);
-    paramDown->SetImage<ImageBaseType>(img);
+    paramDown->SetImage(img);
     }
   else if (dynamic_cast<InputImageListParameter*>(param))
     {
diff --git a/Modules/Feature/SeamCarving/test/otbSeamCarvingTestDriver.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperCastImage.cxx
similarity index 93%
rename from Modules/Feature/SeamCarving/test/otbSeamCarvingTestDriver.cxx
rename to Modules/Wrappers/ApplicationEngine/src/otbWrapperCastImage.cxx
index fb60f6825789081e61c2b52bad4e851b9758170f..347954c65e2bc783195d69db17d8a7619f42a0c1 100644
--- a/Modules/Feature/SeamCarving/test/otbSeamCarvingTestDriver.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperCastImage.cxx
@@ -18,8 +18,4 @@
  * limitations under the License.
  */
 
-#include "otbTestMain.h"
-
-void RegisterTests()
-{
-}
+#include "otbWrapperCastImage.h"
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx
index 65d6d6780585ceaa9bb696d18dbbc1da3b39f6dd..6959aba4ff523f3d14717e52babe45c43efae7b7 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx
@@ -24,6 +24,7 @@
 #include "otbWrapperInputImageParameterMacros.h"
 #include "otb_boost_string_header.h"
 
+
 namespace otb
 {
 
@@ -62,12 +63,18 @@ InputImageParameter::SetFromFileName(const std::string& filename)
 }
 
 
-FloatVectorImageType*
-InputImageParameter::GetImage()
+ImageBaseType* InputImageParameter ::GetImage()
+{
+  return m_Image.GetPointer();
+}
+
+
+ImageBaseType const* InputImageParameter ::GetImage() const
 {
-  return this->GetImage<FloatVectorImageType>();
+  return m_Image.GetPointer();
 }
 
+
 template <>
 ImageBaseType*
 InputImageParameter::GetImage<ImageBaseType>()
@@ -81,21 +88,18 @@ InputImageParameter::GetImage<ImageBaseType>()
 otbGetImageMacro(UInt8RGBImage);
 otbGetImageMacro(UInt8RGBAImage);
 
-void
-InputImageParameter::SetImage(FloatVectorImageType* image)
+
+void InputImageParameter ::SetImage(ImageBaseType* image)
 {
   m_UseFilename = false;
-  this->SetImage<FloatVectorImageType>( image );
+  m_Image       = image;
 }
 
 
 bool
 InputImageParameter::HasValue() const
 {
-  if( m_FileName.empty() && m_Image.IsNull() )
-    return false;
-  else
-    return true;
+  return !m_FileName.empty() || !m_Image.IsNull();
 }
 
 void
@@ -104,7 +108,8 @@ InputImageParameter
 {
   m_Image  = nullptr;
   m_Reader = nullptr;
-  m_Caster = nullptr;
+  m_InputCaster     = nullptr;
+  m_OutputCaster    = nullptr;
   m_FileName = "";
   m_PreviousFileName="";
   m_UseFilename = true;
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx
index 7dcd30d0bfebe934c618c9a9ea43fc6d6e65b191..39b36a355b29517de756b0193206a053434fff36 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx
@@ -19,35 +19,54 @@
  */
 
 #include "otbWrapperOutputImageParameter.h"
+
 #include "otbClampImageFilter.h"
 #include "otbImageIOFactory.h"
-#include "itksys/SystemTools.hxx"
+#include "otbWrapperCastImage.h"
 
 #ifdef OTB_USE_MPI
-
 #include "otbMPIConfig.h"
 #include "otbMPIVrtWriter.h"
-
 #ifdef OTB_USE_SPTW
 #include "otbSimpleParallelTiffWriter.h"
 #endif
-
 #endif
 
+#include "itksys/SystemTools.hxx"
+
+
+#define CAST_IMAGE_BASE(T, image_base)     \
+  {                                        \
+    T* img = dynamic_cast<T*>(image_base); \
+                                           \
+    if (img)                               \
+    {                                      \
+      SwitchInput<T>(img);                 \
+                                           \
+      return;                              \
+    }                                      \
+  }
+
+
 namespace otb
 {
 namespace Wrapper
 {
 
-OutputImageParameter::OutputImageParameter()
-  : m_PixelType(ImagePixelType_float),
-    m_DefaultPixelType(ImagePixelType_float),
-    m_RAMValue(0),
-    m_Caster(nullptr),
-    m_Writer(nullptr)
+
+// Declare specialisation for UInt8RGBAImageType
+template <>
+void OutputImageParameter::SwitchInput(UInt8RGBAImageType*);
+
+// Declare specialisation for UInt8RGBImageType
+template <>
+void OutputImageParameter::SwitchInput(UInt8RGBImageType*);
+
+
+OutputImageParameter::OutputImageParameter() : m_PixelType(ImagePixelType_float), m_DefaultPixelType(ImagePixelType_float), m_RAMValue(0)
 {
-  this->SetName("Output Image");
-  this->SetKey("out");
+  SetName("Output Image");
+  SetKey("out");
 }
 
 
@@ -57,6 +76,9 @@ OutputImageParameter::~OutputImageParameter()
 
 std::string OutputImageParameter::ConvertPixelTypeToString(ImagePixelType type)
 {
+  // TODO: Could be replaced by constant static string array e.g.:
+  // return PIXEL_TYPE_NAME[ type ];
+
   std::string ret;
   switch(type)
     {
@@ -122,6 +144,9 @@ std::string OutputImageParameter::ConvertPixelTypeToString(ImagePixelType type)
 bool
 OutputImageParameter::ConvertStringToPixelType(const std::string &value, ImagePixelType &type)
 {
+  // TODO: Could be replaced std::find_if() in constant static string
+  // array (see ::ConvertPixelTypeToString().
+
   if (value == "uint8")
     type = ImagePixelType_uint8;
   else if (value == "int16")
@@ -149,278 +174,207 @@ OutputImageParameter::ConvertStringToPixelType(const std::string &value, ImagePi
   return true;
 }
 
-void OutputImageParameter::InitializeWriters()
+
+void OutputImageParameter ::InitializeWriters()
 {
-  ImageBaseType* imgBase = m_Image.GetPointer();
-  // Guess the image type
-  std::string className(m_Image->GetNameOfClass());
-  if (className == "VectorImage")
-    {
-    UInt8VectorImageType* imgUInt8 = dynamic_cast<UInt8VectorImageType*>(imgBase);
-    if (imgUInt8 && SwitchInput(imgUInt8)) return;
+  ImageBaseType* image = m_Image.GetPointer();
 
-    Int16VectorImageType* imgInt16 = dynamic_cast<Int16VectorImageType*>(imgBase);
-    if (imgInt16 && SwitchInput(imgInt16)) return;
+  CAST_IMAGE_BASE(UInt8VectorImageType, image);
+  CAST_IMAGE_BASE(Int16VectorImageType, image);
+  CAST_IMAGE_BASE(UInt16VectorImageType, image);
+  CAST_IMAGE_BASE(Int32VectorImageType, image);
+  CAST_IMAGE_BASE(UInt32VectorImageType, image);
 
-    UInt16VectorImageType* imgUInt16 = dynamic_cast<UInt16VectorImageType*>(imgBase);
-    if (imgUInt16 && SwitchInput(imgUInt16)) return;
+  CAST_IMAGE_BASE(FloatVectorImageType, image);
+  CAST_IMAGE_BASE(DoubleVectorImageType, image);
 
-    Int32VectorImageType* imgInt32 = dynamic_cast<Int32VectorImageType*>(imgBase);
-    if (imgInt32 && SwitchInput(imgInt32)) return;
+  CAST_IMAGE_BASE(ComplexInt16VectorImageType, image);
+  CAST_IMAGE_BASE(ComplexInt32VectorImageType, image);
+  CAST_IMAGE_BASE(ComplexFloatVectorImageType, image);
+  CAST_IMAGE_BASE(ComplexDoubleVectorImageType, image);
 
-    UInt32VectorImageType* imgUInt32 = dynamic_cast<UInt32VectorImageType*>(imgBase);
-    if (imgUInt32 && SwitchInput(imgUInt32)) return;
+  CAST_IMAGE_BASE(UInt8ImageType, image);
+  CAST_IMAGE_BASE(Int16ImageType, image);
+  CAST_IMAGE_BASE(UInt16ImageType, image);
+  CAST_IMAGE_BASE(Int32ImageType, image);
+  CAST_IMAGE_BASE(UInt32ImageType, image);
 
-    FloatVectorImageType* imgFloat = dynamic_cast<FloatVectorImageType*>(imgBase);
-    if (imgFloat && SwitchInput(imgFloat)) return;
+  CAST_IMAGE_BASE(FloatImageType, image);
+  CAST_IMAGE_BASE(DoubleImageType, image);
 
-    DoubleVectorImageType* imgDouble = dynamic_cast<DoubleVectorImageType*>(imgBase);
-    if (imgDouble && SwitchInput(imgDouble)) return;
+  CAST_IMAGE_BASE(ComplexInt16ImageType, image);
+  CAST_IMAGE_BASE(ComplexInt32ImageType, image);
+  CAST_IMAGE_BASE(ComplexFloatImageType, image);
+  CAST_IMAGE_BASE(ComplexDoubleImageType, image);
 
-    ComplexInt16VectorImageType* imgCInt16 = dynamic_cast<ComplexInt16VectorImageType*>(imgBase);
-    if (imgCInt16 && SwitchInput(imgCInt16)) return;
+  CAST_IMAGE_BASE(UInt8RGBImageType, image);
+  CAST_IMAGE_BASE(UInt8RGBAImageType, image);
 
-    ComplexInt32VectorImageType* imgCInt32 = dynamic_cast<ComplexInt32VectorImageType*>(imgBase);
-    if (imgCInt32 && SwitchInput(imgCInt32)) return;
+  itkExceptionMacro("Unknown image-base type.");
+}
 
-    ComplexFloatVectorImageType* imgCFloat = dynamic_cast<ComplexFloatVectorImageType*>(imgBase);
-    if (imgCFloat && SwitchInput(imgCFloat)) return;
 
-    ComplexDoubleVectorImageType* imgCDouble = dynamic_cast<ComplexDoubleVectorImageType*>(imgBase);
-    if (imgCDouble && SwitchInput(imgCDouble)) return;
-    }
-  else
-    {
-    UInt8ImageType* imgUInt8 = dynamic_cast<UInt8ImageType*>(imgBase);
-    if (imgUInt8 && SwitchInput(imgUInt8)) return;
+template <typename TOutputImage, typename TInputImage>
+void OutputImageParameter ::ClampAndWriteVectorImage(TInputImage* in)
+{
+  assert(in);
+  assert(!m_FileName.empty());
 
-    Int16ImageType* imgInt16 = dynamic_cast<Int16ImageType*>(imgBase);
-    if (imgInt16 && SwitchInput(imgInt16)) return;
+  // Use metaprogramming to choose optimized pipeline.
+  details::CastImage<TOutputImage, TInputImage> clamp(in);
 
-    UInt16ImageType* imgUInt16 = dynamic_cast<UInt16ImageType*>(imgBase);
-    if (imgUInt16 && SwitchInput(imgUInt16)) return;
 
-    Int32ImageType* imgInt32 = dynamic_cast<Int32ImageType*>(imgBase);
-    if (imgInt32 && SwitchInput(imgInt32)) return;
+#ifdef OTB_USE_MPI
 
-    UInt32ImageType* imgUInt32 = dynamic_cast<UInt32ImageType*>(imgBase);
-    if (imgUInt32 && SwitchInput(imgUInt32)) return;
+  otb::MPIConfig::Pointer mpiConfig = otb::MPIConfig::Instance();
 
-    FloatImageType* imgFloat = dynamic_cast<FloatImageType*>(imgBase);
-    if (imgFloat && SwitchInput(imgFloat)) return;
+  if (mpiConfig->GetNbProcs() > 1)
+  {
+    std::string extension = itksys::SystemTools::GetFilenameExtension(m_FileName);
 
-    DoubleImageType* imgDouble = dynamic_cast<DoubleImageType*>(imgBase);
-    if (imgDouble && SwitchInput(imgDouble)) return;
+    if (extension == ".vrt")
+    {
+      // Use the MPIVrtWriter
 
-    ComplexInt16ImageType* imgCInt16 = dynamic_cast<ComplexInt16ImageType*>(imgBase);
-    if (imgCInt16 && SwitchInput(imgCInt16)) return;
+      auto vrtWriter = otb::MPIVrtWriter<TOutputImage>::New();
 
-    ComplexInt32ImageType* imgCInt32 = dynamic_cast<ComplexInt32ImageType*>(imgBase);
-    if (imgCInt32 && SwitchInput(imgCInt32)) return;
+      vrtWriter->SetInput(clamp.out);
+      vrtWriter->SetFileName(m_FileName);
+      vrtWriter->SetAvailableRAM(m_RAMValue);
 
-    ComplexFloatImageType* imgCFloat = dynamic_cast<ComplexFloatImageType*>(imgBase);
-    if (imgCFloat && SwitchInput(imgCFloat)) return;
+      // Change internal state only when everything has been setup
+      // without raising exception.
 
-    ComplexDoubleImageType* imgCDouble = dynamic_cast<ComplexDoubleImageType*>(imgBase);
-    if (imgCDouble && SwitchInput(imgCDouble)) return;
+      m_InputCaster  = clamp.icif;
+      m_OutputCaster = clamp.ocif;
 
-    UInt8RGBImageType* imgRGB = dynamic_cast<UInt8RGBImageType*>(imgBase);
-    if (imgRGB && SwitchInput(imgRGB)) return;
+      m_Writer = vrtWriter;
 
-    UInt8RGBAImageType* imgRGBA = dynamic_cast<UInt8RGBAImageType*>(imgBase);
-    if (imgRGBA && SwitchInput(imgRGBA)) return;
+      return;
     }
 
-  itkExceptionMacro("Unknown image type");
-}
-
+#ifdef OTB_USE_SPTW
 
-template <typename TInput, typename TOutput> 
-std::pair<itk::ProcessObject::Pointer,itk::ProcessObject::Pointer> 
-ClampAndWriteVectorImage( TInput * in ,
-                    const std::string & filename , 
-                    const unsigned int & ramValue )
-{
-  std::pair<itk::ProcessObject::Pointer,itk::ProcessObject::Pointer> ret;
-  typedef ClampImageFilter < TInput , TOutput > ClampFilterType;
-  typename ClampFilterType::Pointer clampFilter ( ClampFilterType::New() );
+    else if (extension == ".tif")
+    {
+      // Use simple parallel tiff writer
 
-  clampFilter->SetInput( in);
-  ret.first = clampFilter.GetPointer();
-  
-  bool useStandardWriter = true;
+      auto sptWriter = otb::SimpleParallelTiffWriter<TOutputImage>::New();
 
-  #ifdef OTB_USE_MPI
+      sptWriter->SetFileName(m_FileName);
+      sptWriter->SetInput(clamp.out);
+      sptWriter->GetStreamingManager()->SetDefaultRAM(m_RAMValue);
 
-  otb::MPIConfig::Pointer mpiConfig = otb::MPIConfig::Instance();
+      // Change internal state only when everything has been setup
+      // without raising exception.
 
-  if (mpiConfig->GetNbProcs() > 1)
-    {
-    useStandardWriter = false;
+      m_InputCaster  = clamp.icif;
+      m_OutputCaster = clamp.ocif;
 
-    // Get file extension
-    std::string extension = itksys::SystemTools::GetFilenameExtension(filename);
+      m_Writer = sptWriter;
 
-    if(extension == ".vrt")
-      {
-      // Use the MPIVrtWriter
-      typedef otb::MPIVrtWriter<TOutput> VRTWriterType;
+      return;
+    }
 
-      typename VRTWriterType::Pointer vrtWriter = VRTWriterType::New();
-      vrtWriter->SetInput(clampFilter->GetOutput());
-      vrtWriter->SetFileName(filename);
-      vrtWriter->SetAvailableRAM(ramValue);
-      ret.second = vrtWriter.GetPointer();
-      }
-    #ifdef OTB_USE_SPTW
-    else if (extension == ".tif")
-      {
-      // Use simple parallel tiff writer
-      typedef otb::SimpleParallelTiffWriter<TOutput> SPTWriterType;
+#endif // OTB_USE_SPTW
 
-      typename SPTWriterType::Pointer sptWriter = SPTWriterType::New();
-      sptWriter->SetFileName(filename);
-      sptWriter->SetInput(clampFilter->GetOutput());
-      sptWriter->GetStreamingManager()->SetDefaultRAM(ramValue);
-      ret.second = sptWriter.GetPointer();
-      }
-    
-    #endif
     else
       {
-      itkGenericExceptionMacro("File format "<<extension<<" not supported for parallel writing with MPI. Supported formats are .vrt and .tif. Extended filenames are not supported.");
+        itkGenericExceptionMacro("File format " << extension
+                                                << " not supported for parallel writing with MPI. Supported formats are "
+                                                   ".vrt and .tif. Extended filenames are not supported.");
       }
-  
-    }
-  
-  #endif
-  
-  if(useStandardWriter)
-    {
-    typename otb::ImageFileWriter<TOutput>::Pointer writer =
-      otb::ImageFileWriter<TOutput>::New();
-    writer->SetFileName( filename );
-    writer->SetInput(clampFilter->GetOutput());
-    writer->GetStreamingManager()->SetDefaultRAM(ramValue);
-    ret.second = writer.GetPointer();
     }
 
-  return ret;
+#endif // OTB_USE_MPI
+
+    //
+    // Use default OTB writer.
+
+    auto writer = otb::ImageFileWriter<TOutputImage>::New();
+
+    writer->SetFileName(m_FileName);
+    writer->SetInput(clamp.out);
+    writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue);
+
+    // Change internal state only when everything has been setup
+    // without raising exception.
+
+    m_InputCaster  = clamp.icif;
+    m_OutputCaster = clamp.ocif;
+
+    m_Writer = writer;
 }
 
-template <class TInput>
-int
-OutputImageParameter::SwitchInput(TInput *img)
+
+template <typename TInputImage>
+void OutputImageParameter ::SwitchInput(TInputImage* image)
 {
-  if (! img) return 0;
+  assert(image);
 
-  std::pair<itk::ProcessObject::Pointer,itk::ProcessObject::Pointer> ret;
-  switch(m_PixelType )
-    {
-    case ImagePixelType_uint8:
-    {
-    ret = ClampAndWriteVectorImage< TInput , UInt8VectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue );
+  switch (m_PixelType)
+  {
+  case ImagePixelType_uint8:
+    ClampAndWriteVectorImage<UInt8VectorImageType>(image);
     break;
-    }
-    case ImagePixelType_int16:
-    {
-    ret = ClampAndWriteVectorImage< TInput , Int16VectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue );
+
+  case ImagePixelType_int16:
+    ClampAndWriteVectorImage<Int16VectorImageType>(image);
     break;
-    }
-    case ImagePixelType_uint16:
-    {
-    ret = ClampAndWriteVectorImage< TInput , UInt16VectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue );
+
+  case ImagePixelType_uint16:
+    ClampAndWriteVectorImage<UInt16VectorImageType>(image);
     break;
-    }
-    case ImagePixelType_int32:
-    {
-    ret = ClampAndWriteVectorImage< TInput , Int32VectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue );
+
+  case ImagePixelType_int32:
+
+    ClampAndWriteVectorImage<Int32VectorImageType>(image);
     break;
-    }
-    case ImagePixelType_uint32:
-    {
-    ret = ClampAndWriteVectorImage< TInput , UInt32VectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue );
+
+  case ImagePixelType_uint32:
+    ClampAndWriteVectorImage<UInt32VectorImageType>(image);
     break;
-    }
-    case ImagePixelType_float:
-    {
-    ret = ClampAndWriteVectorImage< TInput , FloatVectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue );
+
+  case ImagePixelType_float:
+    ClampAndWriteVectorImage<FloatVectorImageType>(image);
     break;
-    }
-    case ImagePixelType_double:
-    {
-    ret = ClampAndWriteVectorImage< TInput , DoubleVectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue );
+
+  case ImagePixelType_double:
+    ClampAndWriteVectorImage<DoubleVectorImageType>(image);
     break;
-    }
-    case ImagePixelType_cint16:
-    {
-    ret = ClampAndWriteVectorImage < TInput , ComplexInt16VectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue ); 
+
+  case ImagePixelType_cint16:
+    ClampAndWriteVectorImage<ComplexInt16VectorImageType>(image);
     break;
-    }
-    case ImagePixelType_cint32:
-    {
-    ret = ClampAndWriteVectorImage < TInput , ComplexInt32VectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue ); 
+
+  case ImagePixelType_cint32:
+    ClampAndWriteVectorImage<ComplexInt32VectorImageType>(image);
     break;
-    }
-    case ImagePixelType_cfloat:
-    {
-    ret = ClampAndWriteVectorImage < TInput , ComplexFloatVectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue ); 
+
+  case ImagePixelType_cfloat:
+    ClampAndWriteVectorImage<ComplexFloatVectorImageType>(image);
     break;
-    }
+
     case ImagePixelType_cdouble:
-    {
-    ret = ClampAndWriteVectorImage < TInput , ComplexDoubleVectorImageType > (
-      img ,
-      m_FileName ,
-      m_RAMValue );
-    break;
-    }
+      ClampAndWriteVectorImage<ComplexDoubleVectorImageType>(image);
+      break;
+
     default:
+      assert(false && "Unexpected image-type.");
       break;
     }
-  // Save the caster and writer
-  m_Caster = ret.first;
-  m_Writer = ret.second;
-  return 1;
 }
 
+
 void
 OutputImageParameter::Write()
 {
   m_Writer->Update();
 
   // Clean internal filters
-  m_Caster = nullptr;
+  m_InputCaster  = nullptr;
+  m_OutputCaster = nullptr;
+
   m_Writer = nullptr;
 }
 
@@ -444,11 +398,9 @@ OutputImageParameter::SetValue(ImageBaseType* image)
   SetActive(true);
 }
 
-bool
-OutputImageParameter::HasValue() const
+bool OutputImageParameter ::HasValue() const
 {
-  std::string filename(this->GetFileName());
-  return !filename.empty();
+  return !m_FileName.empty();
 }
 
 std::string
@@ -493,43 +445,38 @@ OutputImageParameter::CheckFileName(bool fixMissingExtension)
 }
 
 // Specialization for UInt8RGBAImageType
+
 template <>
-int
-OutputImageParameter::SwitchInput(UInt8RGBAImageType *img)
+void OutputImageParameter ::SwitchInput(UInt8RGBAImageType* img)
 {
-  if (! img) return 0;
-  if( m_PixelType == ImagePixelType_uint8 )
-    {
-    typename otb::ImageFileWriter<UInt8RGBAImageType>::Pointer writer =
-      otb::ImageFileWriter<UInt8RGBAImageType>::New();
-    writer->SetFileName( this->GetFileName() );
-    writer->SetInput(img);
-    writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue);
-    m_Writer = writer.GetPointer();
-    }
-   else
-     itkExceptionMacro("Unknown PixelType for RGBA Image. Only uint8 is supported.");
-  return 1;
+  assert(img);
+
+  if (m_PixelType != ImagePixelType_uint8)
+    itkExceptionMacro("Unknown PixelType for RGBA Image. Only uint8 is supported.");
+
+  auto writer = otb::ImageFileWriter<UInt8RGBAImageType>::New();
+
+  writer->SetFileName(GetFileName());
+  writer->SetInput(img);
+  writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue);
+
+  m_Writer = writer;
 }
 
 // Specialization for UInt8RGBImageType
 template <>
-int
-OutputImageParameter::SwitchInput(UInt8RGBImageType *img)
+void OutputImageParameter ::SwitchInput(UInt8RGBImageType* img)
 {
-  if (! img) return 0;
-  if( m_PixelType == ImagePixelType_uint8 )
-    {
-    typename otb::ImageFileWriter<UInt8RGBImageType>::Pointer writer =
-      otb::ImageFileWriter<UInt8RGBImageType>::New();
-    writer->SetFileName( this->GetFileName() );
-    writer->SetInput(img);
-    writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue);
-    m_Writer = writer.GetPointer();
-    }
-   else
-     itkExceptionMacro("Unknown PixelType for RGB Image. Only uint8 is supported.");
-  return 1;
+  if (m_PixelType != ImagePixelType_uint8)
+    itkExceptionMacro("Unknown PixelType for RGB Image. Only uint8 is supported.");
+
+  auto writer = otb::ImageFileWriter<UInt8RGBImageType>::New();
+
+  writer->SetFileName(GetFileName());
+  writer->SetInput(img);
+  writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue);
+
+  m_Writer = writer;
 }
 
 void OutputImageParameter::SetFileName (const char* filename)
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx
index eaaf8c7c302f9085282eaa1169465477d8a50bbd..3b020d798980c922f491e80c263fd7590a93743c 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx
@@ -366,6 +366,77 @@ OutputProcessXMLParameter::ParseGroup(const std::string& group)
     }
 }
 
+std::string OutputProcessXMLParameter::MakeCommandLine(Application::Pointer application)
+{
+  OutputProcessXMLParameter::Pointer outXMLParam   = OutputProcessXMLParameter::New();
+  TiXmlElement*                      XMLAppElement = outXMLParam->ParseApplication(application);
+
+  // Create command line from the XML document
+  TiXmlElement *     pName, *pParam;
+  std::ostringstream cmdLine;
+
+  cmdLine << "";
+
+  if (XMLAppElement)
+  {
+    pName = XMLAppElement->FirstChildElement("name");
+
+    cmdLine << "otbcli_" << pName->GetText();
+#ifdef _WIN32
+    cmdLine << ".bat";
+#endif
+    cmdLine << " ";
+
+    // Parse application parameters
+    pParam = XMLAppElement->FirstChildElement("parameter");
+
+    while (pParam)
+    {
+      // Get parameter key
+      cmdLine << "-";
+      cmdLine << pParam->FirstChildElement("key")->GetText();
+      cmdLine << " ";
+
+      // Some parameters can have multiple values. Test it and handle this
+      // specific case
+      TiXmlElement* values = pParam->FirstChildElement("values");
+
+      if (values)
+      {
+        // Loop over value
+        TiXmlElement* pValue = values->FirstChildElement("value");
+        while (pValue)
+        {
+          cmdLine << pValue->GetText();
+          cmdLine << " ";
+
+          pValue = pValue->NextSiblingElement(); // iteration over multiple values
+        }
+      }
+      else
+      {
+        // Get parameter value
+        cmdLine << pParam->FirstChildElement("value")->GetText();
+        cmdLine << " ";
+
+        // In case of OutputImageparameter we need to report output pixel type
+        TiXmlElement* pPixType = pParam->FirstChildElement("pixtype");
+
+        if (pPixType)
+        {
+          cmdLine << pPixType->GetText();
+          cmdLine << " ";
+        }
+      }
+
+      pParam = pParam->NextSiblingElement(); // iteration over parameters
+    }
+  }
+
+  return cmdLine.str();
+}
+
+
 } //end namespace wrapper
 
 } //end namespace otb
diff --git a/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx b/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx
index 8cdca28487f797c1b6962edf031eeb623fea8c77..816e56d81fc7ea3f9c9f178198cc999eea1e6cb7 100644
--- a/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx
+++ b/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx
@@ -264,12 +264,6 @@ void ShowUsage(char* argv[])
 
 int main(int argc, char* argv[])
 {
-  #ifdef OTB_USE_MPI
-  otb::MPIConfig::Instance()->Init(argc,argv);
-  #endif
-
-  otb::ConfigurationManager::InitOpenMPThreads();
-
   if (argc < 2)
   {
       ShowUsage(argv);
@@ -299,15 +293,22 @@ int main(int argc, char* argv[])
       }
     }
 
-  typedef otb::Wrapper::CommandLineLauncher LauncherType;
-  LauncherType::Pointer launcher = LauncherType::New();
-
   if (vexp.empty())
   {
     ShowUsage(argv);
     return EXIT_FAILURE;
   }
 
+  #ifdef OTB_USE_MPI
+  if (std::find(vexp.begin(), vexp.end(), "-testenv") == vexp.end() )
+    otb::MPIConfig::Instance()->Init(argc,argv);
+  #endif
+
+  otb::ConfigurationManager::InitOpenMPThreads();
+
+  typedef otb::Wrapper::CommandLineLauncher LauncherType;
+  LauncherType::Pointer launcher = LauncherType::New();
+
   bool success = launcher->Load(vexp) && launcher->ExecuteAndWriteOutput();
 
   // shutdown MPI after application finished
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h
index 6e0a005b1f9d3cd8dba6276b40da9e9fd29c2e8d..70d922b8116411a6201c0cb9569d74534153ee34 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h
@@ -22,12 +22,19 @@
 #define otbWrapperQtWidgetMainWindow_h
 
 #include <QMainWindow>
+
 #include "OTBQtWidgetExport.h"
 
 #include "otbWrapperApplication.h"
 
+namespace Ui
+{
+class AppMainWindow;
+}
+
 class QAction;
 class QMenu;
+class QPlainTextEdit;
 
 namespace otb
 {
@@ -41,16 +48,26 @@ class OTBQtWidget_EXPORT QtMainWindow : public QMainWindow
   Q_OBJECT
 
 public:
-  QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget* parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
+  QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget* parent = nullptr);
+  ~QtMainWindow();
+
+  otb::Wrapper::QtWidgetView* Gui() const;
+
+  void closeEvent(QCloseEvent* event) override;
 
-  QtWidgetView* Gui() const;
+signals:
+  void ExecuteAndWriteOutput();
+  void Stop();
 
 public slots:
   void UnhandledException(QString message);
+  void UpdateMessageAfterApplicationReady(bool val);
+  void UpdateMessageAfterExecution(int status);
+  void on_executeButton_clicked();
+  void CopyCommandLine();
 
 private:
-  QMenu*   helpMenu;
-  QAction* helpAction;
+  ::Ui::AppMainWindow* ui;
 
   QtWidgetView* gui;
 };
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h
index fa4c8ffe9216fdfb2bd5a4e82f66335ccc6edb16..13dffe9fe1078859117eb80c4ae90bdb1be445e4 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h
@@ -37,17 +37,16 @@ class OTBQtWidget_EXPORT AppliThread : public QThread
  Q_OBJECT
 
  public:
-  AppliThread(Application* app)
-    {
-      m_Application = app;
+   AppliThread(Application::Pointer app) : m_Application(app)
+   {
     }
 
   ~AppliThread() override;
 
-  void Execute()
+  /** Ask the running application to stop */
+  void Stop()
   {
-    // Call the signal start to begin running the program
-    start();
+    m_Application->Stop();
   }
 
 signals:
@@ -66,13 +65,6 @@ signals:
    */
   void ExceptionRaised( QString what );
 
-public slots:
-  /** Ask the running application to stop */
-  void Stop()
-    {
-    m_Application->Stop();
-    }
-
 protected:
   void run() override;
 
@@ -107,6 +99,10 @@ public:
     return m_LogOutput;
   }
 
+  bool IsRunning() const;
+
+  void Stop();
+
   /** Logger warning message sender */
   void SendLogWARNING( const std::string & mes );
   /** Logger info message sender */
@@ -144,8 +140,6 @@ signals:
 
   void UpdateGui();
 
-  void Stop();
-
 public slots:
   /**
    * \brief Slots called every time one of the widget needs to be
@@ -168,19 +162,18 @@ private slots:
    */
   void OnApplicationExecutionDone( int status );
 
-  void TimerDone();
-
 private:
   QtWidgetModel(const QtWidgetModel&) = delete;
   void operator=(const QtWidgetModel&) = delete;
 
-  Application::Pointer m_Application;
-
   QtLogOutput::Pointer  m_LogOutput;
 
+  AppliThread* m_taskAppli;
+
   bool m_IsRunning;
 
-  QTimer *m_Timer;
+public:
+  Application::Pointer m_Application;
 };
 
 
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h
deleted file mode 100644
index a8a46382f27497d7449980724ea9fe1c69fcda29..0000000000000000000000000000000000000000
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-#ifndef otbWrapperQtWidgetProgressReport_h
-#define otbWrapperQtWidgetProgressReport_h
-
-#include <QtWidgets>
-#include "otbWrapperQtWidgetModel.h"
-#include "itkQtProgressBar.h"
-#include "itkProcessObject.h"
-#include <string>
-
-
-namespace otb
-{
-namespace Wrapper
-{
-
-/** \class QtWidgetProgressReport
- * \brief Create a widget reporting the progress of the application
- *        process.
- *
- * \ingroup OTBQtWidget
- */
-class OTBQtWidget_EXPORT QtWidgetProgressReport : public QWidget
-{
-  Q_OBJECT
-public:
-  QtWidgetProgressReport(QtWidgetModel * model, QWidget * parent);
-  ~QtWidgetProgressReport() override;
-
-  void SetApplication(Application::Pointer app);
-
-  typedef itk::MemberCommand< QtWidgetProgressReport >  AddProcessCommandType;
-
-  void ProcessEvent( itk::Object * caller, const itk::EventObject & event );
-
-  std::string GetCurrentDescription()
-  {
-    return m_CurrentDescription;
-  }
-
-/*
-  itk::ProcessObject* GetCurrentProcess()
-  {
-    return m_CurrentProcess;
-  }
-
-  QtWidgetModel * GetModel()
-  {
-    m_Model;
-  }
-
-  QVBoxLayout * GetLayout()
-  {
-    return m_Layout;
-  }
-*/
-public slots:
-  void RemoveLayout();
-  /*virtual */void ReportProcess();
-
-  signals:
-  void AddNewProcessToReport();
-
-private:
-  QtWidgetProgressReport(const QtWidgetProgressReport&) = delete;
-  void operator=(const QtWidgetProgressReport&) = delete;
-
-  Application::Pointer              m_Application;
-  QtWidgetModel *                   m_Model;
-  QVBoxLayout *                     m_Layout;
-
-  AddProcessCommandType::Pointer    m_AddProcessCommand;
-  itk::ProcessObject*               m_CurrentProcess;
-  std::string                       m_CurrentDescription;
-};
-
-}
-}
-
-#endif
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h
index 47b6c1a1504e075dd61c7a892addca54f10306f2..9bfc7be1dfc8b65f20c78624cbd487da93336a62 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h
@@ -39,14 +39,14 @@ namespace Wrapper
  *
  * \ingroup OTBQtWidget
  */
-class OTBQtWidget_EXPORT QtWidgetSimpleProgressReport : public QWidget
+class OTBQtWidget_EXPORT QtWidgetSimpleProgressReport : public itk::QtProgressBar
 {
   Q_OBJECT
 public:
-  QtWidgetSimpleProgressReport(QtWidgetModel * model, QWidget * parent);
+  QtWidgetSimpleProgressReport(QWidget* parent);
   ~QtWidgetSimpleProgressReport() override;
 
-  void SetApplication(Application::Pointer app);
+  void SetModel(QtWidgetModel* model);
 
   typedef itk::MemberCommand< QtWidgetSimpleProgressReport >  AddProcessCommandType;
 
@@ -56,25 +56,17 @@ public slots:
   void Init();
   void ReportProcess();
 
-  signals:
+signals:
   void AddNewProcessToReport();
+  void SetText(QString);
 
 private:
   QtWidgetSimpleProgressReport(const QtWidgetSimpleProgressReport&) = delete;
-  void operator=(const QtWidgetSimpleProgressReport&); //purposely not
-                                                       //implemented
-
-  Application::Pointer              m_Application;
-  QtWidgetModel *                   m_Model;
-  QVBoxLayout *                     m_Layout;
+  void operator=(const QtWidgetSimpleProgressReport&) = delete;
 
   AddProcessCommandType::Pointer    m_AddProcessCommand;
   itk::ProcessObject*               m_CurrentProcess;
   std::string                       m_CurrentDescription;
-
-  itk::QtProgressBar * m_Bar;
-  QLabel * m_Label;
-
 };
 
 }
diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h
index 1ec99d5aae5e40497b4690b5d2c8f872d406b675..96b8d4f6ccd4eb370f09f041c7423cab144b0396 100644
--- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h
+++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h
@@ -44,10 +44,6 @@ class OTBQtWidget_EXPORT QtWidgetView :
 {
   Q_OBJECT
 
-  Q_PROPERTY( bool isClosable
-	      READ IsClosable
-	      WRITE SetClosable );
-
 public:
 
   static char const * const OBJECT_NAME;
@@ -66,12 +62,15 @@ public:
   /** \brief Model Accessor */
   QtWidgetModel* GetModel() const;
 
-  bool IsClosable() const;
+  virtual bool BeforeExecuteButtonClicked()
+  {
+    return true;
+  }
 
-  void UnhandledException(QString message);
+  void Disable();
+  void Enable();
 
 signals:
-  void QuitSignal();
   void ExecuteAndWriteOutput();
   void Stop();
   void OTBApplicationOutputImageChanged( const QString &, const QString &);
@@ -83,24 +82,12 @@ protected:
 
   virtual QWidget* CreateInputWidgets();
 
-  // QWidget overloads.
-  void closeEvent( QCloseEvent * event ) override;
-
-protected:
-
-  /** Html section for 'Done' icon */
-  std::string m_IconPathDone;
-
-  /** Html section for 'Failed' icon */
-  std::string m_IconPathFailed;
-
 protected slots:
 
-  virtual void OnExecButtonClicked();
+  virtual void OnExecButtonClicked()
+  {
+  }
 
-  virtual void OnExceptionRaised( QString what );
-
-// Private methods.
 private:
 
   QtWidgetView(const QtWidgetView&) = delete;
@@ -108,29 +95,10 @@ private:
 
   QWidget* CreateFooter();
 
-// Private attributes.
 private:
-
   otb::Wrapper::QtWidgetModel* m_Model;
 
-  QPushButton* m_ExecButton;
-  QPushButton* m_QuitButton;
-  QShortcut* m_QuitShortcut;
-  QLabel* m_Message;
-  QTextEdit *m_LogText;
-  QTabWidget *m_TabWidget;
-
-  bool m_IsClosable : 1;
   bool m_IsRunning;
-
-private slots:
-  void UpdateMessageAfterExecution(int status);
-  void UpdateMessageAfterApplicationReady(bool val);
-
-  void OnProgressReportBegin();
-  void OnProgressReportEnd( int status );
-  void SetClosable( bool );
-
 };
 
 } // end namespace 'Wrapper'
diff --git a/Modules/Wrappers/QtWidget/src/CMakeLists.txt b/Modules/Wrappers/QtWidget/src/CMakeLists.txt
index 94c61a93f8d95baa51b31df9fb62679260197c3d..41fc9f1b190b29da9d7272d41f245b0c06d1a863 100644
--- a/Modules/Wrappers/QtWidget/src/CMakeLists.txt
+++ b/Modules/Wrappers/QtWidget/src/CMakeLists.txt
@@ -44,7 +44,6 @@ set(OTBQtWidget_SRC
   otbWrapperQtWidgetParameterGroup.cxx
   otbWrapperQtWidgetInputFilenameListParameter.cxx
   otbWrapperQtWidgetRAMParameter.cxx
-  otbWrapperQtWidgetProgressReport.cxx
   otbWrapperQtWidgetOutputProcessXMLParameter.cxx
   otbWrapperQtWidgetParameterBase.cxx
   otbWrapperQtWidgetInputImageParameter.cxx
@@ -79,7 +78,6 @@ set(OTBQtWidget_MOC_HDR
   ../include/otbWrapperQtWidgetModel.h
   ../include/otbWrapperQtWidgetView.h
   ../include/otbWrapperQtWidgetMainWindow.h
-  ../include/otbWrapperQtWidgetProgressReport.h
   ../include/otbWrapperQtWidgetListViewParameter.h
   ../include/otbQtFileSelectionWidget.h
   ../include/otbQtStringSelectionWidget.h
@@ -101,6 +99,7 @@ set(OTBQtWidget_MOC_HDR
 
 set( OTBQtWidget_FORMS
   otbWrapperQtWidgetListEditWidget.ui
+  appmainwindow.ui
   )
 
 set( OTBQtWidget_RESOURCES
diff --git a/Modules/Wrappers/QtWidget/src/appmainwindow.ui b/Modules/Wrappers/QtWidget/src/appmainwindow.ui
new file mode 100644
index 0000000000000000000000000000000000000000..c376f1984f3cec0518739bf1dd22fe3b6fb4f4be
--- /dev/null
+++ b/Modules/Wrappers/QtWidget/src/appmainwindow.ui
@@ -0,0 +1,268 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AppMainWindow</class>
+ <widget class="QMainWindow" name="AppMainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>900</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="otbWrapperQtWidgetIcons.qrc">
+    <normaloff>:/Utilities/Data/Icons/monteverdi-48x48.png</normaloff>:/Utilities/Data/Icons/monteverdi-48x48.png</iconset>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <property name="spacing">
+     <number>16</number>
+    </property>
+    <property name="leftMargin">
+     <number>16</number>
+    </property>
+    <property name="topMargin">
+     <number>12</number>
+    </property>
+    <property name="rightMargin">
+     <number>16</number>
+    </property>
+    <property name="bottomMargin">
+     <number>12</number>
+    </property>
+    <item>
+     <widget class="QTabWidget" name="tabWidget">
+      <property name="currentIndex">
+       <number>0</number>
+      </property>
+      <widget class="QWidget" name="tab1">
+       <attribute name="title">
+        <string>Parameters</string>
+       </attribute>
+       <layout class="QVBoxLayout" name="verticalLayout_2">
+        <property name="spacing">
+         <number>16</number>
+        </property>
+        <property name="leftMargin">
+         <number>0</number>
+        </property>
+        <property name="topMargin">
+         <number>0</number>
+        </property>
+        <property name="rightMargin">
+         <number>0</number>
+        </property>
+        <property name="bottomMargin">
+         <number>0</number>
+        </property>
+        <item>
+         <widget class="QScrollArea" name="scrollArea">
+          <property name="frameShape">
+           <enum>QFrame::NoFrame</enum>
+          </property>
+          <property name="widgetResizable">
+           <bool>true</bool>
+          </property>
+          <widget class="QWidget" name="scrollAreaWidgetContents">
+           <property name="geometry">
+            <rect>
+             <x>0</x>
+             <y>0</y>
+             <width>864</width>
+             <height>425</height>
+            </rect>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_2">
+            <property name="spacing">
+             <number>16</number>
+            </property>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab2">
+       <attribute name="title">
+        <string>Log</string>
+       </attribute>
+       <layout class="QVBoxLayout" name="verticalLayout_3">
+        <property name="spacing">
+         <number>16</number>
+        </property>
+        <property name="leftMargin">
+         <number>0</number>
+        </property>
+        <property name="topMargin">
+         <number>0</number>
+        </property>
+        <property name="rightMargin">
+         <number>0</number>
+        </property>
+        <property name="bottomMargin">
+         <number>0</number>
+        </property>
+        <item>
+         <widget class="QPlainTextEdit" name="plainTextEdit">
+          <property name="readOnly">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </widget>
+    </item>
+    <item>
+     <widget class="QLabel" name="message">
+      <property name="text">
+       <string>Status text</string>
+      </property>
+      <property name="wordWrap">
+       <bool>true</bool>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <property name="spacing">
+       <number>16</number>
+      </property>
+      <property name="sizeConstraint">
+       <enum>QLayout::SetDefaultConstraint</enum>
+      </property>
+      <item>
+       <widget class="otb::Wrapper::QtWidgetSimpleProgressReport" name="progressBar">
+        <property name="enabled">
+         <bool>true</bool>
+        </property>
+        <property name="value">
+         <number>0</number>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="executeButton">
+        <property name="text">
+         <string>Execute</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>900</width>
+     <height>22</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menuApplication">
+    <property name="title">
+     <string>Application</string>
+    </property>
+    <addaction name="separator"/>
+    <addaction name="actionCopy_command_line"/>
+    <addaction name="actionQuit"/>
+   </widget>
+   <widget class="QMenu" name="menuHelp">
+    <property name="title">
+     <string>Help</string>
+    </property>
+    <addaction name="actionDocumentation"/>
+   </widget>
+   <addaction name="menuApplication"/>
+   <addaction name="menuHelp"/>
+  </widget>
+  <widget class="QStatusBar" name="statusBar">
+   <property name="styleSheet">
+    <string notr="true">color: rgb(85, 87, 83);</string>
+   </property>
+  </widget>
+  <action name="actionDocumentation">
+   <property name="text">
+    <string>Documentation</string>
+   </property>
+   <property name="shortcut">
+    <string>F1</string>
+   </property>
+  </action>
+  <action name="actionAboutOTB">
+   <property name="text">
+    <string>About</string>
+   </property>
+  </action>
+  <action name="actionAbout">
+   <property name="text">
+    <string>About</string>
+   </property>
+  </action>
+  <action name="actionView_log">
+   <property name="text">
+    <string>View log</string>
+   </property>
+  </action>
+  <action name="actionLoad_parameters">
+   <property name="text">
+    <string>Load parameters</string>
+   </property>
+  </action>
+  <action name="actionSave_parameters">
+   <property name="text">
+    <string>Save parameters</string>
+   </property>
+  </action>
+  <action name="actionQuit">
+   <property name="text">
+    <string>Quit</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+Q</string>
+   </property>
+  </action>
+  <action name="actionReset_parameters">
+   <property name="text">
+    <string>Reset parameters</string>
+   </property>
+  </action>
+  <action name="actionReset">
+   <property name="text">
+    <string>Reset All</string>
+   </property>
+  </action>
+  <action name="actionLoad_from_XML">
+   <property name="text">
+    <string>Load from XML</string>
+   </property>
+  </action>
+  <action name="actionSave_to_XML">
+   <property name="text">
+    <string>Save to XML</string>
+   </property>
+  </action>
+  <action name="actionCopy_command_line">
+   <property name="text">
+    <string>Copy command line to clipboard</string>
+   </property>
+  </action>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>otb::Wrapper::QtWidgetSimpleProgressReport</class>
+   <extends>QProgressBar</extends>
+   <header>otbWrapperQtWidgetSimpleProgressReport.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="otbWrapperQtWidgetIcons.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetIcons.qrc b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetIcons.qrc
index 60701a70320c2449e328d4cc1d3d907e79a5f4b4..6762620b11e830eb51ee174e56f891a3386c408e 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetIcons.qrc
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetIcons.qrc
@@ -2,5 +2,6 @@
 <qresource>
     <file>../../../../Utilities/Data/Icons/mIconClearText.png</file>
     <file>../../../../Utilities/Data/Icons/mIconClearTextHover.png</file>
+    <file>../../../../Utilities/Data/Icons/monteverdi-48x48.png</file>
 </qresource>
 </RCC>
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
index 736a3d8fdbcf847f532fa1fd3ac277ba8326f39c..1dd3dae0c592c43c685ac47ddcd33ef6fcd26ceb 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
@@ -120,7 +120,6 @@ void QtWidgetListViewParameter::DoCreateWidget()
   m_VLayout = new QHBoxLayout;
   m_VLayout->setContentsMargins(0, 0, 0, 0);
   m_VLayout->addWidget(m_ListView);
-  m_ListView->setMaximumSize(m_ListView->width() ,  4* m_LineHeight);
   m_VLayout->activate();
 
   this->setLayout(m_VLayout);
@@ -144,6 +143,9 @@ void QtWidgetListViewParameter::SelectedItems()
   // make sure parameter is enabled
   m_ListViewParam->SetActive(true);
   m_ListViewParam->SetUserValue(true);
+
+  // Call the application DoUpdateParameters, then all widgets' DoUpdateGUI (including this one)
+  this->GetModel()->NotifyUpdate();
 }
 
 }
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx
index d185a8b9a9cc3689c0edf67394901f77036ef509..93c3f459e2e43b49d43e879a84e3f83ccfa30345 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx
@@ -21,44 +21,143 @@
 #include "otbWrapperQtWidgetMainWindow.h"
 
 #include <QtWidgets>
+
 #include "otbWrapperQtWidgetView.h"
+#include "otbWrapperQtWidgetOutputProcessXMLParameter.h"
+
+#include "ui_appmainwindow.h"
 
 namespace otb
 {
 namespace Wrapper
 {
 
-QtMainWindow::QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget* parent, Qt::WindowFlags flags) :
-    QMainWindow(parent, flags),
-    gui(gui)
+QtMainWindow::QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget* parent) : QMainWindow(parent), ui(new Ui::AppMainWindow), gui(gui)
 {
-  this->setWindowIcon(QIcon(":/otb_small.png"));
-  this->setWindowTitle(QString(app->GetDocName()).append(" - ").append(OTB_VERSION_STRING));
+  ui->setupUi(this);
+
+  // Setup the "View command line" widget
+  this->setWindowTitle(QString(app->GetName()).append(" - OTB ").append(OTB_VERSION_STRING));
 
   // Set the given application view widget
   gui->setParent(this);
-  this->setCentralWidget(gui);
-
-  // Connect the View "Quit" signal, to the mainWindow close slot
-  connect(gui, &QtWidgetView::QuitSignal, this, &QMainWindow::close);
-
-  // Setup the help menu
-  QMenu* helpMenu = this->menuBar()->addMenu(tr("&Help"));
-  helpAction      = new QAction(tr("&Documentation"), this);
-  helpAction->setShortcuts(QKeySequence::HelpContents);
-  helpMenu->addAction(helpAction);
-  const std::string url = std::string("https://www.orfeo-toolbox.org/CookBook/Applications/app_") + app->GetName() + std::string(".html");
-  QObject::connect(helpAction, &QAction::triggered, this, [=] { QDesktopServices::openUrl(QUrl(QString::fromStdString(url))); });
+  ui->scrollArea->setWidget(gui);
+
+  // Connect menu buttons
+  connect(ui->actionQuit, &QAction::triggered, this, &QMainWindow::close);
+  const auto url = std::string("https://www.orfeo-toolbox.org/CookBook/Applications/app_") + app->GetName() + std::string(".html");
+  connect(ui->actionDocumentation, &QAction::triggered, this, [=] { QDesktopServices::openUrl(QUrl(QString::fromStdString(url))); });
+
+  connect(ui->actionCopy_command_line, &QAction::triggered, this, &QtMainWindow::CopyCommandLine);
+
+  // Setup execute / cancel button
+  ui->executeButton->setDefault(true);
+  ui->executeButton->setEnabled(false);
+  ui->executeButton->setText(QObject::tr("Execute"));
+
+  connect(gui->GetModel(), &QtWidgetModel::SetApplicationReady, ui->executeButton, &QPushButton::setEnabled);
+  connect(this, &QtMainWindow::ExecuteAndWriteOutput, gui->GetModel(), &QtWidgetModel::ExecuteAndWriteOutputSlot);
+
+  connect(gui->GetModel(), &QtWidgetModel::SetApplicationReady, this, &QtMainWindow::UpdateMessageAfterApplicationReady);
+  connect(gui->GetModel(), &QtWidgetModel::SetProgressReportDone, this, &QtMainWindow::UpdateMessageAfterExecution);
+
+  connect(gui->GetModel(), &QtWidgetModel::ExceptionRaised, [&] { ui->tabWidget->setCurrentIndex(1); });
+
+  // Status bar and message default text
+  ui->statusBar->showMessage(tr("Select parameters"));
+  ui->message->setText("");
+
+  // Setup the progress bar to observe the model
+  ui->progressBar->SetModel(gui->GetModel());
+
+  // Connect application progress text to the QLabel
+  connect(ui->progressBar, &QtWidgetSimpleProgressReport::SetText, ui->message, &QLabel::setText);
+
+  // Connect log output to the textEdit area
+  connect(gui->GetModel()->GetLogOutput(), &QtLogOutput::NewContentLog, ui->plainTextEdit, &QPlainTextEdit::appendPlainText);
 }
 
-QtWidgetView* QtMainWindow::Gui() const
+void QtMainWindow::UpdateMessageAfterApplicationReady(bool val)
+{
+  if (!gui->GetModel()->IsRunning())
+  {
+    if (val == true)
+    {
+      ui->statusBar->showMessage(tr("Ready to run"));
+    }
+    else
+    {
+      ui->statusBar->showMessage(tr("Select parameters"));
+    }
+  }
+}
+
+void QtMainWindow::UpdateMessageAfterExecution(int status)
+{
+  if (status >= 0)
+  {
+    ui->statusBar->showMessage(tr("Done"));
+  }
+  else
+  {
+    ui->statusBar->showMessage(tr("Failed!"));
+  }
+  ui->executeButton->setText(tr("Execute"));
+  gui->Enable();
+}
+
+void QtMainWindow::on_executeButton_clicked()
+{
+  if (gui->GetModel()->IsRunning())
+  {
+    ui->statusBar->showMessage(tr("Cancelling..."));
+    gui->GetModel()->Stop();
+  }
+  else
+  {
+    if (gui->BeforeExecuteButtonClicked())
+    {
+      gui->Disable();
+      ui->statusBar->showMessage(tr("Running..."));
+      ui->executeButton->setText(tr("Cancel"));
+      emit ExecuteAndWriteOutput();
+    }
+  }
+}
+
+void QtMainWindow::CopyCommandLine()
+{
+  // Get command line
+  std::string cmdLine = OutputProcessXMLParameter::MakeCommandLine(gui->GetModel()->m_Application);
+
+  // Copy it to clipboard
+  QClipboard* clipboard = QGuiApplication::clipboard();
+  clipboard->setText(QString::fromStdString(cmdLine));
+
+  // Also show it in the log
+  gui->GetModel()->SendLogINFO(cmdLine);
+}
+
+QtMainWindow::~QtMainWindow()
+{
+  delete ui;
+}
+
+otb::Wrapper::QtWidgetView* QtMainWindow::Gui() const
 {
   return gui;
 }
 
 void QtMainWindow::UnhandledException(QString message)
 {
-  gui->UnhandledException(message);
+  ui->plainTextEdit->appendPlainText(message);
+  ui->tabWidget->setCurrentIndex(1);
+}
+
+void QtMainWindow::closeEvent(QCloseEvent* event)
+{
+  gui->GetModel()->Stop();
+  QMainWindow::closeEvent(event);
 }
 
 } // namespace Wrapper
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx
index 6803a555110064cfcb0199661c6280313618b32b..dc0e9278dd532fed974eb1c8adc900e9fc5fd32b 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx
@@ -31,11 +31,7 @@ namespace otb
 namespace Wrapper
 {
 
-QtWidgetModel
-::QtWidgetModel(Application* app) :
-  m_Application(app),
-  m_LogOutput(),
-  m_IsRunning(false)
+QtWidgetModel ::QtWidgetModel(Application* app) : m_LogOutput(), m_taskAppli(nullptr), m_IsRunning(false), m_Application(app)
 {
   // Init only if not already done
   if(!m_Application->IsInitialized())
@@ -47,23 +43,19 @@ QtWidgetModel
 
   // Attach log output to the Application logger
   m_Application->GetLogger()->AddLogOutput(m_LogOutput);
-
-  m_Timer = new QTimer(this);
-  m_Timer->setSingleShot(true);
-  m_Timer->setInterval(1000);
-  QObject::connect( m_Timer, &QTimer::timeout, this, &QtWidgetModel::TimerDone );
 }
 
 QtWidgetModel::~QtWidgetModel()
 {
-  if (m_Timer)
-    delete m_Timer;
+  delete m_taskAppli;
 }
 
 void
 QtWidgetModel
 ::NotifyUpdate()
 {
+  assert(!m_IsRunning && "Cannot update parameters while application is running.");
+
   // Update the parameters
   try
   {
@@ -118,108 +110,39 @@ QtWidgetModel
   emit SetApplicationReady(false);
   m_IsRunning = true;
 
-  //Buld corresponding command line and display to the Log tab
-
-  //Build XML DOM from m_application
-  OutputProcessXMLParameter::Pointer outXMLParam = OutputProcessXMLParameter::New();
-
-  TiXmlElement* XMLAppElement = outXMLParam->ParseApplication(m_Application);
-
-  //Create command line from the XML document
-  TiXmlElement * pName, *pParam;
-  std::ostringstream cmdLine;
-
-  cmdLine << "";
-
-  if(XMLAppElement)
-    {
-    pName = XMLAppElement->FirstChildElement("name");
-
-    cmdLine << "otbcli_" << pName->GetText();
-#ifdef _WIN32
-    cmdLine << ".bat";
-#endif
-    cmdLine << " ";
-
-    //Parse application parameters
-    pParam = XMLAppElement->FirstChildElement("parameter");
-
-    while(pParam)
-      {
-      //Get parameter key
-      cmdLine << "-";
-      cmdLine << pParam->FirstChildElement("key")->GetText();
-      cmdLine << " ";
-
-      //Some parameters can have multiple values. Test it and handle this
-      //specific case
-      TiXmlElement * values = pParam->FirstChildElement("values");
-
-      if (values)
-        {
-        //Loop over value
-        TiXmlElement * pValue = values->FirstChildElement("value");
-        while(pValue)
-          {
-          cmdLine << pValue->GetText();
-          cmdLine << " ";
-
-          pValue = pValue->NextSiblingElement(); // iteration over multiple values
-          }
-        }
-      else
-        {
-        //Get parameter value
-        cmdLine << pParam->FirstChildElement("value")->GetText();
-        cmdLine << " ";
-
-        //In case of OutputImageparameter we need to report output pixel type
-        TiXmlElement * pPixType = pParam->FirstChildElement("pixtype");
-
-        if (pPixType)
-          {
-          cmdLine << pPixType->GetText();
-          cmdLine << " ";
-          }
-        }
-
-      pParam = pParam->NextSiblingElement(); // iteration over parameters
-      }
-
-    //Insert a new line character at the end of the command line
-    cmdLine << std::endl;
-
-    //Report the command line string to the application logger
-    m_Application->GetLogger()->Write(itk::LoggerBase::INFO, cmdLine.str());
-    }
-
   // launch the output image writing
-  AppliThread *taskAppli = new AppliThread( m_Application );
-
-  QObject::connect( taskAppli, &AppliThread::ExceptionRaised,
-                    this, &QtWidgetModel::ExceptionRaised );
+  delete m_taskAppli;
+  m_taskAppli = new AppliThread(m_Application);
 
-  QObject::connect( taskAppli, &AppliThread::ApplicationExecutionDone,
-                    this, &QtWidgetModel::OnApplicationExecutionDone );
+  QObject::connect(m_taskAppli, &AppliThread::ExceptionRaised, this, &QtWidgetModel::ExceptionRaised);
 
-  QObject::connect( taskAppli, &AppliThread::finished,
-                    taskAppli, &AppliThread::deleteLater );
-
-  QObject::connect( this, &QtWidgetModel::Stop,
-                    taskAppli, &AppliThread::Stop );
+  QObject::connect(m_taskAppli, &AppliThread::ApplicationExecutionDone, this, &QtWidgetModel::OnApplicationExecutionDone);
 
   // Tell the Progress Reporter to begin
   emit SetProgressReportBegin();
 
-  taskAppli->Execute();
+  // Run the application
+  m_taskAppli->start();
 
   emit SetApplicationReady(true);
 }
 
+void QtWidgetModel::Stop()
+{
+  if (m_taskAppli && m_IsRunning)
+  {
+    m_taskAppli->Stop();
+    m_taskAppli->wait();
+    m_IsRunning = false;
+  }
+}
+
 void
 QtWidgetModel
 ::OnApplicationExecutionDone( int status )
 {
+  m_IsRunning = false;
+
   // For the progressReport to close the Progress widget
   // and the GUI to update message
   emit SetProgressReportDone( status );
@@ -230,18 +153,6 @@ QtWidgetModel
     oss << "Execution took "<< m_Application->GetLastExecutionTiming() << " sec";
     SendLogINFO(oss.str());
     }
-
-  // start timer
-  m_Timer->start();
-}
-
-void
-QtWidgetModel
-::TimerDone()
-{
-  m_IsRunning = false;
-  // Require GUI update.
-  NotifyUpdate();
 }
 
 void
@@ -333,6 +244,10 @@ AppliThread
   emit ApplicationExecutionDone( result );
 }
 
+bool QtWidgetModel::IsRunning() const
+{
+  return m_IsRunning;
+}
 }
 
 }
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx
index 61c72aa250beeeffbc613e8f2beec7728dbfe7ef..5aadbca9ef2e90ef9261442586dc71882302a225 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx
@@ -50,8 +50,7 @@ void QtWidgetParameterGroup::DoCreateWidget()
 {
   // a GridLayout with two columns : parameter label / parameter widget
   QGridLayout *gridLayout = new QGridLayout;
-  gridLayout->setSpacing(1);
-  gridLayout->setContentsMargins(0, 0, 0, 0);
+  this->setLayout(gridLayout);
 
   unsigned int nbParams = m_ParamList->GetNumberOfParameters();
   for (unsigned int i = 0; i < nbParams; ++i)
@@ -139,8 +138,6 @@ void QtWidgetParameterGroup::DoCreateWidget()
         }
       }
     }
-
-  this->setLayout(gridLayout);
 }
 
 
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetProgressReport.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetProgressReport.cxx
deleted file mode 100644
index 4e958f82b2078727d204d1363c27a7579d2717ed..0000000000000000000000000000000000000000
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetProgressReport.cxx
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2005-2019 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.
- */
-
-
-#include "otbWrapperQtWidgetProgressReport.h"
-#include "otbWrapperOutputImageParameter.h"
-#include "itksys/SystemTools.hxx"
-
-#include "otbWrapperAddProcessToWatchEvent.h"
-
-namespace otb
-{
-namespace Wrapper
-{
-
-QtWidgetProgressReport::QtWidgetProgressReport(QtWidgetModel * model, QWidget * parent)
-  : QWidget(parent)
-  , m_CurrentProcess()
-{
-  m_Model = model;
-  connect(model, &QtWidgetModel::SetProgressReportBegin, this, &QtWidgetProgressReport::show );
-  connect(model, &QtWidgetModel::SetProgressReportDone, this, &QtWidgetProgressReport::close );
-  connect(model, &QtWidgetModel::SetProgressReportDone, this, &QtWidgetProgressReport::RemoveLayout );
-  connect(this, &QtWidgetProgressReport::AddNewProcessToReport, this, &QtWidgetProgressReport::ReportProcess );
-
-  m_Layout = new QVBoxLayout;
-  this->setLayout(m_Layout);
-
-  m_AddProcessCommand = AddProcessCommandType::New();
-  m_AddProcessCommand->SetCallbackFunction( this, &QtWidgetProgressReport::ProcessEvent );
-
-  this->show();
-}
-
-QtWidgetProgressReport::~QtWidgetProgressReport()
-{
-}
-
-void QtWidgetProgressReport::SetApplication(Application::Pointer app)
-{
-  m_Application = app;
-  m_Application->AddObserver( AddProcessToWatchEvent(), m_AddProcessCommand.GetPointer() );
-}
-
-void
-QtWidgetProgressReport::ProcessEvent( itk::Object * itkNotUsed(caller),
-                                      const itk::EventObject & ev )
-{
-  if( typeid( otb::Wrapper::AddProcessToWatchEvent ) == typeid( ev ) )
-    {
-    const AddProcessToWatchEvent* eventToWatch = dynamic_cast< const  AddProcessToWatchEvent*> ( &ev );
-
-    if(eventToWatch)
-      {
-      m_CurrentProcess = eventToWatch->GetProcess();
-      m_CurrentDescription =  eventToWatch->GetProcessDescription();
-      emit AddNewProcessToReport();
-      }
-    }
-}
-
-void QtWidgetProgressReport::ReportProcess ( )
-{
-  // Build the widget containing the QtProgressBar for the current
-  // process
-
-  // Create a itk::QtProgressBar, observing the event ProgressEvent
-  itk::QtProgressBar * bar =  new itk::QtProgressBar(this);
-  connect( bar, &itk::QtProgressBar::SetValueChanged, bar, &itk::QtProgressBar::setValue );
-  connect( m_Model, &QtWidgetModel::SetProgressReportDone, bar, &itk::QtProgressBar::reset );
-  bar->Observe(m_CurrentProcess);
-
-  // label
-  QLabel *label = new QLabel(QString(m_CurrentDescription.c_str()), this);
-
-  // Build the layout and store the pointers
-  m_Layout->addWidget(label);
-  m_Layout->addWidget(bar);
-}
-
-void QtWidgetProgressReport::RemoveLayout()
-{
-  // Remove the children of the layout (progress bar widgets)
-  QLayoutItem *child;
-  while ((child = this->layout()->takeAt(0)) != nullptr)
-    {
-    delete child->widget();
-    delete child;
-    }
-}
-
-}
-}
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx
index 8df23531e7646587a7bf1e726cf701c365197936..19fffe036460e8a2425103319d84855328a780f2 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx
@@ -30,44 +30,29 @@ namespace otb
 namespace Wrapper
 {
 
-QtWidgetSimpleProgressReport::QtWidgetSimpleProgressReport(QtWidgetModel * model, QWidget * parent)
-  : QWidget(parent)
-  , m_CurrentProcess()
+QtWidgetSimpleProgressReport::QtWidgetSimpleProgressReport(QWidget* parent) : itk::QtProgressBar(parent), m_CurrentProcess()
+{
+}
+
+void QtWidgetSimpleProgressReport::SetModel(QtWidgetModel* model)
 {
-  m_Model = model;
   connect(model, &QtWidgetModel::SetProgressReportBegin, this, &QtWidgetSimpleProgressReport::show );
   connect(model, &QtWidgetModel::SetProgressReportDone, this, &QtWidgetSimpleProgressReport::Init );
   connect(this, &QtWidgetSimpleProgressReport::AddNewProcessToReport, this, &QtWidgetSimpleProgressReport::ReportProcess );
 
-  m_Layout = new QVBoxLayout;
-  this->setLayout(m_Layout);
-
   m_AddProcessCommand = AddProcessCommandType::New();
   m_AddProcessCommand->SetCallbackFunction( this, &QtWidgetSimpleProgressReport::ProcessEvent );
 
-  m_Bar =  new itk::QtProgressBar(this);
-
-  m_Label = new QLabel("No process", this);
-  m_Label->setWordWrap(true);
-  connect( m_Bar, &itk::QtProgressBar::SetValueChanged, m_Bar, &itk::QtProgressBar::setValue );
-  connect( m_Model, &QtWidgetModel::SetProgressReportDone, m_Bar, &itk::QtProgressBar::reset );
+  connect(this, &itk::QtProgressBar::SetValueChanged, this, &itk::QtProgressBar::setValue);
+  connect(model, &QtWidgetModel::SetProgressReportDone, this, &itk::QtProgressBar::reset);
 
-  m_Layout->addWidget(m_Label);
-  m_Layout->addWidget(m_Bar);
-
-  this->show();
+  model->GetApplication()->AddObserver(AddProcessToWatchEvent(), m_AddProcessCommand.GetPointer());
 }
 
 QtWidgetSimpleProgressReport::~QtWidgetSimpleProgressReport()
 {
 }
 
-void QtWidgetSimpleProgressReport::SetApplication(Application::Pointer app)
-{
-  m_Application = app;
-  m_Application->AddObserver( AddProcessToWatchEvent(), m_AddProcessCommand.GetPointer() );
-}
-
 void
 QtWidgetSimpleProgressReport::ProcessEvent( itk::Object * itkNotUsed(caller),
                                       const itk::EventObject & event2 )
@@ -87,15 +72,14 @@ QtWidgetSimpleProgressReport::ProcessEvent( itk::Object * itkNotUsed(caller),
 
 void QtWidgetSimpleProgressReport::ReportProcess()
 {
-  m_Bar->Observe(m_CurrentProcess);
-  m_Label->setText(QString(m_CurrentDescription.c_str()));
+  this->Observe(m_CurrentProcess);
+  emit SetText(QString::fromStdString(m_CurrentDescription));
 }
 
-
 void QtWidgetSimpleProgressReport::Init()
 {
-  m_Bar->setValue(0);
-  m_Label->setText("No process");
+  this->setValue(0);
+  emit SetText(QString(""));
 }
 
 }
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx
index 4af61804517d82518ce13d78ec021a86b044fee5..9984222ae6a1fd7240dc544e2d9a811d15e245ce 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx
@@ -103,7 +103,8 @@ void QtWidgetSpinBox::SetValueNoSignal(int value)
 int QtWidgetSpinBox::valueFromText(const QString &text) const
 {
   bool ok;
-  int result = QLocale::system().toInt(text, &ok);
+  // Force C locale because OTB gui is not i18n
+  int result = QLocale::c().toInt(text, &ok);
   if (ok)
   {
     return result;
@@ -162,7 +163,8 @@ void QtWidgetDoubleSpinBox::SetValueNoSignal(double value)
 double QtWidgetDoubleSpinBox::valueFromText(const QString &text) const
 {
   bool ok;
-  double result = QLocale::system().toDouble(text, &ok);
+  // Force C locale because OTB gui is not i18n
+  double result = QLocale::c().toDouble(text, &ok);
   if (ok)
   {
     return result;
@@ -180,7 +182,9 @@ QString QtWidgetDoubleSpinBox::textFromValue(double value) const
   // which leads to ugly trailing zeros for small values (e.g 1.50000)
   // We use std::ostringstream because QString::arg formatting support is too limited
   std::ostringstream oss;
-  oss.imbue(std::locale("")); // use system's locale for formatting
+
+  // Force C locale because OTB gui is not i18n
+  oss.imbue(std::locale::classic());
 
   // Set precision to the number of decimal digits that can be represented without change.
   // Use float precision because OTB parameter is float
@@ -190,9 +194,8 @@ QString QtWidgetDoubleSpinBox::textFromValue(double value) const
 
   // Add a trailing dot if the number is integer,
   // so that int and float parameters are more visually different.
-  // For now this is done for all locales, even though not all locales use this
-  // convention for formatting decimals...
-  const char dot = std::use_facet<std::numpunct<char>>(std::locale("")).decimal_point();
+  // This is an ok convention as long as we stay in C or english locale
+  const char dot = std::use_facet<std::numpunct<char>>(std::locale::classic()).decimal_point();
   if (oss.str().find(dot) == std::string::npos)
   {
       oss << dot;
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx
index 6b84fa510c85722a183a0a1ed7ab71f0236cea69..e72a1b4dd4df05fecabe758550aa155212d53d5d 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx
@@ -20,8 +20,6 @@
 
 #include "otbWrapperQtWidgetView.h"
 
-#include <functional>
-
 #include "otbWrapperQtWidgetParameterGroup.h"
 #include "otbWrapperQtWidgetParameterFactory.h"
 #include "otbWrapperOutputFilenameParameter.h"
@@ -54,36 +52,11 @@ QtWidgetView::QtWidgetView( const otb::Wrapper::Application::Pointer & otbApp,
 		QWidget* parent,
 		Qt::WindowFlags flags ) :
   QWidget( parent, flags ),
-  m_IconPathDone(""),
-  m_IconPathFailed(""),
   m_Model( NULL ),
-  m_ExecButton( NULL ),
-  m_QuitButton( NULL ),
-  m_Message( NULL ),
-  m_LogText( NULL ),
-  m_TabWidget( NULL ),
-  m_IsClosable( true ),
   m_IsRunning(false)
 {
   setObjectName( QtWidgetView::OBJECT_NAME );
-
   m_Model = new otb::Wrapper::QtWidgetModel( otbApp );
-  m_QuitShortcut = new QShortcut(QKeySequence("Ctrl+Q"), this);
-
-  QObject::connect(
-    m_Model, &QtWidgetModel::SetProgressReportBegin,
-    this, &QtWidgetView::OnProgressReportBegin
-  );
-
-  QObject::connect(
-    m_Model, &QtWidgetModel::SetProgressReportDone,
-    this, &QtWidgetView::OnProgressReportEnd
-  );
-
-  QObject::connect(
-    m_Model, &QtWidgetModel::ExceptionRaised,
-    this, &QtWidgetView::OnExceptionRaised
-  );
 }
 
 QtWidgetView::~QtWidgetView()
@@ -94,172 +67,14 @@ QtWidgetView::~QtWidgetView()
 
 void QtWidgetView::CreateGui()
 {
-  // Create a VBoxLayout with the header, the input widgets, and the footer
   QVBoxLayout *mainLayout = new QVBoxLayout;
-  m_TabWidget = new QTabWidget(this);
-
-  m_TabWidget->addTab(CreateInputWidgets(), tr("Parameters"));
-  m_LogText = new QTextEdit(this);
-  connect( m_Model->GetLogOutput(), &QtLogOutput::NewContentLog, m_LogText, &QTextEdit::append );
-  m_TabWidget->addTab(m_LogText, tr("Logs"));
-  mainLayout->addWidget(m_TabWidget);
-
-  m_Message = new QLabel("<center><font color=\"#FF0000\">"+tr("Select parameters")+"</font></center>", this);
-  connect( m_Model, &QtWidgetModel::SetApplicationReady, this, &QtWidgetView::UpdateMessageAfterApplicationReady );
-  connect( m_Model, &QtWidgetModel::SetProgressReportDone, this, &QtWidgetView::UpdateMessageAfterExecution );
-  mainLayout->addWidget(m_Message);
-
-  otb::Wrapper::QtWidgetSimpleProgressReport * progressReport = new otb::Wrapper::QtWidgetSimpleProgressReport(m_Model, this);
-  progressReport->SetApplication(m_Model->GetApplication());
-
-  QWidget* footer = CreateFooter();
-
-  QHBoxLayout *footLayout = new QHBoxLayout;
-  footLayout->addWidget(progressReport);
-  footLayout->addWidget(footer);
-  mainLayout->addLayout(footLayout);
-
-  footLayout->setAlignment(footer, Qt::AlignBottom);
-
-  QGroupBox *mainGroup = new QGroupBox(this);
-  mainGroup->setLayout(mainLayout);
-
-  QVBoxLayout  *finalLayout = new QVBoxLayout;
-  finalLayout->addWidget(mainGroup);
-
-  // Make the final layout to the widget
-  this->setLayout(finalLayout);
-}
-
-void QtWidgetView::UpdateMessageAfterExecution(int status)
-{
-  if (status >= 0)
-    {
-    m_Message->setText("<center>"+QString(m_IconPathDone.c_str())+
-      "<font color=\"#00A000\">"+tr("Done")+"</font></center>");
-    }
-  else
-    {
-    m_Message->setText("<center>"+QString(m_IconPathFailed.c_str())+
-      "<font color=\"#FF0000\">"+tr("Failed")+"</font></center>");
-    }
-  m_ExecButton->setText(QObject::tr("Execute"));
-  m_IsRunning = false;
-}
-
-void QtWidgetView::UpdateMessageAfterApplicationReady( bool val )
-{
-  if(!m_IsRunning)
-    {
-    if(val == true)
-      m_Message->setText("<center><font color=\"#00A000\">"+tr("Ready to run")+"</font></center>");
-    else
-      m_Message->setText("<center><font color=\"#FF0000\">"+tr("Select parameters")+"</font></center>");
-    }
+  this->setLayout(mainLayout);
+  mainLayout->addWidget(CreateInputWidgets());
 }
 
 QWidget* QtWidgetView::CreateInputWidgets()
 {
-  QScrollArea *scrollArea = new QScrollArea(this);
-
-  scrollArea->setWidget( otb::Wrapper::QtWidgetParameterFactory::CreateQtWidget(
-      m_Model->GetApplication()->GetParameterList(),
-      m_Model,
-      this));
-  scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
-  scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
-  scrollArea->setWidgetResizable(true);
-
-  return scrollArea;
-}
-
-
-QWidget* QtWidgetView::CreateFooter()
-{
-  // an HLayout with two buttons : Execute and Quit
-  QGroupBox *footerGroup = new QGroupBox(this);
-  QHBoxLayout *footerLayout = new QHBoxLayout;
-
-  m_ExecButton = new QPushButton(footerGroup);
-  m_ExecButton->setDefault(true);
-  m_ExecButton->setEnabled(false);
-  m_ExecButton->setText(QObject::tr("Execute"));
-  connect( m_Model, &QtWidgetModel::SetApplicationReady, m_ExecButton, &QPushButton::setEnabled );
-  connect( m_ExecButton, &QPushButton::clicked, this, &QtWidgetView::OnExecButtonClicked );
-  connect( this, &QtWidgetView::ExecuteAndWriteOutput, m_Model, &QtWidgetModel::ExecuteAndWriteOutputSlot );
-  connect( this, &QtWidgetView::Stop, m_Model, &QtWidgetModel::Stop );
-
-  m_QuitButton = new QPushButton(footerGroup);
-  m_QuitButton->setText(QObject::tr("Quit"));
-  connect(m_QuitButton, &QPushButton::clicked, this, &QtWidgetView::close );
-
-  // Add Ctrl-Q shortcut to quit
-  connect( m_QuitShortcut, &QShortcut::activated, this, &QtWidgetView::close );
-
-  // Put the buttons on the right
-  footerLayout->addStretch();
-  footerLayout->addWidget(m_ExecButton);
-  footerLayout->addWidget(m_QuitButton);
-
-  footerGroup->setLayout(footerLayout);
-
-  return footerGroup;
-}
-
-void QtWidgetView::closeEvent( QCloseEvent * e )
-{
-  assert( e!=NULL );
-
-  if( !IsClosable() )
-    {
-    assert( GetModel()->GetApplication() );
-
-    QMessageBox::warning(
-      this,
-      tr( "Warning!" ),
-      tr( "OTB-Application '%1' cannot be closed while running!")
-      .arg( GetModel()->GetApplication()->GetDocName() )
-    );
-
-    e->ignore();
-
-    return;
-    }
-
-  QWidget::closeEvent( e );
-
-  emit QuitSignal();
-
-  deleteLater();
-}
-
-void
-QtWidgetView
-::OnExecButtonClicked()
-{
-  if (m_IsRunning)
-    {
-    m_Message->setText("<center><font color=\"#FF0000\">"+tr("Cancelling")+"...</font></center>");
-    emit Stop();
-    }
-  else
-    {
-    m_IsRunning =  true;
-    m_Message->setText("<center><font color=\"#FF0000\">"+tr("Running")+"</font></center>");
-    m_ExecButton->setText(QObject::tr("Cancel"));
-    emit ExecuteAndWriteOutput();
-    }
-}
-
-void QtWidgetView::UnhandledException(QString message)
-{
-  this->OnExceptionRaised(message);
-  m_LogText->append(message);
-}
-
-void QtWidgetView::OnExceptionRaised( QString /*message*/)
-{
-  m_TabWidget->setCurrentIndex(1);
+  return otb::Wrapper::QtWidgetParameterFactory::CreateQtWidget(m_Model->GetApplication()->GetParameterList(), m_Model, this);
 }
 
 bool QtWidgetView::IsRunning() const
@@ -272,29 +87,26 @@ QtWidgetModel* QtWidgetView::GetModel() const
 return m_Model;
 }
 
-bool QtWidgetView::IsClosable() const
-{
-  return m_IsClosable;
-}
-
-void QtWidgetView::SetClosable( bool enabled )
-{
-  m_IsClosable = enabled;
-
-  setEnabled( true );
-
-  if( m_QuitButton!=NULL )
-    m_QuitButton->setEnabled( m_IsClosable );
-}
-
-void QtWidgetView::OnProgressReportBegin()
+void QtWidgetView::Disable()
 {
-  SetClosable( false );
+  // Disable all widgets to make sure parameters are not updated when the application is running in another thread
+  for (QWidget* w : this->findChildren<QWidget*>())
+  {
+    w->setEnabled(false);
+  }
+  this->setEnabled(false);
 }
 
-void QtWidgetView::OnProgressReportEnd( int )
+void QtWidgetView::Enable()
 {
-  SetClosable( true );
+  // Reset all widgets of the view to their previous enabled state
+  this->setEnabled(true);
+  for (QWidget* w : this->findChildren<QWidget*>())
+  {
+    w->setEnabled(true);
+  }
+  // Resync widgets enabled state with parameter enabled flag
+  this->GetModel()->NotifyUpdate();
 }
 
 } // end of namespace Wrapper
diff --git a/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx b/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx
index 9477a89fa6ec0bf8c2139daa17d47bcba11fbd9f..8f566438d7d6d898e44435460c72dcb2afa85da3 100644
--- a/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx
+++ b/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx
@@ -25,7 +25,6 @@
 #include "otbQtApplication.h"
 #include "otbWrapperApplicationRegistry.h"
 #include "otbWrapperQtWidgetView.h"
-#include "otbWrapperQtWidgetProgressReport.h"
 #include "itksys/SystemTools.hxx"
 
 
@@ -33,7 +32,6 @@ using otb::Wrapper::Application;
 using otb::Wrapper::ApplicationRegistry;
 using otb::Wrapper::QtApplication;
 using otb::Wrapper::QtWidgetView;
-using otb::Wrapper::QtWidgetProgressReport;
 
 
 struct static_finalizer
@@ -113,19 +111,6 @@ otbWrapperQtWidgetShowWidget( int argc, char* argv[] )
 	  );
 
 	  layout->addWidget( qwv );
-
-	  // Create OTB-Application progress-report.
-	  //
-	  // SAT: QWidget should be created without parent when adding
-	  // into QLayout (because QLayout will take ownership of the
-	  // reference-counted pointer) but OTB API doesn't defined default nullptr
-	  // value such as in Qt.
-	  QtWidgetProgressReport * qwpr =
-	    new QtWidgetProgressReport( qwv->GetModel(), widget );
-
-	  qwpr->SetApplication( otb_application );
-
-	  layout->addWidget( qwpr );
 	}
         widget->setLayout( layout );
       }
diff --git a/Utilities/Doxygen/mcdoc.py b/Utilities/Doxygen/mcdoc.py
index b380dd153f6754bab1ab9142b9b18951945a9d78..0242dcfbea1c0a6d15ea142891f96cec738c871c 100644
--- a/Utilities/Doxygen/mcdoc.py
+++ b/Utilities/Doxygen/mcdoc.py
@@ -70,7 +70,7 @@ def setGroup( fname, group ):
 
 def checkGroup( fname, group ):
 # sys.stderr.write("Checking"+ fname + "\n")
-  f = open( fname, "r" )
+  f = open( fname, "r", encoding='utf-8')
   # load everything in memory
   fcontent = f.read()
   f.close()