-
Notifications
You must be signed in to change notification settings - Fork 5.9k
New superpixel algorithm (F-DBSCAN) #3093
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
68ece0e
79f8436
3e6aaae
5d8616e
d74bde5
9dfe150
3e4f25d
5a2e153
7130d25
ee702c6
c4155b0
ec78937
4de0e31
c6a918c
67d9143
0fbdc2f
74c6cf5
650f9c4
e0a4048
a968096
d98fa2c
a2bdd04
0b3bfe4
a2d5fe8
5e950ee
d092203
86521fc
bcbfdc3
c64cbf6
56112ad
a048792
f106c54
6635ef2
e9413ad
8e86fc0
ab87fa1
1b586b3
a766bb4
67fa9e5
2234e6a
3f398a5
8b132b5
30e7b5b
acc879b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,83 @@ | ||
| // 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. | ||
| // | ||
| // Copyright (C) 2021, Dr Seng Cheong Loke ([email protected]) | ||
|
|
||
| #ifndef __OPENCV_XIMGPROC_SCANSEGMENT_HPP__ | ||
| #define __OPENCV_XIMGPROC_SCANSEGMENT_HPP__ | ||
|
|
||
| #include <opencv2/core.hpp> | ||
|
|
||
| namespace cv { namespace ximgproc { | ||
|
|
||
| /** @brief Class implementing the F-DBSCAN (Accelerated superpixel image segmentation with a parallelized DBSCAN algorithm) superpixels | ||
| algorithm by Loke SC, et al. @cite loke2021accelerated for original paper. | ||
|
|
||
| The algorithm uses a parallelised DBSCAN cluster search that is resistant to noise, competitive in segmentation quality, and faster than | ||
| existing superpixel segmentation methods. When tested on the Berkeley Segmentation Dataset, the average processing speed is 175 frames/s | ||
| with a Boundary Recall of 0.797 and an Achievable Segmentation Accuracy of 0.944. The computational complexity is quadratic O(n2) and | ||
| more suited to smaller images, but can still process a 2MP colour image faster than the SEEDS algorithm in OpenCV. The output is deterministic | ||
| when the number of processing threads is fixed, and requires the source image to be in Lab colour format. | ||
| */ | ||
| class CV_EXPORTS_W ScanSegment : public Algorithm | ||
| { | ||
| public: | ||
| virtual ~ScanSegment(); | ||
|
|
||
| /** @brief Returns the actual superpixel segmentation from the last image processed using iterate. | ||
|
|
||
| Returns zero if no image has been processed. | ||
| */ | ||
| CV_WRAP virtual int getNumberOfSuperpixels() = 0; | ||
|
|
||
| /** @brief Calculates the superpixel segmentation on a given image with the initialized | ||
| parameters in the ScanSegment object. | ||
|
|
||
| This function can be called again for other images without the need of initializing the algorithm with createScanSegment(). | ||
| This save the computational cost of allocating memory for all the structures of the algorithm. | ||
|
|
||
| @param img Input image. Supported format: CV_8UC3. Image size must match with the initialized | ||
| image size with the function createScanSegment(). It MUST be in Lab color space. | ||
| */ | ||
| CV_WRAP virtual void iterate(InputArray img) = 0; | ||
|
|
||
| /** @brief Returns the segmentation labeling of the image. | ||
|
|
||
| Each label represents a superpixel, and each pixel is assigned to one superpixel label. | ||
|
|
||
| @param labels_out Return: A CV_32UC1 integer array containing the labels of the superpixel | ||
| segmentation. The labels are in the range [0, getNumberOfSuperpixels()]. | ||
| */ | ||
| CV_WRAP virtual void getLabels(OutputArray labels_out) = 0; | ||
|
|
||
| /** @brief Returns the mask of the superpixel segmentation stored in the ScanSegment object. | ||
|
|
||
| The function return the boundaries of the superpixel segmentation. | ||
|
|
||
| @param image Return: CV_8UC1 image mask where -1 indicates that the pixel is a superpixel border, and 0 otherwise. | ||
| @param thick_line If false, the border is only one pixel wide, otherwise all pixels at the border are masked. | ||
| */ | ||
| CV_WRAP virtual void getLabelContourMask(OutputArray image, bool thick_line = false) = 0; | ||
| }; | ||
|
|
||
| /** @brief Initializes a ScanSegment object. | ||
|
|
||
| The function initializes a ScanSegment object for the input image. It stores the parameters of | ||
| the image: image_width and image_height. It also sets the parameters of the F-DBSCAN superpixel | ||
| algorithm, which are: num_superpixels, threads, and merge_small. | ||
|
|
||
| @param image_width Image width. | ||
| @param image_height Image height. | ||
|
Comment on lines
+70
to
+71
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. BTW, prefer to use
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was thinking of this also, but in the end I went with following the pattern in createSuperpixelSEEDS which used two dedicated values. If you prefer cv::Size, let me know and I will change. |
||
| @param num_superpixels Desired number of superpixels. Note that the actual number may be smaller | ||
| due to restrictions (depending on the image size). Use getNumberOfSuperpixels() to | ||
| get the actual number. | ||
| @param slices Number of processing threads for parallelisation. Setting -1 uses the maximum number | ||
| of threads. In practice, four threads is enough for smaller images and eight threads for larger ones. | ||
| @param merge_small merge small segments to give the desired number of superpixels. Processing is | ||
| much faster without merging, but many small segments will be left in the image. | ||
| */ | ||
| CV_EXPORTS_W cv::Ptr<ScanSegment> createScanSegment(int image_width, int image_height, int num_superpixels, int slices = 8, bool merge_small = true); | ||
|
|
||
| }} // namespace | ||
| #endif | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add
@cite loke2021acceleratedin this documentation section.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added.