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); }
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); } }
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); }
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); }
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); }
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); }
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); }
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); }