Kittler二值化方法,是一种经典的基于直方图的二值化方法。由J. Kittler在1986年发表的论文“Minimum Error Thresholding”提出。论文是对贝叶斯最小错误阈值的准则做了改进,使得计算更加的简单和有效。

  Divijver 和 Kittler的贝叶斯最小错误准则为:

  因为需要求解二次方程和对正态分布的均值和方差进行估计,Nagawa 和 Rosenfeld提出了求解和估计的方法(Some Experiments on Variable Thresholding)。但他们的方法计算式很耗时的。作者做了一个修改,从而得到了计算更简单的准则函数。假设已知直方图h, 则通过以下目标函数寻找最优为:

,

其中

  该方法对于双峰的图像,双峰差别特别大的图像有很好的分割效果,这样的的场景在工业视觉中的零部件中常常遇到。如打光部件后是很容易形成双波峰的,这样该方法的分割往往会得到很好的效果,下面的实验也说明该方法在这类场景中是要更优于大津法和一维最大熵法的。

  论文中还提到了一种变化阈值的求解办法。其思想是:首先将图像割成大小一样的小块(patch),然后对每个小块都使用论文所提到的方法计算得到一个局部(相对于整幅图片)的阈值,接着用双边插值法对计算得到的阈值进行插值,从而得到了每个像素点的二值化分割阈值。文中对一个工业器件进行分割,并给出了效果图:

  代码实现参考了ImageShop提供的C#版本(http://www.cnblogs.com/Imageshop/p/3307308.html),做了简单修改得到了C++版本,代码如下:

/*灰度图像的二值化方法*/

class CxThreshold
{
public:
static int CalcKittlerMinError(int* HistGram)
{
int X, Y;
int MinValue, MaxValue;
int Threshold ;
long PixelBack, PixelFore;
double OmegaBack, OmegaFore, MinSigma, Sigma, SigmaBack, SigmaFore;
for (MinValue = ; MinValue < && HistGram[MinValue] == ; MinValue++) ;
for (MaxValue = ; MaxValue > MinValue && HistGram[MinValue] == ; MaxValue--) ;
if (MaxValue == MinValue) return MaxValue; // 图像中只有一个颜色
if (MinValue + == MaxValue) return MinValue; // 图像中只有二个颜色
Threshold = -;
MinSigma = 1E+;
for (Y = MinValue; Y < MaxValue; Y++){
PixelBack = ; PixelFore = ;
OmegaBack = ; OmegaFore = ;
for (X = MinValue; X <= Y; X++){
PixelBack += HistGram[X];
OmegaBack = OmegaBack + X * HistGram[X];
}
for (X = Y + ; X <= MaxValue; X++){
PixelFore += HistGram[X];
OmegaFore = OmegaFore + X * HistGram[X];
}
OmegaBack = OmegaBack / PixelBack;
OmegaFore = OmegaFore / PixelFore;
SigmaBack = ; SigmaFore = ;
for (X = MinValue; X <= Y; X++) SigmaBack = SigmaBack + (X - OmegaBack) * (X - OmegaBack) * HistGram[X];
for (X = Y + ; X <= MaxValue; X++) SigmaFore = SigmaFore + (X - OmegaFore) * (X - OmegaFore) * HistGram[X];
if (SigmaBack == || SigmaFore == ){
if (Threshold == -)Threshold = Y;
}
else{
SigmaBack = sqrt(SigmaBack / PixelBack);
SigmaFore = sqrt(SigmaFore / PixelFore);
//Sigma = 1 + 2 * (PixelBack * log(SigmaBack / PixelBack) + PixelFore * log(SigmaFore / PixelFore));
Sigma = PixelBack * log(SigmaBack / PixelBack) + PixelFore * log(SigmaFore / PixelFore) - PixelBack * log( PixelBack) - PixelFore* log(PixelFore);
if (Sigma < MinSigma){
MinSigma = Sigma;
Threshold = Y;
}
}
}
return Threshold;
}
};
 
  实验不同算法的效果:
  kettler法,获得最佳的分割效果,纽扣完整性最好。

  大津法,对纽扣亮色部分分割不好。

  一维最大熵法。获得了最差的效果,纽扣完整性不好。对和白色接近的颜色分割较差。

												

