otsuBinarize static method

Uint8List otsuBinarize(
  1. Uint8List gray,
  2. int width,
  3. int height
)

Otsu's Global Adaptive Thresholding algorithm.

Implementation

static Uint8List otsuBinarize(Uint8List gray, int width, int height) {
  final histogram = Int32List(256);
  final total = gray.length;

  for (int i = 0; i < total; i++) {
    histogram[gray[i]]++;
  }

  double sum = 0.0;
  for (int t = 0; t < 256; t++) {
    sum += t * histogram[t];
  }

  double sumB = 0.0;
  int wB = 0;
  double maxVar = 0.0;
  int threshold = 128;

  for (int t = 0; t < 256; t++) {
    wB += histogram[t];
    if (wB == 0) continue;

    final wF = total - wB;
    if (wF == 0) break;

    sumB += t * histogram[t];
    final mB = sumB / wB;
    final mF = (sum - sumB) / wF;

    final varBetween = wB.toDouble() * wF.toDouble() * (mB - mF) * (mB - mF);

    if (varBetween > maxVar) {
      maxVar = varBetween;
      threshold = t;
    }
  }

  final out = Uint8List(total);
  for (int i = 0; i < total; i++) {
    out[i] = gray[i] >= threshold ? 255 : 0;
  }
  return out;
}