示例#1
0
        private ColorMap GetTransitionMap(int[] sampleHist, int[] referenceHist, int n, YUVPlanes plane)
        {
            var map          = new ColorMap(sampleBits, n, Dither);
            var highRefColor = GetHighColor(referenceBits, plane);

            for (int newColor = GetLowColor(referenceBits), oldColor = -1, lastOldColor = -1, lastNewColor = GetLowColor(referenceBits) - 1, restPixels = 0; newColor <= highRefColor; newColor++)
            {
                void MissedColors(double newColorLimit, double oldColorLimit)
                {
                    var step = (newColorLimit - lastNewColor - 1) / (oldColorLimit - lastOldColor);

                    for (var tempColor = lastOldColor + 1; tempColor < oldColorLimit; tempColor++)
                    {
                        var actualColor   = lastNewColor + step * (tempColor - lastOldColor);
                        var intergerColor = Math.Truncate(actualColor);
                        var val           = 1 - (actualColor - intergerColor);
                        if (tempColor == highRefColor)
                        {
                            val = 1;
                        }
                        map.Add(tempColor, (int)intergerColor, val);
                        if (val <= 1 - double.Epsilon)
                        {
                            map.Add(tempColor, (int)intergerColor + 1, 1 - val);
                        }
                    }
                }

                var refCount = referenceHist[newColor];
                var notEmpty = refCount > 0;
                while (refCount > 0)
                {
                    var add = Math.Min(restPixels, refCount);
                    if (add > 0)
                    {
                        map.Add(oldColor, newColor, add / (double)sampleHist[oldColor]);
                        refCount    -= add;
                        restPixels  -= add;
                        lastOldColor = oldColor;
                    }
                    else
                    {
                        restPixels = sampleHist[++oldColor];
                        if (restPixels != 0 && oldColor - lastOldColor > 1)
                        {
                            MissedColors(newColor, oldColor);
                        }
                    }
                }
                if (notEmpty)
                {
                    lastNewColor = newColor;
                }
                if (newColor == highRefColor)
                {
                    MissedColors(highRefColor + 1, 1 << sampleBits);
                }
            }
            return(map);
        }
示例#2
0
        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 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);
            var mappedCount  = mappedColors.Count();
            var limit        = Math.Max(mappedCount / 10, Math.Min(mappedCount, 10));


            if (min < first)
            {
                var avgDiff = mappedColors.Take(limit).Sum(p => map.Average(p) - p) / limit;
                var mapped  = min + avgDiff;
                map.Add(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.Add(max, Math.Min(maxColor, mapped));
                Log(() => $"Max: {max} -> {mapped:F3}");
            }
        }
示例#4
0
        private ColorMap GetTransitionMap(int[] sampleHist, int[] referenceHist, int n, YUVPlanes plane)
        {
            var map          = new ColorMap(sampleBits, n, Intensity < 1 ? 1 : Dither);
            var highRefColor = GetHighColor(referenceBits, plane);

            for (int newColor = GetLowColor(referenceBits), oldColor = -1, restPixels = 0; newColor <= highRefColor; newColor++)
            {
                var refCount = referenceHist[newColor];
                //var excludeReference = (double) refCount / int.MaxValue < Exclude;
                while (refCount > 0)
                {
                    var add = Math.Min(restPixels, refCount);
                    if (add > 0)
                    {
                        var exclude = (((double)add) / int.MaxValue) < Exclude;
                        if (!exclude)
                        {
                            var weight = add / (double)sampleHist[oldColor];
                            map.Add(oldColor, newColor, weight);
                        }
                        refCount   -= add;
                        restPixels -= add;
                    }
                    else
                    {
                        restPixels = sampleHist[++oldColor];
                    }
                }
            }
            return(map);
        }
示例#5
0
        public void TestColorMap()
        {
            var map = new ColorMap(8, 0, 1);

            map.Add(2, 3.2);
            var tuples = map.GetColorsAndWeights();

            Assert.AreEqual(tuples.Item1[2][0], 3);
            Assert.AreEqual(tuples.Item1[2][1], 4);
            Assert.AreEqual(tuples.Item2[2][0], 0.8, 0.0001);
            Assert.AreEqual(tuples.Item2[2][1], 0.2, 0.0001);
        }
