OpenCV根据面积筛选连通域学习示例

目录
  • 学习目标:
  • 示例代码

学习目标:

对二值图进行分析,设定最大最小面积区间

保留该面积区间内的区域

示例代码

//src为二值图,minArea、maxArea为面积阈值,dest为结果图像
void connectionAreaSelect(Mat src, int minArea, int maxArea, Mat &dest)
{
	Mat labels, stats, centroids, img_color;
	//连通域计算
	int nccomps = connectedComponentsWithStats(
		src, //二值图像
		labels,
		stats,
		centroids
	);

	//去除过小区域,初始化颜色表
	vector<Vec3b> colors(nccomps);
	colors[0] = Vec3b(0, 0, 0); // background pixels remain black.
	for (int i = 1; i < nccomps; i++)
	{
		colors[i] = Vec3b(rand() % 256, rand() % 256, rand() % 256);

		//面积阈值筛选
		int holeArea = stats.at<int>(i, CC_STAT_AREA);
		if ((holeArea < minArea) || (holeArea > maxArea))
		{
			colors[i] = Vec3b(0, 0, 0);
		}
	}
	//按照label值,对不同的连通域进行着色
	img_color = Mat::zeros(src.size(), CV_8UC3);
	for (int y = 0; y < img_color.rows; y++)
	{
		for (int x = 0; x < img_color.cols; x++)
		{
			int label = labels.at<int>(y, x);
			CV_Assert(0 <= label && label <= nccomps);
			img_color.at<Vec3b>(y, x) = colors[label];
		}
	}
	//统计降噪后的连通区域
	Mat grayImg;
	cvtColor(img_color, grayImg, COLOR_BGR2GRAY);
	threshold(grayImg, grayImg, 1, 255, THRESH_BINARY);
	dest = grayImg.clone();

	labels.release();
	stats.release();
	centroids.release();
	img_color.release();
	grayImg.release();
}

以上就是OpenCV根据面积筛选连通域学习示例的详细内容,更多关于OpenCV根据面积筛选连通域的资料请关注我们其它相关文章!

(0)

