Example #1
0
/* Recursive function.  Store local array */
long int rarray(long int x) {
    if (x <= 0)
	return x;
    volatile long int a[3];
    a[1] = x-1;
    return rarray(x-2) + a[1];
}
bool
CppIterCHT (vector < unsigned int >originImage,
            vector < unsigned int >dim_originImage, unsigned int maxR,
            vector < unsigned int >&edgeImage,
            vector < unsigned int >&dim_edgeImage,
            vector < unsigned int >&result_row,
            vector < unsigned int >&result_col,
            vector < unsigned int >&result_r,
            vector < unsigned int >&result_peak)
{
  // result_row, result_col: based from 0.

  //mxArray *prhs[1], *plhs[1];
  //double *tempGetPr;
  //mxLogical *tempGetLogicals;

  if (!(dim_originImage.size () == 2 && dim_edgeImage.size () == 2)) {
#ifdef MATLABPRINT
    mexPrintf ("CppIterCHT ==> inputs are invalid, failed!\n");
#endif
    return false;
  }

  edgeImage.clear ();
  edgeImage.resize (originImage.size ());
  copy (originImage.begin (), originImage.end (), edgeImage.begin ());
  dim_edgeImage[0] = dim_originImage[0];
  dim_edgeImage[1] = dim_originImage[1];

  vector < unsigned int >accumulator (edgeImage.size (), 0);
  vector < unsigned int >rarray (edgeImage.size (), 0),
    peakarray (edgeImage.size (), 0);
  unsigned int currentrow, currentcol, edgecellnum = 0;
  //prhs[0]=mxCreateDoubleMatrix(dim_edgeImage[0], dim_edgeImage[1], mxREAL);     // used for calling MATLAB function "imregionalmax"
  for (unsigned int rcount = 1; rcount <= maxR; rcount++) {
    accumulator.assign (accumulator.size (), 0);
    edgecellnum = 0;
    for (unsigned int pcount = 0; pcount < edgeImage.size (); pcount++) {
      if (edgeImage[pcount] != 0)       // the pixel is on the edge
      {
        // draw circle with center at the pixel and radius rcount in accumulator.
        currentrow =
          MatrixLZ::ind2subrow (pcount, dim_edgeImage[0], dim_edgeImage[1],
                                MatrixLZ::ColMajor);
        currentcol =
          MatrixLZ::ind2subcol (pcount, dim_edgeImage[0], dim_edgeImage[1],
                                MatrixLZ::ColMajor);
        CppRasterCircle (currentcol + 1, currentrow + 1, rcount, accumulator,
                         dim_edgeImage);
        edgecellnum += 1;
      }
    }

    for (unsigned int i = 0; i < accumulator.size (); i++) {
      if (accumulator[i] > peakarray[i]) {
        rarray[i] = rcount;
        peakarray[i] = accumulator[i];
      }
    }

    //tempGetPr=mxGetPr(prhs[0]);
    //for (unsigned i=0; i<accumulator.size(); i++)
    //{
    //      tempGetPr[i]=static_cast<double>(accumulator[i]);
    //}
    //mexCallMATLAB(1, plhs, 1, prhs, "imregionalmax");

    //tempGetLogicals=mxGetLogicals(plhs[0]);
    //for (unsigned int i=0; i<accumulator.size(); i++)
    //{
    //      if (tempGetLogicals[i] && accumulator[i]>peakarray[i])
    //      {
    //              rarray[i]=rcount;
    //              peakarray[i]=accumulator[i];
    //      }
    //}
    //mxDestroyArray(plhs[0]);

  }
  //mxDestroyArray(prhs[0]);

  unsigned int maxpeak;
  maxpeak = *(max_element (peakarray.begin (), peakarray.end ()));
  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  // the threshold used to determine whether local peak indicates a
  // circle. If the local peak value is no less than maximum local peak
  // value and no less than 0.1*(number of cells on edge), it is deemed to
  // be a circle center in the image. 
  result_row.clear ();
  result_col.clear ();
  result_r.clear ();
  result_peak.clear ();
  for (unsigned int i = 0; i < peakarray.size (); i++) {
    if (peakarray[i] >= 1 * maxpeak
        && peakarray[i] >= static_cast <
        unsigned int >(0.1 * edgecellnum + 0.5)) {
      currentrow =
        MatrixLZ::ind2subrow (i, dim_edgeImage[0], dim_edgeImage[1],
                              MatrixLZ::ColMajor);
      currentcol =
        MatrixLZ::ind2subcol (i, dim_edgeImage[0], dim_edgeImage[1],
                              MatrixLZ::ColMajor);
      result_row.push_back (currentrow);
      result_col.push_back (currentcol);
      result_r.push_back (rarray[i]);
      result_peak.push_back (peakarray[i]);
    }
  }

  return true;
}