- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
connectedComponents 函数计算布尔图像的连通组件标签图像。
该函数接受一个具有4或8连通性的二值图像,并返回 N,即标签总数(标签范围为 [0, N-1],其中 0 代表背景标签)。ltype 参数指定了输出标签图像的类型,这是基于标签总数或源图像中的像素总数的一个重要考虑因素。ccltype 参数指定了要使用的连通组件标签算法,目前支持 Bolelli(Spaghetti)[31]、Grana(BBDT)[108] 和 Wu(SAUF)[296] 算法,详见 ConnectedComponentsAlgorithmsTypes。请注意,SAUF 算法强制使用行主序(row-major order)的标签,而 Spaghetti 和 BBDT 不强制。如果至少有一个允许的并行框架被启用,并且图像的行数至少是 getNumberOfCPUs 返回值的两倍,该函数将使用并行版本的算法。
函数原型1
int cv::connectedComponents
(
InputArray image,
OutputArray labels,
int connectivity,
int ltype,
int ccltype
)
参数1
- 参数image 待标记的8位单通道图像。
- 参数labels 目标标记图像。
- 参数connectivity 8或4,分别表示8连通性或4连通性
- 参数ltype 输出图像标签类型。目前支持 CV_32S 和 CV_16U。
- 参数ccltype 连通组件算法类型(详见 ConnectedComponentsAlgorithmsTypes).
函数原型2
这是一个重载成员函数,提供方便。它与上述原型1的不同之处仅在于它接受的参数不同。
int cv::connectedComponents
(
InputArray image,
OutputArray labels,
int connectivity = 8,
int ltype = CV_32S
)
参数2
- 参数image: 要标记的8位单通道图像。
- 参数labels: 目标标记图像(输出)。
- 参数connectivity: 连通性设置,8表示8邻接,4表示4邻接。
- 参数ltype: 输出图像的标签类型。目前支持 CV_32S(32位有符号整型)和 CV_16U(16位无符号整型)。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
// 创建一个简单的二值图像
cv::Mat img = cv::Mat::zeros( 300, 300, CV_8UC1 );
// 添加一些连通区域
cv::rectangle( img, cv::Rect( 50, 50, 100, 100 ), cv::Scalar( 255 ), cv::FILLED );
cv::rectangle( img, cv::Rect( 150, 150, 100, 100 ), cv::Scalar( 255 ), cv::FILLED );
// 显示原始二值图像
cv::imshow( "Binary Image", img );
// 初始化输出标签图像
cv::Mat labels;
int nr_components;
// 使用8连通性来寻找连通组件
nr_components = cv::connectedComponents( img, labels, 8, CV_32S, cv::CCL_WU );
// 打印连通组件的数量
std::cout << "Number of components: " << nr_components << std::endl;
// 将标签图像转换为8位单通道图像
cv::Mat labels_8u;
labels.convertTo( labels_8u, CV_8U, 255.0 / ( nr_components - 1 ) );
// 将标签图像可视化
cv::Mat vis;
cv::applyColorMap( labels_8u, vis, cv::COLORMAP_JET );
// 显示标签图像
cv::imshow( "Labeled Image", vis );
cv::waitKey( 0 );
return 0;
}
运行结果
终端输出:
Number of components: 2
图像输出: