图像分割_区域分裂合并

基于区域的图像分割-----------区域分裂合并 阅读详情

转自:http://blog.youkuaiyun.com/cay22/article/details/5666109

区域分裂合并算法的基本思想是先确定一个分裂合并的准则,即区域特征一致性的测度,当图像中某个区域的特征不一致时就将该区域分裂成4 个相等的子区域,当相邻的子区域满足一致性特征时则将它们合成一个大区域,直至所有区域不再满足分裂合并的条件为止.   当分裂到不能再分的情况时,分裂结束,然后它将查找相邻区域有没有相似的特征,如果有就将相似区域进行合并,最后达到分割的作用。   在一定程度上区域生长和区域分裂合并算法有异曲同工之妙,互相促进相辅相成的,区域分裂到极致就是分割成单一像素点,然后按照一定的测量准则进行合并,在一定程度上可以认为是单一像素点的区域生长方法。   区域生长比区域分裂合并的方法节省了分裂的过程,而区域分裂合并的方法可以在较大的一个相似区域基础上再进行相似合并,而区域生长只能从单一像素点出发进行生长(合并)。

 

反复进行拆分和聚合以满足限制条件的算法。

令R表示整幅图像区域并选择一个谓词P。对R进行分割的一种方法是反复将分割得到的结果图像再次分为四个区域,直到对任何区域Ri,有P(Ri)=TRUE。这里是从整幅图像开始。如果P(R)=FALSE,就将图像分割为4个区域。对任何区域如果P的值是FALSE.就将这4个区域的每个区域再次分别分为4个区域,如此不断继续下去。这种特殊的分割技术用所谓的四叉树形式表示最为方便(就是说,每个非叶子节点正好有4个子树),这正如图10.42中说明的树那样。注意,树的根对应于整幅图像,每个节点对应于划分的子部分。此时,只有R4进行了进一步的再细分。

如果只使用拆分,最后的分区可能会包含具有相同性质的相邻区域。这种缺陷可以通过进行拆分的同时也允许进行区域聚合来得到矫正。就是说,只有在P(Rj∪Rk)=TRUE时,两个相邻的区域Rj和Rk才能聚合。

前面的讨论可以总结为如下过程。在反复操作的每一步,我们需要做:

l.对于任何区域Ri,如果P(Ri)=FALSE,就将每个区域都拆分为4个相连的象限区域。

2.将P(Rj∪Rk)=TRUE的任意两个相邻区域Rj和Rk进行聚合。

3.当再无法进行聚合或拆分时操作停止。

可以对前面讲述的基本思想进行几种变化。例如,一种可能的变化是开始时将图像拆分为一组图象块。然后对每个块进一步进行上述拆分,但聚合操作开始时受只能将4个块并为一组的限制。这4个块是四叉树表示法中节点的后代且都满足谓词P。当不能再进行此类聚合时,这个过程终止于满足步骤2的最后的区域聚合。在这种情况下,聚合的区域可能会大小不同。这种方法的主要优点是对于拆分和聚合都使用同样的四叉树,直到聚合的最后一步。

 

例10.17 拆分和聚合

图10.43(a)显示了一幅简单的图像。如果在区域Ri内至少有80%的像素具有zj-mi≤2σi的性质,就定义P(Ri)=TRUE,这里zj是Ri内第j个像素的灰度级,mi是区域Ri的灰度级均值,σi是区域Ri内的灰度级的标准差。如果在此条件下,P(Ri)=TRUE,则设置Ri内的所有像素的值等于mi。拆分和聚合使用前速算法的要点完成。将这种技术应用于图10.43(a)所得结果示于图10.43(b)。请注意,图像分割效果相当好。示于图10.43(c)中的图像是通过对图10.43(a)进行门限处理得到的,门限值选在直方图中两个主要的尖峰之间的中点。经过门限处理,图像中生成的阴影(和叶子的茎)被错误地消除了。

 

