图像分割_区域生长

2024-09-05 10:48
文章标签 图像 分割 区域 生长

本文主要是介绍图像分割_区域生长,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至于每个象素)开始,将相邻的具有同样性质的象素或其它区域归并到目前的区域中从而逐步增长区域,直至没有可以归并的点或其它小区域为止。区域内象素的相似性度量可以包括平均灰度值、纹理、颜色等信息。

     区域增长方法是一种比较普遍的方法,在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图象,如自然景物。但是,区域增长方法是一种迭代的方法,空间和时间开销都比较大。

 

区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于1.初始点(种子点)的选取。2.生长准则。3.终止条件。区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。

区域生长的原理

区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长起点,然后将种子像素和周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当作新的种子继续上面的过程,直到没有满足条件的像素可被包括进来。这样一个区域就生长成了。

 图1给出已知种子点进行区域生长的一个示例。图1(a)给出需要分割的图像,设已知两个种子像素(标为深浅不同的灰色方块),现要进行区域生长。设这里采用的判定准则是:如果考虑的像素与种子像素灰度值差的绝对值小于某个门限T,则将该像素包括进种子像素所在的区域。图1(b)给出了T=3时的区域生长结果,整幅图被较好地分成2个区域;图1(c)给出了T=1时的区域生长结果,有些像素无法判定;图1(c)给出了T=6时的区域生长的结果,整幅图都被分在一个区域中了。由此可见门限的选择是很重要的

 

区域生长是一种古老的图像分割方法,最早的区域生长图像分割方法是由Levine等人提出的。该方法一般有两种方式,一种是先给定图像中要分割的目标物体内的一个小块或者说种子区域(seed point),再在种子区域基础上不断将其周围的像素点以一定的规则加入其中,达到最终将代表该物体的所有像素点结合成一个区域的目的;另一种是先将图像分割成很多的一致性较强,如区域内像素灰度值相同的小区域,再按一定的规则将小区域融合成大区域,达到分割图像的目的,典型的区域生长法如T. C. Pong等人提出的基于小面(facet)模型的区域生长法,区域生长法固有的缺点是往往会造成过度分割,即将图像分割成过多的区域

 

 

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

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

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

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

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

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

 

 

代码:

/*************************************************************************

 *

 * /函数名称:

 *   RegionGrow()

 *

 * /输入参数:

 *   CDib * pDib                     - 指向CDib类的指针,含有原始图象信息

 *   unsigned char * pUnRegion       - 指向区域生长结果的指针

 *

 * /返回值:

 *   

 *

 * /说明:

 *   pUnRegion指针指向的数据区存储了区域生长的结果,其中(逻辑)表示

 *   对应象素为生长区域,表示为非生长区域

 *   区域生长一般包含三个比较重要的问题:

 *       1. 种子点的选取

 *       2. 生长准则

 *       3. 终止条件

 *   可以认为,这三个问题需要具体分析,而且每个问题解决的好坏直接关系到

 *   区域生长的结果。

 *   本函数的种子点选取为图像的中心,生长准则是相邻象素的象素值小于

 *   nThreshold, ()终止条件是一直进行到再没有满足生长准则需要的象素时为止

 *   

 *************************************************************************

 */

// 在这个代码中,它认为这张图片就是一个区域,选取了中间点为种子点。

void RegionGrow(CDib * pDib, unsigned char * pUnRegion, int nThreshold)

{

     static int nDx[]={-1,0,1,0};

     static int nDy[]={0,1,0,-1};

 

     nThreshold = 20;

 

     // 遍历图象的纵坐标

//   int y;

 

     // 遍历图象的横坐标

//   int x;

 

     // 图象的长宽大小

     CSize sizeImage        = pDib->GetDimensions();

     int nWidth             = sizeImage.cx         ;

     int nHeight            = sizeImage.cy         ;

 

     // 图像在计算机在存储中的实际大小

     CSize sizeImageSave    = pDib->GetDibSaveDim();

 

     // 图像在内存中每一行象素占用的实际空间

     int nSaveWidth = sizeImageSave.cx;

 

     // 初始化

     memset(pUnRegion,0,sizeof(unsigned char)*nWidth*nHeight);

 

     // 种子点

     int nSeedX, nSeedY;

 

     // 设置种子点为图像的中心

     nSeedX = nWidth /2 ;

     nSeedY = nHeight/2 ;

 

     // 定义堆栈,存储坐标

     int * pnGrowQueX ;

     int * pnGrowQueY ;

    

     // 分配空间

     pnGrowQueX = new int [nWidth*nHeight];

     pnGrowQueY = new int [nWidth*nHeight];

 

     // 图像数据的指针

     unsigned char *  pUnchInput =(unsigned char * )pDib->m_lpImage;

    

     // 定义堆栈的起点和终点

     // 当nStart=nEnd, 表示堆栈中只有一个点

     int nStart ;

     int nEnd   ;

 

     //初始化

     nStart = 0 ;

     nEnd   = 0 ;

 

     // 把种子点的坐标压入栈

     pnGrowQueX[nEnd] = nSeedX;

     pnGrowQueY[nEnd] = nSeedY;

 

     // 当前正在处理的象素

     int nCurrX ;

     int nCurrY ;

 

     // 循环控制变量

     int k ;

 

     // 图象的横纵坐标,用来对当前象素的邻域进行遍历

     int xx;

     int yy;

 

     while (nStart<=nEnd)

     {

         // 当前种子点的坐标

         nCurrX = pnGrowQueX[nStart];

         nCurrY = pnGrowQueY[nStart];

 

         // 对当前点的邻域进行遍历

         for (k=0; k<4; k++)   

         {   

              // 4邻域象素的坐标

              xx = nCurrX + nDx[k];

              yy = nCurrY + nDy[k];

             

              // 判断象素(xx,yy) 是否在图像内部

              // 判断象素(xx,yy) 是否已经处理过

              // pUnRegion[yy*nWidth+xx]==0 表示还没有处理

 

              // 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY) 象素值差的绝对值

              if ( (xx < nWidth) && (xx>=0) && (yy<nHeight) && (yy>=0)

                       && (pUnRegion[yy*nWidth+xx]==0)

                       && abs(pUnchInput[yy*nSaveWidth+xx] - pUnchInput[nCurrY*nSaveWidth+nCurrX])<nThreshold )

              {

                   // 堆栈的尾部指针后移一位

                   nEnd++;

 

                   // 象素(xx,yy) 压入栈

                   pnGrowQueX[nEnd] = xx;

                   pnGrowQueY[nEnd] = yy;

 

                   // 把象素(xx,yy)设置成逻辑()

                   // 同时也表明该象素处理过

                   pUnRegion[yy*nWidth+xx] = 255 ;

              }

         }

         nStart++;

     }

 

     // 释放内存

     delete []pnGrowQueX;

     delete []pnGrowQueY;

    pnGrowQueX = NULL ;

     pnGrowQueY = NULL ;

}

 

该代码的效果不是很好,大概是选择的生长点不是很好吧。

这篇关于图像分割_区域生长的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138746

相关文章

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户