图像分割的一些简单实现

原创 2003年03月31日 09:31:00

图像分割中阈值的自动选取的研究及其算法实现<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

图像分割是图像处理这门学科中的基础难题,基于阈值的分割则又是图像分割的最基本的难题之一,其难点在于阈值的选取。事实证明,阈值的选择的恰当与否对分割的效果起着决定性的作用。由于阈值选取对图像分割的基础性,本文主要在【1】、【2】、【3】、【4】等的基础上,对一些当前流行的阈值选取算法做了探讨、实现和比较。多阈值分割虽然能进一步提高图像分割的质量,但由于它只是分割技巧的处理问题,而与单阈值分割并无本质的区别。因此本文并不对多阈值分割进行讨论,而只考虑单阈值分割的情形。

1.  双峰法

双峰法的原理及其简单:它认为图像由前景和背景组成,在灰度直方图上,前后二景都形成高峰,在双峰之间的最低谷处就是图像的阈值所在。根据这一原理,我们给出了它的实现,部分代码如下(Pascal语言描述,以下同):

//intPeakintPeak2intValley:峰值和直方图值

//intIndx::相应的灰度值

intPeak,intIndx,intPeak2,intIndx2,intValley,intValleyIndx:integer;

//初始双峰值

    intPeak:=0;

    intPeak2:=0;

 

//取得第一峰值

    for intLoop:=0 to 255 do

      if intPeak<=intGrayLevel[intLoop] then

      begin

        intPeak:=intGrayLevel[intLoop];

        intIndx:=intLoop;

      end;

 

//取得第二峰值

    for intLoop:=0 to 255 do

    Begin

      if (intPeak2<=intGrayLevel[intLoop]) and (intLoop<>intIndx) then

      begin

        intPeak2:=intGrayLevel[intLoop];

        intIndx2:=intLoop;

      end

    end;

 

//取得双峰之间的谷值

    intValley:=intSize;

    if intIndx2<intIndx then

      for intLoop:=intIndx2 to intIndx do

        if intValley>intGrayLevel[intLoop] then

        begin

          intValley:=intGrayLevel[intLoop];

          intValleyIndx:=intLoop;

        end;

从分割的效果来看,当前后景的对比较为强烈时,分割效果较好;否则基本无效。

2.  迭代法

迭代法是基于逼近的思想,其步骤如下:

1.  求出图象的最大灰度值和最小灰度值,分别记为ZMAXZMIN,令初始阈值T0=(ZMAX+ZMIN)/2

2.  根据阈值TK将图象分割为前景和背景,分别求出两者的平均灰度值ZOZB

3.  求出新阈值TK+1=(ZO+ZB)/2

4.  TK=TK+1,则所得即为阈值;否则转2,迭代计算。

以下给出迭代求阈值的部分实现:

//阈值初始为0

intThresholdVal:=0;

      intThresholdVal2:=0;

 

  //总灰度值

  intTotalGrayLevel:=0;

  for intLoop:=0 to 255 do

    if intGrayLevel[intLoop]<>0 then

      intTotalGrayLevel:=intTotalGrayLevel+intLoop*intGrayLevel[intLoop];

 

  //求出初始最大灰度值

  for intLoop:=0 to 255 do

    if intGrayLevel[intLoop]>0 then

    begin

      intLGrayLevel:=intLoop;

      intThresholdVal:=intLoop;

      break;

    end;

 

  //求出初始最小灰度值和初始阈值

  for intLoop:=255 downto 0 do

    if intGrayLevel[intLoop]>0 then

    begin

      intRGrayLevel:=intLoop;

      intThresholdVal:=(intThresholdVal+intLoop)div 2;

      break;

    end;

 

  //迭代求解

  while intThresholdVal<>intThresholdVal2 do

    begin

      intThresholdVal2:=intThresholdVal;

      intCount:=0;

      intLGrayLevel:=0;

      for intLoop:=0 to intThresholdVal do

        if intGrayLevel[intLoop]<>0 then

        begin

          intCount:=intCount+intGrayLevel[intLoop];

          intLGrayLevel:=intLGrayLevel+intLoop*intGrayLevel[intLoop];

        end;

      intRGrayLevel:=intTotalGrayLevel-intLGrayLevel;

      intLGrayLevel:=intLGrayLevel div intCount;

      intRGrayLevel:=intRGrayLevel div (intSize-intCount);

      intThresholdVal:=(intLGrayLevel+intRGrayLevel)div 2;

    end;

迭代所得的阈值分割的图象效果良好。基于迭代的阈值能区分出图像的前景和背景的主要区域所在,但在图像的细微处(如图1中的浅色线条)还没有很好的区分度。

但令人惊讶的是,对某些特定图象,微小数据的变化却会引起分割效果的巨大改变,两者的数据只是稍有变化,但分割效果却反差极大,个中原因还有待进一步研究。

3.  大津法(OTSU法)

大津法由大津于1979年提出,对图像Image,记t为前景与背景的分割阈值,前景点数占图像比例为w0 平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。图像的总平均灰度为:u=w0*u0+w1*u1。从最小灰度值到最大灰度值遍历t,当t使得值g=w0*(u0-u)2+w1*(u1-u)2 最大时t即为分割的最佳阈值。对大津法可作如下理解:该式实际上就是类间方差值,阈值t分割出的前景和背景两部分构成了整幅图像,而前景取值u0,概率为w0,背景取值u1,概率为w1,总均值为u,根据方差的定义即得该式。因方差是灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小,因此使类间方差最大的分割意味着错分概率最小。

直接应用大津法计算量较大,因此我们在实现时采用了等价的公式g=w0*w1*(u0-u1)2。部分计算过程如下:

 

//遍历所有灰度值求Max g

for intCurrentLevel:=0 to intArrLen do

  begin

    if intSclGrayLevel[intCurrentLevel]=0 then

      continue

    else

      begin

              //计算当阈值为intCurrentLevel时的g

        intCount:=0;

        intSumPels:=0;

        for intLoop:=0 to intCurrentLevel do

          begin

            intCount:=intCount+intSclGrayLevel[intLoop];

            intSumPels:=intSumPels+intSumPelsArr[intLoop];

          end;

        w0:=intCount/intSize;

        u0:=intSumPels/intCount;

        w1:=1-w0;

        if intSize-intCount<>0 then

          u1:=(intTotalPels-intSumPels)/(intSize-intCount)

        else

          u1:=0;

 

        RlTempO:=w0*w1*(u0-u1)*(u0-u1);

        if RlTempO>RlMaxO then

        begin

          RlMaxO:=RlTempO;

          Result:=intCurrentLevel;

        end;

      end;

我们在测试中发现:大津法选取出来的阈值非常理想,对各种情况的表现都较为良好。虽然它在很多情况下都不是最佳的分割,但分割质量通常都有一定的保障,可以说是最稳定的分割。由上可知,大津算法是一种较为通用的分割算法。在它的思想的启迪下,人们进一步提出了多种类似的评估阈值的算法,具体可参加【5】、【6】等。

4.  灰度拉伸-一种改进的大津法

大津法得到了广泛的应用,但有人发现,大津法致命的缺陷是当目标物与背景灰度差不明显时,会出现无法忍受的大块黑色区域,甚至会丢失整幅图像的信息。为了解决这个问题,有人提出了灰度拉伸的增强大津法。这种方法的原理其实就是在大津法的基础上通过增加灰度的级数来增强前后景的灰度差,从而解决问题。灰度增加的方法是用原有的灰度级乘上同一个系数,从而扩大灰度的级数,特别地,当乘上的系数为1时,这就是大津法的原型,因此,大津法可以看做是这种方法的一个特例。

在实现中,我们实现了多种灰度拉伸,发现对不同的图像,当遇上不同的拉伸系数时,分割效果也相差甚远。

5.  Kirsh算子

在【4】中提出了基于Kirsh算子的分割方法,其思想为:对数字图像的每个像素i,考虑它的八个邻点的灰度值,以其中三个相邻点的加权和减去剩下五个邻点的加权和得到差值,令三个邻点绕该像素点不断移位,取此八个差值的最大值作为Kirsh算子。即:设Si为三邻点之和,Ti为五邻点之和,则Kirsh算子定义为K(i)=max{1,max5Si-3Ti}如取阈值THk,则当K(i)>THk时,像素i为阶跃边缘点。此外,【4】的作者认为:假设图像大小为H×W个像素点,其边缘点像素一般不会超过5×H个。基于这一假设,该文作者提出:(对一幅图像)用Kirsh算法,取某一较低的初始阈值THk(以保证目标和背景间灰度变化很小的图像边缘也能被取出),对于每个像素点i计算其Kirsh算子,如果K(i)>THk,则i为边缘点,边缘点数N(初始值为0)1,一旦边缘点数超过5×H ,而i还小于整幅图像的像素数,说明阈值取得太低,致使许多不是边缘点的像素也被取出,因此需提高阈值。如此反复,即可获得分割图像所需的阈值。

