2026-03-28 10:49:55 +08:00
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.
# ifndef OPENCV_IMGPROC_SEGMENTATION_HPP
# define OPENCV_IMGPROC_SEGMENTATION_HPP
# include "opencv2/imgproc.hpp"
namespace cv {
namespace segmentation {
//! @addtogroup imgproc_segmentation
//! @{
/** @brief Intelligent Scissors image segmentation
*
* This class is used to find the path ( contour ) between two points
* which can be used for image segmentation .
*
* Usage example :
* @ snippet snippets / imgproc_segmentation . cpp usage_example_intelligent_scissors
*
* Reference : < a href = " http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.138.3811&rep=rep1&type=pdf " > " Intelligent Scissors for Image Composition " < / a >
* algorithm designed by Eric N . Mortensen and William A . Barrett , Brigham Young University
* @ cite Mortensen95intelligentscissors
*/
class CV_EXPORTS_W_SIMPLE IntelligentScissorsMB
{
public :
CV_WRAP
IntelligentScissorsMB ( ) ;
/** @brief Specify weights of feature functions
*
* Consider keeping weights normalized ( sum of weights equals to 1.0 )
* Discrete dynamic programming ( DP ) goal is minimization of costs between pixels .
*
* @ param weight_non_edge Specify cost of non - edge pixels ( default : 0.43f )
* @ param weight_gradient_direction Specify cost of gradient direction function ( default : 0.43f )
* @ param weight_gradient_magnitude Specify cost of gradient magnitude function ( default : 0.14f )
*/
CV_WRAP
IntelligentScissorsMB & setWeights ( float weight_non_edge , float weight_gradient_direction , float weight_gradient_magnitude ) ;
/** @brief Specify gradient magnitude max value threshold
*
* Zero limit value is used to disable gradient magnitude thresholding ( default behavior , as described in original article ) .
* Otherwize pixels with ` gradient magnitude > = threshold ` have zero cost .
*
* @ note Thresholding should be used for images with irregular regions ( to avoid stuck on parameters from high - contract areas , like embedded logos ) .
*
* @ param gradient_magnitude_threshold_max Specify gradient magnitude max value threshold ( default : 0 , disabled )
*/
CV_WRAP
IntelligentScissorsMB & setGradientMagnitudeMaxLimit ( float gradient_magnitude_threshold_max = 0.0f ) ;
/** @brief Switch to "Laplacian Zero-Crossing" edge feature extractor and specify its parameters
*
* This feature extractor is used by default according to article .
*
* Implementation has additional filtering for regions with low - amplitude noise .
* This filtering is enabled through parameter of minimal gradient amplitude ( use some small value 4 , 8 , 16 ) .
*
* @ note Current implementation of this feature extractor is based on processing of grayscale images ( color image is converted to grayscale image first ) .
*
* @ note Canny edge detector is a bit slower , but provides better results ( especially on color images ) : use setEdgeFeatureCannyParameters ( ) .
*
* @ param gradient_magnitude_min_value Minimal gradient magnitude value for edge pixels ( default : 0 , check is disabled )
*/
CV_WRAP
IntelligentScissorsMB & setEdgeFeatureZeroCrossingParameters ( float gradient_magnitude_min_value = 0.0f ) ;
/** @brief Switch edge feature extractor to use Canny edge detector
*
* @ note " Laplacian Zero-Crossing " feature extractor is used by default ( following to original article )
*
* @ sa Canny
*/
CV_WRAP
IntelligentScissorsMB & setEdgeFeatureCannyParameters (
double threshold1 , double threshold2 ,
int apertureSize = 3 , bool L2gradient = false
) ;
/** @brief Specify input image and extract image features
*
* @ param image input image . Type is # CV_8UC1 / # CV_8UC3
*/
CV_WRAP
IntelligentScissorsMB & applyImage ( InputArray image ) ;
/** @brief Specify custom features of input image
*
* Customized advanced variant of applyImage ( ) call .
*
* @ param non_edge Specify cost of non - edge pixels . Type is CV_8UC1 . Expected values are ` { 0 , 1 } ` .
* @ param gradient_direction Specify gradient direction feature . Type is CV_32FC2 . Values are expected to be normalized : ` x ^ 2 + y ^ 2 = = 1 `
* @ param gradient_magnitude Specify cost of gradient magnitude function : Type is CV_32FC1 . Values should be in range ` [ 0 , 1 ] ` .
* @ param image * * Optional parameter * * . Must be specified if subset of features is specified ( non - specified features are calculated internally )
*/
CV_WRAP
IntelligentScissorsMB & applyImageFeatures (
InputArray non_edge , InputArray gradient_direction , InputArray gradient_magnitude ,
InputArray image = noArray ( )
) ;
/** @brief Prepares a map of optimal paths for the given source point on the image
*
* @ note applyImage ( ) / applyImageFeatures ( ) must be called before this call
*
* @ param sourcePt The source point used to find the paths
*/
CV_WRAP void buildMap ( const Point & sourcePt ) ;
/** @brief Extracts optimal contour for the given target point on the image
*
* @ note buildMap ( ) must be called before this call
*
* @ param targetPt The target point
* @ param [ out ] contour The list of pixels which contains optimal path between the source and the target points of the image . Type is CV_32SC2 ( compatible with ` std : : vector < Point > ` )
* @ param backward Flag to indicate reverse order of retrived pixels ( use " true " value to fetch points from the target to the source point )
*/
CV_WRAP void getContour ( const Point & targetPt , OutputArray contour , bool backward = false ) const ;
# ifndef CV_DOXYGEN
struct Impl ;
inline Impl * getImpl ( ) const { return impl . get ( ) ; }
protected :
std : : shared_ptr < Impl > impl ;
# endif
} ;
//! @}
} // namespace segmentation
} // namespace cv
# endif // OPENCV_IMGPROC_SEGMENTATION_HPP