如前面的例子中所使用的属性那样,我们试图使用基于区域中像素的均值和标准差的某些特性对区域的纹理进行量化(见11.3.3节中关于纹理的讨论)。纹理分割的概念是以在谓词P(Ri)中使用有关纹理的量度为基础的。就是说,通过指定基于纹理内容的谓词,我们可以使用本节中讨论的任何方法进行纹理分割。

 

 

 

1.       把一幅图像分成4份,计算每一份图像的最大灰度值与最小灰度值的差, 如果差在误差范围值外,则该份图像继续分裂。

2.       对于那些不需要分裂的那些份图像可以对其进行阈值切割了,例如某一块图像的最大灰度大于某个值,则该块图像变成255,否则变为0。

 

// 代码

// 区域分裂合并的图像分割

// nOffSetLne是行偏移量

 

// 由于分裂的层数太多了, 使用递归将使内存空间堆栈溢出

// 解决方法是使用一个堆栈对要分裂的块入栈

// 使用堆栈的方法类似在"区域生长"的实现方法

#include <stack>

struct SplitStruct

{

     unsigned int nWidth;                 // 这一块图像的宽度

     unsigned int nHeigh;                 // 这一块图像的高度

     unsigned int nOffSetWidth;           // 相对源图像数据的偏移宽度

     unsigned int nOffSetHeigh;           // 相对源图像数据的偏移高度

};

void AreaSplitCombineEx(BYTE* image0,              // 源图像数据

                         unsigned int nAllWidth,        // 源图像的宽度

                         unsigned int nAllHeigh,        // 源图像的高度

                         unsigned int w,                // 这一块图像的宽度

                         unsigned int h,                // 这一块图像的高度

                         unsigned int nOffSetWidth,     // 相对源图像数据的偏移宽度

                         unsigned int nOffSetHeigh)     // 相对源图像数据的偏移高度

