区域生长算法及其实现
区域生长算法及其实现
背景
前面我们已经介绍了
最大熵分割法
OTSU算法
他们都有各自的优缺点,通常都不是单独使用这些算法,需要和其它算法来结合使用,前面两类算法都是单独对图像的灰度信息进行处理,不包含图像的空间信息,而区域生长算法则包含了图像的空间信息。
优点:
比较灵活,可以根据项目需要灵活的选择所需要的生长的规则,分割的效果比较好,通常可以较好的分割出种子点周围的区域。
缺点:
当要分割的区域不联通,被分割成一个个小的封闭区域时,会导致出来的只有种子点附近的一个小区域,分割不理想,区域生长算法容易受到噪声等的影响,同时由于该算法是迭代算法,算法的时间开销大。
算法原理:
步骤:
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;}}}}}
米粒 |
米粒分割图 |
区域生长算法及其实现相关推荐
- PCL:超详细的基于法向量和曲率的区域生长算法原理以及源码解读
---------原理介绍: (1)首先计算出来各点的曲率值,将曲率值按照从小到大的顺序进行排序. (2)设置一空的种子点序列和一个空的聚类数组. (3)选取曲率最小的点放入上述种子点序列中. (4) ...
- 基于区域生长算法的图像分割python_图像分割中区域生长算法的程序设计与实现...
论文编号:DZXX399 论文字数:12586,页数:30 摘要 本课题主要研究图像分割中区域生长算法的程序设计与实现.开发工具选用VC++6.0.通过VC++6.0开发环境中的常用向导和MFC类库 ...
- 区域生长算法原理及MATLAB实现
1. 基于区域生长算法的图像分割原理 数字图像分割算法一般是基于灰度值的两个基本特性之一:不连续性和相似性.前一种性质的应用途径是基于图像灰度的不连续变化分割图像,比如图像的边缘.第二种性质的主要应用 ...
- OpenCV与图像处理学习十——区域生长算法(含代码)
OpenCV与图像处理学习十--区域生长算法(含代码) 一.区域生长算法概要 二.区域生长算法原理 三.代码应用 一.区域生长算法概要 区域生长是一种串行区域分割的图像分割方法.区域生长是指从某个像素 ...
- 基于改进区域生长算法的图像分割方法及实现
一.题目与要求 1.1课程设计题目 采用灰度图像(该图像由高分二号卫星拍摄,是武汉市江夏区矿区的部分灰度图像)分别实现几种图像分割方法: (1) 经典区域生长方法: (2) 改进的区域生长方法: (3 ...
- java实现区域生长算法_matlab 区域生长算法生成二值图像边界区域
function ret=growseed() %=====区域生长算法======== %input :二值图像数据 %output:边界点二值图像数据 global I;global M; glo ...
- matlab 区域生长算法生成二值图像边界区域
function ret=growseed() %=====区域生长算法======== %input :二值图像数据 %output:边界点二值图像数据 global I;global M; glo ...
- java实现区域生长算法_区域生长算法(附MATLAB代码实现)
标签: 一.理论概念 区域生长是按照事先定义的生长准则将一个像素或者子区域逐步聚合成一个完整独立的连通区域过程.对于图像感兴趣目标区域R,z为区域R上事先发现的种子点,按照规定的生长准则逐步将与种子点 ...
- 区域生长算法(附MATLAB代码实现)
一.理论概念 区域生长是按照事先定义的生长准则将一个像素或者子区域逐步聚合成一个完整独立的连通区域过程.对于图像感兴趣目标区域R,z为区域R上事先发现的种子点,按照规定的生长准则逐步将与种子点z一定邻 ...
- python 区域生长算法_多种子的区域生长算法
摘要:多种子的区域生长算法,基于C++编写. 关键字:图像处理, 种子生长, 区域生长 1. 题外话 最近需要找一种简单对图像进行分割的算法,作为后续算法的前处理阶段.最开始想到的是聚类,但是聚类会有 ...
最新文章
- 眼耳鼻舌身意,严肃地聊一聊元宇宙的“技术拼图”
- 【微软公有云系列】(七)SCVMM模板--Windows server 2012 虚拟机模板
- 蓝桥杯-递归求二项式系数值(java)
- MySQL优化从执行计划开始(explain超详细)
- Java 关键字 transient
- Ngnix安装的几种常用方式
- vod点歌系统_专业音响系统常见故障及修理方法
- 文字不间断滚动(转)
- Android 8.0(29)---Android 8.0 获取当前的activity
- 三星Galaxy S22系列快充规格曝光:只可比肩iPhone 13Pro Max
- Activity工作流工作笔记001---快速上手_认识工作流
- Codeforces Round #723 (Div. 2)B. I Hate 1111(完全背包)
- 为激励英特尔建厂 美国俄亥俄州拿出20亿美元优惠政策
- GTK槽回调函数,组件颜色,布局控件
- DS18B20的CRC验证算法
- VSCode升级后启动不了~
- SWE_Browser编译
- Error deploying web application directory D:\tomcat7.0.30\webapps\docs java.lang.IllegalStateExcep
- HDU1713 相遇周期(数学)
- How to use Clang Static Analyzer