得鹿梦鱼 得鹿梦鱼

一种基于直方图的图像二值化的算法

图像二值化是指整幅图像画面中仅有黑白两种灰度,他们之间不存在其他灰度层次的变化,即整幅图像的像素值为白色或者黑色,从图像所包含的信息来看,二值化起始是图形的压缩,压缩后的图形每像素占1bit,这种压缩会丢失大量的图像细节,因此,在二值化图形中的过程中,应尽量保持图像中有用的细节。
从本质而言,图形的二值化就是一种图像分割,是利用图形中药提取的目标物与其背景在灰度特性上的差异,把图像视为具有不同灰度级的两类区域的组合,他选取一个合适的阈值,来确定每个像素点应该属于目标区域还是背景区域,从而产生相应的二值图像,图像二值化在计算机图像处理技术中广泛应用于模式识别,特征提取,图像提取等领域。

常见的二值化算法

在图像二值化实现过程中,阈值的选取是关键,目前常见的阈值选取算法分类有全局阈值法、局部阈值法以及动态阈值法。其中,典型的基于直方图的全局阈值法包括

  • 平均灰度值法: 选取图像中所有像素灰度值的平均值为阈值
  • Kittler算法: 首选计算整幅图像的梯度灰度的平均值。然后以此平均值作为阈值
  • 最大类间方差法: 是按照图像的灰度特性,将图像分位背景和目标两部分,背景和目标之间的类间方差越大,说明构成图像两部分的差别越大

最佳阈值迭代法

对于那些具有明显双峰直方图的图像,亦即图像中背景区域和目标区域差异比较大且区域面积相当。我们可以选择双峰的谷底作为阈值,这是基于直方图的图像二值化算法的基本思想,用这种方法选取出来的阈值可以快速的确定图形中的像素应属于目标区域还是背景区域,在此基础之上提出一种基于直方图的选取阈值的算法,最佳阈值迭代法

描述

算法先根据图像的最大灰度值和最小灰度值设定一个初始闽值,然后通过迭代循环计算在该值下的目标和背景的中心值",当目标和背景中心值的平均值和假定的闽值相同时,则循环中止,并以此值为闽值进行图像二值化,算法流程图如下

算法流程图

算法实现

  1. 求出图像的最大灰度值和最小灰度值,记作graymaxgray_{max}graymingray_{min}, 则初始阈值为T0=graymax+graymin2T_{0}=\frac{gray_{max} + gray_{min} }{2}
  2. 根据阈值T_i将图像分割为目标区域和背景区域,分别求出这2个区域的平均灰度值

graybjgray_{bj}grayfjgray_{fj}
graybj=Ti+1g=graymaxg×hgTi+1g=graymaxhggray_{bj} = \frac{\sum_{T_i+1}^{ g=gray_{max} } g \times hg}{\sum_{T_i+1}^{ g=gray_{max} }hg}

grayfj=grayming=Tig×hggrayming=Tihggray_{fj} = \frac{{\sum_{gray_{min}}^{ g=T_i} } g \times hg}{{\sum_{gray_{min}}^{ g=T_i} hg}}

  1. Ti+1=graybj+grayfj2T_{i+1}=\frac{gray_{bj} + gray_{fj} }{2},如果Ti=Ti+1T_{i} = T_{i+1}, TiT_i为所求的阈值,否则进入第二步

代码实现

function getIteraticeBestThresholdhistGramList{    let minValue =  histGramList.sorta,b => a - b[0]; // 最小灰度值    let maxValue = histGramList.sorta,b => b - a[0]; // 最大灰度值    let threshold  = maxValue + minValue >> 1; // 阈值    let newThreshold // 最新阈值    // 请保证至少3个灰度是有效的    whilethreshold !== newThreshold{        let sumGrayPixelMin = 0;        let sumValueMin = 0;        let meanGrayMin;        let sumGrayPixelMax = 0;        let sumValueMax = 0;        let meanGrayMax;        ifnewThreshold{            threshold = newThreshold;        }        forlet i = minValue; i <= threshold ; i++{            sumGrayPixelMin += histGramList[i] * i;            sumGrayMin += histGramList[i]        }               forlet i = threshold + 1; i <= maxValue; i++{            sumGrayPixelMax += histGramList[i] * i; // 求前景色的像素灰度和            sumValueMax += histGramList[i]        }        ifsumGrayMin && sumValueMax{            meanGrayMin = sumGrayPixelMin / sumGrayMin            meanGrayMax = sumGrayPixelMax / sumValueMax;            newThreshold = meanGrayMax + meanGrayMin >> 2        }    }    return newThreshold === threshold ? threshold : -1  }

文献地址

知网的文献资料内容也是错误的么???