private void Extrapolate(ColorMap map, int[] srcHist, int minColor, int maxColor) { var min = srcHist.TakeWhile(p => p == 0).Count(); var max = srcHist.Length - srcHist.Reverse().TakeWhile(p => p == 0).Count() - 1; var first = map.First(); var last = map.Last(); var sampleCount = last - first + 1; var mappedColors = Enumerable.Range(first, sampleCount).Where(map.Contains);//.Where(p => srcHist[p] > 50); var mappedCount = mappedColors.Count(); var limit = Math.Max(mappedCount / 5, Math.Min(mappedCount, 10)); if (min < first) { var avgDiff = mappedColors.Take(limit).Sum(p => map.Average(p) - p) / limit; var mapped = min + avgDiff; map.AddReal(min, Math.Max(minColor, mapped)); Log(() => $"Min: {min} -> {mapped:F3}"); } if (max > last) { var avgDiff = mappedColors.Reverse().Take(limit).Sum(p => map.Average(p) - p) / limit; var mapped = max + avgDiff; map.AddReal(max, Math.Min(maxColor, mapped)); Log(() => $"Max: {max} -> {mapped:F3}"); } }
private IInterpolation GetInterpolator(ColorMap map, double mult) { var size = map.FixedMap.Length; var points = new List <Tuple <int, double> >(map.FixedMap.Length); for (var oldColor = 0; oldColor < size; oldColor++) { if (map.Contains(oldColor)) { points.Add(Tuple.Create(oldColor, map.Average(oldColor))); } } var xValues = new double[points.Count]; var yValues = new double[points.Count]; for (var i = 0; i < points.Count; i++) { var point = points[i]; xValues[i] = point.Item1; yValues[i] = point.Item2; } if (xValues.Length == 1) { return(GetInterpolator(Interpolation, new[] { xValues[0], xValues[0] }, new[] { yValues[0], yValues[0] }, mult)); } return(GetInterpolator(Interpolation, xValues, yValues, mult)); }