图像分割-区域增长算法及IDL实现

作者:Sinsonglew 出处:http://www.cnblogs.com/sinsonglew 欢迎转载,也请保留这段声明。thanks :)

1.  区域增长算法原理

  参考文献: 维基词条区域增长算法;

  从种子点seed出发,遍历seed的4邻域,如果某邻域像素符合阈值设定,则标定为增长点并作为新的增长种子插入到种子队列,并移除老种子,一直循环直到种子队列为空,像素空间(一张图片)便分割完毕。如下图所示,红色格子为初始种子;

  

2.  区域增长示例

      

3.  代码实现

     注: 开发语言为IDL,ENVI 4.8版本自带开发语言

  区域增长算法类文件 RegionGrow__define.pro

  1 FUNCTION RegionGrow::init, REGION=region, SEEDS=seeds
  2
  3   self._region   = PTR_NEW(/ALLOCATE_HEAP);
  4   *(self._region) = region;
  5
  6   dims = size(region, /DIMENSIONS);
  7   self._width = dims[0];
  8   self._height = dims[1];
  9
 10   self._ifront = 0L;
 11   self._iback = N_ELEMENTS(seeds);
 12   self._seeds = PTR_NEW(/ALLOCATE_HEAP);
 13   *(self._seeds) = MAKE_ARRAY(self._width * self._height, /LONG, VALUE=0);
 14   (*(self._seeds))[INDGEN(self._iback)] = seeds;
 15
 16   self._hseeds = HASH(seeds, MAKE_ARRAY(self._iback, /BYTE, VALUE=0));
 17
 18   RETURN, 1
 19
 20 END
 21
 22 PRO RegionGrow::setthreshold, mint, maxt
 23   self._mint = mint;
 24   self._maxt = maxt;
 25 END
 26
 27 FUNCTION RegionGrow::isgrowable, value
 28   RETURN, (self._mint LE value && value LE self._maxt)
 29 END
 30
 31 FUNCTION RegionGrow::hasseeds
 32   RETURN, (self._ifront LT self._iback);
 33 END
 34
 35 FUNCTION RegionGrow::isnotseed, index
 36   RETURN, ((self._hseeds).hasKey(index) EQ 0);
 37 END
 38
 39 FUNCTION RegionGrow::popseed
 40   seed = (*(self._seeds))[self._ifront];
 41   self._ifront = self._ifront + 1;
 42   RETURN, seed;
 43 END
 44
 45 PRO RegionGrow::pushseed, index
 46    (self._hseeds)[index] = 0;
 47    (*(self._seeds))[self._iback] = index;
 48    self._iback = self._iback + 1;
 49 END
 50
 51 FUNCTION RegionGrow::grow
 52
 53     growImg = make_array(self._width, self._height, /BYTE, VALUE=0);
 54      k = 0;
 55     WHILE (self->hasseeds()) DO BEGIN
 56        k = k+1;
 57        ;print,"==========================>", k;
 58        seed = self->popseed();
 59        i = FLOOR(seed / self._width);
 60        j = seed - i * self._width;
 61        growImg[j,i] = 255;
 62
 63        ;;;;;LEFT
 64        index = seed - 1;
 65        IF (j-1 GE 0) && (self->isnotseed(index)) && self->isgrowable((*(self._region))[j-1,i]) THEN BEGIN
 66          self->pushseed, index;
 67        ENDIF
 68
 69        ;;;;;RIGHT
 70        index = seed + 1;
 71        IF ((j+1) LT self._width) && (self->isnotseed(index)) && self->isgrowable((*(self._region))[j+1,i]) THEN BEGIN
 72          self->pushseed, index;
 73        ENDIF
 74
 75        ;;;;;UP
 76        index = seed + self._width;
 77        IF ((i+1) LT self._height) && (self->isnotseed(index)) && self->isgrowable((*(self._region))[j,i+1]) THEN BEGIN
 78          self->pushseed, index;
 79        ENDIF
 80
 81        ;;;;;DOWN
 82        index = seed - self._width;
 83        IF ((i-1) GE 0) && (self->isnotseed(index)) && self->isgrowable((*(self._region))[j,i-1]) THEN BEGIN
 84          self->pushseed, index;
 85        ENDIF
 86
 87     ENDWHILE
 88
 89     RETURN, growImg
 90
 91 END
 92
 93 PRO RegionGrow::cleanup
 94
 95   *(self._region) = !NULL;
 96
 97   PTR_FREE, self._seeds;
 98
 99   DELVAR, self._seeds;
100   DELVAR, self._hseeds;
101
102   RETURN
103 END
104
105 PRO RegionGrow__define
106
107   struct = {RegionGrow, _region:PTR_NEW(), _seeds:PTR_NEW(), _hseeds:HASH(), _ifront:0L, _iback:0L, _width:0L, _height:0L, _mint:0, _maxt:0}
108   RETURN
109 END

    区域增长测试主函数文件Region.pro

 1 PRO Region
 2   grayIMG = READ_TIFF(‘D:\ndvi.tif‘);
 3   ;help, grayImg
 4   seeds = WHERE(grayImg EQ 221);
 5
 6   executer = OBJ_NEW("RegionGrow", REGION=grayImg, SEEDS=seeds);
 7   executer.setthreshold,186,230;
 8   st = SYSTIME(1);
 9   result = executer.grow();
10   et = SYSTIME(1);
11   HELP, result;
12   print, "=====================>time: ", (et-st);
13   ;im = IMAGE(result);
14
15   gr = MAKE_ARRAY(3, 2048, 1024, /BYTE, VALUE=0);
16   gr[0,*,*] = result[*,*];
17   gr[1,*,*] = result[*,*];
18   gr[2,*,*] = result[*,*];
19   WRITE_JPEG, "grow.jpg", gr, /TRUE
20 END

