OpenCV(二十八):连通域分割

目录

1.介绍连通域分割

2.像素领域介绍

3.两遍法分割连通域

4.连通域分割函数


1.介绍连通域分割

连通域分割是一种图像处理技术,用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性,如相近的灰度值或颜色。连通域分割可以用于物体检测、图像分割、目标跟踪等应用。

2.像素领域介绍

在连通域分割中,常用的领域关系有四领域和八领域。

  • 四领域表示一个像素与其上下左右四个相邻像素连接。
  • 八领域表示一个像素与其上、下、左、右、左上、右上、左下、右下八个相邻像素连接。

3.两遍法分割连通域

(橙色区域为目标物体,即前景像素)

1,第一遍扫描:

a. 从上往下,从左往右遍历图像的每个像素,检查其是否属于前景像素(包括目标物体)。如果是前景像素,则进行以下操作:

  • 检查其上方和左方的像素

(1) 如果都是前景像素, 则取两者中像素的标签的最小值作为当前像素的标签。

(2)如果只有一个是前景像素,则将当前像素标记为该前景像素的标签。

(3) 如果两个方向都没有前景像素,则将当前像素标记为新的数字标签。(数字标签 从1开始,然后不断+1递增)

第一遍扫描的结果:

2.第二遍扫描:

a. 将同一连通区域内的不同相邻标签合并,取标签的最小值,使每个连通域只有一个标签。

第二遍扫描结果:

4.连通域分割函数

4.1只分割连通域的函数 connectedComponents()

int cv::connectedComponents ( InputArray image,

OutputArray labels,

int connectivity =8,

int ltype = CV_32S

  • image:待标记不同连通域的图像单通道,数据类型必须为CV 8U。
  • labels:标记不同连通域后的输出图像,与输入图像具有相同的尺寸。
  • connectivity:标记连通域时使用的邻域种类,4表示4-邻域,8表示8-邻域,默认参数为8。
  • ltype:输出图像的数据类型,目前支持CV 32S和CV 16U两种数据类型,默认参数为CV 32S

示例代码:

复制代码
void connect_f(Mat image){
   Mat rice,riceBW;
   //将图像转成二值图像,用于统计连通域
    cvtColor(image,rice,COLOR_BGR2GRAY);
    threshold(rice,riceBW,50,255,THRESH_BINARY);
    //生成随机颜色,用于区分不同连通域
    RNG rng(10086);
    Mat out;
    int number= connectedComponents(riceBW,out,8,CV_16U);//统计图像中连通域的个数
    vector<Vec4b> colors;
    for(int i=0;i<number;i++){
        //使用均匀分布的随机数确定颜色
        Vec4b vec4=Vec4b(rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256));
        colors.push_back(vec4);
    }
    //以不同颜色标记出不同的连通域
    Mat result=Mat::zeros(rice.size(),image.type());
    int w=result.cols;
    int h=result.rows;
    for(int row=0;row<h;row++){
        for(int col=0;col<w;col++){
            int label=out.at<uint16_t>(row,col);
            if(label==0){//背景的黑色不改变
                continue;
            }
            result.at<Vec4b>(row,col)=colors[label];
        }
    }
    //显示结果
    imwrite("/sdcard/DCIM/result.png",result);
}

4.2分割并统计连通域信息的函数connectedComponentsWithStats()

int cv::connectedComponentsWithStats ( InputArray image,

OutputArray labels,

OutputArray stats,

OutputArray centroids,

int connectivity =8,

int ltype = CV_32S

)

  • image:待标记不同连通域的图像单通道,数据类型必须为CV_8U。
  • labels:标记不同连通域后的输出图像,与输入图像具有相同的尺寸。
  • stats:不同连通域的统计信息矩阵,矩阵的数据类型为CV 32S。阵中第i行是标签为i的连通域的统计特性。
  • centroids:每个连通域的质心坐标,数据类型为CV 64F。
  • connectivity:标记连通域时使用的邻域种类,4表示4-邻域,8表示8-邻域,默认参数值为8。
  • ltype: 输出图像的数据类型,目前只支持CV 32S和CV 16U这两种数据类型,默认参数值为CV_32S。

示例代码:

复制代码
//统计连通域信息
void connectedComponentsWithStats_f(Mat image){
    Mat rice,riceBW;
    //将图像转成二值图像,用于统计连通域
    cvtColor(image,rice,COLOR_BGR2GRAY);
    threshold(rice,riceBW,50,255,THRESH_BINARY);
    Mat stats,centroids,out;
    int number= connectedComponentsWithStats(riceBW,out,stats,centroids,8,CV_16U);
    vector<Vec4b> colors;
    RNG rng(10086);
    for(int i=0;i<number;i++){
        //使用均匀分别的随机数确定颜色
        Vec4b vec4=Vec4b(rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256));
        colors.push_back(vec4);
    }
    //以不同颜色标记出不同的连通域
    for(int i=1;i<number;i++){
        //中心位置
        int center_x=centroids.at<double>(i,0);
        int center_y=centroids.at<double>(i,1);
        //矩形边框
        int x=stats.at<int>(i,CC_STAT_LEFT);
        int y=stats.at<int>(i,CC_STAT_TOP);
        int w=stats.at<int>(i,CC_STAT_WIDTH);
        int h=stats.at<int>(i,CC_STAT_HEIGHT);
        int area=stats.at<int>(i,CC_STAT_AREA);
        //中心位置绘制
        circle(image,Point(center_x,center_y),2,Scalar(0,255,0),2,8,0);
        //外接矩形
        Rect rect(x,y,w,h);
        rectangle(image,rect,colors[i],1,8,0);
        putText(image, format("%d",i),Point(center_x,center_y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,255),1);
        ostringstream ss;
        ss << "number:" <<i<<",area:"<<area<< std::endl;
    }
    //显示结果
    imwrite("/sdcard/DCIM/image_Markers.png",image);
}
相关推荐
该用户已不存在2 小时前
在 Gemini CLI 中使用 Gemini 3 Pro 实操指南
人工智能·ai编程·gemini
东皇太星2 小时前
ResNet (2015)(卷积神经网络)
人工智能·神经网络·cnn
aircrushin2 小时前
TRAE SOLO 中国版,正式发布!AI 编程的 "Solo" 时代来了?
前端·人工智能
Java中文社群3 小时前
保姆级教程:3分钟带你轻松搭建N8N自动化平台!(内附视频)
人工智能·工作流引擎
是Yu欸3 小时前
DevUI MateChat 技术演进:UI 与逻辑解耦的声明式 AI 交互架构
前端·人工智能·ui·ai·前端框架·devui·metachat
我不是QI3 小时前
周志华《机器学习---西瓜书》 一
人工智能·python·机器学习·ai
H***99763 小时前
月之暗面公开强化学习训练加速方法:训练速度暴涨97%,长尾延迟狂降93%
人工智能·深度学习·机器学习
二川bro3 小时前
Python在AI领域应用全景:2025趋势与案例
开发语言·人工智能·python
AI-智能3 小时前
RAG 系统架构设计模式介绍
人工智能·langchain·llm·agent·知识库·rag·大模型应用
长桥夜波3 小时前
机器学习日报20
人工智能·机器学习