首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 办公软件
图像分割的一些简单实现_delphi教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
 

图像分割中阈值的自动选取的研究及其算法实现

图像分割是图像处理这门学科中的基础难题,基于阈值的分割则又是图像分割的最基本的难题之一,其难点在于阈值的选取。事实证明,阈值的选择的恰当与否对分割的效果起着决定性的作用。由于阈值选取对图像分割的基础性,本文主要在【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


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·ASP.NET2.0连接SQL Server数据库详解-.NET教程,Asp.Net开发
·在.net中轻松掌握Windows窗体间的数据交互-.NET教程,.NET Framework
·Java中的类反射机制-JSP教程,Java技巧及代码
·小技巧让pdf文件与word文档之间自由地转换
·j2ee程序员应该掌握的linux知识-JSP教程,J2EE/EJB/服务器
·通过WMI获得硬盘和CPU的物理序列号(VB.net)-.NET教程,VB.Net语言
·firfox浏览器开发人公开firfox2.0开发计划
·VB.net入门(10):补充:类~属性-.NET教程,VB.Net语言
·office2003实战秘笈之excel轻松制胜招
·C#编码规范.doc-.NET教程,C#语言
最新文章
·天涯试水网络口碑营销 邢明:希望与"关键词"媲美_站长访谈
·美梨网站长冰寒的商务之道_站长访谈
·白手起家 新网站流量快速提高之道_站长心得
·照片处理 photoshop简单制作照片柔光效果_photoshop教程
·网络百戒 ---网页外观_站长心得
·utf-8转换gb2312编码,解决统计google搜索来源关键字乱_google推广
·googleadsense作弊不是技术的较量_google推广
·google改进搜索服务 企业可在local更新资料_google推广
·rss订阅对你的网站搜索表现有好处吗?_站长心得
·15种简洁有效的网站推广方法_站长心得
相关主题
西部数码虚拟主机

友情链接
CNNIC 西部数码
万网 自助建站
虚拟主机 asp空间
域名注册 域名
域名申请 主页空间
论坛空间 网站空间
国际域名 虚拟空间
空间租用 DDOS防火墙
成都主机托管 四川主机托管
主机租用 服务器租用
网站目录 自助建站
虚拟主机 网址大全
软件下载
自助链接
虚拟主机资讯 特价虚拟主机
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论 打印  刷新     关闭