OpenCV——图像连通域分析

这篇具有很好参考价值的文章主要介绍了OpenCV——图像连通域分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、主要函数

  cv::connectedComponents 函数将二值图像分割成多个连通区域,每个连通区域被赋予一个唯一的标签。函数的返回值为标签数目。该函数的原型如下:

int connectedComponents(InputArray image, 
                        OutputArray labels,
                        int connectivity = 8,
                        int ltype = CV_32S);
  • image:输入图像。
  • labels:输出的连通区域标签图像。
  • connectivity:为连通性。
  • ltype:输出图像的数据类型。

cv::connectedComponentsWithStats 函数除了输出连通区域标签图像外,还会输出每个连通区域的一些统计信息,如像素数目、外接矩形等。该函数的原型如下:

int connectedComponentsWithStats(InputArray image,
                                 OutputArray labels,
                                 OutputArray stats,
                                 OutputArray centroids,
                                 int connectivity = 8,
                                 int ltype = CV_32S);

  其中,参数 imagelabelsconnectivityltype 的含义与 cv::connectedComponents 函数相同,参数 stats 为输出的统计信息,参数 centroids 为输出的连通区域质心。使用这两个函数可以方便地实现图像分割、目标检测等应用。

二、C++代码

#include <iostream>
#include <opencv2\opencv.hpp>

using namespace std;

int main()
{
	//对图像进行距离变换
	cv::Mat img = cv::imread("rice.png");
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	cv::Mat rice, riceBW;

	//将图像转成二值图像,用于统计连通域
	cv::cvtColor(img, rice, cv::COLOR_BGR2GRAY);
	cv::threshold(rice, riceBW, 50, 255, cv::THRESH_BINARY);

	//生成随机颜色,用于区分不同连通域
	cv::RNG rng(10086);
	cv::Mat out;
	int number = connectedComponents(riceBW, out, 8, CV_16U);  //统计图像中连通域的个数
	vector<cv::Vec3b> colors;
	for (int i = 0; i < number; i++)
	{
		//使用均匀分布的随机数确定颜色
		cv::Vec3b vec3 = cv::Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
		colors.push_back(vec3);
	}

	//以不同颜色标记出不同的连通域
	cv::Mat result = cv::Mat::zeros(rice.size(), img.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<cv::Vec3b>(row, col) = colors[label];
		}
	}

	//显示结果
	cv::imshow("原图", img);
	cv::imshow("标记后的图像", result);

	cv::waitKey(0);
	return 0;
}

三、python代码

import cv2
import numpy as np

# -------------------------读取数据----------------------------
img = cv2.imread("E:\\OpenCV\\opencvTEST\\rice.png")
# ------------------------转为灰度图---------------------------
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# -------------------Otsu's thresholding----------------------
ret2, th2 = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# ------------------------连通域分析---------------------------
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(th2, connectivity=8)

# -----------------------查看各个返回值------------------------
# 连通域数量
print('num_labels = ', num_labels)
# 连通域的信息:对应各个轮廓的x、y、width、height和面积
print('stats = ', stats)
# 连通域的中心点
print('centroids = ', centroids)
# 每一个像素的标签1、2、3.。。,同一个连通域的标签是一致的
print('labels = ', labels)

# 不同的连通域赋予不同的颜色
output = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
for i in range(1, num_labels):
    mask = labels == i
    output[:, :, 0][mask] = np.random.randint(0, 255)
    output[:, :, 1][mask] = np.random.randint(0, 255)
    output[:, :, 2][mask] = np.random.randint(0, 255)
cv2.imshow('oginal', output)
cv2.waitKey()
cv2.destroyAllWindows()

四、结果展示

1、原始图像

OpenCV——图像连通域分析

2、检测结果

OpenCV——图像连通域分析

五、参考链接

[1] OPENCV自学记录(6)——PYTHON实现连通域处理函数CV2.CONNECTEDCOMPONENTSWITHSTATS()和CV2.CONNECTEDCOMPONENTS()
[2] OpenCV_连通区域分析(Connected Component Analysis-Labeling)文章来源地址https://www.toymoban.com/news/detail-501870.html

