Esempio n. 1
0
        public void ExtractAnchors(string sourceFileName,
                                   GradientOperator gradientOperator, int gradientThreshold,
                                   int anchorScanInterval, int anchorThreshold)
        {
            // Arrange
            var source    = LoadImage(sourceFileName);
            var rows      = source.Size.Height;
            var columns   = source.Size.Width;
            var gradients = new Gradients(rows, columns);

            gradients.ComputeGradient(source, gradientOperator, gradientThreshold);

            // Act
            var anchors = gradients.ExtractAnchors(anchorScanInterval, anchorThreshold);

            // Assert
            var anchorMap = new Mat(rows, columns, Depth.U8, 1);

            anchorMap.Set(Scalar.All(0));
            foreach (var anchor in anchors)
            {
                anchorMap.SetReal(anchor.Y, anchor.X, 255);
            }
            var resultFileName = Path.Combine("Output", "ExtractAnchors", $"{Path.GetFileNameWithoutExtension(sourceFileName)}_{gradientOperator}_{gradientThreshold}_{anchorScanInterval}_{anchorThreshold}.png");

            SaveImage(anchorMap, resultFileName);
        }
Esempio n. 2
0
        public void DrawEdges(Arr source, Arr destination, GradientOperator gradientOperator, int gradientThreshold, int anchorScanInterval, int anchorThreshold)
        {
            // compute the gradient and direction maps
            _gradients.ComputeGradient(source, gradientOperator, gradientThreshold);

            // compute the anchors
            var anchors = _gradients.ExtractAnchors(anchorScanInterval, anchorThreshold);

            // connect the anchors by smart routing
            foreach (var anchor in anchors)
            {
                DrawEdge(anchor.Y, anchor.X, _gradients.GradientMap, _gradients.DirectionMap, destination, _rows, _columns);
            }
        }
Esempio n. 3
0
        public void ComputeGradient(Arr source, GradientOperator gradientOperator, double gradientThreshold)
        {
            // gaussian filtering
            CV.Smooth(source, _smoothed, SmoothMethod.Gaussian, 5, 5, 1.0);

            // calculate gradients
            switch (gradientOperator)
            {
            case GradientOperator.Prewitt:
                CV.Filter2D(_smoothed, _gradientX, PrewittX);
                CV.Filter2D(_smoothed, _gradientY, PrewittY);
                if (gradientThreshold < 0.0)
                {
                    gradientThreshold = 6.0;
                }
                break;

            case GradientOperator.Sobel:
                CV.Sobel(_smoothed, _gradientX, 1, 0);
                CV.Sobel(_smoothed, _gradientY, 0, 1);
                break;

            case GradientOperator.Scharr:
                CV.Sobel(_smoothed, _gradientX, 1, 0, -1);
                CV.Sobel(_smoothed, _gradientY, 0, 1, -1);
                break;

            default:
                throw new Exception($"Unknown gradient operator: {gradientOperator}");
            }

            // calculate absolute values for gradients
            CV.ConvertScaleAbs(_gradientX, _absGradientX);
            CV.ConvertScaleAbs(_gradientY, _absGradientY);

            // merge gradients
            // d = 0.5 * abs(dx) + 0.5 * abs(dy)
            CV.AddWeighted(_absGradientX, 0.5, _absGradientY, 0.5, 0.0, GradientMap);

            // eliminate gradient weak pixels
            CV.Threshold(GradientMap, GradientMap, gradientThreshold, 255, ThresholdTypes.ToZero);

            // edge direction
            // abs(dx) >= abs(dy) => VERTICAL
            CV.Cmp(_absGradientX, _absGradientY, DirectionMap, ComparisonOperation.GreaterOrEqual);
        }
Esempio n. 4
0
        public void ComputeGradient(string sourceFileName, GradientOperator gradientOperator, int gradientThreshold)
        {
            // Arrange
            var source    = LoadImage(sourceFileName);
            var rows      = source.Size.Height;
            var columns   = source.Size.Width;
            var gradients = new Gradients(rows, columns);

            // Act
            gradients.ComputeGradient(source, gradientOperator, gradientThreshold);

            // Assert
            var gradientFileName   = Path.Combine("Output", "ComputeGradient", $"{Path.GetFileNameWithoutExtension(sourceFileName)}_{gradientOperator}_{gradientThreshold}_GradientMap.png");
            var directionsFileName = Path.Combine("Output", "ComputeGradient", $"{Path.GetFileNameWithoutExtension(sourceFileName)}_{gradientOperator}_{gradientThreshold}_DirectionsMap.png");

            SaveImage(gradients.GradientMap, gradientFileName);
            SaveImage(gradients.DirectionMap, directionsFileName);
        }
Esempio n. 5
0
        public Edges DrawEdgesParameterFree(Arr source, GradientOperator gradientOperator, int gradientThreshold, int anchorScanInterval, int minLength = 0)
        {
            // compute the gradient and direction maps
            _gradients.ComputeGradient(source, gradientOperator, gradientThreshold);

            // compute the normalized cummulative histogram
            _gradients.CummulativeHistogram();

            // compute the anchors
            var anchors = _gradients.ExtractAnchors(anchorScanInterval);

            // connect the anchors by smart routing
            var edges = new Edges();

            foreach (var anchor in anchors)
            {
                DrawEdge(anchor.Y, anchor.X, _gradients, _edgesMap, edges, _rows, _columns, minLength);
            }
            return(edges);
        }