相关推荐

  • OpenCV清除小面积连通域的实现方法

    场景需求 使用OpenCV,往往遇到这类场景:需要清除目标图像中比较小的噪声区,保留主要区域信息. 特此分享自己写的一个简单的清除小面积连通域函数,逻辑比较简单,给大家留出了足够的发展空间,根据自身场景需求进行调整. 原理可以简单归结为:搜索图像的连通区轮廓->遍历各个连通区->基于阈值删除面积较小的连通区 运行速度方面,我没单独测试过这个单元,大家如果试过之后太慢可以评论告诉我哦~ 反正平常我工作跑那种2000*2000的图像,这个函数的耗时几乎忽略不计... C++实现代码 /** * @

  • OpenCV连通域数量统计学习示例

    目录 学习目标: 核心代码 代码执行说明 学习目标: 1.输入图像为分割结果图像 2.根据种子填充法思路,遍历图像,得到每个连通域外接矩形坐标信息.面积信息 核心代码 /* Input: src: 待检测连通域的二值化图像 Output: dst: 标记后的图像 featherList: 连通域特征的清单(可自行查阅文档) return: 连通域数量. */ int connectionDetect(Mat &src, Mat &dst, vector<Feather> &am

  • 使用OpenCV获取图片连通域数量,并用不同颜色标记函

    一,原图和效果图 二,代码 //#########################产生随机颜色######################### cv::Scalar icvprGetRandomColor() { uchar r = 255 * (rand() / (1.0 + RAND_MAX)); uchar g = 255 * (rand() / (1.0 + RAND_MAX)); uchar b = 255 * (rand() / (1.0 + RAND_MAX)); return

  • OpenCV实现图像连通域

    图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来. 一般情况下,一个连通域内只包含一个像素值,因此为了防止像素值波动对提取不同连通域的影响,连通域分析常处理的是二值化后的图像. 4-邻域和8-邻域: 常用的图像邻域分析法有两遍扫描法和种子填充法.两遍扫描法会遍历两次图像,第一次遍历图像时会给每一个非0像素赋予一个数字标签,当某个像素的上方和左侧邻域内的像素已经有数字标签时,取两者中的最小值作为当前像素的标签,否则赋予

  • 使用OpenCV去除面积较小的连通域

    这是后期补充的部分,和前期的代码不太一样 效果图 源代码 //测试 void CCutImageVS2013Dlg::OnBnClickedTestButton1() { vector<vector<Point> > contours; //轮廓数组 vector<Point2d> centers; //轮廓质心坐标 vector<vector<Point> >::iterator itr; //轮廓迭代器 vector<Point2d&g

  • OpenCV根据面积筛选连通域学习示例

    目录 学习目标: 示例代码 学习目标: 对二值图进行分析,设定最大最小面积区间 保留该面积区间内的区域 示例代码 //src为二值图,minArea.maxArea为面积阈值,dest为结果图像 void connectionAreaSelect(Mat src, int minArea, int maxArea, Mat &dest) { Mat labels, stats, centroids, img_color; //连通域计算 int nccomps = connectedCompon

  • OpenCV凸包检测和凸缺陷学习示例

    目录 1.凸包检测与凸缺陷定义 2.opencv相关实现函数 3.代码实践 4.总结 1.凸包检测与凸缺陷定义 凸包是将最外层的点连接起来构成的凸多边形,它能包含点击中所有的点.物体的凸包检测常应用在物体识别.手势识别及边界检测等领域. 凸包检测常常用在轮廓分析之后.对二值图像进行轮廓分析之后,可以构建每个轮廓的凸包,构建完成之后会返回该凸包包含的点集.根据返回的凸包点集可以绘制该轮廓对应的凸包.一般来说,凸性曲线总是凸出来的,至少是平的.如果有地方凹进去了就被叫做凸性缺陷. 下图可以更加直接的

  • Opencv检测多个圆形(霍夫圆检测,轮廓面积筛选)

    主要是利用霍夫圆检测.面积筛选等完成多个圆形检测,具体代码及结果如下. 第一部分是头文件(common.h): #pragma once #include<opencv2/opencv.hpp> #include<opencv2/highgui.hpp> #include<iostream> using namespace std; using namespace cv; extern Mat src; void imageBasicInformation(Mat&am

  • Python OpenCV读取显示视频的方法示例

    目标 学习读取视频,显示视频和保存视频. 学习从相机捕捉并显示它. 你将学习以下功能:cv.VideoCapture(),cv.VideoWriter() 从相机中读取视频 通常情况下,我们必须用摄像机捕捉实时画面.提供了一个非常简单的界面.让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来.只是一个简单的任务开始. 要捕获视频,你需要创建一个 VideoCapture 对象.它的参数可以是设备索引或视频文件的名称.设备索引就是指定哪个摄像头的数

  • OpenCV 表盘指针自动读数的示例代码

    前段时间参加了一个表盘指针读数的比赛,今天来总结一下 数据集一共有一千张图片: 方法一:径向灰度求和 基本原理: 将图像以表盘圆心转换成极坐标,然后通过矩阵按行求和找到二值图最大值即为指针尖端 导入需要用到的包 import cv2 as cv import numpy as np import math from matplotlib import pyplot as plt import os 图像预处理 去除背景:利用提取红色实现 def extract_red(image): "&quo

  • 用opencv给图片换背景色的示例代码

    图像平滑 模糊/平滑图片来消除图片噪声 OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter() 2D 卷积 OpenCV中用cv2.filter2D()实现卷积操作,比如我们的核是下面这样(3×3区域像素的和除以10): img = cv2.imread('lena.jpg') # 定义卷积核 kernel = np.ones((3, 3), np.float32) / 10 # 卷积操作,

  • Python 利用OpenCV给照片换底色的示例代码

    OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法.相比于PIL库来说OpenCV更加强大, 可以做更多更复杂的应用,比如人脸识别等. 1. 读入并显示图片 im

  • Python Opencv实现单目标检测的示例代码

    一 简介 目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰.以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全置为0,然后通过其它方法找到目标的外接矩形并分割,在此选择一张前景和背景相差较大的图片作为示例. 环境:python3.7 opencv4.4.0 二 背景前景分离 1 灰度+二值+形态学 轮廓特征和联通组件 根据图像前景和背景的差异进行二值化,例如有明显颜色差异的转换到HSV色彩空间进行分割. 1

随机推荐