基于模糊集理论的一种图像二值化算法的原理、实现效果及代码
来源:互联网 发布:网络道德公约 编辑:程序博客网 时间:2024/05/16 09:26
这篇文章是我从自己的QQ(632846506)日志中移过来的。https://user.qzone.qq.com/632846506/infocenter。
该论文的原文可从此处下载: Image thresholding by minimizing the measure of fuzziness。
该论文结合了当时处于研究热潮的模糊集理论,提出了一种具有较好效果的图像二值化算法,本文主要是对其进行简单的翻译和注释,并提供了测试代码。
一、模糊集及其隶属度函数
首先,我们假定X代表一副大小为M×N的具有L个色阶的灰度图像,而xmn代表图像X中点(m,n)处的像素灰度值,定义μx(xmn)表示该点具有某种属性的隶属度值,也就是说我们定义了一个从图像X映射到[0,1]区间的模糊子集,用专业的模糊集表达,即有:
其中0≤μx(xmn)≤1,m=0,1,...M-1,n=0,1,...N-1。对于二值化来说,每个像素对于其所属的类别(前景或背景)都应该有很相近的关系,因此,我们可以这种关系来表示μx(xmn)的值。
定义h(g)表示图像中具有灰度级g的像素的个数,对于一个给定的阈值t,背景和前景各自色阶值的平均值μ0和μ1可用下式表示:
上述μ0和μ1,可以看成是指定阈值t所对应的前景和背景的目标值,而图像X中某一点和其所述的区域之间的关系,在直觉上应该和该点的色阶值与所属区域的目标值之间的差异相关。因此,对于点(m,n),我们提出如下的隶属度定义函数:
其中C是一个常数,该常数使得0.5≤μx(xmn)≤1。因此,对于一个给定的阈值t,图像中任何一个像素要么属于背景,要么属于前景,因此,每个像素的隶属度不应小于0.5。
C值在实际的编程中,可以用图像的最大灰度值减去最小灰度值来表达,即 C=gmax-gmin;
二、模糊度的度量及取阈值的原则
模糊度表示了一个模糊集的模糊程度,有好几种度量方式已经被提及了,本文仅仅使用了香农熵函数来度量模糊度。
基于香农熵函数,一个模糊集A的熵定义为:
其中香农函数:
扩展到2维的图像,图像X的熵可以表达为:
因为灰度图像至多只有L个色阶,因此使用直方图式(7)可进一步写成:
可以证明式(6)在区间[0,0.5]之间是单调递增而在[0.5,1]之间是单调递减的,并且E(X)具有以下属性:
(1)0≤E(X)≤1 ;
(2)如果μx(xmn)=0或者μx(xmn)=1时,E(X)具有最小值0,在本文中μx(xmn)只可能为1,此时分类具有最好的明确性。
(3)当μx(xmn)=0.5,E(X)获得最大值1,此时的分类具有最大的不明确性。
那么对于图像X,我们确定最好的阈值t的原则就是:对于所有的可能的阈值t,取香农熵值最小时的那个t为最终的分割阈值。
三、编程中的技巧
有了上述原理,其实编程也是件很容易的事情了,你可以按照你的想法去做,不过作者论文中的阐述会让代码写起来更清晰、更有效。
首先,为了表达方便,我们定义如下一些表达式:
根据上述表达式,可以知道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)、 计算下面算式:
稍微有点数学基础的人都应该能看懂上述算式的推导原理。
根据式(2)和式(3),可以知道背景和前景的区域的平均灰度值为:
上式中int表示取整操作。
(3)根据式(4)及式(11)计算图像的模糊度;
(4)令t=t+1,然后重新执行步骤2,直到t=gmax-1;
(5)找到整个过程中的最小模糊度值对应的阈值t,并作为最佳的分割阈值。
为了稍微加快点速度,上述式4中的计算可以在步骤1中用一查找表实现。
四、参考代码:
for (X = Y + 1; X <= Last; X++) Entropy += Smu[Math.Abs(X - mu)] * HistGram[X]; // 公式8 if (BestEntropy > Entropy) { BestEntropy = Entropy; // 取最小熵处为最佳阈值 Threshold = Y; } } return Threshold;}
代码其实还是很简单的。
五、效果:
针对一些图像,我们做了如下测试:
原图 二值图,阈值=175
上图使用OSTU等经典算法都无法获得上图的理想效果。
原图 二值图,阈值=67
上图和其他一些二值算法的效果也是非常类似的。
- 基于模糊集理论的一种图像二值化算法的原理、实现效果及代码
- 基于模糊集理论的一种图像二值化算法的原理、实现效果及代码
- 基于模糊集理论的一种图像二值化算法的原理、实现效果及代码
- 基于模糊集理论的一种图像二值化算法
- 基于模糊集理论的一种图像二值化算法
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
- JavaScript 常用方法总结
- Beautiful Soup的用法
- 统计Xcode代码总行数的方法
- Spring3+Hibernate4注解式事务中无法获取Session的问题
- Java 求解最大公约数的四种常见算法
- 基于模糊集理论的一种图像二值化算法的原理、实现效果及代码
- 小兔蹦蹦跳
- IE下对AJAX响应缓存的解决
- Activity的四种launchMode
- usb总结
- uva 11054
- 不能再迷茫下去了,只有你付出才能有收获
- java时间格式处理工具
- 暑期集训热身训练:一只小蜜蜂....