{

 

     std::stack<SplitStruct> nMyStack;

 

     SplitStruct splitStruct, splitStructTemp;

     splitStruct.nWidth          = w;

     splitStruct.nHeigh          = h;

     splitStruct.nOffSetWidth    = nOffSetWidth;

     splitStruct.nOffSetHeigh    = nOffSetHeigh;

 

     nMyStack.push(splitStruct);

    

     int i, j;

     int nValueS[2][2];     // 用于存储块图像的属性值(该属性值= 该块图像的所有像素灰度值之和除以该块图像所有像素点的数量)

     int nAV;

     int nWidthTemp[3], nHeightTemp[3], nTemp;

     int nWidth, nHeigh;

     int n, m, l;

     double dOver;

 

 

     while(!nMyStack.empty())

     {

         splitStruct = nMyStack.top();

         nMyStack.pop();

 

 

         n = (splitStruct.nOffSetHeigh * nAllWidth + splitStruct.nOffSetWidth);     // 该块图像的左上角

         // 1. 把图像分成2 * 2 块,

         nWidthTemp[0] = 0;

         nWidthTemp[2] = (splitStruct.nWidth + 1) / 2;

         nWidthTemp[1] = splitStruct.nWidth - nWidthTemp[2];

 

         nHeightTemp[0] = 0;

         nHeightTemp[2] = (splitStruct.nHeigh + 1) / 2;

         nHeightTemp[1] = splitStruct.nHeigh - nHeightTemp[2];

 

         // 计算每一块图像的属性值

         int nValue;

         int nValueTemp;

         nAV = 0;

         for(i = 1; i < 3; ++i)

         {

              for(j = 1; j < 3; ++j)

              {

                   nValue = 0;

                   m = (n + nAllWidth * nHeightTemp[i - 1] + nWidthTemp[j - 1]);

                   for(nHeigh = 0; nHeigh < nHeightTemp[i]; ++nHeigh)

                   {

                       for(nWidth = 0; nWidth < nWidthTemp[j]; ++nWidth)

                       {

                            l = (m + nAllWidth * nHeigh + nWidth) * 4;

                            nValueTemp = (0.299 * image0[l] + 0.587 * image0[l + 1] + 0.114 * image0[l + 2]);

                            // 灰度值之和

                            nValue += nValueTemp;

                       }

                   }

 

                   if(nHeightTemp[i] * nWidthTemp[j] == 0)

                   {

                       continue;

                   }

                   if(nHeightTemp[i] * nWidthTemp[j] == 1)

                   {

                       l = m * 4;

                       if((0.299 * image0[l] + 0.587 * image0[l + 1] + 0.114 * image0[l + 2]) < 125)

// 这个值可以动态设定

                       {

                            image0[l] = image0[l + 1] = image0[l + 2] = 0;

                            image0[l + 3] = 255;

                       }

                       else

                       {

                            image0[l] = image0[l + 1] = image0[l + 2] = 255;

                            image0[l + 3] = 255;

                       }

                       continue;

                   }

 

                   // 各块图像的灰度平均值(每一块图像的属性值)

                   nValueS[i - 1][j - 1] = nValue / (nHeightTemp[i] * nWidthTemp[j]);

                   // 2. 对每一块进行判断是否继续分裂(注意分裂的原则)

                   // 我这里的分裂原则是: 图像的属性值在属性值平均值的误差范围之内就不分裂

                   if(nValueS[i - 1][j - 1]  < 220)     // 灰度平均值少于200 需要继续分裂 // 这里就是分裂准则了

                   {

                       splitStructTemp.nWidth           = nWidthTemp[j];

                       splitStructTemp.nHeigh           = nHeightTemp[i];

                       splitStructTemp.nOffSetWidth     = splitStruct.nOffSetWidth + nWidthTemp[j - 1];

                       splitStructTemp.nOffSetHeigh     = splitStruct.nOffSetHeigh + nHeightTemp[i - 1];

                       nMyStack.push(splitStructTemp);

                   }

                   else                                      // 合并(直接填充该块图像为黑色)

                   {

                       // 3. 如果不需要分裂, 则进行合并

                       for(nHeigh = 0; nHeigh < nHeightTemp[i]; ++nHeigh)

                       {

                            for(nWidth = 0; nWidth < nWidthTemp[j]; ++nWidth)

                            {

                                 l = (m + nAllWidth * nHeigh + nWidth) * 4;

                                 image0[l] = image0[l + 1] = image0[l + 2] = 255;

                                 image0[l + 3] = 255;

                            }

                       }

                   }

              }

         }

     }

 

     return;

}

 

该代码的效果也不是太好,主要是分裂准则不好确定

 

区域分裂合并中 最初使用每块图像区域中极大与极小灰度值之差是否在允许的偏差范围来作为均匀性测试准则。 后来均匀性测试准则又被不断的发展。目前,统计检验,如均方误差最小, F检测等都是最常用的均匀性测试准侧方法。

 

看均方误差最小的情况

 

 

其中C是区域R中N个点的平均值。

 

相对于区域生长而言,区域分割于合并技术不再依赖于种子点的选择与生长顺序。但选用合适的均匀性测试准则P对于提高图像分割质量十分重要,当均匀性测试准则P选择不当时,很容易会引起“方块效应”

图像分割技术:区域生长与分裂合并算法详解 本文介绍了两种经典图像分割算法:区域生长和分裂合并。区域生长算法从种子点出发,基于像素相似性扩展区域,适合均匀目标分割;分裂合并算法通过递归分裂和合并相似区域实现分割,适应复杂场景。文章提供了Python实现代码,对比了两种方法的优缺点:区域生长实现简单但对种子点敏感,分裂合并无需种子但计算复杂。实际应用中,区域生长适合医学图像等目标提取任务,分裂合适合遥感图像分析。最后建议根据具体需求选择算法或结合使用。两种方法共同展示了传统图像分割的基本思路和技术实现。 阅读详情

