openCv for android 图像二值化

二值化的目的是将图片分成两种颜色,白色或者黑色;

二值化前一步是将彩色的图片转化为灰色的图片,这样的图片二值化比较精确一些;

二值化有一个阈值(读音,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 
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值