区域生长算法

图像分割是一种重要的图像处理技术,而区域生长是图像分割技术的一种。区域生长的基本思想是将具有相似性的像素集合起来构成区域。首先对每个需要分割的区域找出一个种子像素作为生长的七点,然后将种子像素周围邻域中与种子有相同或相似性质的像素(根据事先确定的生长或相似准则来确定)合并到种子像素所在的区域中。而新的像素继续作为种子向四周生长,直到再没有满足条件的像素可以包括进来,一个区域就生长而成了。

种子区域生长(region seeds growing, RSG)算法在实践中关键的问题是种子的选取和相似区域判定准则的确定。种子的选择可以人工选择,也可以通过一些方法自动选取;灰度图的判定准则一般用灰度差值小于某个阈值来表示,不同的判定准则可能会产生不同的分割结果。

为了说明区域是如何生长的,本文从最简单的情况出发:使用二值图像;人工选取种子;判定准则为是否是前景像素。

区域生长实现的步骤如下:

1. 对图像顺序扫描!找到第1个还没有归属的像素, 设该像素为(x0, y0);

2. 以(x0, y0)为中心, 考虑(x0, y0)的8邻域像素(x, y)如果(x0, y0)满足生长准则, 将(x, y)与(x0, y0)合并(在同一区域内), 同时将(x, y)压入堆栈;

3. 从堆栈中取出一个像素, 把它当作(x0, y0)返回到步骤2;

4. 当堆栈为空时!返回到步骤1;

5. 重复步骤1 - 4直到图像中的每个点都有归属时。生长结束。

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

using namespace std;
using namespace cv;

// 8 邻域
static Point connects[8] = { Point(-1, -1), Point(0, -1), Point(1, -1), Point(1, 0), Point(1, 1), Point(0, 1), Point(-1, 1), Point(-1, 0)};

int main()
{
	// 原图
	Mat src = imread("img2.jpg", 0);
	// 结果图
	Mat res = Mat::zeros(src.rows, src.cols, CV_8U);
	// 用于标记是否遍历过某点
	Mat flagMat;
	res.copyTo(flagMat);
	// 二值图像
	Mat bin;
	threshold(src, bin, 80, 255, CV_THRESH_BINARY);

	// 初始3个种子点
	stack<Point> seeds;
	seeds.push(Point(0, 0));
	seeds.push(Point(186, 166));
	seeds.push(Point(327, 43));
	res.at<uchar>(0, 0) = 255;
	res.at<uchar>(166, 186) = 255;
	res.at<uchar>(43, 327) = 255;

	while (!seeds.empty())
	{
		Point seed = seeds.top();
		seeds.pop();

		// 标记为已遍历过的点
		flagMat.at<uchar>(seed.y, seed.x) = 1;

		// 遍历8邻域
		for (size_t i = 0; i < 8; i++)
		{
			int tmpx = seed.x + connects[i].x;
			int tmpy = seed.y + connects[i].y;

			if (tmpx < 0 || tmpy < 0 || tmpx >= src.cols || tmpy >= src.rows)
				continue;
			// 前景点且没有被标记过的点
			if (bin.at<uchar>(tmpy, tmpx) != 0 && flagMat.at<uchar>(tmpy, tmpx) == 0)
			{
				res.at<uchar>(tmpy, tmpx) = 255; // 生长
				flagMat.at<uchar>(tmpy, tmpx) = 1; // 标记
				seeds.push(Point(tmpx, tmpy)); // 种子压栈
			}
		}
	}

	imshow("RES",res);
	imwrite("res.jpg", res);
	waitKey(0);
	return 1;
}

原图:

上面的代码通过人工选择了三个种子,它们在原图中的大致位置如下(红色十字中心):

区域生长的过程:

工程:

时间: 2024-11-05 06:02:54

区域生长算法的相关文章