相关推荐

Python实现区域分裂合并图像分割算法

在区域分裂合并算法中,分裂条件用于判断一个区域是否需要进一步分裂。通常根据区域内像素的灰度值方差或标准差来决定是否继续分裂。如果区域的标准差较大,表示该区域内的像素值差异较大,可能包含多种特征,需要进一步分裂。return np.std(region) > 15 # 如果区域的标准差大于阈值,则继续分裂合并条件用于判断两个相邻区域是否可以合并。通常根据区域的平均灰度值来判断。如果两个区域的灰度均值差异较小,则可以将它们合并为一个更大的区域。

闲人编程的博客 812

图像分割-区域分裂合并算法

原文:https://www.jianshu.com/p/fa573431ef3d 区域分裂合并法:区域分裂合并法是一种图像分割算法。 它与区域生长法略有相似之处,但无需预先指定种子点,而是按某种一致性准则分裂或者合并区域。 分裂合并法对分割复杂的场景图像比较有效。 算法的思想并不复杂,总的来说,就是先把图像分成4块,若这其中的一块符合分裂条件,那么这一块又分裂成4块,就这样一直分裂。分裂到一定数量时,以每块为中心,检查相邻的各块,满足一定条件,就合并。 如此循环往复进行分裂和合并的操作。 最后合并小区,即

蜗壳X儿 1万+

基於區域的圖像分割-----------區域分裂合並

http://blog.youkuaiyun.com/cay22/article/details/5666109  2. 區域分裂合並 區域分裂合並算法的基本思想是先確定一個分裂合並的准則,即區域特征一致性的測度,當圖像中某個區域的特征不一致時就將該區域分裂成4 個相等的子區域,當相鄰的子區域滿足一致性特征時則將它們合成一個大區域,直至所有區域不再滿足分裂合並的條件為止.   當分裂到不能再分的情況時

I am Rocky 1607

传统图像分割——区域合并算法(region merging)

本篇文章主要梳理基于区域算法的原理。结合具体实例介绍了区域增长法,区域合并法以及区域分割合并法

dreaming__star的博客 7345

区域分裂合并技术实现图像分割项目包

图像分割是计算机视觉和图像处理领域的一个核心任务,其目的是将图像分割成多个具有相同特征的区域,以便于后续的分析和处理。通过对图像中的物体或区域进行识别和分割,可以有效地提取出感兴趣的对象,为图像识别、物体检测、场景理解等任务打下基础。图像分割技术的分类方式多样,按照算法的不同可以分为基于边缘检测、基于区域生长、基于聚类等方法。其中,区域分裂合并技术作为一种经典的图像分割方法,因其较好的区域均质性和鲁棒性,在工业、医疗和遥感等领域中有着广泛的应用。

weixin_28746457的博客 748

区域分裂合并法

本程序属于图像分割技术中区域分割的区域分裂合并法,具有良好的分割效果

区域生长和区域分离与合并的图像分割方法

最近在学习图像分割的方法,所以对区域生长与区域分离与合并的图像分割方法进行一下总结。 首先说一下两者的不同。区域生长是根据预先定义的生长准则来把像素或子区域集合成较大区域的处理方法。区域生长是先给定图像中要分割的目标物体内的一个小块或者说种子区域(seed point),再在种子区域基础上不断将其周围的像素点以一定的规则加入其中,达到最终将代表该物体的所有像素点结合成一个区域的目的。区域分离与合

dulingtingzi的博客 1万+

合并分裂算法MATLAB代码 CUMT自主移动机器人作业

合并分裂算法MATLAB代码 CUMT自主移动机器人作业

【Opencv】图像分割——区域分裂合并