Esempio n. 6
0
        public void DrawEdges(
            string sourceFileName,
            GradientOperator gradientOperator, int gradientThreshold,
            int anchorScanInterval, int anchorThreshold)
        {
            // Arrange
            var source      = LoadImage(sourceFileName);
            var rows        = source.Size.Height;
            var columns     = source.Size.Width;
            var edgeDrawing = new EdgeDrawing(rows, columns);
            var edgesMap    = new Mat(rows, columns, Depth.U8, 1);

            edgesMap.Set(Scalar.All(0));

            // Act
            edgeDrawing.DrawEdges(source, edgesMap, gradientOperator, gradientThreshold, anchorScanInterval, anchorThreshold);

            // Assert
            var resultFileName = Path.Combine("Output", "DrawEdges", $"{Path.GetFileNameWithoutExtension(sourceFileName)}_{gradientOperator}_{gradientThreshold}_{anchorScanInterval}_{anchorThreshold}_EdgesMap.png");

            SaveImage(edgesMap, resultFileName);
        }
Esempio n. 7
0
        public Edges DrawEdges(Arr source, GradientOperator gradientOperator, int gradientThreshold, int anchorScanInterval, int anchorThreshold, int minLength = 0)
        {
            // compute the gradient and direction maps
            _gradients.ComputeGradient(source, gradientOperator, gradientThreshold);

            // compute the anchors
            var anchors = _gradients.ExtractAnchors(anchorScanInterval, anchorThreshold);

            // initialize the edges map
            if (_edgesMap is null)
            {
                _edgesMap = new Mat(_rows, _columns, Depth.U8, 1);
            }
            _edgesMap.Set(Scalar.All(0));

            // connect the anchors by smart routing
            var edges = new Edges();

            foreach (var anchor in anchors)
            {
                DrawEdge(anchor.Y, anchor.X, _gradients, _edgesMap, edges, _rows, _columns, minLength);
            }
            return(edges);
        }
Esempio n. 8
0
        public static MyFilter GradientKernel(GradientOperator operate, GradientDirect direct)
        {// please not use MyFilter.GradientDirect.BOTH
            MyFilter kernel = null;

            switch (operate)
            {
            case MyFilter.GradientOperator.SOBEL:
                kernel = new MyFilter(3);
                switch (direct)
                {
                case MyFilter.GradientDirect.X:
                    if (_SOBEL_X == null)
                    {
                        kernel[0, 0] = 1;
                        kernel[2, 0] = -1;
                        kernel[0, 1] = 2;
                        kernel[2, 1] = -2;
                        kernel[0, 2] = 1;
                        kernel[2, 2] = -1;
                        _SOBEL_X     = kernel;
                        return(kernel);
                    }
                    else
                    {
                        return(_SOBEL_X);
                    }

                case MyFilter.GradientDirect.Y:
                    if (_SOBEL_Y == null)
                    {
                        kernel[0, 0] = 1;
                        kernel[1, 0] = 2;
                        kernel[2, 0] = 1;
                        kernel[0, 2] = -1;
                        kernel[1, 2] = -2;
                        kernel[2, 2] = -1;
                        _SOBEL_Y     = kernel;
                        return(kernel);
                    }
                    else
                    {
                        return(_SOBEL_Y);
                    }
                }
                break;

            case MyFilter.GradientOperator.PREWITT:
                kernel = new MyFilter(3);
                switch (direct)
                {
                case MyFilter.GradientDirect.X:
                    if (_PREWITT_X == null)
                    {
                        kernel[0, 0] = 1;
                        kernel[2, 0] = -1;
                        kernel[0, 1] = 1;
                        kernel[2, 1] = -1;
                        kernel[0, 2] = 1;
                        kernel[2, 2] = -1;
                        _PREWITT_X   = kernel;
                        return(kernel);
                    }
                    else
                    {
                        return(_PREWITT_X);
                    }

                case MyFilter.GradientDirect.Y:
                    if (_PREWITT_Y == null)
                    {
                        kernel[0, 0] = 1;
                        kernel[1, 0] = 1;
                        kernel[2, 0] = 1;
                        kernel[0, 2] = -1;
                        kernel[1, 2] = -1;
                        kernel[2, 2] = -1;
                        _PREWITT_Y   = kernel;
                        return(kernel);
                    }
                    else
                    {
                        return(_PREWITT_Y);
                    }
                }
                break;

            case MyFilter.GradientOperator.ROBERT:
                kernel = new MyFilter(2);
                switch (direct)
                {
                case MyFilter.GradientDirect.X:
                    if (_ROBERT_X == null)
                    {
                        kernel[0, 0] = -1;
                        kernel[1, 0] = 0;
                        kernel[0, 1] = 0;
                        kernel[1, 1] = 1;
                        _ROBERT_X    = kernel;
                        return(kernel);
                    }
                    else
                    {
                        return(_ROBERT_X);
                    }

                case MyFilter.GradientDirect.Y:
                    if (_ROBERT_Y == null)
                    {
                        kernel[0, 0] = 0;
                        kernel[1, 0] = -1;
                        kernel[0, 1] = 1;
                        kernel[1, 1] = 0;
                        _ROBERT_Y    = kernel;
                        return(kernel);
                    }
                    else
                    {
                        return(_ROBERT_Y);
                    }
                }
                break;
            }
            return(kernel);
        }