基于模糊集理论的一种图像二值化算法_第1页
基于模糊集理论的一种图像二值化算法_第2页
基于模糊集理论的一种图像二值化算法_第3页
基于模糊集理论的一种图像二值化算法_第4页
基于模糊集理论的一种图像二值化算法_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于模糊集理论的一种图像二值化算法的原理、实现效果及代码这是篇很古老的论文中的算法,发表与1994年,是清华大学黄良凯(Liang-kai Huang) 所写,因此国外一些论文里和代码里称之为Huang's fuzzy thresholding method。虽然古老也很简单,但是其算法的原理还是值得学习的。     该论文的原文可从此处下载: Image thresholding by minimizing the measure of fuzziness。     该论文结合了当时处于研究热潮

2、的模糊集理论,提出了一种具有较好效果的图像二值化算法,本文主要是对其进行简单的翻译和注释,并提供了测试代码。一、模糊集及其隶属度函数     首先,我们假定X代表一副大小为M×N的具有L个色阶的灰度图像,而xmn代表图像X中点(m,n)处的像素灰度值,定义x(xmn)表示该点具有某种属性的隶属度值,也就是说我们定义了一个从图像X映射到0,1区间的模糊子集,用专业的模糊集表达,即有:              

3、0;                               其中0x(xmn)1,m=0,1,.M-1,n=0,1,.N-1。对于二值化来说,每个像素对于其所属的类别(前景或背景)都应该有很相近的关系,因此,我们可以这种关系来表示x(xmn)的值。     

4、60; 定义h(g)表示图像中具有灰度级g的像素的个数,对于一个给定的阈值t,背景和前景各自色阶值的平均值0和1可用下式表示:                                       

5、60;                                       上述0和1,可以看成是指定阈值t所对应的前景和背景的目标值,而图像X中某一点和其所述的区域之间的关系,在直觉上应该和该点的色阶值与所属区域的目标值之间的差异

6、相关。因此,对于点(m,n),我们提出如下的隶属度定义函数:         其中C是一个常数,该常数使得0.5x(xmn)1。因此,对于一个给定的阈值t,图像中任何一个像素要么属于背景,要么属于前景,因此,每个像素的隶属度不应小于0.5。     C值在实际的编程中,可以用图像的最大灰度值减去最小灰度值来表达,即 C=gmax-gmin;二、模糊度的度量及取阈值的原则     模糊度表示了一个模糊集的模糊程度,有好几种度量方

7、式已经被提及了,本文仅仅使用了香农熵函数来度量模糊度。     基于香农熵函数,一个模糊集A的熵定义为:             其中香农函数:            扩展到2维的图像,图像X的熵可以表达为:     因为灰度图像至多只有L个色阶,因此使用直方图式(7)可进一步写成:   

8、           可以证明式(6)在区间0,0.5之间是单调递增而在0.5,1之间是单调递减的,并且E(X)具有以下属性:     (1)0E(X)1      (2)如果x(xmn)=0或者x(xmn)=1时,E(X)具有最小值0,在本文中x(xmn)只可能为1,此时分类具有最好的明确性。     (3)当x(xmn)=0.5,E(X)获得最大值1,此时的分类具有最大的不明确性。&

9、#160;    那么对于图像X,我们确定最好的阈值t的原则就是:对于所有的可能的阈值t,取香农熵值最小时的那个t为最终的分割阈值。三、编程中的技巧     有了上述原理,其实编程也是件很容易的事情了,你可以按照你的想法去做,不过作者论文中的阐述会让代码写起来更清晰、更有效。     首先,为了表达方便,我们定义如下一些表达式:             根据上述表达式,可以知道

10、S(L-1)及W(L-1)对于一副图像来说是个常量,其中S(L-1)明显就是像素的总个数。我们的算法步骤如下:     (1)、计算S(L-1)、W(L-1),设置初始阈值t=gmin,令S(t-1)=0、W(t-1)=0;     (2)、计算下面算式:                     稍微有点数学基础的人都

11、应该能看懂上述算式的推导原理。       根据式(2)和式(3),可以知道背景和前景的区域的平均灰度值为:       上式中int表示取整操作。 (3)根据式(4)及式(11)计算图像的模糊度; (4)令t=t+1,然后重新执行步骤2,直到t=gmax-1; (5)找到整个过程中的最小模糊度值对应的阈值t,并作为最佳的分割阈值。 为了稍微加快点速度,上述式4中的计算可以在步骤1中用一查找表实现。   &

12、#160;四、参考代码:public static int GetHuangFuzzyThreshold(int HistGram) int X, Y; int First, Last; int Threshold = -1; double BestEntropy = Double.MaxValue, Entropy; / 找到第一个和最后一个非0的色阶值 for (First = 0; First < HistGram.Length && HistGramFirst = 0; First+) ; for (Last = HistGram.Length - 1; Last

13、 > First && HistGramLast = 0; Last-) ; if (First = Last) return First; / 图像中只有一个颜色 if (First + 1 = Last) return First; / 图像中只有二个颜色 / 计算累计直方图以及对应的带权重的累计直方图 int S = new intLast + 1; int W = new intLast + 1; / 对于特大图,此数组的保存数据可能会超出int的表示范围,可以考虑用long类型来代替 S0 = HistGram0; for (Y = First > 1 ?

14、 First : 1; Y <= Last; Y+) SY = SY - 1 + HistGramY; WY = WY - 1 + Y * HistGramY; / 建立公式(4)及(6)所用的查找表 double Smu = new doubleLast + 1 - First; for (Y = 1; Y < Smu.Length; Y+) double mu = 1 / (1 + (double)Y / (Last - First); / 公式(4) SmuY = -mu * Math.Log(mu) - (1 - mu) * Math.Log(1 - mu); / 公式(6

15、) / 迭代计算最佳阈值 for (Y = First; Y <= Last; Y+) Entropy = 0; int mu = (int)Math.Round(double)WY / SY); / 公式17 for (X = First; X <= Y; X+) Entropy += SmuMath.Abs(X - mu) * HistGramX; mu = (int)Math.Round(double)(WLast - WY) / (SLast - SY); / 公式18 for (X = Y + 1; X <= Last; X+) Entropy += SmuMath.Abs(X - mu) * HistGramX; / 公式8 if (BestEntropy > Entropy) BestEntropy = Entropy; / 取最小熵处为最佳阈值 Thresh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论