文章目录1 环境2 效果3 原理4 代码 1 环境 Python 3.8.8 PyCharm 2021 opencv-python 2 效果 3 原理   区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标提取。分裂合并差不多是区域生长的逆过程:从整个图像出发,不断分裂得到各个子区域,然后再把前景区域合并,实现目标提取。分裂合并的假设是对于一幅图像,前景区域由一些相互连通的像素组成的,因此,如果把一幅图像分裂到像素级,那么就可以判定该像素是否为前景像素。当所有像素点或者子区域完成判断以

weixin_53598445的博客 1万+

ubuntu18.04安装R——无法连接上 dl.google.com:80 (6.6.6.6),连接超时&&E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

安装R的时候,sudo apt update 的时候出现错误: 查资料要修改/etc/apt/sources.list.d/google-chrome.list 文件 原来是: deb http://dl.google.com/linux/chrome/deb/ stable main 改为: deb [arch=amd64] http://dl.google.com/linux/chrom...

许希律的博客 4348

激光雷达与相机融合(四)----基于激光雷达与相机的碰撞检测

在这一部分,基于前面的各个部分内容,将利用激光雷达和相机实现目标的检测分类及单目标跟踪,并对车辆前方的车辆目标计算相应的碰撞时间TTC。计算方法分别利用相机和雷达实现。 1.系统的总体架构: 2.TTC计算 简单介绍一下通过激光雷达和相机计算碰撞时间的原理: 利用激光雷达点计算碰撞时间:首先根据检测框聚类出前车目标的点,并过滤掉这些点中的离群点,然后找出这些点中相对于本车最近的点,基于前后两帧以及数据采集频率就可以求解出相对速度,然后用当前帧的距离除以速度得出当前的TTC。但该方法对最近点的选取稳定性不是

张飞飞的博客 3985

图像分割算法

图像分割是指将图像分成若干互不重叠的子区域,使得同一个子区域内的特征具有一定相似性,不同子区域的特征呈现较为明显的差异。之前介绍了基于阈值的分割方法,比如Otsu法等;基于边缘检测的分割方法,比如Sobel算子、Canny算子等。

crossoverpptx的博客 4689

Unity——Scroll View 滑动居中、居中的放大、其他的缩小(支持横竖Scroll View)

一、效果 二、上代码,两种方式。 (第一种是在Update中用插值完成的,如果不想再项目中看到Update,下面的另一种改了一段用DoTween实现的,需要导入一下DoTween) using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using Unit...

SiReSo 7659

图像分割——区域分裂合并法

区域分裂合并法无需预先指定种子点,它按某种一致性准则分裂或者合并区域.可以先进行分裂运算,然后再进行合并运算;也可以分裂和合并运算同时进行,经过连续的分裂和合并,最后得到图像的精确分割效果。分裂合并法对分割复杂的场景图像比较有效。具体实现时,分裂合并算法是基于四叉树数据表示方式进行。 下面介绍分裂合并法的具体步骤。 ⑴ 初始分割 把一幅图像分裂到第二层,子块数n = 16,子块标号如下图。 ⑵ 合并处理 按预先给定的合并原则,对第二层的每4个子块进行检查。假定子块21、22、23、24符合合并原则,合并后标

钢铁男儿 1280

BCIC IV 2a数据集:从下载到实战应用全解析

本文全面解析了BCI Competition IV 2a(BCIC IV 2a)数据集的应用流程。从官方渠道下载数据、解析其结构,到在MATLAB和Python环境中进行数据导入、预处理(包括处理特殊受试者A04T),并详细演示了从特征提取(如CSP)到分类(如LDA、SVM)的完整实战步骤,为脑机接口研究者提供了从入门到实践的清晰指南。

weixin_28235513的博客 972

POSS-NH2:氨基化笼型聚半倍硅氧烷的合成与应用探索

