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 void Interpolate(ColorMap map, int min, int max, int srcBits, int refBits) { var interpolator = GetInterpolator(map); if (interpolator == null) { return; } var firstOldColor = map.First(); var lastOldColor = map.Last(); var mult = Math.Pow(2, refBits - srcBits); for (var oldColor = 0; oldColor < map.FixedMap.Length; oldColor++) { if (oldColor < firstOldColor || oldColor > lastOldColor) { map.Add(oldColor, oldColor * mult); } else if (!map.Contains(oldColor)) { var interpolated = interpolator.Interpolate(oldColor); interpolated = Math.Min(max, Math.Max(min, interpolated)); map.Add(oldColor, interpolated); } } }
private void Interpolate(ColorMap map, int min, int max, int srcBits, int refBits) { var mult = Math.Pow(2, refBits - srcBits); var interpolator = GetInterpolator(map, mult); if (interpolator == null) { return; } var firstOldColor = map.First(); var lastOldColor = map.Last(); for (var oldColor = 0; oldColor < map.FixedMap.Length; oldColor++) { if (oldColor < firstOldColor || oldColor > lastOldColor) { map.AddReal(oldColor, oldColor * mult); } else if (!map.Contains(oldColor)) { var interpolated = interpolator.Interpolate(oldColor); interpolated = Math.Min(max, Math.Max(min, interpolated)); map.AddReal(oldColor, interpolated); } else if (map.FixedMap[oldColor] < 0) { var m = map.DynamicMap[oldColor]; var weights = m.Values.Sum(); if (weights < 1 - double.Epsilon) { var interpolated = interpolator.Interpolate(oldColor); interpolated = Math.Min(max, Math.Max(min, interpolated)); map.AddReal(oldColor, interpolated, 1 - weights); continue; var coef = 1 / weights; foreach (var color in m.Keys.ToArray()) { m[color] *= coef; } } } } }