示例#6
0
        public override void HandleInput(PointF relativeMousePos)
        {
            var hit = _mouseRegions.ItemUnderMouse(relativeMousePos);
            var leftMousePressed = InputState.MouseButtonPressed(MouseButton.Left);

            if (hit != null && hit.Item2 == ColorMap && leftMousePressed)
            {
                var key   = KeyValueAtPos(hit.Item1, relativeMousePos);
                var color = ColorMap[key];
                ColorMap.Add(key, color);
                Changed(ColorMap);
                _selected = key;
                ItemSelected(ColorMap.IndexOfKey(key));
            }
            else if (hit != null && hit.Item2 is float)
            {
                var hitKey = (float)hit.Item2;
                if (leftMousePressed)
                {
                    if (hitKey != _selected)
                    {
                        _selected = hitKey;
                        ItemSelected(ColorMap.IndexOfKey(hitKey));
                    }
                    _dragging = hitKey;
                    return;
                }
                else if (ColorMap.Count > 1 && InputState.MouseButtonPressed(MouseButton.Right))
                {
                    _selected = null;
                    ItemSelected(null);
                    ColorMap.Remove(hitKey);
                    Changed(ColorMap);
                }
            }
            if (_dragging != null && InputState.MouseButtonDown(MouseButton.Left))
            {
                var newKey = KeyValueAtPos(_mouseRegions[0].Item1, relativeMousePos);
                if (newKey >= DomainMin && newKey <= DomainMax &&
                    ColorMap.MoveKey(_dragging.Value, newKey))
                {
                    Changed(ColorMap);
                    _dragging = newKey;
                    _selected = newKey;
                }
            }
            else
            {
                _dragging = null;
            }
        }
        public static ColorMap BuildColorMap(this Bitmap source)
        {
            var map = new ColorMap();

            source.GetPixels().Select(p =>
            {
                if (map.ContainsKey(p.Color)) {
                    map[p.Color]++;
                } else {
                    map.Add(p.Color, 1);
                }

                return p;
            }).ToList();

            return map;
        }
示例#8
0
        private static ConsoleColor GetEventsColor(Guid id)
        {
            if (ColorMap.TryGetValue(id, out var color))
            {
                return(color);
            }

            color = PetitionColors[CurrentColor];
            ColorMap.Add(id, color);

            if (CurrentColor == PetitionColors.Length - 1)
            {
                CurrentColor = 0;
            }
            else
            {
                CurrentColor++;
            }

            return(color);
        }
示例#9
0
        protected override VideoFrame GetFrame(int n)
        {
            var input = Child.GetFrame(n, StaticEnv);

            if (Intensity <= double.Epsilon)
            {
                return(input);
            }
            var sampleFrames    = Enumerable.Range(n - tr, tr * 2 + 1).Select(p => Sample.GetFrame(p, StaticEnv)).ToList();
            var referenceFrames = Enumerable.Range(n - tr, tr * 2 + 1).Select(p => Reference.GetFrame(p, StaticEnv)).ToList();
            var inputFrames     = tr == 0
                ? new List <VideoFrame> {
                input
            }
                : Enumerable.Range(n - tr, tr * 2 + 1).Select(p => Child.GetFrame(p, StaticEnv)).ToList();
            var writable = GetVideoInfo().pixel_type == Child.GetVideoInfo().pixel_type&& StaticEnv.MakeWritable(input);
            var output   = writable ? input : NewVideoFrame(StaticEnv);

            using (var sampleMaskFrame = SampleMask?.GetFrame(n, StaticEnv))
                using (var refMaskFrame = ReferenceMask?.GetFrame(n, StaticEnv))
                {
                    var pixelSize = Sample.GetVideoInfo().IsRGB() ? 3 : 1;
                    Parallel.ForEach(planes, plane =>
                    {
                        Parallel.ForEach(realChannels, channel =>
                        {
                            int[] sampleHist = null, referenceHist = null, srcHist = null;

                            Parallel.Invoke(
                                () => sampleHist    = GetHistogram(sampleFrames, sampleMaskFrame, pixelSize, channel, plane, Sample.GetVideoInfo().pixel_type, sampleBits, false),
                                () => referenceHist = GetHistogram(referenceFrames, refMaskFrame, pixelSize, channel, plane, Reference.GetVideoInfo().pixel_type, referenceBits, LimitedRange),
                                () => srcHist       = Extrapolation ? GetHistogram(inputFrames, null, pixelSize, channel, plane, Child.GetVideoInfo().pixel_type, sampleBits, LimitedRange) : null);

                            var map = GetTransitionMap(sampleHist, referenceHist, n, plane);

                            if (Extrapolation)
                            {
                                Extrapolate(map, srcHist, GetLowColor(referenceBits), GetHighColor(referenceBits, plane));
                            }

                            Interpolate(map, GetLowColor(referenceBits), GetHighColor(referenceBits, plane), sampleBits, referenceBits);

                            if (Intensity < 1)
                            {
                                var decreased = new ColorMap(sampleBits, n, Dither);
                                for (var color = 0; color < 1 << sampleBits; color++)
                                {
                                    decreased.Add(color, map.Average(color) * Intensity + color * (1 - Intensity));
                                }
                                map = decreased;
                            }

                            var tuple = map.GetColorsAndWeights();

                            NativeUtils.ApplyColorMap(DynamicNoise ? n : 0,
                                                      input.GetReadPtr(plane), input.GetPitch(plane), sampleBits > 8,
                                                      output.GetWritePtr(plane), output.GetPitch(plane), referenceBits > 8,
                                                      input.GetRowSize(plane), input.GetHeight(plane), pixelSize, channel,
                                                      map.FixedMap, tuple.Item1, tuple.Item2);
                        });
                    });
                }

            if (!writable)
            {
                input.Dispose();
            }
            sampleFrames.ForEach(p => p.Dispose());
            referenceFrames.ForEach(p => p.Dispose());
            return(output);
        }