コード例 #1
0
        public void Sobel_Test()
        {
            var sourceBitmap = Samples.sample00;
            var source       = sourceBitmap.ToBytes();

            var width  = sourceBitmap.Width;
            var height = sourceBitmap.Height;

            var neighbors = new byte[height * width * 5];
            var gradient  = new float[height * width];
            var angle     = new float[height * width];
            var dx        = new float[height * width];
            var dy        = new float[height * width];

            UnoptimizedAlgorithms.Sobel3(width, height, source, dx, dy, gradient, angle, neighbors);

            Run("samples/sample00.png");
            gradient.RunAs(width, height, 1, "sobel_gradient.png");

            dx.RunAs(width, height, 1, "sobel_dx.png");
            dy.RunAs(width, height, 1, "sobel_dy.png");

            //source.RunAsText(width, height, 4, "sample00.txt");
            //gradient.RunAsText(width, height, 1, "sobel_gradient.txt");
        }
コード例 #2
0
        public void Grayscale_Test()
        {
            var sourceBitmap = Samples.sample13;

            Run("samples/sample13.png");

            var source = sourceBitmap.ToBytes();

            var w = sourceBitmap.Width;
            var h = sourceBitmap.Height;
            var n = w * h;

            var grayscale = new byte[n];

            var sw = new Stopwatch();

            sw.Start();
            for (var i = 0; i < 1; i++)
            {
                UnoptimizedAlgorithms.Grayscale(w, h, source, grayscale);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            grayscale.RunAs(w, h, 1, "grayscale.png");
        }
コード例 #3
0
        public void BoxBlur_Test()
        {
            var sourceBitmap = Samples.sample03;

            Run("samples/sample03.png");

            var source = sourceBitmap.ToBytes();

            var channels = 4;

            var width  = sourceBitmap.Width;
            var height = sourceBitmap.Height;
            var n      = width * height;

            var linePrefixSums = new int[n * channels];

            UnoptimizedAlgorithms.LinePrefixSum(width, height, source, channels, linePrefixSums);

            var box     = new byte[n * channels];
            var boxSize = 5;

            UnoptimizedAlgorithms.BoxBlur(width, height, linePrefixSums, channels, box, boxSize);

            source.RunAsText(width, height, channels, "source.txt");

            box.RunAs(width, height, channels, $"box{boxSize}.png");
            box.RunAsText(width, height, channels, $"box{boxSize}.txt");
        }
コード例 #4
0
        public void Gauss_Test()
        {
            var sourceBitmap = Samples.sample02;
            var source       = sourceBitmap.ToBytes();

            var width  = sourceBitmap.Width;
            var height = sourceBitmap.Height;

            var result = new byte[source.Length];

            UnoptimizedAlgorithms.Gauss(width, height, source, result);

            Run("samples/sample02.png");

            result.RunAs(width, height, 4, "gauss.png");
        }
コード例 #5
0
        public void Enlarge_Test()
        {
            var sourceBitmap = Samples.sample03;

            Run("samples/sample03.png");

            var source   = sourceBitmap.ToBytes();
            var channels = 4;

            var width  = sourceBitmap.Width;
            var height = sourceBitmap.Height;

            var large = new byte[height * width * 4 * channels];

            UnoptimizedAlgorithms.Enlarge2(width, height, source, large, channels);

            large.RunAs(width * 2, height * 2, channels, "large.png");
        }
コード例 #6
0
        public void Background_Test()
        {
            var sourceBitmap = Samples.sample03;

            Run("samples/sample03.png");

            var source = sourceBitmap.ToBytes();

            var channels = 4;

            var width  = sourceBitmap.Width;
            var height = sourceBitmap.Height;
            var n      = width * height;

            var grayscale = new byte[n];

            UnoptimizedAlgorithms.Grayscale(width, height, source, grayscale);

            var background     = new byte[n * channels];
            var backgroundSize = 7;

            UnoptimizedAlgorithms.Background(width, height, source, channels, grayscale, background, backgroundSize);

            grayscale.RunAs(width, height, 1, "grayscale.png");
            grayscale.RunAsText(width, height, 1, "grayscale.txt");

            source.RunAsText(width, height, channels, "source.txt");

            background.RunAs(width, height, channels, "background.png");
            background.RunAsText(width, height, channels, "background.txt");

            var grayscaleBg = new byte[n];

            UnoptimizedAlgorithms.GrayscaleEq(width, height, background, grayscaleBg);

            grayscaleBg.RunAs(width, height, 1, "grayscaleBg.png");
            grayscaleBg.RunAsText(width, height, 1, "grayscaleBg.txt");
        }
コード例 #7
0
 public void BackgroundLarge7()
 {
     UnoptimizedAlgorithms.Background(W2, H2, _large, channels, _grayscaleEq, _background2, 7);
 }
コード例 #8
0
 public void Background5()
 {
     UnoptimizedAlgorithms.Background(Width, Height, _source, channels, _grayscaleEq, _background, 5);
 }
コード例 #9
0
 public void Enlarge2()
 {
     UnoptimizedAlgorithms.Enlarge2(Width, Height, _source, _large, channels);
 }
コード例 #10
0
 public void Sobel3()
 {
     UnoptimizedAlgorithms.Sobel3(Width, Height, _source, _dx, _dy, _gradient, _angle, _neighbours, channels);
 }
コード例 #11
0
 public void GrayscaleEq()
 {
     UnoptimizedAlgorithms.GrayscaleEq(Width, Height, _source, _grayscale);
 }
コード例 #12
0
        public void NonMaximumSuppression_Test()
        {
            var sourceBitmap = Samples.sample03;

            var source   = sourceBitmap.ToBytes();
            var channels = 4;

            var width  = sourceBitmap.Width;
            var height = sourceBitmap.Height;

            var useLarge              = true;
            var swtEdgeOnColorChange  = true;
            var swtEdgeColorTolerance = 50;
            var swtConnectByColor     = false;
            var varianceTolerance     = 2.0f;
            var sizeRatioTolerance    = 10;

            var n           = height * width;
            var grayscaleEq = new byte[n];
            var background  = new byte[n * channels];

            var bgWindowSize = 7;

            UnoptimizedAlgorithms.GrayscaleEq(width, height, source, grayscaleEq);
            UnoptimizedAlgorithms.Background(width, height, source, channels, grayscaleEq, background, bgWindowSize);

            source.RunAs(width, height, channels, $"source.png");
            //background.RunAs(width, height, channels, $"background{bgWindowSize}.png");

            byte[] large = null;
            if (useLarge)
            {
                large = new byte[n * 4 * channels];
                UnoptimizedAlgorithms.Enlarge2(width, height, source, large, channels);

                width  *= 2;
                height *= 2;
                n       = height * width;
            }
            var src = useLarge ? large : source;

            var gauss     = new byte[n * channels];
            var grayscale = new byte[n];

            var gradient  = new float[n];
            var dx        = new float[n];
            var dy        = new float[n];
            var angle     = new float[n];
            var neighbors = new byte[n * 5];
            var nms       = new float[n];
            var cmp0      = new float[n];
            var cmp1      = new float[n];
            var swt0      = new int[n];
            var swt1      = new int[n];

            Array.Fill(swt0, int.MaxValue);
            Array.Fill(swt1, int.MaxValue);

            UnoptimizedAlgorithms.Grayscale(width, height, src, grayscale);
            UnoptimizedAlgorithms.Gauss(width, height, src, gauss);
            UnoptimizedAlgorithms.Sobel3(width, height, gauss, dx, dy, gradient, angle, neighbors);
            UnoptimizedAlgorithms.NonMaximumSuppression(width, height, gradient, angle, neighbors, nms, cmp0, cmp1);
            UnoptimizedAlgorithms.StrokeWidthTransform(width, height, src, gradient, nms, angle, dx, dy, swt0, swt1,
                                                       sourceChannels: 4,
                                                       rayLength: 30,
                                                       colorDifference: swtEdgeColorTolerance,
                                                       useStrokeColor: swtEdgeOnColorChange);

            var coloring0 = new int[height * width];
            var coloring1 = new int[height * width];

            UnoptimizedAlgorithms.PrepareComponents(swt0, coloring0);
            UnoptimizedAlgorithms.PrepareComponents(swt1, coloring1);

            var colorRounds0 = UnoptimizedAlgorithms.ColorComponentsFixedPointBackPropagation(
                width, height, swt0, coloring0);
            var colorRounds1 = UnoptimizedAlgorithms.ColorComponentsFixedPointBackPropagation(
                width, height, swt1, coloring1);

            var componentIndexByColoring0 = new int[n];
            var componentIndexByColoring1 = new int[n];

            var componentsLimit    = 100000;
            var componentSizeLimit = 1024;
            var cn = componentsLimit * componentSizeLimit;

            var componentItems0 = new int[cn];
            var componentItems1 = new int[cn];

            var componentSwtItems0 = new int[cn];
            var componentSwtItems1 = new int[cn];

            var components0 = new Component[componentsLimit];
            var components1 = new Component[componentsLimit];

            var regionCount0 = UnoptimizedAlgorithms.ComponentAnalysis(
                width, height, src, swt0, coloring0, componentIndexByColoring0, componentItems0, componentSwtItems0, components0, componentsLimit, componentSizeLimit, sourceChannels: channels);
            var regionCount1 = UnoptimizedAlgorithms.ComponentAnalysis(
                width, height, src, swt1, coloring1, componentIndexByColoring1, componentItems1, componentSwtItems0, components1, componentsLimit, componentSizeLimit, sourceChannels: channels);

            UnoptimizedAlgorithms.ColorComponentsFixedPointByColorSimilarity(
                width, height, swt0, coloring0, src, background, channels, componentIndexByColoring0, components0, 30, useLarge);
            UnoptimizedAlgorithms.ColorComponentsFixedPointByColorSimilarity(
                width, height, swt1, coloring1, src, background, channels, componentIndexByColoring1, components1, 30, useLarge);

            // Filter components 1st pass
            //var valid0 = Algorithms.PassiveFilter(regionCount0, componentList0);
            //var valid1 = Algorithms.PassiveFilter(regionCount1, componentList1);

            //var invalid0 = regionCount0 - valid0;
            //var invalid1 = regionCount1 - valid1;

            //Console.WriteLine($"Components BoW: {valid0}/{invalid0}");
            //Console.WriteLine($"Components WoB: {valid1}/{invalid1}");

            //var rtree0 = Algorithms.ComponentRBush(regionCount0, componentList0);
            //var rtree1 = Algorithms.ComponentRBush(regionCount1, componentList1);

            //Algorithms.MergeComponents(width, height, regionCount0, componentList0, rtree0);
            //Algorithms.MergeComponents(width, height, regionCount1, componentList1, rtree1);

            //Algorithms.RemoveBoxes(width, height, regionCount0, componentList0, rtree0);
            //Algorithms.RemoveBoxes(width, height, regionCount1, componentList1, rtree1);

            if (useLarge)
            {
                large.RunAs(width, height, channels, "large.png");
                //large.RunAsText(width, height, channels, "large.txt");
            }

            //gauss.RunAs(width, height, channels, "gauss.png");

            //grayscale.RunAs(width, height, 1, "gray.png");
            //grayscale.ReplaceEquals(255, 0).RunAsText(width, height, 1, "gray.txt");

            //gradient.RunAs(width, height, 1, "gradient.png");
            gradient.RunAsText(width, height, 1, "gradient.txt");

            //angle.RunAsText(width, height, 1, "angle.txt");

            //nms.RunAs(width, height, 1, "nms.png");
            nms.RunAsText(width, height, 1, "nms.txt");

            swt0.RunAs(width, height, 1, "swt0.png");
            swt0.ReplaceEquals(int.MaxValue, 0).MultiplyBy(10).RunAsText(width, height, 1, "swt0.txt");

            swt1.RunAs(width, height, 1, "swt1.png");
            swt1.ReplaceEquals(int.MaxValue, 0).MultiplyBy(10).RunAsText(width, height, 1, "swt1.txt");

            coloring0.RunAs(width, height, 1, "cc0.png");
            coloring0.ReplaceGreaterOrEquals(n, 0).RunAsText(width, height, 1, "cc0.txt");

            coloring1.RunAs(width, height, 1, "cc1.png");
            coloring1.ReplaceGreaterOrEquals(n, 0).RunAsText(width, height, 1, "cc1.txt");

            var text0 = new int[n];
            var text1 = new int[n];

            for (var i = 0; i < n; i++)
            {
                var color = coloring0[i];
                if (color >= n)
                {
                    text0[i] = 255;
                    continue;
                }

                var ci = componentIndexByColoring0[color];
                if (color >= n || ci == -1)
                {
                    text0[i] = 255;
                    continue;
                }
                ref var c = ref components0[ci];
                if (!c.IsValid())
                {
                    text0[i] = c.Validity;
                }
            }