区域生长算法及其实现

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(使用前将#替换为@)

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

  • 如何使用requirements.txt 在 Heroku python Web 应用程序中安装 Dlib?

    我构建了一个涉及机器学习的 Python Flask Web API 但在 Heroku 上部署它时遇到了很多挫折 问题是 我的应用程序依赖于 Dlib 一个库 我似乎找不到在我的 Heroku 服务器中安装的方法 我正在试图解决这个问题
  • C++ OpenCV 2.3 中缺少 MoveWindow()

    我正在使用 OpenCV 2 3 的 C 版本 并且正在努力完成一项基本任务 我想做的是创建一个窗口并将其移动到屏幕上的特定位置 例如使用 cv namedWindow My Window 1 cv MoveWindow My Window
  • opencv createsamples没有错误,但是没有找到样本

    我在用着this http coding robin de 2013 07 22 train your own opencv haar classifier html教程 我正在根据我的正面图像创建大量样本 我正在使用 Windows 这是
  • 如何在Python中使用tcp套接字发送和接收网络摄像头流?

    我正在尝试重新创建这个项目 https github com hamuchiwa AutoRCCar 我拥有的是服务器 我的电脑 和客户端 我的树莓派 我所做的与原始项目不同的是我尝试使用一个简单的网络摄像头而不是树莓派摄像头将图像从我的
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • Python:opencv warpPerspective 既不接受 2 个也不接受 3 个参数

    我发现单应矩阵如下特征匹配 单应性教程 https docs opencv org 3 4 1 d1 de0 tutorial py feature homography html using M mask cv2 findHomograp
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 在加载“cv2”二进制扩展期间检测到递归

    我有一个小程序 在 pyinstaller 编译后返回 opencv 错误 但无需编译即可工作 我在 Windows 10 上使用 Python 3 8 10 Program 导入 pyautogui将 numpy 导入为 np导入CV2
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 当我将鼠标移到 Mat 关键字上时,Visual Studio 2017 冻结(OpenCv 3.4.1)

    我想在 Visual Studio 2017 中开发 openCv 项目 我下载了 opencv 预构建库并进行了必要的设置 那是 1 我添加了系统路径 build x64 vc14 bin 2 在 Visual Studio 中的项目属性
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • 创建 OpenCV 的 mouseCallback 函数的基于类的实现时遇到问题

    正如标题所示 我在基于类的 C 结构中实现 OpenCV 的 mouseCallback 函数时遇到了一些麻烦 请允许我解释一下 我定义了一个名为 BriskMatching 的类 在其中创建了一个名为 mouseCallback 的成员函
  • 如何使用 Python 裁剪图像中的矩形

    谁能给我关于如何裁剪两个矩形框并保存它的建议 我已经尝试过这段代码 但效果不佳 import cv2 import numpy as np Run the code with the image name keep pressing spa
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here

随机推荐

  • 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算法 他们都有各自的优缺点 通常都不是单独使用这些算法 需要和其它算法来结合使用 前面两类算法都是单独对图像的灰度信息进行处理 不包含图像的空间信息 而区域生长算法则包含