本文详细介绍了氨基化笼型聚半倍硅氧烷(POSS-NH2)的合成方法与应用。通过水解缩合与官能团转化两种主流路线,可制备出这种关键的纳米增强材料。其核心价值在于通过表面的氨基与树脂基体形成化学键合,从而显著提升复合材料的热稳定性和机械性能。文章以环氧树脂改性为例,展示了POSS-NH2在航空航天、电子封装等高性能领域的应用潜力。

grpc6streamer的博客 498

4.2图像分割之区域分裂与合并

区域分裂与合并   区域生长是从一组生长点开始的,另一种方法是在开始时将图像分割成一系列任意不相关的区域,然后将它们合并或者拆分以满足限制条件,这就是区域分裂与合并。通过分裂,可以将不同特征的区域分离开,而通过合并,可以将相同特征的区域合并起来。 (1) 分裂   令R表示整个图像,P代表某种相似性准则。一种区域分裂方法是首先将图像等分为4个区域,然后反复将分割得到的子图像再次分为4个区...

阿兵-AI医疗的专栏 2万+

Vivado FFT IP核避坑指南:从Matlab数据生成到FPGA验证的完整流程

本文详细解析了Vivado FFT IP核从Matlab数据生成到FPGA验证的完整流程,重点解决跨平台数据一致性、IP核配置陷阱和验证方法论等核心问题。通过实战案例和避坑指南,帮助工程师高效实现FFT运算的硬件验证,确保结果与Matlab的误差控制在0.3%以内。

weixin_42543046的博客 395

图像分割(二)——阈值分割/区域生长/区域分裂合并法

一、基于阈值的分割方法         阈值分割是最经典的分割技术,也是最简单实用的。许多情况下,图像中目标区域与背景区域或者说不同区域之间其灰度值存在差异,此时可以将灰度的均一性作为依据进行分割。阈值分割即通过一个或几个阈值将图像分割成不同的区域。         阈值分割方法的核心在于如何寻找适当的阈值。最常用的阈值方法是基于灰度直方图的方法,如最大类间方差法(OTSU)、最小误差法、最大

hairuiJY 3万+

本地Pycharm连接远程服务器详细配置过程(直接在本地使用服务器显卡,很棒)

相信很多人都遇见过这种情况:实验室成员使用同一台服务器,每个人拥有自己的独立账号,我们可以使用服务器更好的配置完成实验,毕竟自己哪有money拥有自己的3090呢。

NorthSmile的博客 4万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

图像分割的奇妙之旅:区域分裂合并与区域生长算法详解

通过这两种算法,我们见证了计算机如何理解图像的内在结构。区域分裂合并像一位严谨的架构师,而区域生长则像耐心的园丁。在实际应用中,常将它们与其他方法(如边缘检测)结合使用。# 完整代码获取# 访问https://github.com/tangchao37/DIP.git。

tangchaoS的博客 1005

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

基于区域的分裂合并图像分割方法

基于区域的分裂合并图像分割方法 【下载地址】基于区域的分裂合并图像分割方法 这个开源项目提供了基于区域的分裂合并图像分割方法的完整实现,适合对图像处理感兴趣的研究者和开发者使用。项目包含三个核心MATLAB文件,分别用于定义分裂合并准则、检测分裂需求以及执行实际的分裂合并操作。用户只需将这些文件放置在统一目录下,调用主函...

gitblog_06766的博客 326

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

基于区域的分裂合并图像分割方法:高效图像处理新选择

基于区域的分裂合并图像分割方法:高效图像处理新选择 【下载地址】基于区域的分裂合并图像分割方法 这个开源项目提供了基于区域的分裂合并图像分割方法的完整实现,适合对图像处理感兴趣的研究者和开发者使用。项目包含三个核心MATLAB文件,分别用于定义分裂合并准则、检测分裂需求以及执行实际的分裂合并操作。用户只需将这些文件放置在...

gitblog_06707的博客 875
上一篇: opencv 形状分析
下一篇: 图像分割_区域生长
淡淡的生活
博客等级 码龄16年 341粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值