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