您的位置:首页 > 其它

OTSU方法计算图像二值化的自适应阈值

2008-04-11 19:04 477 查看
2004年09月02日 10:42:00

int otsu (unsigned char *image, int rows, int cols, int x0, int y0,
int dx, int dy, int vvv)

{

unsigned char
*np;
// 图像指针

int thresholdValue=1;
// 阈值

int
ihist[256];
// 图像直方图,256个点

int i, j,
k;
// various counters

int n, n1, n2, gmin, gmax;

double m1, m2, sum, csum, fmax, sb;

// 对直方图置零...

memset(ihist, 0, sizeof(ihist));

gmin=255; gmax=0;

// 生成直方图

for (i = y0 + 1; i < y0 + dy - 1; i++)
{

np =
&image[i*cols+x0+1];

for (j = x0
+ 1; j < x0 + dx - 1; j++) {

ihist[*np]++;

if(*np > gmax) gmax=*np;

if(*np < gmin) gmin=*np;

np++;

}

}

// set up everything

sum = csum = 0.0;

n = 0;

for (k = 0; k <= 255; k++) {

sum +=
(double) k * (double)
ihist[k];

n +=
ihist[k];

}

if (!n) {

// if n has
no value, there is problems...

fprintf
(stderr, "NOT NORMAL thresholdValue = 160\n");

return
(160);

}

// do the otsu global thresholding
method

fmax = -1.0;

n1 = 0;

for (k = 0; k < 255; k++) {

n1 +=
ihist[k];

if (!n1) {
continue; }

n2 = n -
n1;

if (n2 == 0)
{ break; }

csum +=
(double) k *ihist[k];

m1 = csum /
n1;

m2 = (sum -
csum) / n2;

sb =
(double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);

if (sb >
fmax) {

fmax = sb;

thresholdValue = k;

}

}

// at this point we have our thresholding
value

// debug code to display thresholding
values

if ( vvv & 1 )

fprintf(stderr,"# OTSU: thresholdValue = %d
gmin=%d gmax=%d\n",

thresholdValue, gmin, gmax);

return(thresholdValue);

}

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=92086
分享到新浪微博
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: