文档章节

基于模糊集理论的一种图像二值化算法的原理、实现效果及代码

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:39
字数 1667
阅读 11
收藏 0
点赞 0
评论 0

  这是篇很古老的论文中的算法,发表与1994年,是清华大学黄良凯(Liang-kai Huang) 所写,因此国外一些论文里和代码里称之为Huang's fuzzy thresholding method。虽然古老也很简单,但是其算法的原理还是值得学习的。

     该论文的原文可从此处下载: 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中用一查找表实现。

    四、参考代码:

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 && HistGram[First] == 0; First++) ;
    for (Last = HistGram.Length - 1; Last > First && HistGram[Last] == 0; Last--) ;
    if (First == Last) return First;                // 图像中只有一个颜色
    if (First + 1 == Last) return First;            // 图像中只有二个颜色

    // 计算累计直方图以及对应的带权重的累计直方图
    int[] S = new int[Last + 1];
    int[] W = new int[Last + 1];            // 对于特大图,此数组的保存数据可能会超出int的表示范围,可以考虑用long类型来代替
    S[0] = HistGram[0];
    for (Y = First > 1 ? First : 1; Y <= Last; Y++)
    {
        S[Y] = S[Y - 1] + HistGram[Y];
        W[Y] = W[Y - 1] + Y * HistGram[Y];
    }

    // 建立公式(4)及(6)所用的查找表
    double[] Smu = new double[Last + 1 - First];
    for (Y = 1; Y < Smu.Length; Y++)
    {
        double mu = 1 / (1 + (double)Y / (Last - First));               // 公式(4)
        Smu[Y] = -mu * Math.Log(mu) - (1 - mu) * Math.Log(1 - mu);      // 公式(6)
    }

    // 迭代计算最佳阈值
    for (Y = First; Y <= Last; Y++)
    {
        Entropy = 0;
        int mu = (int)Math.Round((double)W[Y] / S[Y]);             // 公式17
        for (X = First; X <= Y; X++)
            Entropy += Smu[Math.Abs(X - mu)] * HistGram[X];
        mu = (int)Math.Round((double)(W[Last] - W[Y]) / (S[Last] - S[Y]));  // 公式18
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

    上图和其他一些二值算法的效果也是非常类似的。

 

 

*********************************作者: laviewpbt   时间: 2013.9.5    联系QQ:  33184777  转载请保留本行信息************************

本文转载自:http://www.cnblogs.com/Imageshop/p/3302850.html

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
实时图像处理和机器学习库 - cv4j

The target is to set up a high quality and real-time image process and machine learning library which is implemented in pure java. The framework can run application on java desk......

匿名
2017/06/13
394
0
CVPR 2018 | 使用CNN生成图像先验,实现更广泛场景的盲图像去模糊

  选自arXiv   机器之心编译   参与:Nurhachu Null、刘晓坤      现有的最优方法在文本、人脸以及低光照图像上的盲图像去模糊效果并不佳,主要受限于图像先验的手工设计属性。本文...

机器之心
03/18
0
0
【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑、高斯平滑、...

Eastmount
2015/06/08
0
0
图像处理——形态学

形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建。 基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换 几种算法进行组合,就可以实现一些非常复杂的功...

li_wen01
2017/06/05
0
0
模拟油画和铅笔画的滤镜效果

油画效果 先上未经任何处理的原图 原图.png 然后使用油画风格的滤镜OilPaintFilter看看效果,OilPaintFilter的使用方式就一句话:) 油画效果.png OilPaintFilter在处理人物图片和风景图片时...

Tony沈哲
2017/05/12
0
0
利用美颜SDK技术使直播源代码更加完善

1)、首先是音频采集方面的升级 音频数据既能与图像结合组合成音视频数据,也能以纯音频的方式采集播放,后者在很多成熟的应用场景如在线电台和语音电台等起着非常重要的作用。音频的采集过程...

云豹小王子
06/28
0
0
高斯模糊

前言 通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。 “模糊”的算法不只一种,高斯模糊只是其中一种,甚至它只是其中效率很差的一种。 在Android中使用高斯模糊,需要...

某昆
2017/10/21
0
0
SIFT四部曲之——高斯滤波

版权声明:本文为博主原创文章,未经博主允许不得转载。博客不用于商业活动,博主对博客的使用,拥有最终解释权 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用...

hit2015spring
2016/10/22
0
0
图像直方图与直方图均衡化

图像直方图(英语:Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布。这种直方图中,横坐标的左侧...

Tony沈哲
2017/05/22
0
0
高斯模糊的算法

通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。 "模糊"的算法有很多种,其中有一种叫做"高斯模糊"(Gaussian Blur)。它将正态分布(又名"高斯分布")用于图像处理。 ...

阮一峰
2012/11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

rabbitmq学习记录(三)

工作队列:一个生产者对应多个消费者,生产者直接将消息发送到rabbitmq的队列之中。 消息分配模式默认采用的是轮询分配:即不管消费者处理信息的效率,队列给所有消费者轮流发送一条信息,直...

人觉非常君
24分钟前
0
0
Java 之 反射

反射,剖析 Java类 中的 各个组成部分,映射成 一个个 Java对象,多用于 框架和组件,写出复用性高的通用程序。 测试类代码如下: class Person { private String name; public St...

绝世武神
27分钟前
0
0
华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大

华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps、超级...

华为终端开放实验室
33分钟前
0
0
多 SSH Key 实现同一台服务器部署多 Git 仓库

本文以以下需求为背景,介绍详细的做法: 需在同一台服务器同时部署两个不同的 Github 仓库(对 Bitbucket 等 git 服务同样适用) root 用户可在远程登录 SSH 后附上预期的 SSH Key 进行 gi...

yeahlife
35分钟前
0
0
003. es6数值的扩展

一、普通扩展 Number 方法,将字符串、数值转为十进制 : Number('0b111') Number.isFinite() 用来检查一个数值是否为有限的:Number.isFinite(15) Number.isNan() 用来检查一个值是否为NaN N...

秋季长青
49分钟前
0
0
C语言数组和指针的语法糖

对于C语言,我可以这样秀:比如当创建一个数组arr[n]之后,一般我们去遍历数组的时候是for (int i = 0; i < n; i++) { a[i]; }但是我知道下表访问符[]是个语法糖,也就是说a[i]在编译器看来是...

ustbgaofan
58分钟前
0
0
Call to undefined function bcmath()的解决方法

乐意黎的ECS主机环境,Centos7.2 + PHP7 由于使用了bcdiv()函数,运行时总在抛错。 Fatal error: Call to undefined function bcmath() in /usr/loca/apache/htdocs/... on line 4 一查得知:......

dragon_tech
今天
0
0
css优先级

..

architect刘源源
今天
0
0
【转】Twitter的分布式自增ID算法snowflake

结构 snowflake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以...

talen
今天
0
0
hive支持行级修改

Hive从0.14版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置。要想支持行级insert、update、delete,需要配置Hive支持事务。 一、Hive具有ACID语义事务的使用场景 1. 流式...

hblt-j
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部