normalize function

Image normalize(
  1. Image src,
  2. {required num min,
  3. required num max,
  4. Image? mask,
  5. Channel maskChannel = Channel.luminance}
)

Linearly normalize the colors of the image. All color values will be mapped to the range min, max inclusive.

Implementation

Image normalize(Image src,
    {required num min,
    required num max,
    Image? mask,
    Channel maskChannel = Channel.luminance}) {
  final num a = min < max ? min : max;
  final num b = min < max ? max : min;

  final mM = minMax(src);
  final mn = mM[0];
  final mx = mM[1];

  if (mn == mx) {
    return src;
  }

  final fm = mn.toDouble();
  final fM = mx.toDouble();

  if (mn != a || mx != b) {
    for (var frame in src.frames) {
      for (final p in frame) {
        final msk = mask?.getPixel(p.x, p.y).getChannelNormalized(maskChannel);
        if (msk == null) {
          p
            ..r = (p.r - fm) / (fM - fm) * (b - a) + a
            ..g = (p.g - fm) / (fM - fm) * (b - a) + a
            ..b = (p.b - fm) / (fM - fm) * (b - a) + a
            ..a = (p.a - fm) / (fM - fm) * (b - a) + a;
        } else {
          final xr = (p.r - fm) / (fM - fm) * (b - a) + a;
          final xg = (p.g - fm) / (fM - fm) * (b - a) + a;
          final xb = (p.b - fm) / (fM - fm) * (b - a) + a;
          final xa = (p.a - fm) / (fM - fm) * (b - a) + a;
          p
            ..r = mix(p.r, xr, msk)
            ..g = mix(p.g, xg, msk)
            ..b = mix(p.b, xb, msk)
            ..a = mix(p.a, xa, msk);
        }
      }
    }
  }

  return src;
}