区域生长算法(C# 实现)

区域生长算法 2014年9月19日 17:01:44 大道理一摆: (以下说明转载,感觉写的很好) 历史:区域生长是一种古老的图像分割方法,最早的区域生长图像分割方法是由Levine等人提出的.该方法一般有两种方式,一种是先给定图像中要分割的目标物体内的一个小块或者说种子区域(seed point),再在种子区域基础上不断将其周围的像素点以一定的规则加入其中,达到最终将代表该物体的所有像素点结合成一个区域的目的:另一种是先将图像分割成很多的一致性较强,如区域内像素灰度值相同的小区域,再按一定的规

图像中区域生长算法的详解和实现

区域生长算法的基本思想是将有相似性质的像素点合并到一起.对每一个区域要先指定一个种子点作为生长的起点,然后将种子点周围领域的像素点和种子点进行对比,将具有相似性质的点合并起来继续向外生长,直到没有满足条件的像素被包括进来为止.这样一个区域的生长就完成了.这个过程中有几个关键的问题: 1 给定种子点(种子点如何选取?) 种子点的选取很多时候都采用人工交互的方法实现,也有用其他方式的,比如寻找物体并提取物体内部点或者利用其它算法找到的特征点作为种子点. 2 确定在生长过程中能将相邻像素包括进来的准则

区域生长算法的一种C++实现

区域生长算法是一种图像分割方法,能够将图像中具有相同特征的连通区域分割出来,同时保证较好的边缘信息. 区域生长算法的优点是简单,容易实现:但空间和时间复杂度较高,对分割图像要求较高,否则容易形成孔洞和过分割. 区域生长算法的基本思想是首先获取分割区域的一个种子点,然后在种子点的周围搜索与该种子点有相似性质的像素点,合并到种子区域中.然后将合并的像素作为新的种子点继续搜索,直到种子区域中所有像素周围没有相似的像素点,算法结束. 如果要实现区域生长算法,基本算法流程是: 1. 选取种子点p(x0,y

区域生长算法(附MATLAB代码实现)

一.理论概念 区域生长是按照事先定义的生长准则将一个像素或者子区域逐步聚合成一个完整独立的连通区域过程.对于图像感兴趣目标区域R,z为区域R上事先发现的种子点,按照规定的生长准则逐步将与种子点z一定邻域内符合相似性判据的像素合并成一个种子群以备下一阶段的生长,这样不断的进行循环生长直到满足生长停止条件为止,从而完成了对感兴趣区域由一个种子点生长为一个独立连通区域的过程.其中相似性判据可以是像素灰度值.颜色.纹理特征等图像信息. 因此区域生长算法一般分为三个步骤实现: (1)    确定生长种子点

灰度图像--图像分割 区域分割之区域生长

学习DIP第58天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 继续说废话,昨天写博客被同事看到了,问我,为什么你每一篇开始都是废话,我说凑字数,在一个可以写点轻松的话,天天在算法的海洋里飘荡,偶尔说几句荒山野岭的废话也算活跃气氛了. 区域分割介绍 今天介绍基于区域的分割方法,前面基于阈值的分割方法暂时

PCL—点云分割(最小割算法)

1.点云分割的精度 在之前的两个章节里介绍了基于采样一致的点云分割和基于临近搜索的点云分割算法.基于采样一致的点云分割算法显然是意识流的,它只能割出大概的点云(可能是杯子的一部分,但杯把儿肯定没分割出来).基于欧式算法的点云分割面对有牵连的点云就无力了(比如风筝和人,在不用三维形态学去掉中间的线之前,是无法分割风筝和人的).基于法线等信息的区域生长算法则对平面更有效,没法靠它来分割桌上的碗和杯子.也就是说,上述算法更关注能不能分割,除此之外,我们还需要一个方法来解决分割的"好不好"这个

LSD算法

LSD算法是一个直线提取算法,在opencv 中也有封装,它的主要思想是通过求导得到灰度的梯度,因为灰度梯度的方向的垂直方向就是线条的方向,将有相同方向的向量用矩形圈起来,再将举行精细化,最后就可以得到的一条线段了. 关于它的文章和算法和demo基本上可以在这里找到. 这篇文章里引入了很多名词,切听我一一道来.首先,我们看下图,这里的图片首先根据梯度的垂线构造了一个level-line field,它把和梯度的垂直方向的线叫做level-line,所以这个field就是由这样的线组成的场.有了这

PCL—低层次视觉—点云分割(超体聚类)

1.超体聚类——一种来自图像的分割方法 超体(supervoxel)是一种集合,集合的元素是“体”.与体素滤波器中的体类似,其本质是一个个的小方块.与之前提到的所有分割手段不同,超体聚类的目的并不是分割出某种特定物体,其对点云实施过分割(over segmentation),将场景点云化成很多小块,并研究每个小块之间的关系.这种将更小单元合并的分割思路已经出现了有些年份了,在图像分割中,像素聚类形成超像素,以超像素关系来理解图像已经广为研究.本质上这种方法是对局部的一种总结,纹理,材质,颜色类似

高斯过程回归

参考资料: http://kingfengji.com/?p=44 说说高斯过程回归 http://www.cnblogs.com/tornadomeet/archive/2013/06/15/3137239.html 机器学习&数据挖掘笔记_11(高斯过程回归) ? 在网上找了许久,终于找到几篇关于介绍这方面的文章,在第一篇文章的链接中,我们可以去下载一些demo 不过没看明白,程序也没调通.大神们,可以在试试. ? 何为高斯过程回归: 其实分为两个过程,高斯过程+回归. 高斯过程:其实就是在