zoukankan      html  css  js  c++  java
  • OTSU求阈值程序

    writen by wqj1212@yahoo.com.cn


    int otsu (IplImage *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, 0sizeof(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++; /* next pixel 
    }
    }
    */

    for(j=y0;j<dy;j++)
    {
        
    for(i=0;i<dx;i++)
        
    {
            unsigned 
    char temp=CV_IMAGE_ELEM(image,uchar,j,i);
            ihist[temp]
    ++;
        }

    }


    // set up everything
    sum = csum = 0.0;
    = 0;

    for (k = 0; k <= 255; k++{
    sum 
    += (double) k * (double) ihist[k]; /* x*f(x) 质量矩*/
    += ihist[k]; /* f(x) 质量 */
    }


    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 == 0break; }
    csum 
    += (double) k *ihist[k];
    m1 
    = csum / n1;
    m2 
    = (sum - csum) / n2;
    sb 
    = (double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);
    /* bbg: note: can be optimized. */
    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);
    }
     
  • 相关阅读:
    【转】Python常见web系统返回码
    【转】暴力破解无线WiFi密码
    【转】Django继承AbstractUser新建User Model时出现auth.User.groups: (fields.E304)错误
    Python去除文件中的空格、Tab键和回车
    用filter求素数
    【转】Python读取PDF文档,输出内容
    【转】RPC简单介绍
    【转】Python3使用Django2.x的settings文件详解
    Python生成随机字符串
    Python之turtle画同心圆和棋盘
  • 原文地址:https://www.cnblogs.com/wqj1212/p/1009655.html
Copyright © 2011-2022 走看看