207 lines
7.0 KiB
C++

/*
* Software License Agreement (BSD License)
*
* Point Cloud Library (PCL) - www.pointclouds.org
* Copyright (c) 2012-, Open Perception, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of the copyright holder(s) nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#pragma once
#include <pcl/pcl_base.h>
namespace pcl {
template <typename PointT>
class Morphology : public PCLBase<PointT> {
private:
using PointCloudIn = pcl::PointCloud<PointT>;
using PointCloudInPtr = typename PointCloudIn::Ptr;
PointCloudInPtr structuring_element_;
public:
using PCLBase<PointT>::input_;
Morphology() {}
/** \brief This function performs erosion followed by dilation.
* It is useful for removing noise in the form of small blobs and patches.
* \param[out] output Output point cloud passed by reference
*/
void
openingBinary(pcl::PointCloud<PointT>& output);
/** \brief This function performs dilation followed by erosion.
* It is useful for filling up (holes/cracks/small discontinuities) in a binary
* segmented region
* \param[out] output Output point cloud passed by reference
*/
void
closingBinary(pcl::PointCloud<PointT>& output);
/** \brief Binary dilation is similar to a logical disjunction of sets.
* At each pixel having value 1, if for all pixels in the structuring element having
* value 1, the corresponding pixels in the input image are also 1, the center pixel
* is set to 1. Otherwise, it is set to 0.
*
* \param[out] output Output point cloud passed by reference
*/
void
erosionBinary(pcl::PointCloud<PointT>& output);
/** \brief Binary erosion is similar to a logical addition of sets.
* At each pixel having value 1, if at least one pixel in the structuring element is
* 1 and the corresponding point in the input image is 1, the center pixel is set
* to 1. Otherwise, it is set to 0.
*
* \param[out] output Output point cloud passed by reference
*/
void
dilationBinary(pcl::PointCloud<PointT>& output);
/** \brief Grayscale erosion followed by dilation.
* This is used to remove small bright artifacts from the image. Large bright objects
* are relatively undisturbed.
*
* \param[out] output Output point cloud passed by reference
*/
void
openingGray(pcl::PointCloud<PointT>& output);
/** \brief Grayscale dilation followed by erosion.
* This is used to remove small dark artifacts from the image. Bright features or
* large dark features are relatively undisturbed.
*
* \param[out] output Output point cloud passed by reference
*/
void
closingGray(pcl::PointCloud<PointT>& output);
/** \brief Takes the min of the pixels where kernel is 1
* \param[out] output Output point cloud passed by reference
*/
void
erosionGray(pcl::PointCloud<PointT>& output);
/** \brief Takes the max of the pixels where kernel is 1
* \param[out] output Output point cloud passed by reference
*/
void
dilationGray(pcl::PointCloud<PointT>& output);
/** \brief Set operation
* output = input1 - input2
* \param[out] output Output point cloud passed by reference
* \param[in] input1
* \param[in] input2
*/
void
subtractionBinary(pcl::PointCloud<PointT>& output,
const pcl::PointCloud<PointT>& input1,
const pcl::PointCloud<PointT>& input2);
/** \brief Set operation
* \f$output = input1 \cup input2\f$
* \param[out] output Output point cloud passed by reference
* \param[in] input1
* \param[in] input2
*/
void
unionBinary(pcl::PointCloud<PointT>& output,
const pcl::PointCloud<PointT>& input1,
const pcl::PointCloud<PointT>& input2);
/** \brief Set operation \f$ output = input1 \cap input2 \f$
* \param[out] output Output point cloud passed by reference
* \param[in] input1
* \param[in] input2
*/
void
intersectionBinary(pcl::PointCloud<PointT>& output,
const pcl::PointCloud<PointT>& input1,
const pcl::PointCloud<PointT>& input2);
/** \brief Creates a circular structing element. The size of the kernel created is
* 2*radius x 2*radius. Center of the structuring element is the center of the circle.
* All values lying on the circle are 1 and the others are 0.
*
* \param[out] kernel structuring element kernel passed by reference
* \param[in] radius Radius of the circular structuring element.
*/
void
structuringElementCircular(pcl::PointCloud<PointT>& kernel, const int radius);
/** \brief Creates a rectangular structing element of size height x width. *
* All values are 1.
*
* \param[out] kernel structuring element kernel passed by reference
* \param[in] height height number of rows in the structuring element
* \param[in] width number of columns in the structuring element
*
*/
void
structuringElementRectangle(pcl::PointCloud<PointT>& kernel,
const int height,
const int width);
enum MORPHOLOGICAL_OPERATOR_TYPE {
EROSION_GRAY,
DILATION_GRAY,
OPENING_GRAY,
CLOSING_GRAY,
EROSION_BINARY,
DILATION_BINARY,
OPENING_BINARY,
CLOSING_BINARY
};
MORPHOLOGICAL_OPERATOR_TYPE operator_type;
/**
* \param[out] output Output point cloud passed by reference
*/
void
applyMorphologicalOperation(pcl::PointCloud<PointT>& output);
/**
* \param[in] structuring_element The structuring element to be used for the
* morphological operation
*/
void
setStructuringElement(const PointCloudInPtr& structuring_element);
};
} // namespace pcl
#include <pcl/2d/impl/morphology.hpp>