zoukankan      html  css  js  c++  java
  • OTSU自适应阈值分割

    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);
    }

    原文:http://wsyjwps1983.blog.163.com/blog/static/680090012009722114728877/

  • 相关阅读:
    bootstrap在线引用 bootstrap百度调用
    CentOS7下安装MySQL5.7安装与配置(YUM)
    screen命令的常见用法
    Nginx主要用来干什么
    linux-Centos7安装python3并与python2共存
    爬虫小问题之以为是编码问题,却是headers中参数问题
    LabWindows/CVI基础
    STM32 命名方法
    Ubuntu14.04虚拟机下基本操作(typical安装)
    网关,路由器,交换机,猫小结
  • 原文地址:https://www.cnblogs.com/yingying0907/p/2128073.html
Copyright © 2011-2022 走看看