コード例 #1
0
ファイル: inout.c プロジェクト: rossetd0/porta
void writesys( FILE *fp, int frow, int lrow, int rowl, int format, 
               int *indx, char eqie, int *start )
{
    int i,j;
    
    if (!MP_realised) 
    {
        max = (RAT *) RATallo(CP 0,0,U rowl);
        for (j = 0; j < rowl; j++) 
            max[j].num =  max[j].den.i = 0;
        
        for (i = frow; i < lrow; i++)
            max_vals( max, porta_list[i]->sys, rowl );
        
        width_line(max,rowl,format);
    }
    
    for (i = frow; i < lrow; i++)
    {
        /*
           fprintf(fp,"(%3d) ",i-frow+1);   
        */
        fprintf(fp,"(%3d) ",*start);
        (*start)++;     
        (* writeline)(fp,rowl,porta_list[i]->sys,format,max,eqie,indx);
        if (option & Statistic_of_coefficients) 
            writestatline(fp,(int *)porta_list[i]->ptr);
        fprintf(fp,"\n");
    } /* for i */
/*
    fprintf(fp,"\n");
*/
    if (!MP_realised) RATallo(max,rowl,0);
}
コード例 #2
0
  void ContrastStretch(
    int32_t grid_size,
    const cv::Mat& source_image,
    cv::Mat& dest_image,
    const cv::Mat& mask,
    double max_min,
    double min_max)
  {
    double cell_width = static_cast<double>(source_image.cols) / grid_size;
    double cell_height = static_cast<double>(source_image.rows) / grid_size;

    cv::Mat max_vals(grid_size, grid_size, CV_32F);
    cv::Mat min_vals(grid_size, grid_size, CV_32F);
    cv::Mat grid_mask = cv::Mat::ones(grid_size, grid_size, CV_8U) * 255;

    bool has_mask = !mask.empty();
    for(int i = 0; i < grid_size; i++)
    {
      for(int j = 0; j < grid_size; j++)
      {
        double minVal = 0;
        double maxVal = 0;

        int x = j * cell_width;
        int y = i * cell_height;
        int x2 = (j + 1) * cell_width;
        int y2 = (i + 1) * cell_height;
        int w = x2 - x;
        int h = y2 - y;

        cv::Rect roi = cv::Rect(x, y, w, h);
        roi.width = std::min(source_image.cols - roi.x, roi.width);
        roi.height = std::min(source_image.rows - roi.y, roi.height);

        if (has_mask)
        {
          if (cv::countNonZero(mask(roi)) > 0)
          {
            cv::minMaxLoc(source_image(roi), &minVal, &maxVal, 0, 0, mask(roi));
          }
          else
          {
            grid_mask.at<uint8_t>(i, j) = 0;
          }
        }
        else
        {
          cv::minMaxLoc(source_image(roi), &minVal, &maxVal, 0, 0);
        }

        max_vals.at<float>(i, j) = maxVal;
        min_vals.at<float>(i, j) = minVal;
      }
    }

    MaskedBoxFilter(max_vals, grid_mask, 3);
    MaskedBoxFilter(min_vals, grid_mask, 3);

    // Stretch contrast accordingly
    for(int i = 0; i < source_image.rows; i++)
    {
      int cell_y = std::min(grid_size - 1, static_cast<int>(i / cell_height));
      int cell_y_start = cell_y * cell_height;
      int cell_y_end = std::min(source_image.rows - 1, static_cast<int>((cell_y + 1) * cell_height));
      double py = (i - cell_y_start) / static_cast<double>(cell_y_end - cell_y_start);

      for(int j = 0; j < source_image.cols; j++)
      {
        // Find relevant min and max values
        int cell_x = std::min(grid_size - 1, static_cast<int>(j / cell_width));
        int cell_x_start = cell_x * cell_width;
        int cell_x_end = std::min(source_image.cols - 1, static_cast<int>((cell_x + 1) * cell_width));
        double px = (j - cell_x_start) / static_cast<double>(cell_x_end - cell_x_start);

        int cell_x1 = cell_x;
        int cell_x2 = cell_x;
        double px1 = 0.5;
        double px2 = 0.5;
        if (px < 0.5 && cell_x > 0)
        {
          cell_x1 = cell_x - 1;
          cell_x2 = cell_x;
          px2 = px + 0.5;
          px1 = 1.0 - px2;
        }
        else if (px > 0.5 && cell_x + 1 < grid_size)
        {
          cell_x1 = cell_x;
          cell_x2 = cell_x + 1;
          px1 = 1.5 - px;
          px2 = 1.0 - px1;
        }

        int cell_y1 = cell_y;
        int cell_y2 = cell_y;
        double py1 = 0.5;
        double py2 = 0.5;
        if (py < 0.5 && cell_y > 0)
        {
          cell_y1 = cell_y - 1;
          cell_y2 = cell_y;
          py2 = py + 0.5;
          py1 = 1.0 - py2;
        }
        else if (py > 0.5 && cell_y + 1 < grid_size)
        {
          cell_y1 = cell_y;
          cell_y2 = cell_y + 1;
          py1 = 1.5 - py;
          py2 = 1.0 - py1;
        }

        // Stretch histogram
        double min_x1_y1 = min_vals.at<float>(cell_y1, cell_x1);
        double max_x1_y1 = max_vals.at<float>(cell_y1, cell_x1);

        double min_x2_y1 = min_vals.at<float>(cell_y1, cell_x2);
        double max_x2_y1 = max_vals.at<float>(cell_y1, cell_x2);

        double min_x1_y2 = min_vals.at<float>(cell_y2, cell_x1);
        double max_x1_y2 = max_vals.at<float>(cell_y2, cell_x1);

        double min_x2_y2 = min_vals.at<float>(cell_y2, cell_x2);
        double max_x2_y2 = max_vals.at<float>(cell_y2, cell_x2);

        //4-point interpolation
        double xM1 = max_x1_y1 * px1 + max_x2_y1 * px2;
        double xM2 = max_x1_y2 * px1 + max_x2_y2 * px2;
        double M = xM1 * py1 + xM2 * py2;

        double xm1 = min_x1_y1 * px1 + min_x2_y1 * px2;
        double xm2 = min_x1_y2 * px1 + min_x2_y2 * px2;
        double m = xm1 * py1 + xm2 * py2;
        double minVal = m;
        double maxVal = M;

        if(maxVal > 255) maxVal = 255;
        if(minVal < 0) minVal = 0;

        // Put a bound on maxVal and minVal
        maxVal = std::max(maxVal, min_max);
        minVal = std::min(minVal, max_min);

        double val = source_image.at<uint8_t>(i,j);
        val = 255.0 * (val - minVal) / (maxVal - minVal);
        if(val > 255) val = 255;
        if(val < 0) val = 0;
        dest_image.at<uint8_t>(i,j) = val;
      }
    }

    dest_image.setTo(0, mask == 0);
  }