otbLSMSSmallRegionsMerging.cxx 17.90 KiB
/*
 * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
 * This file is part of Orfeo Toolbox
 *     https://www.orfeo-toolbox.org/
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *     http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
#include "otbMultiChannelExtractROI.h"
#include "otbExtractROI.h"
#include "otbStreamingStatisticsImageFilter.h"
#include "otbSystem.h"
#include "itkUnaryFunctorImageFilter.h"
#include "itkChangeLabelImageFilter.h"
#include "otbTileImageFilter.h"
#include <time.h>
#include <algorithm>
#include <climits>
#include "otbWrapperApplication.h"
#include "otbWrapperApplicationFactory.h"
#include "otbStandardWriterWatcher.h"
namespace otb
namespace Wrapper
class LSMSSmallRegionsMerging : public Application
public:
  typedef LSMSSmallRegionsMerging Self;
  typedef Application Superclass;
  typedef itk::SmartPointer<Self> Pointer;
  typedef itk::SmartPointer<const Self> ConstPointer;
  typedef FloatVectorImageType              ImageType;
  typedef ImageType::InternalPixelType      ImagePixelType;
  typedef UInt32ImageType                   LabelImageType;
  typedef LabelImageType::InternalPixelType LabelImagePixelType;
  typedef otb::MultiChannelExtractROI <ImagePixelType,ImagePixelType > MultiChannelExtractROIFilterType;
  typedef otb::ExtractROI<LabelImagePixelType,LabelImagePixelType> ExtractROIFilterType;
  typedef otb::StreamingStatisticsImageFilter<LabelImageType> StatisticsImageFilterType;
  typedef itk::ImageRegionConstIterator<LabelImageType> LabelImageIterator;
  typedef itk::ImageRegionConstIterator<ImageType> ImageIterator;
  typedef itk::ChangeLabelImageFilter<LabelImageType,LabelImageType> ChangeLabelImageFilterType;
  typedef otb::TileImageFilter<LabelImageType> TileImageFilterType;
  itkNewMacro(Self);
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
itkTypeMacro(Merging, otb::Application); private: ChangeLabelImageFilterType::Pointer m_ChangeLabelFilter; void DoInit() override { SetName("LSMSSmallRegionsMerging"); SetDescription("This application performs the third (optional) step of the exact Large-Scale Mean-Shift segmentation workflow [1]."); SetDocName("Exact Large-Scale Mean-Shift segmentation, step 3 (optional)"); SetDocLongDescription("Given a segmentation result (can be the out output parameter of the" " LSMSSegmentation application [2]) and the original image, it will" " merge segments whose size in pixels is lower than minsize parameter" " with the adjacent segments with the adjacent segment with closest" " radiometry and acceptable size.\n\n" "Small segments will be processed by increasing size: first all segments" " for which area is equal to 1 pixel will be merged with adjacent" " segments, then all segments of area equal to 2 pixels will be processed," " until segments of area minsize. For large images one can use the" " tilesizex and tilesizey parameters for tile-wise processing, with the" " guarantees of identical results.\n\n" "The output of this application can be passed to the" " LSMSVectorization application [3] to complete the LSMS workflow."); SetDocLimitations("This application is part of the Large-Scale Mean-Shift segmentation" " workflow (LSMS) and may not be suited for any other purpose. This" " application is not compatible with in-memory connection since it does" " its own internal streaming."); SetDocAuthors("David Youssefi"); SetDocSeeAlso( "[1] Michel, J., Youssefi, D., & Grizonnet, M. (2015). Stable" " mean-shift algorithm and its application to the segmentation of" " arbitrarily large remote sensing images. IEEE Transactions on" " Geoscience and Remote Sensing, 53(2), 952-964.\n" "[2] LSMSegmentation\n" "[3] LSMSVectorization"); AddDocTag(Tags::Segmentation); AddDocTag(Tags::Deprecated); AddDocTag("LSMS"); AddParameter(ParameterType_InputImage, "in", "Input image"); SetParameterDescription( "in", "The input image, containing initial spectral signatures corresponding to the segmented image (inseg)." ); AddParameter(ParameterType_InputImage, "inseg", "Segmented image"); SetParameterDescription( "inseg", "Segmented image where each pixel value is the unique integer label of the segment it belongs to." ); AddParameter(ParameterType_OutputImage, "out", "Output Image"); SetParameterDescription( "out", "The output image. The output image is the segmented image where the minimal segments have been merged. An ecoding of uint32 is advised." ); SetDefaultOutputPixelType("out",ImagePixelType_uint32); AddParameter(ParameterType_Int, "minsize", "Minimum Segment Size"); SetParameterDescription("minsize", "Minimum Segment Size. If, after the segmentation, a segment is of size lower than this criterion, the segment is merged with the segment that has the closest sepctral signature."); SetDefaultParameterInt("minsize", 50); SetMinimumParameterIntValue("minsize", 0); MandatoryOff("minsize"); AddParameter(ParameterType_Int, "tilesizex", "Size of tiles in pixel (X-axis)"); SetParameterDescription("tilesizex", "Size of tiles along the X-axis for tile-wise processing."); SetDefaultParameterInt("tilesizex", 500); SetMinimumParameterIntValue("tilesizex", 1); AddParameter(ParameterType_Int, "tilesizey", "Size of tiles in pixel (Y-axis)"); SetParameterDescription("tilesizey", "Size of tiles along the Y-axis for tile-wise processing."); SetDefaultParameterInt("tilesizey", 500); SetMinimumParameterIntValue("tilesizey", 1); AddRAMParameter(); // Doc example parameter settings SetDocExampleParameterValue("in","smooth.tif"); SetDocExampleParameterValue("inseg","segmentation.tif"); SetDocExampleParameterValue("out","merged.tif");