但在实现中,本文作者发现,【4】中的叙述颇有值得探讨之处,如在H×W图像中,HW之间的关系是完全对称的,两者之间如何抉择?此外,在求Kirsh算子K(i)=max{1,max5Si-3Ti}时也颇有疑虑之处,由其求得的结果分割图像效果并不明显。基于对称性和归一化的考虑,笔者把Kirsh算子改为:K(i)=max{1,max abs(5Si-3Ti) div 15 },并根据在实际运行中的效果,对WH的选取为:if W>H then use 5*H else use 5*W。在实际应用中表明,修改后的分割质量显著提高。但与【4】文中作者声称的效果及其示例相比,仍有相当的距离,特别是它不能解决前后景对比不强烈时的分割情形。但当前后背景对比十分强烈且集中时,Kirsh算子法却会有十分突出的表现。参考文献

【1】       崔屹,数字图像处理技术与应用,电子工业出版社,1997

【2】       付忠良,图像阈值选取方法,计算机应用,2000

【3】       吴冰、秦志远,自动确定图像二值化最佳阈值的新方法,绘测学院学报,2000

【4】       曹莉华,图像边缘提取中的一种动态阈值获取法,小型微型计算机系统,1997

【5】       付忠良,基于图像差距度量的阈值选取方法,计算机研究与发展,2001

【6】       付忠良,一些新的图像阈值选取方法,计算机应用,2001

【7】       Kenneth.R.Castleman著,朱志刚等译,数字图像处理,电子工业出版社,1998

 

图像分割的一些简单实现

图像分割中阈值的自动选取的研究及其算法实现图像分割是图像处理这门学科中的基础难题,基于阈值的分割则又是图像分割的最基本的难题之一,其难点在于阈值的选取。事实证明,阈值的选择的恰当与否对分割的效果起着决...
  • dmgf
  • dmgf
  • 2003年03月31日 09:31
  • 2020

基于图像分割的立体匹配方法

1.绪论立体匹配是三维重建系统的关键步骤,并且作为一种非接触测量方法在工业以及科研领域具有重要的应用价值。为了完成匹配工作以及获取场景的稠密视差图,可以通过构建能量函数对应立体匹配的约束条件。复杂能量...
  • wangyaninglm
  • wangyaninglm
  • 2016年07月12日 20:58
  • 6853

对主流的图像分割算法进行比较,并对其部分算法进行优化

四种分割算法比较 一、实验时间:2010-05-02---2010-10-05  实验人:满达(队长)、高士梦(队员) 二、实验目的:分别使用基于区域信息内容的分割、JSEG、SegCortina...
  • huohunri2013
  • huohunri2013
  • 2012年09月10日 23:17
  • 1103

基于K-means聚类的图像分割

K-means算法用于聚类分析,广泛用于机器学习领域。 下面借用百度百科的解释,个人觉得讲的还算清楚: k-means 算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得...
  • u014568921
  • u014568921
  • 2014年12月11日 15:21
  • 8385

十分钟看懂图像语义分割技术

大多数人接触“语义”都是在和文字相关的领域,或语音识别,期望机器能够识别你发出去的消息或简短的语音,然后给予你适当的反馈和回复。嗯,看到这里你应该已经猜到了,图像领域也是存在“语义”的。 今天是AI大...
  • u012150360
  • u012150360
  • 2017年04月26日 11:58
  • 1392

区域分割算法

思路参考了论文《基于特征线段匹配的救援机器人建图方法》 特征识别主要分为两个过程:区域分割与特征提取 首先要做的就是区域分割,假设激光雷达可以得到n个数据点,以这n个数据点作为一个区域,可以表...
  • jiakeyouwe
  • jiakeyouwe
  • 2016年08月07日 10:45
  • 411

图像分割(一)——原理概念

图像分割(Segmentation)指的是将数字图像细分为多个图像子区域(像素的集合)(也被称作超像素)的过程,就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处...
  • u010368556
  • u010368556
  • 2017年04月14日 19:25
  • 1495

图像语义分割(1)- FCN

在图像处理领域,图像的分割主要考虑像素灰度的变化,区分不同的前后景。之前的一个系列《图像分割技术(1)》对主流算法做了概述图像的语义分割则不仅是区分每个像素的前后景,更需要将其所属类别预测出来,属于计...
  • zizi7
  • zizi7
  • 2017年08月11日 15:12
  • 934

图像分割阈值选取技术综述

摘要  图像分割是图像处理与计算机视觉领域低层次视觉中最为基础和重要的领域之一,它是对图像进行视觉分析和模式识别的基本前提.阈值法是一种传统的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图...
  • qq_26898461
  • qq_26898461
  • 2015年08月28日 11:41
  • 8726

4k图像分割技术

为什么要进行4k图像分割? 4K图像来自HDMI传输,当输入源为4K50P/60P时,HDMI输入输入数据速率达到18Gbps,实际的有效数据也在8G多,如果想要将如此大的数据对其它设备传输,需要一...
  • a52228254
  • a52228254
  • 2017年08月26日 21:59
  • 170
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图像分割的一些简单实现
举报原因:
原因补充:

(最多只允许输入30个字)