到了这里,关于OpenCV——图像连通域分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv 连通域操作示例代码记录connectedComponentsWithStats()函数示例

    上面这个代码是MFC程序里面的一个函数,不能够直接运行,但是如果学过MFC相信没有问题完全能够看得懂。 上例当中,count=7(也许可能是count,我写成了cout,也就不改了).说明检测到7个连通域。

    2024年02月06日
    浏览(57)
  • opencv图像识别主要流程

    为了使图像识别的流程更加直观,我们提前设置一个函数用于图像识别过程中每一步的图像展示。 使用这个函数可以使得在图像识别过程中的每一步更加直观的展示出来,也可以用于检测每一步是否正确运行。 我们进行图像识别的原理是将0-9十个数字的模板进行提取,然后

    2024年02月07日
    浏览(26)
  • OPENCV C++图像提取,图像处理,roi,阈值分割,连通区域筛选,边缘检测(以箱子边缘框选为例)

    本周有机会接触了一点opnev, 在此做一下记录, 最终以 框选出下图箱子为目的( 图片箱子为相机实拍结果,曝光有点低,会有亿点点暗 ), 本文会拆解步骤并附上图片, 完整的源码在最后.PS: 本文参考了好多大佬分享的理论知识, 在此先感谢大佬的分享~~ 首先是梳理一下流程, 下图是

    2024年02月07日
    浏览(48)
  • 计算机视觉任务图像预处理之去除图像中的背景区域-------使用连通域分析算法(包含完整代码)

    通过连通域分析算法能够找到最大的连通域,即图片的主体部分,然后保存该连通域的最小外接矩阵,即可去除掉无关的背景区域 更多图像预处理操作工具集包含在这个github仓库中

    2024年02月06日
    浏览(53)
  • 我在Vscode学OpenCV 图像处理一(阈值处理、形态学操作【连通性,腐蚀和膨胀,开闭运算,礼帽和黑帽,内核】)

    例如,设定阈值为127,然后:  将图像内所有像素值大于 127 的像素点的值设为 255。  将图像内所有像素值小于或等于 127 的像素点的值设为 0。 cv2.threshold() 和 cv2.adaptiveThreshold() 是 OpenCV 中用于实现阈值处理的两个函数,它们之间有以下区别: 1.1.1. cv2.threshold(): 这个函数

    2024年02月05日
    浏览(58)
  • opencv中绘制图像的函数

    OpenCV 中用于绘制不同图形的 C++ 函数的简要介绍: 绘制矩形框: image :目标图像 pt1  和  pt2 :矩形的对角线顶点坐标 color :矩形的颜色 thickness :线条的粗细,如果为负数,表示填充矩形 绘制文字: image :目标图像 text :要绘制的文本 org :文本的起始坐标 fontFace :字体

    2024年02月06日
    浏览(43)
  • ROS OpenCV 图像基本处理函数

    在ROS中结合OpenCV使用时, cv::imread() 函数 并非ROS本身的API,而是来自OpenCV库的函数,用于读取本地磁盘上的图像文件。 其用法如下: cv::Mat cv::imread(const string filename, int flags = IMREAD_COLOR); 参数说明:     filename: 字符串类型,表示要读取的图像文件的完整路径和名称。   

    2024年02月02日
    浏览(43)
  • OpenCV图像预处理常用函数及流程

    在PyCharm终端中,运行如下命令 由于默认使用的为外网资源,下载速度和稳定性较差,具体看网络状态。如下命令为使用清华镜像下载安装相应的包 在终端中运行命令时,Windows10系统可能会存在如下报错:无法加载激活文件,因此在此系统上禁止运行脚本。此情况是因为win

    2024年02月05日
    浏览(50)
  • OpenCV 图像重映射函数remap()实例详解

             OpenCV 图像重映射函数remap()对图像应用通用几何变换。其原型如下:         void remap(InputArray  src,                               OutputArray dst,                                InputArray  map1,                                InputArray map2,            

    2024年04月23日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包