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


    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];   
         += 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


  • 相关阅读:
    【leetcode 简单】第六题 有效的括号
    【leetcode 简单】第四题 罗马数字转整数
    【leetcode 简单】第三题 回文数
    【leetcode 简单】第二题 反转整数
    【leetcode 简单】第一题 两数之和
    C语言实现栈(顺序存储方式)
    C语言实现线性表(链式存储方式)
    【Linux 命令】fping ping 包间隔时间详解
    有趣的模式见解
    解决在web项目使用log4j中无法将log信息写入文件
  • 原文地址:https://www.cnblogs.com/feisky/p/1586566.html
Copyright © 2020-2023  润新知