otsuBinarize static method
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;
}