区域生长算法及其实现

2023-11-20

区域生长算法及其实现

背景

​ 前面我们已经介绍了
最大熵分割法
OTSU算法
他们都有各自的优缺点,通常都不是单独使用这些算法,需要和其它算法来结合使用,前面两类算法都是单独对图像的灰度信息进行处理,不包含图像的空间信息,而区域生长算法则包含了图像的空间信息。

优点:

​ 比较灵活,可以根据项目需要灵活的选择所需要的生长的规则,分割的效果比较好,通常可以较好的分割出种子点周围的区域。

缺点:

​ 当要分割的区域不联通,被分割成一个个小的封闭区域时,会导致出来的只有种子点附近的一个小区域,分割不理想,区域生长算法容易受到噪声等的影响,同时由于该算法是迭代算法,算法的时间开销大。

算法原理:

image-20220219152211110

步骤:

1、在图像中选取一个种子点(x,y)

2、根据生长规则,判断种子点周围8个点哪几个点可以作为下次生长的点,判断完后,将当前的种子标记为已使用。

3、判断下一生长点

4、直到不再有生长点。

哪么生长规则如何设定呢?大概有以下几种判断规则:灰度、梯度幅值等,例如:判断种子点与下一生长点之间的灰度差,如何小于某值,则将其加入种子点中。

算法流程:

1、将初始种子点存入vector

2、弹出1个种子点,根据生长规则判断周围8个点哪个符合规则,符合则加入到vector中

3、判断vector的size是不是为0,为0则结束,不为0则继续第二步

Opencv实现:

void Region_Growing(Mat input, Mat& output, Point2i fristseed, int value)
{
	vector<Point2i>allseed;              //保存种子
	allseed.push_back(fristseed);         //压入第一个种子

	int direction[8][2] = { { -1, -1 }, { 0, -1 }, { 1, -1 }, { 1, 0 }, { 1, 1 }, { 0, 1 }, { -1, 1 }, { -1, 0 } };//种子选取的顺序
	output = Mat::zeros(input.size(), CV_8UC1);               //创建一个黑图

	output.at<uchar>(fristseed.y, fristseed.x) = 255;         //第一个种子点设置为
	
	int cerseedvalue = 0;     //初始种子点的值

	int nextseedvalue = 0;    //与种子点相比较的下一点的值

	Point2i comparseed;       //与种子点相比较的下一点
	
	cerseedvalue = input.at<uchar>(fristseed.y, fristseed.x);    // 种子点的灰度值

	while (!allseed.empty())
	{
		fristseed = allseed.back();   //最后一个种子点的
		allseed.pop_back();           //弹出最后一个种子点

		for (int i = 0; i < 8; ++i)
		{
			comparseed.x = direction[i][0] + fristseed.x;
			comparseed.y = direction[i][1] + fristseed.y;

			if (comparseed.x<0 || comparseed.x>(input.cols-1) || comparseed.y<0 || comparseed.y>(input.rows-1))
				continue;

			if (output.at<uchar>(comparseed.y, comparseed.x) == 0)   //判断有没有被使用过
			{
				nextseedvalue = input.at<uchar>(comparseed.y, comparseed.x);       //生长点的值
				if (abs(nextseedvalue - cerseedvalue) < value)//生长规则
				{
					allseed.push_back(comparseed);
					output.at<uchar>(comparseed.y, comparseed.x) =255;
				}
			}
		}
	}
	
}
米粒
米粒
米粒分割图
米粒分割图
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区域生长算法及其实现 的相关文章

  • OpenCV:视频录制太快

    我有一个简单的录像机 录制来自网络摄像头的视频 theVideoWriter open filename countAsString ext CV FOURCC X V I D 30 Size 1920 1080 true while re
  • `opencv.android.JavaCameraView` 和 `opencv.android.NativeCameraView` 有什么区别

    正如主题中所述 有什么区别opencv android JavaCameraView and opencv android NativeCameraView 与其他主要优点相比 有哪些优点可以提供更多选择 来自OpenCV 文档 http
  • Opencv - 找不到头文件

    我正在尝试使用 opencv 开始开发 问题是 到目前为止我几乎无法设置 opencv 因为我找不到它的头文件 我对此主题进行了一些研究 但没有一个真正有帮助 下面是一些链接 opencv2 包含文件在哪里 https stackoverf
  • 如何将图像从 np.uint16 转换为 np.uint8?

    我正在创建一个图像 image np empty shape height width 1 dtype np uint16 之后我将图像转换为 BGR 模型 image cv2 cvtColor image cv2 COLOR GRAY2B
  • OpenCV 完美识别物体

    我有一个应用程序 我想一次跟踪 2 个在图片中相当小的对象 该应用程序应该在 Android 和 iPhone 上运行 因此算法应该是高效的 对于我的客户来说 如果我们提供一些模式以及附加到要跟踪的对象的软件 以获得易于识别的目标 那就完全
  • 从 2 个摄像头捕获(OpenCV、Python)[重复]

    这个问题在这里已经有答案了 所以我试图从 openCV 中的两个摄像头 python 和 windows 7 进行捕获 我用一台相机拍摄的效果很好 你也会注意到我正在对图像做一些时髦的事情 但这并不重要 这是尝试使用两个的代码 import
  • 使用 cv2 在 python 中创建多通道零垫

    我想用 cv2 opencv 包装器在 python 中创建一个多通道 mat 对象 我在网上找到了一些例子 其中 c Mat zeros 被 numpy zeros 替换 这看起来不错 但似乎没有多通道类型适合 看代码 import cv
  • 使用 OpenCV VideoWriter 将 RTSP 流存储为视频文件

    我正在使用 OpenCV 开发一个 Python 模块 该模块连接到 RTSP 流以对视频执行一些预处理 主要是降低 fps 和分辨率 然后将其存储在文件系统中 但是 即使在尝试了几种编解码器 寻找类似的开发之后 我总是得到一个空的视频 我
  • 使用 SURF 在检测到的对象周围绘制矩形

    我正在尝试从涉及冲浪检测器的以下代码中检测对象 我不想绘制匹配项 我想在检测到的对象周围绘制一个矩形 但不知何故我无法获得正确的单应性 请任何人指出在哪里我走错了 include
  • opencv如何使用鼠标事件不规则地选择图像区域? c/c++ [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 最近在学习opencv 有没有办法使用鼠标事件选择图像区域 我已经尝试过三角形的了 如果我想选择特定区域而不是三角形怎么办 谢谢你 我对此进
  • 使用 OpenCV 和 Python 叠加两个图像而不丢失颜色强度

    如何叠加两个图像而不损失两个图像的颜色强度 我有图像1和图像2 2 我尝试使用 0 5 alpha 和 beta 但它给我的合并图像的颜色强度只有一半 dst cv2 addWeighted img1 0 5 img2 0 5 0 但是当我
  • Android API人脸检测与OpenCV/JavaCV人脸检测

    我在 Android 设备上使用了本地 Android 人脸检测 但它似乎很慢 而且我不太确定其可靠性 我还使用了 OpenCV 的人脸检测 但仅限于 PC 而不是 Android 设备 对于 Android 我猜我必须使用 JavaCV
  • 如何将 OpenCV 的测试框架与 CMake 结合使用?

    好像 OpenCV 有一个测试框架 https github com Itseez opencv tree ef91d7e8830c36785f0b6fdbf2045da48413dd76 modules ts include opencv
  • 将向量 转换为大小为 (n x 3) 的 Mat,反之亦然

    我有 Point3d 向量 向量形式的点云 如果我使用 OpenCV 提供的转换 比如 cv Mat tmpMat cv Mat pts Here pts is vector
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • Opencv C++ 检测并裁剪图像上的白色区域

    我在网上搜索过 已经找到了一些方法来完成我想要的事情 但是与我需要的相比 这些方法的效率较低 我有一个 kinect 使用 Microsoft SDK 当前正在获取一个移除背景的人 将结果保存在 3 通道 Mat 中 并将该人从背景中移除
  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 如何根据图像中的对象大小(以像素为单位)来测量现实世界中的对象大小(例如英寸、厘米等)?

    我计算了物体的大小pixel来自包含对象的图像 我想测量现实世界中物体的大小 有没有办法找出乘数来测量实际尺寸 我目前正在使用python以便实施 通常 您将使用相机获取图像 该相机通过镜头将 3 维场景投影到 2 维传感器上 垂直 高度
  • OpenCV:RGB 到 YUV 转换,并显示维基百科等通道

    我一直在寻找这种转换有一段时间了 在Linux上使用Python将RGB图像转换为YUV图像并访问Y U和V通道有哪些方法 使用 opencv skimage 等 更新 我用的是opencv img yuv cv2 cvtColor ima
  • Android 上的硬币识别

    我目前正在开发一个 Android 应用程序 它能够拍摄硬币的现有图像 或者使用内置摄像头扫描单个硬币 非常像 Google Goggles 我正在使用 Android 版 OpenCV 我的问题如下 什么方法最适合使用 OpenCV 在

随机推荐

  • Typescript学习笔记

    Typescript学习笔记 什么是Typescript TypeScript是一种由微软开发的开源 跨平台的编程语言 它是JavaScript的超集 最终会被编译为JavaScript代码 TypeScript适合用来编写基于node的大
  • def __int__(self):的作用

    def int self 名称 初始化方法 构造方法 构造函数 作用 当我们创建好一个实例对象之后 会自动调用这个方法 来初始化这个对象 实例化后传入的参数会到此方法中来 构造方法 self name name此种语句将参数赋给实例 此类中
  • vue3+ts+echars实现中国为中心中文版世界地图(包含配置文件)

  • Python ERROR: Could not install packages due to an OSError:XXX解决方法

    Python ERROR Could not install packages due to an OSError XXX解决方法 文章目录 Python ERROR Could not install packages due to an
  • 滑动窗口专题(字节面试题)

    关键字 连续数组 字串 1 和为s的连续正整数序列 剑指offer57 II 输入一个正整数 target 输出所有和为 target 的连续正整数序列 至少含有两个数 序列内的数字由小到大排列 不同序列按照首个数字从小到大排列 示例 1
  • Linux下软件安装的命令

    源码安装 以源代码安装软件 每次都需要配置操作系统 配置编译参数 实际编译 最后还要依据个人喜好的方式来安装软件 这个过程很麻烦很累人 RPM安装软件的默认路径 注意 etc 配置文件放置目录 usr bin 一些可执行文件 usr lib
  • [计算机毕业设计]改进粒子群算法的监测资源调度

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • 基于Hexo+Matery的LuckyBlog开源搭建教程

    前言 之前在B站上发布了个人博客的视频 播放量也破千了 有网友私聊也想要搭建一个这样的博客 经过一段时间的准备 现将本人博客的源代码公布出来 大家只需要根据以下的步骤 即可快速搭建一个漂亮完善的博客 0x01 LuckyBlog 介绍 上一
  • OJ编程之多组输入----牛客网----BC41 你是天才吗?

    OJ编程之多组输入 牛客网 BC41 你是天才吗 题目要求 错误代码 include
  • JavaScript 简介

    简介 JavaScript是一门脚本语言 这门语言主要用于 HTML 和 web 更可广泛用于服务器 PC 笔记本电脑 平板电脑和智能手机等设备 前端开发中JavaScript代码可以被插入到HTML页面代码中使用 并由浏览器来执行 示例
  • 关于打代码的一些些心得

    些许废话 零零散散也正式以打代码为生快一年半了 从代码写的稀碎到稍微能总结出一点东西 也算是一个一直在向上缓慢行走的状态了 很难说我喜欢代码这件事 原本选择也只是为了糊口 但从面向百度编程 到一点点写出带着自己风格的代码 再到可以略微静下来
  • Qt 实现压缩文件、文件夹和解压缩操作zip

    一 实现方式 通过Qt自带的库来实现 使用多线程方式 通过信号和槽来触发压缩与解压缩 并将压缩和解压缩结果回传过来 使用的类 include QtGui private qzipreader p h include QtGui privat
  • 同时有线内网无线外网的解决方案

    内网有线环境下先固定好自己的IP地址 子网掩码和网关地址 DNS 连接WIFI后 用管理员权限打开CMD命令行 第一步 输入route print 后按回车 会看到左侧网络目标里有两个0 0 0 0的地址 这样就会路由冲突 出现要么只能上内
  • “传统技术”快速搭建AI产品的利器——LLM技术

    文章首发地址 LLM原理 LLM Learning Localization and Mapping 技术的原理是将学习 定位和建图结合起来 实现机器人对环境的感知 定位和地图构建 下面是LLM技术的基本原理 学习 Learning LLM
  • html颜色怎么渐变效果,html怎么设置颜色渐变

    html设置颜色渐变的方法 首先创建一个HTML示例文件 然后使用div标签创建一个模块 接着在css标签内通过 id colorchange 来设置div样式 最后通过linear gradient属性设置div的背景颜色渐变效果即可 本
  • 讲解 最大流问题+最小花费问题+python(ortool库)实现

    文章目录 基本概念 图 邻接矩阵 最大流问题 python解决最大流问题 python解决最大流最小费用问题 喜欢的话请关注我们的微信公众号 你好世界炼丹师 公众号主要讲统计学 数据科学 机器学习 深度学习 以及一些参加Kaggle竞赛的经
  • ul里面可以放div吗?

    在HTML中 ul 标签代表无序列表 可以用来展示项目列表 而 div 标签则是div容器用于分组内容 提供独立于文档的CSS样式和JavaScript事件处理 那么 ul里面可以放div吗 答案是肯定的 下面从多个方面进行详细阐述 一 语
  • MacBook安装使用XMind

    MacBook安装使用XMind XMind简介 官方地址 https www xmind cn XMind 是一个全功能的思维导图和头脑风暴软件 为激发灵感和创意而生 作为一款有效提升工作和生活效率的生产力工具 受到全球百千万用户的青睐
  • 计算机内存插在主板的哪个槽,四个内存插槽,这是正确的安装顺序

    具有防呆设计的主板插槽几乎不可能错误地插入 因此很有可能在第一个插槽中安装了内存 尽管可以 但是会阻止内存在最佳状态下工作 主板手册中有这样一句话 说明 为便于理解 首先对内存插槽编号 从靠近CPU插槽的位置开始 主板 针对不同情况的最佳安
  • 区域生长算法及其实现

    区域生长算法及其实现 背景 前面我们已经介绍了 最大熵分割法 OTSU算法 他们都有各自的优缺点 通常都不是单独使用这些算法 需要和其它算法来结合使用 前面两类算法都是单独对图像的灰度信息进行处理 不包含图像的空间信息 而区域生长算法则包含