二值化方法:Kittler:Minimum Error Thresholding
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的更多相关文章
- python实现超大图像的二值化方法
一,分块处理超大图像的二值化问题 (1) 全局阈值处理 (2) 局部阈值 二,空白区域过滤 三,先缩放进行二值化,然后还原大小 np.mean() 返回数组元素的平均值 np.std() 返回数 ...
- [python-opencv]超大图像二值化方法
*分块 *全局阈值 VS 局部阈值 import cv2 as cv import numpy as np def big_image_binary(image): print(image.shape ...
- 二值法方法综述及matlab程序
在某些图像处理当中一个关键步是二值法,二值化一方面能够去除冗余信息,另一方面也会使有效信息丢失.所以有效的二值化算法是后续的处理的基础.比如对于想要最大限度的保留下面图的中文字,以便后续的定位处理. ...
- 一种局部二值化算法:Sauvola算法
之前接触过全局二值化(OTSU算法),还有OPENCV提供的自适应二值化,最近又了解到一种新的局部二值化算法,Sauvola算法. 转载自:http://www.dididongdong.com/ar ...
- openCV_java 图像二值化
较为常用的图像二值化方法有:1)全局固定阈值:2)局部自适应阈值:3)OTSU等. 局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样做的好处在于每个像素位置处的二值化 ...
- 二值化函数cvThreshold()参数CV_THRESH_OTSU的疑惑【转】
查看OpenCV文档cvThreshold(),在二值化函数cvThreshold(const CvArr* src, CvArr* dst, double threshold, double max ...
- [python-opencv]图像二值化【图像阈值】
图像二值化[图像阈值]简介: 如果灰度图像的像素值大于阈值,则为其分配一个值(可以是白色255),否则为其分配另一个值(可以是黑色0) 图像二值化就是将灰度图像上的像素值设置为0或255,也就是将整个 ...
- OpenCV_基于局部自适应阈值的图像二值化
在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...
- OpenCV---超大图像二值化和空白区域过滤
超大图像的二值化方法 1.可以采用分块方法, 2.先缩放处理就行二值化,然后还原大小 一:分块处理超大图像的二值化问题 def big_image_binary(image): print(image ...
随机推荐
- 2015 Dhaka
2015 Dhaka A - Automatic Cheater Detection solution 模拟计数. B - Counting Weekend Days solution 模拟计数. C ...
- vue总结 08状态管理vuex
状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管 ...
- C/C++之static
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...
- Python 离线环境
一.应用场景 比如:对于数据安全要求比较严格的机房,服务器是不允许上网的.那么我现在开发了一套python程序,需要一些模块,怎么运行? 二.离线包制作 有2个解决方案: 1. 使用requireme ...
- Oracle学习笔记:11g服务介绍及哪些服务必须开启?
由于工作环境中oracle版本为10g,不支持行转列函数pivot,特在自己电脑上安装了oracle 11g,但因为不经常使用,便把服务自动启动给关闭了,只在需要使用时手动启动,因此记录一下需要启动的 ...
- MySQL学习笔记:limit
MySQL支持用limit语句来设置查询的行数范围,同Hive. LIMIT a, b; a:从a+1开始: b:取b行数据: 1.取出第一行记录: ,; 2.取出第二行记录: ,; 3.取出从11开 ...
- PHP随机浮点数
function randomFloat($min = 0, $max = 1) { $rand = mt_rand(); $lmax = mt_getrandmax(); return $min + ...
- 基于Json.NET自己实现MVC中的JsonValueProviderFactory
写了博文ASP.NET MVC 3升级至MVC 5.1的遭遇:“已添加了具有相同键的项”之后,继续看着System.Web.Mvc.JsonValueProviderFactory的开源代码. 越看越 ...
- 2017冬季24集训模拟-2.A问题
————————————————————————————————————————题解 唯一没有想出来的题 我们发现以上两种操作 a0,a3,a6,a9……的相对位置不变 a1,a4,a7,a10……的 ...
- 004 Numpy
一:Numpy介绍 1.简介 Numerical Python 就是数值python包,是python进行科学计算的一个基础包,因此要更好的理解与掌握python科学计算包,尤其是pandas,需要先 ...