예제 #1
0
 void getCentroid(ImageProcessor ip, int minThreshold, int maxThreshold) {
   byte[] pixels = (byte[]) ip.getPixels();
   byte[] mask = ip.getMaskArray();
   boolean limit = minThreshold > 0 || maxThreshold < 255;
   double xsum = 0, ysum = 0;
   int count = 0, i, mi, v;
   for (int y = ry, my = 0; y < (ry + rh); y++, my++) {
     i = y * width + rx;
     mi = my * rw;
     for (int x = rx; x < (rx + rw); x++) {
       if (mask == null || mask[mi++] != 0) {
         if (limit) {
           v = pixels[i] & 255;
           if (v >= minThreshold && v <= maxThreshold) {
             count++;
             xsum += x;
             ysum += y;
           }
         } else {
           count++;
           xsum += x;
           ysum += y;
         }
       }
       i++;
     }
   }
   xCentroid = xsum / count + 0.5;
   yCentroid = ysum / count + 0.5;
   if (cal != null) {
     xCentroid = cal.getX(xCentroid);
     yCentroid = cal.getY(yCentroid, height);
   }
 }
예제 #2
0
 void calculateMoments(ImageProcessor ip, int minThreshold, int maxThreshold, float[] cTable) {
   byte[] pixels = (byte[]) ip.getPixels();
   byte[] mask = ip.getMaskArray();
   int v, i, mi;
   double dv, dv2, sum1 = 0.0, sum2 = 0.0, sum3 = 0.0, sum4 = 0.0, xsum = 0.0, ysum = 0.0;
   for (int y = ry, my = 0; y < (ry + rh); y++, my++) {
     i = y * width + rx;
     mi = my * rw;
     for (int x = rx; x < (rx + rw); x++) {
       if (mask == null || mask[mi++] != 0) {
         v = pixels[i] & 255;
         if (v >= minThreshold && v <= maxThreshold) {
           dv = ((cTable != null) ? cTable[v] : v) + Double.MIN_VALUE;
           dv2 = dv * dv;
           sum1 += dv;
           sum2 += dv2;
           sum3 += dv * dv2;
           sum4 += dv2 * dv2;
           xsum += x * dv;
           ysum += y * dv;
         }
       }
       i++;
     }
   }
   double mean2 = mean * mean;
   double variance = sum2 / pixelCount - mean2;
   double sDeviation = Math.sqrt(variance);
   skewness =
       ((sum3 - 3.0 * mean * sum2) / pixelCount + 2.0 * mean * mean2) / (variance * sDeviation);
   kurtosis =
       (((sum4 - 4.0 * mean * sum3 + 6.0 * mean2 * sum2) / pixelCount - 3.0 * mean2 * mean2)
               / (variance * variance)
           - 3.0);
   xCenterOfMass = xsum / sum1 + 0.5;
   yCenterOfMass = ysum / sum1 + 0.5;
   if (cal != null) {
     xCenterOfMass = cal.getX(xCenterOfMass);
     yCenterOfMass = cal.getY(yCenterOfMass, height);
   }
 }