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

学习DIP第58天

转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

开篇废话

继续说废话,昨天写博客被同事看到了,问我,为什么你每一篇开始都是废话,我说凑字数,在一个可以写点轻松的话,天天在算法的海洋里飘荡,偶尔说几句荒山野岭的废话也算活跃气氛了。

区域分割介绍

今天介绍基于区域的分割方法,前面基于阈值的分割方法暂时告一段落,基于区域的分割运用同样广泛,但和阈值比较,区域分割难度也稍微大了一些,比如后面要讲到的分水岭算法,分水岭算法是个算法族,并不是单一的一个固定算法,比如有基于形态学的,也有基于其他的,但思想都一样,分水岭是那种典型的,看起来很简单,一说原理,小学生都能听懂,但实现起来难度不小,也可能是我代码能力不行,反正写了将近一整天,修改了一天才算看到点结果。

由于基于区域的分割算法已经成为一个专门的研究领域,这几篇博文只介绍一点点最基础的,通用的算法,至于高深的高科技的算法,留到未来的某个时刻。这里只讲最简单的。

今天介绍的区域生长,是其中比较简单的一种。

区域生长算法

区域生长的算法过程总结如下:

  1. 选取种子点c(x,y)
  2. 以种子点为中心,对其邻域像素进行递归遍历
  3. 对于每一个邻域像素N(x′,y′),设计一个判别式Q(c(x,y),N(x′,y′))。
  4. 如果判别式为真,邻域像素N被设置为新的种子点,进入第2步,并将该点加入结果集合(与种子点为同一区域)。否则退出此次递归回到3,检测下一个邻域像素。

整体思路是以种子点为中心,遍历图,深度优先或广度优先没有没有关系,判断中心点和其邻域是否满足判别式,注意,此处最终要的点是判别式,设计判别式可以针对不同的应用,下面代码中设计的判别式是个简单的范围判别式,也就是说如果被判别的像素灰度值,在一定范围内,则为真,否则为假,范围是由种子点和附加参数param一起产生的。

代码


/****************************************************************************/
/****************************************************************************/
/*区域生长,设置一个种子点x(灰度值为x_v),然后以种子点为中心
 *向四周进行图搜索,如果点y(灰度值为y_v),邻域满足param+x_v>y_v>x_v-param(条件1)
 *则此点与种子点归为一个区域,以此递归,条件1可以根据不同的需要自行设置其他.
 */
//递归遍历邻域,并判断条件是否成立
void findGrowRegion(double *src,double *dst,int seed_x,int seed_y,int width,int height,int regionNum,double value,double param){
    dst[seed_y*width+seed_x]=(double)regionNum;
    for(int j=-1;j<2;j++)
        for(int i=-1;i<2;i++){
            if(seed_x>=0&&seed_y>=0&&seed_x<width&&seed_y<height&&(j!=0||i!=0)){
                if(src[(j+seed_y)*width+i+seed_x]>=value-param
                   &&src[(j+seed_y)*width+i+seed_x]<=value+param
                   &&dst[(j+seed_y)*width+i+seed_x]==0.0)
                    findGrowRegion(src, dst, i+seed_x, j+seed_y, width, height, regionNum, value,param);
            }
        }
}
void RegionGrow(double *src,double *dst,Position * position,int p_size,int width,int height,double param){
    double * dsttemp=(double *)malloc(sizeof(double)*width*height);
    Zero(dsttemp, width, height);
    int regionNum=100;

    for(int i=0;i<p_size;i++){
        int x=position[i].x;
        int y=position[i].y;
        findGrowRegion(src, dsttemp, x,y, width, height, regionNum,src[y*width+x],param);
        regionNum+=10;
    }

    matrixCopy(dsttemp, dst, width, height);
    free(dsttemp);
}

结果分析

总结

区域生长算法实现较简单,但如果递归区域面积过大,可能造成程序卡死,可能是栈空间不够或者别的,这个需要处理下,这个算法的缺点是需要设置种子点,本算法的优点也是可以设置种子点,这样灵活但不够智能,算法执行速度较快。

待续。。。

时间: 2024-08-03 00:01:13

灰度图像--图像分割 区域分割之区域生长的相关文章

灰度图像--图像分割 区域分割之区域分离

学习DIP第59天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 废话开始,今天本来只想写一篇,但晚上觉得还是快把区域分割简单介绍下,后面开始彩色图像类的知识学习和代码实现,下一篇介绍分水岭算法,这才是个头疼的算法,今天的区域分离(合并)相对比较好理解. 算法原理 首先本算法依然是基于区域的,用到的区域的

灰度图像--图像分割 区域分割之分水岭算法

学习DIP第60天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 今天已经是第60篇博客了,这六十篇每一篇平均要两天左右,所以,在过去的四个月学到了这么多知识,想想挺开心,但学的越多就会发现自己不会的越多.从小学到大学,这么多年一直以学习为主要工作但学习又有很多阶段,对于通用知识,比如小学的语文数学此观点

灰度图像--图像分割 综合介绍

学习DIP第40天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

灰度图像--图像分割 边缘模型

学习DIP第41天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

灰度图像--图像分割 霍夫变换(Hough Transform)--直线

学习DIP第50天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 废话开始,要过年了,到处人心惶惶,沉下心写篇博客,下一篇就等农历新年以后了.马上新年了,希望自己在新年能提高技术,找到一份图像处理的好工作,也希望大家都能学习到更多的知识,做自己喜欢做的事情. 以前基本每天都写博客,坚持了三个月感觉确实有提

灰度图像--图像分割 阈值处理综述

学习DIP第51天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 新年第一篇博客,图像分割进行到阈值处理,前面学的边缘检测,然后将边缘连接起来,达到分割区域的目的,用到的基础原理是图像灰度的变化,而阈值处理用到的是阈值的不变,也就是把具有相同或相似的灰度的一类像素定义为一个区域,根据这个特点来定义并区分一

灰度图像--图像分割 阈值处理之平均阈值

学习DIP第52天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 好久没写博客了,已然不熟练了,过完年整个人都不好了,哈哈,到刚才为止算是把图像分割学习了一下,这两天把学习结果和代码简单总结一下. 前面已经介绍了边缘检测,和边缘修复,阈值处理的基本概念也进行了一定介绍.阈值处理速度快,算法简单,所以应用比

灰度图像--图像分割 Robert算子

学习DIP第43天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

灰度图像--图像分割 Canny边缘检测

学习DIP第48天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https://github.com/Tony-Tan/DIPpro 开篇废话 废话开始,Canny大名鼎鼎,大家都称之为Canny算子,包括wiki上也是写的Canny detector,但是按照我的理解,我觉得叫做Canny算法比较合适,但如果叫做算子,那也应该叫做复合算子,因为Canny本身并不是一个线性模板(