二值化的目的是将图片分成两种颜色,白色或者黑色;
二值化前一步是将彩色的图片转化为灰色的图片,这样的图片二值化比较精确一些;
二值化有一个阈值(读音,yu,不是kuo,更不是ga,哈哈);
获取一张图的阈值有一个算法,这个算法是别人写好的,代码如下:
int otsu2(jint* colors, int w, int h) {
unsigned int pixelNum[256]; // 图象灰度直方图[0, 255]
int color; // 灰度值
int n, n0, n1; // 图像总点数,前景点数, 后景点数(n0 + n1 = n)
int w0, w1; // 前景所占比例, 后景所占比例(w0 = n0 / n, w0 + w1 = 1)
double u, u0, u1; // 总平均灰度,前景平均灰度,后景平均灰度(u = w0 * u0 + w1 * u1)
double g, gMax; // 图像类间方差,最大类间方差(g = w0*(u0-u)^2+w1*(u1-u)^2 = w0*w1*(u0-u1)^2)
double sum_u, sum_u0, sum_u1; // 图像灰度总和,前景灰度总和, 后景平均总和(sum_u = n * u)
int thresh; // 阈值
memset(pixelNum, 0, 256 * sizeof(unsigned int)); // 数组置0
// 统计各灰度数目
int i, j;
for (i = 0; i < h; i++) {
for (j = 0; j < w; j++) {
color = (colors[w * i + j]) & 0xFF; // 获得灰度值
pixelNum[color]++; // 相应灰度数目加1
}
}
// 图像总点数
n = w * h;
// 计算总灰度
int k;
for (k = 0; k <= 255; k++) {
sum_u += k * pixelNum[k];
}
// 遍历判断最大类间方差,得到最佳阈值
for (k