OpenCV实现图像连通域分析与封闭区域筛选
本资源提供了一个C++代码片段,用于在OpenCV(计算机视觉库)中实现获取图像的连通域并根据面积筛选封闭图形的功能。连通域是图像处理中的一个重要概念,它将图像分割成多个区域,每个区域内的像素彼此相连且与其它区域隔绝。在这个示例中,函数`bwLabel`接受两个输入:源图像`src`(二值图像,通常表示为灰度图像或通过某种阈值处理后的黑白图),以及目标输出图像`dst`,它将被填充上连通域的标签。 函数首先初始化一些变量,如行数、列数、当前标签值、种子点栈、区域面积、边界坐标等。然后,遍历`src`图像的每个像素点,如果像素值为255(通常代表白色,即连通部分),则进行以下操作: 1. **区域分析**: - 重置区域面积和标签值,增加当前像素点作为种子点。 - 将种子点的标签设置为`labelValue`,并将该点添加到点栈中。 - 更新区域面积,并记录左、右、上、下边界位置。 2. **连通域扩展**: - 使用栈(后进先出数据结构)来追踪未标记的邻域像素,直至所有与种子点相连的像素都被标记。 - 遍历邻居像素,检查其是否属于同一连通域,若未标记,则标记它们,更新区域面积,更新边界位置,并将其推入栈中继续扩展。 3. **筛选封闭图形**: - 在标记完一个连通域后,检查该连通域的面积是否达到预设条件。如果是封闭图形(即边界完全闭合),则将其相关信息(标签、面积、边界框)存入`Feather`结构体列表`featherList`中。 4. **输出结果**: - 清空`featherList`,释放旧的`dst`图像,并创建新的`dst`作为输出,以便存储标签信息。 通过这个函数,可以有效地从图像中提取出多个连通域,并根据指定的面积范围筛选出封闭图形,这对于许多应用场景,如物体检测、图像分割等都有重要的作用。执行此函数后,返回的`featherList`提供了有关每个封闭图形的关键信息,方便后续的分析和处理。
#include <iostream>
#include <vector>
#include <stack>
#include <string>
#include <list>
using namespace std;
using namespace cv;
typedef struct _Feather
{
int label; // 连通域的label值
int area; // 连通域的面积
Rect boundingbox; // 连通域的外接矩形框
} Feather;
/*
Input:
src: 待检测连通域的二值化图像
Output:
dst: 标记后的图像
featherList: 连通域特征的清单
return:
连通域数量。
*/
int bwLabel(Mat & src, Mat & dst, vector<Feather> & featherList)
{
int rows = src.rows;
int cols = src.cols;
int labelValue = 0;
stack<Point> pointStack; // 堆栈
int area = 0; // 用于计算连通域的面积
int leftBoundary = 0; // 连通域的左边界,即外接最小矩形的左边框,横坐标值,依此类推
int rightBoundary = 0;
int topBoundary = 0;
int bottomBoundary = 0;
Rect box; // 外接矩形框
Feather feather;
featherList.clear(); // 清除数组
dst.release();
dst = src.clone();
for (int i = 0; i < rows; i++)
{
uchar *pRow = dst.ptr<uchar>(i);
for (int j = 0; j < cols; j++)
{
if (pRow[j] == 255)
{
area = 0;
labelValue++; // labelValue最大为254,最小为1.
seed = Point(j, i); // Point(横坐标,纵坐标)
dst.at<uchar>(seed) = labelValue;
pointStack.push(seed);
area++;
leftBoundary = seed.x;
rightBoundary = seed.x;
剩余5页未读,继续阅读
- 粉丝: 6
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