测试分割水体结果如下:

    

时间: 2024-10-10 13:30:46

图像分割-区域增长算法及IDL实现的相关文章

区域增长算法的设计与实现(递归思想和堆栈数据结构)

程序员:左正康           发表时间:2013年12月16日 0:56    代号:与老鼠共处一室的日子 算法设计思想:算法中主要有2个函数,分别是CreateSeed函数和Decide函数,CreateSeed函数:创建种子点:Decide函数:决定连通点是否进入生长区域,进入生长区域的连通点作为下一个种子点递归调用CreateSeed函数,直到生长区域不再长大,结束递归. 程序测试展示:

图像分割基础算法及实现实例

最近的项目涉及到了图像处理领域,小小研究了一番,同时收集资料实现了几个基础功能. 一.图像反转 I=imread('input_image.jpg'); J=double(I); J=-J+(256-1); %图像反转线性变换 H=uint8(J); subplot(3,3,4),imshow(H); title('图像反转线性变换'); axis([50,250,50,200]); axis on; 二.灰度线性变换 I=imread('input_image.jpg'); subplot(3

机器学习算法实践——K-Means算法与图像分割

一.理论准备 1.1.图像分割 图像分割是图像处理中的一种方法,图像分割是指将一幅图像分解成若干互不相交区域的集合,其实质可以看成是一种像素的聚类过程.通常使用到的图像分割的方法可以分为: 基于边缘的技术 基于区域的技术 基于聚类算法的图像分割属于基于区域的技术. 1.2.K-Means算法 K-Means算法是基于距离相似性的聚类算法,通过比较样本之间的相似性,将形式的样本划分到同一个类别中,K-Means算法的基本过程为: 初始化常数 ,随机初始化k个聚类中心 重复计算以下过程,直到聚类中心

JPEG算法解密

图片压缩有多重要,可能很多人可能并没有一个直观上的认识,举个例子,一张800X800大小的普通图片,如果未经压缩,大概在1.7MB左右,这个体积如果存放文本文件的话足够保存一部92万字的鸿篇巨著<红楼梦>,现如今互联网上绝大部分图片都使用了JPEG压缩技术,也就是大家使用的jpg文件,通常JPEG文件相对于原始图像,能够得到1/8的压缩比,如此高的压缩率是如何做到的呢?        JPEG能够获得如此高的压缩比是因为使用了有损压缩技术,所谓有损压缩,就是把原始数据中不重要的部分去掉,以便可

区域生长法图像分割的实现方法

本文介绍一种区域生长法进行图像分割的数据组织方式和实现方法,给出了核心代码,可用该方法实现立体匹配中的非法点检测. 区域生长法图像分割是直接根据像素的相似性和连通性来对图像进行聚类的算法.基本原理是,给出若干种子点,然后依次对这些种子点进行如下操作,直到种子点集合为空:判断种子点四邻域或八邻域的像素点是否和种子点相似(灰度相似或其他测度相似),如果相似则将该点加入种子点集合,否则不作处理. 该算法原理很简单,但在数据结构的组织上却需要技巧,本文介绍一种简易的数据组织方式实现该算法. 如上图所示,

基于图像分割的目标识别

1. 图像分割的背景与意义 在应用方面,由于图像分割是从图像处理到图像分析的重要一步,所以自从它的产生到现在,一直受到人们的高度重视.它主要起源于上世纪70年代的电影行业.至今为止,随着我们科技的不断进步,我们也提出了许多种图像分割的算法,并且也有了不小的成绩,而且图像分割也已经在我们的生活中的各个领域得到了广泛的应用,例如在在线产品检验.生产过程控制.文档图像处理.工业自动化.遥感.生产过程控制和生物医学的图像分析,以及体育.农业.军事工程等方面.但是,到目前为止我们还没有一种较为通用的分割方

基于图像分割的目标识别的研究

1.课题研究的背景 图像分割是把图像分成几个特定的区域,然后提取出所需的对象目标的技术和过程.由于图像分割是从图像处理到图像分析的重要一步,所以自从它的产生到现在,一直受到人们的高度重视.而且图像分割的结果是图像特征提取和识别等图像理解的基础,对图像分割的研究也一直是数字图像处理技术的焦点和热点.它主要起源于上世纪70年代的电影行业,从图像分割技术产生发展到现在的这几十年中,随着我们科技的不断进步,我们也提出了许多种图像分割的算法,并且也有了不小的成绩,而且图像分割也已经在我们的生活中的各个领域

论文:LSD-线段提取算法

前言 参考资料: 论文主页:LSD: a Line Segment Detector  Rafael Grompone von Gioi, Jérémie Jakubowicz, Jean-Michel Morel, Gregory Randall 博客:基于LSD的直线提取算法 by tianwaifeimao 博客:线特征 by essica&jie 致谢 摘要 本文中的LSD算法是一种线段(line segment)检测算法,能够在线性时间内得到亚像素级精度的检测结果.它无需调试参数就可以

opencv::基于距离变换与分水岭的图像分割

什么是图像分割 图像分割(Image Segmentation)是图像处理最重要的处理手段之一 图像分割的目标是将图像中像素根据一定的规则分为若干(N)个cluster集合,每个集合包含一类像素. 根据算法分为监督学习方法和无监督学习方法,图像分割的算法多数都是无监督学习方法 - KMeans 距离变换常见算法有两种 - 不断膨胀/腐蚀得到 - 基于倒角距离 分水岭变换常见的算法 - 基于浸泡理论实现 cv::distanceTransform( InputArray src, OutputAr