二值化方法:Kittler:Minimum Error Thresholding的更多相关文章

  1. python实现超大图像的二值化方法

    一,分块处理超大图像的二值化问题   (1) 全局阈值处理  (2) 局部阈值 二,空白区域过滤 三,先缩放进行二值化,然后还原大小 np.mean() 返回数组元素的平均值 np.std() 返回数 ...

  2. [python-opencv]超大图像二值化方法

    *分块 *全局阈值 VS 局部阈值 import cv2 as cv import numpy as np def big_image_binary(image): print(image.shape ...

  3. 二值法方法综述及matlab程序

    在某些图像处理当中一个关键步是二值法,二值化一方面能够去除冗余信息,另一方面也会使有效信息丢失.所以有效的二值化算法是后续的处理的基础.比如对于想要最大限度的保留下面图的中文字,以便后续的定位处理. ...

  4. 一种局部二值化算法:Sauvola算法

    之前接触过全局二值化(OTSU算法),还有OPENCV提供的自适应二值化,最近又了解到一种新的局部二值化算法,Sauvola算法. 转载自:http://www.dididongdong.com/ar ...

  5. openCV_java 图像二值化

    较为常用的图像二值化方法有:1)全局固定阈值:2)局部自适应阈值:3)OTSU等. 局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样做的好处在于每个像素位置处的二值化 ...

  6. 二值化函数cvThreshold()参数CV_THRESH_OTSU的疑惑【转】

    查看OpenCV文档cvThreshold(),在二值化函数cvThreshold(const CvArr* src, CvArr* dst, double threshold, double max ...

  7. [python-opencv]图像二值化【图像阈值】

    图像二值化[图像阈值]简介: 如果灰度图像的像素值大于阈值,则为其分配一个值(可以是白色255),否则为其分配另一个值(可以是黑色0) 图像二值化就是将灰度图像上的像素值设置为0或255,也就是将整个 ...

  8. OpenCV_基于局部自适应阈值的图像二值化

    在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...

  9. OpenCV---超大图像二值化和空白区域过滤

    超大图像的二值化方法 1.可以采用分块方法, 2.先缩放处理就行二值化,然后还原大小 一:分块处理超大图像的二值化问题 def big_image_binary(image): print(image ...

随机推荐

  1. linux用户权限 -> 系统特殊权限

    set_uid 运行一个命令的时候,相当于这个命令的所有者,而不是执行者的身份. suid的授权方法 suid 权限字符s(S),用户位置上的x位上设置. 授权方法: passwd chmod u+s ...

  2. 字体格式类型(.eot/.otf/.woff/.svg)

    @font-face语句是css中的一个功能模块,用于实现网页字体多样性的模块(设计者可随意指定字体,不需要考虑浏览者电脑上是否安装). @font-face文件 而由于网页中使用的字体类型,也是各浏 ...

  3. 洛谷P2279消防局的设立

    传送门啦 一个很摸不清头脑的树形dp 状态: $ dp[i][0] $ :选自己 $ dp[i][1] $ :选了至少一个儿子 $ dp[i][2] $ :选了至少一个孙子 ------------- ...

  4. Spring框架的基本使用(IOC部分)

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. Spring的好处 1.方便解耦,简化开发: Spring就是一个大工厂,专门负责生成Bean,可以将所有对象创建和依赖关 ...

  5. JAVA复习笔记:内存结构和类加载

    Part1:JVM内存结构 JVM定义了若干个程序执行期间使用的数据区域.这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁.而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出 ...

  6. wordpress后台进去空白怎么办?

    最近博客换成了用wordpress程序搭建,内容和版面也重新设计.经常使用FTP工具,更改模板或者其他程序文件.由于对wordpress不太了解,竟然出现了wordpress后台进去空白的问题,而前台 ...

  7. CCF CSP 201512-3 画图

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-3 画图 问题描述 用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ...

  8. HBase(十)HBase性能调优总结

    一. HBase的通用优化 1 高可用 在 HBase 中 Hmaster 负责监控 RegionServer 的生命周期,均衡 RegionServer 的负载,如果 Hmaster 挂掉了,那么整 ...

  9. javascript输入验证数字方法,适合充值时输入正整数验证

    说明:用于验证正整数的输入,不允许输入其他字符. html: <input type="text" id="sell_jobNum" name=" ...

  10. GMM与EM算法

    用EM算法估计GMM模型参数 参考  西瓜书 再看下算法流程