A fast adaptive image binarization method (Wellner 1993)
该算法的英文介绍可看:http://www.idevlife.com/24638/
原文下载地址:不过好像下不下来了。
http://www.xrce.xerox.com/Publications/Attachments/1993-110/EPC-1993-110.pdf
该算法的主要思想如下:
代码如下:
void quickAdaptiveThreshold(unsigned char* grayImage, unsigned char* binImage,int width,int height)
{
int t = 15;
int s = width >> 3;
const int T = 9; //T是避免浮点数运算
const int power2S = 1 << T; //同时乘除2的T次方,避免浮点运算
int factor = power2S * (100-t) / (100*s);
int gn = 127 * s;
int q = power2S - power2S / s; //等比数列比率
int pn, hn;
unsigned char *scanline = NULL;
int *prev_gn = NULL;
prev_gn = new int[width];
for (int i = 0; i < width; i++)
{
prev_gn[i] = gn;
}
//左右交替扫描所有行
for (int y = 0; y < height; y ++ )
{
int yh = y * width;
scanline = grayImage + y * width;
for ( int x = 0; x <width; x ++ ) //该行从左往右扫描
{
pn = scanline[x] ;
gn = ((gn * q) >> T) + pn;
hn = (gn + prev_gn[x]) >> 1; //上下两行求平均
prev_gn[x] = gn;
pn < (hn*factor) >> T ? binImage[yh+x] = 0 : binImage[yh+x] = 0xff;
}
y ++ ;
if ( y == height)
{
break;
}
yh = y * width;
scanline = grayImage + y * width;
for ( int x = width-1; x >= 0; x --) //该行从右往左扫描
{
pn = scanline[x] ;
gn = ((gn * q) >> T) + pn;
hn = (gn + prev_gn[x]) >> 1;
prev_gn[x] = gn;
pn < (hn*factor) >> T ? binImage[yh+x] = 0 : binImage[yh+x] = 0xff;
}
}
delete prev_gn;
}
本文下载地址:http://pan.baidu.com/share/link?shareid=1686484188&uk=4213349809