コード例 #1
0
        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}");
            }
        }
コード例 #2
0
ファイル: ColorAdjust.cs プロジェクト: KAviSynth/AutoOverlay
        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);
                }
            }
        }
コード例 #3
0
        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;
                        }
                    }
                }
            }
        }