diff --git a/src/ImageSharp/ImageSharp.csproj.DotSettings b/src/ImageSharp/ImageSharp.csproj.DotSettings
index a7337240a..e446893e9 100644
--- a/src/ImageSharp/ImageSharp.csproj.DotSettings
+++ b/src/ImageSharp/ImageSharp.csproj.DotSettings
@@ -6,5 +6,6 @@
True
True
True
+ True
True
True
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/DetectEdgesExtensions.cs b/src/ImageSharp/Processing/DetectEdgesExtensions.cs
index a3be298d0..7527d601d 100644
--- a/src/ImageSharp/Processing/DetectEdgesExtensions.cs
+++ b/src/ImageSharp/Processing/DetectEdgesExtensions.cs
@@ -1,7 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing.Processors;
using SixLabors.ImageSharp.Processing.Processors.Convolution;
using SixLabors.Primitives;
@@ -9,82 +8,79 @@ using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Processing
{
///
- /// Adds edge detection extensions to the type.
+ /// Adds edge detection extensions to the type.
///
public static class DetectEdgesExtensions
{
///
- /// Detects any edges within the image. Uses the filter
+ /// Detects any edges within the image. Uses the filter
/// operating in grayscale mode.
///
- /// The pixel format.
/// The image this method extends.
- /// The .
- public static IImageProcessingContext DetectEdges(this IImageProcessingContext source)
- where TPixel : struct, IPixel
- => DetectEdges(source, new SobelProcessor(true));
+ /// The .
+ public static IImageProcessingContext DetectEdges(this IImageProcessingContext source) =>
+ DetectEdges(source, new SobelProcessor(true));
///
- /// Detects any edges within the image. Uses the filter
+ /// Detects any edges within the image. Uses the filter
/// operating in grayscale mode.
///
- /// The pixel format.
/// The image this method extends.
///
/// The structure that specifies the portion of the image object to alter.
///
- /// The .
- public static IImageProcessingContext DetectEdges(this IImageProcessingContext source, Rectangle rectangle)
- where TPixel : struct, IPixel
- => DetectEdges(source, rectangle, new SobelProcessor(true));
+ /// The .
+ public static IImageProcessingContext DetectEdges(this IImageProcessingContext source, Rectangle rectangle) =>
+ DetectEdges(source, rectangle, new SobelProcessor(true));
///
/// Detects any edges within the image.
///
- /// The pixel format.
/// The image this method extends.
/// The filter for detecting edges.
- /// The .
- public static IImageProcessingContext DetectEdges(this IImageProcessingContext source, EdgeDetectionOperators filter)
- where TPixel : struct, IPixel
- => DetectEdges(source, GetProcessor(filter, true));
+ /// The .
+ public static IImageProcessingContext DetectEdges(
+ this IImageProcessingContext source,
+ EdgeDetectionOperators filter) =>
+ DetectEdges(source, GetProcessor(filter, true));
///
/// Detects any edges within the image.
///
- /// The pixel format.
/// The image this method extends.
/// The filter for detecting edges.
/// Whether to convert the image to grayscale first. Defaults to true.
- /// The .
- public static IImageProcessingContext DetectEdges(this IImageProcessingContext source, EdgeDetectionOperators filter, bool grayscale)
- where TPixel : struct, IPixel
- => DetectEdges(source, GetProcessor(filter, grayscale));
+ /// The .
+ public static IImageProcessingContext DetectEdges(
+ this IImageProcessingContext source,
+ EdgeDetectionOperators filter,
+ bool grayscale) =>
+ DetectEdges(source, GetProcessor(filter, grayscale));
///
/// Detects any edges within the image.
///
- /// The pixel format.
/// The image this method extends.
/// The filter for detecting edges.
///
/// The structure that specifies the portion of the image object to alter.
///
/// Whether to convert the image to grayscale first. Defaults to true.
- /// The .
- public static IImageProcessingContext DetectEdges(this IImageProcessingContext source, EdgeDetectionOperators filter, Rectangle rectangle, bool grayscale = true)
- where TPixel : struct, IPixel
- => DetectEdges(source, rectangle, GetProcessor(filter, grayscale));
+ /// The .
+ public static IImageProcessingContext DetectEdges(
+ this IImageProcessingContext source,
+ EdgeDetectionOperators filter,
+ Rectangle rectangle,
+ bool grayscale = true) =>
+ DetectEdges(source, rectangle, GetProcessor(filter, grayscale));
///
/// Detects any edges within the image.
///
- /// The pixel format.
/// The image this method extends.
/// The filter for detecting edges.
- /// The .
- private static IImageProcessingContext DetectEdges(this IImageProcessingContext source, IImageProcessor filter)
- where TPixel : struct, IPixel
+ /// The .
+ private static IImageProcessingContext DetectEdges(this IImageProcessingContext source, IImageProcessor filter)
{
return source.ApplyProcessor(filter);
}
@@ -92,65 +88,65 @@ namespace SixLabors.ImageSharp.Processing
///
/// Detects any edges within the image.
///
- /// The pixel format.
/// The image this method extends.
///
/// The structure that specifies the portion of the image object to alter.
///
/// The filter for detecting edges.
- /// The .
- private static IImageProcessingContext DetectEdges(this IImageProcessingContext source, Rectangle rectangle, IImageProcessor filter)
- where TPixel : struct, IPixel
+ /// The .
+ private static IImageProcessingContext DetectEdges(
+ this IImageProcessingContext source,
+ Rectangle rectangle,
+ IImageProcessor filter)
{
source.ApplyProcessor(filter, rectangle);
return source;
}
- private static IImageProcessor GetProcessor(EdgeDetectionOperators filter, bool grayscale)
- where TPixel : struct, IPixel
+ private static IImageProcessor GetProcessor(EdgeDetectionOperators filter, bool grayscale)
{
- IImageProcessor processor;
+ IImageProcessor processor;
switch (filter)
{
case EdgeDetectionOperators.Kayyali:
- processor = new KayyaliProcessor(grayscale);
+ processor = new KayyaliProcessor(grayscale);
break;
case EdgeDetectionOperators.Kirsch:
- processor = new KirschProcessor(grayscale);
+ processor = new KirschProcessor(grayscale);
break;
case EdgeDetectionOperators.Laplacian3x3:
- processor = new Laplacian3x3Processor(grayscale);
+ processor = new Laplacian3x3Processor(grayscale);
break;
case EdgeDetectionOperators.Laplacian5x5:
- processor = new Laplacian5x5Processor(grayscale);
+ processor = new Laplacian5x5Processor(grayscale);
break;
case EdgeDetectionOperators.LaplacianOfGaussian:
- processor = new LaplacianOfGaussianProcessor(grayscale);
+ processor = new LaplacianOfGaussianProcessor(grayscale);
break;
case EdgeDetectionOperators.Prewitt:
- processor = new PrewittProcessor(grayscale);
+ processor = new PrewittProcessor(grayscale);
break;
case EdgeDetectionOperators.RobertsCross:
- processor = new RobertsCrossProcessor(grayscale);
+ processor = new RobertsCrossProcessor(grayscale);
break;
case EdgeDetectionOperators.Robinson:
- processor = new RobinsonProcessor(grayscale);
+ processor = new RobinsonProcessor(grayscale);
break;
case EdgeDetectionOperators.Scharr:
- processor = new ScharrProcessor(grayscale);
+ processor = new ScharrProcessor(grayscale);
break;
default:
- processor = new SobelProcessor(grayscale);
+ processor = new SobelProcessor(grayscale);
break;
}
diff --git a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs
index 1fb26c976..661ab523d 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs
@@ -11,7 +11,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
/// Kernel radius is calculated using the minimum viable value.
- /// See http://chemaguerra.com/gaussian-filter-radius/ .
+ /// See .
///
internal static int GetDefaultGaussianRadius(float sigma)
{
diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor.cs
index ef185a01f..5daf14fc3 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor.cs
@@ -12,7 +12,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
/// Defines a processor that detects edges within an image using two one-dimensional matrices.
///
/// The pixel format.
- internal abstract class EdgeDetector2DProcessor : ImageProcessor
+ internal class EdgeDetector2DProcessor : ImageProcessor
where TPixel : struct, IPixel
{
///
@@ -21,7 +21,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
/// The horizontal gradient operator.
/// The vertical gradient operator.
/// Whether to convert the image to grayscale before performing edge detection.
- protected EdgeDetector2DProcessor(in DenseMatrix kernelX, in DenseMatrix kernelY, bool grayscale)
+ internal EdgeDetector2DProcessor(in DenseMatrix kernelX, in DenseMatrix kernelY, bool grayscale)
{
Guard.IsTrue(kernelX.Size.Equals(kernelY.Size), $"{nameof(kernelX)} {nameof(kernelY)}", "Kernel sizes must be the same.");
this.KernelX = kernelX;
@@ -39,7 +39,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
public DenseMatrix KernelY { get; }
- ///
public bool Grayscale { get; }
///
diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor.cs
index 1205b02dc..227003195 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor.cs
@@ -19,57 +19,23 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
/// Defines a processor that detects edges within an image using a eight two dimensional matrices.
///
/// The pixel format.
- internal abstract class EdgeDetectorCompassProcessor : ImageProcessor
+ internal class EdgeDetectorCompassProcessor : ImageProcessor
where TPixel : struct, IPixel
{
///
/// Initializes a new instance of the class.
///
+ /// Gets the kernels to use.
/// Whether to convert the image to grayscale before performing edge detection.
- protected EdgeDetectorCompassProcessor(bool grayscale) => this.Grayscale = grayscale;
-
- ///
- /// Gets the North gradient operator
- ///
- public abstract DenseMatrix North { get; }
-
- ///
- /// Gets the NorthWest gradient operator
- ///
- public abstract DenseMatrix NorthWest { get; }
-
- ///
- /// Gets the West gradient operator
- ///
- public abstract DenseMatrix West { get; }
-
- ///
- /// Gets the SouthWest gradient operator
- ///
- public abstract DenseMatrix SouthWest { get; }
-
- ///
- /// Gets the South gradient operator
- ///
- public abstract DenseMatrix South { get; }
-
- ///
- /// Gets the SouthEast gradient operator
- ///
- public abstract DenseMatrix SouthEast { get; }
-
- ///
- /// Gets the East gradient operator
- ///
- public abstract DenseMatrix East { get; }
+ internal EdgeDetectorCompassProcessor(CompassKernels kernels, bool grayscale)
+ {
+ this.Grayscale = grayscale;
+ this.Kernels = kernels;
+ }
- ///
- /// Gets the NorthEast gradient operator
- ///
- public abstract DenseMatrix NorthEast { get; }
+ private CompassKernels Kernels { get; }
- ///
- public bool Grayscale { get; }
+ private bool Grayscale { get; }
///
protected override void BeforeFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
@@ -83,7 +49,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
protected override void OnFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
{
- DenseMatrix[] kernels = { this.North, this.NorthWest, this.West, this.SouthWest, this.South, this.SouthEast, this.East, this.NorthEast };
+ DenseMatrix[] kernels = this.Kernels.Flatten();
int startY = sourceRectangle.Y;
int endY = sourceRectangle.Bottom;
diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs
index b4d4763d0..75be15bcc 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs
@@ -2,49 +2,30 @@
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.ImageSharp.Processing.Processors.Filters;
-using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
/// Defines a processor that detects edges within an image using a single two dimensional matrix.
///
- /// The pixel format.
- internal abstract class EdgeDetectorProcessor : ImageProcessor
- where TPixel : struct, IPixel
+ public abstract class EdgeDetectorProcessor : IImageProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
- /// The 2d gradient operator.
- /// Whether to convert the image to grayscale before performing edge detection.
- protected EdgeDetectorProcessor(in DenseMatrix kernelXY, bool grayscale)
+ /// A value indicating whether to convert the image to grayscale before performing edge detection.
+ protected EdgeDetectorProcessor(bool grayscale)
{
- this.KernelXY = kernelXY;
this.Grayscale = grayscale;
}
- ///
- public bool Grayscale { get; }
-
///
- /// Gets the 2d gradient operator.
+ /// Gets a value indicating whether to convert the image to grayscale before performing edge detection.
///
- public DenseMatrix KernelXY { get; }
-
- ///
- protected override void BeforeFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
- {
- if (this.Grayscale)
- {
- new GrayscaleBt709Processor(1F).ApplyToFrame(source, sourceRectangle, configuration);
- }
- }
+ public bool Grayscale { get; }
- ///
- protected override void OnFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
- => new ConvolutionProcessor(this.KernelXY, true).Apply(source, sourceRectangle, configuration);
+ ///
+ public abstract IImageProcessor CreatePixelSpecificProcessor()
+ where TPixel : struct, IPixel;
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs
new file mode 100644
index 000000000..026313cc1
--- /dev/null
+++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs
@@ -0,0 +1,49 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Primitives;
+using SixLabors.ImageSharp.Processing.Processors.Filters;
+using SixLabors.Primitives;
+
+namespace SixLabors.ImageSharp.Processing.Processors.Convolution
+{
+ ///
+ /// Defines a processor that detects edges within an image using a single two dimensional matrix.
+ ///
+ /// The pixel format.
+ internal class EdgeDetectorProcessor : ImageProcessor
+ where TPixel : struct, IPixel
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The 2d gradient operator.
+ /// Whether to convert the image to grayscale before performing edge detection.
+ public EdgeDetectorProcessor(in DenseMatrix kernelXY, bool grayscale)
+ {
+ this.KernelXY = kernelXY;
+ this.Grayscale = grayscale;
+ }
+
+ public bool Grayscale { get; }
+
+ ///
+ /// Gets the 2d gradient operator.
+ ///
+ public DenseMatrix KernelXY { get; }
+
+ ///
+ protected override void BeforeFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
+ {
+ if (this.Grayscale)
+ {
+ new GrayscaleBt709Processor(1F).ApplyToFrame(source, sourceRectangle, configuration);
+ }
+ }
+
+ ///
+ protected override void OnFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
+ => new ConvolutionProcessor(this.KernelXY, true).Apply(source, sourceRectangle, configuration);
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs
index 8652efa12..99dfb17ff 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs
@@ -1,24 +1,30 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
-
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
- /// Applies edge detection processing to the image using the Kayyali operator filter.
+ /// Defines edge detection processing using the Kayyali operator filter.
+ /// See .
///
- /// The pixel format.
- internal class KayyaliProcessor : EdgeDetector2DProcessor
- where TPixel : struct, IPixel
+ public class KayyaliProcessor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public KayyaliProcessor(bool grayscale)
- : base(KayyaliKernels.KayyaliX, KayyaliKernels.KayyaliY, grayscale)
+ : base(grayscale)
+ {
+ }
+
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
{
+ return new EdgeDetector2DProcessor(
+ KayyaliKernels.KayyaliX,
+ KayyaliKernels.KayyaliY,
+ this.Grayscale);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs
new file mode 100644
index 000000000..f44de9105
--- /dev/null
+++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs
@@ -0,0 +1,57 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using SixLabors.ImageSharp.Primitives;
+
+namespace SixLabors.ImageSharp.Processing.Processors.Convolution
+{
+ internal abstract class CompassKernels
+ {
+ ///
+ /// Gets the North gradient operator.
+ ///
+ public abstract DenseMatrix North { get; }
+
+ ///
+ /// Gets the NorthWest gradient operator.
+ ///
+ public abstract DenseMatrix NorthWest { get; }
+
+ ///
+ /// Gets the West gradient operator.
+ ///
+ public abstract DenseMatrix West { get; }
+
+ ///
+ /// Gets the SouthWest gradient operator.
+ ///
+ public abstract DenseMatrix SouthWest { get; }
+
+ ///
+ /// Gets the South gradient operator.
+ ///
+ public abstract DenseMatrix South { get; }
+
+ ///
+ /// Gets the SouthEast gradient operator.
+ ///
+ public abstract DenseMatrix SouthEast { get; }
+
+ ///
+ /// Gets the East gradient operator.
+ ///
+ public abstract DenseMatrix East { get; }
+
+ ///
+ /// Gets the NorthEast gradient operator.
+ ///
+ public abstract DenseMatrix NorthEast { get; }
+
+ public DenseMatrix[] Flatten() =>
+ new[]
+ {
+ this.North, this.NorthWest, this.West, this.SouthWest,
+ this.South, this.SouthEast, this.East, this.NorthEast
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/KayyaliKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs
similarity index 100%
rename from src/ImageSharp/Processing/Processors/Convolution/KayyaliKernels.cs
rename to src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs
diff --git a/src/ImageSharp/Processing/Processors/Convolution/KirschKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs
similarity index 81%
rename from src/ImageSharp/Processing/Processors/Convolution/KirschKernels.cs
rename to src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs
index 86232e306..882b87075 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/KirschKernels.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs
@@ -8,12 +8,12 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Contains the eight matrices used for Kirsch edge detection
///
- internal static class KirschKernels
+ internal class KirschKernels : CompassKernels
{
///
/// Gets the North gradient operator
///
- public static DenseMatrix KirschNorth =>
+ public override DenseMatrix North =>
new float[,]
{
{ 5, 5, 5 },
@@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the NorthWest gradient operator
///
- public static DenseMatrix KirschNorthWest =>
+ public override DenseMatrix NorthWest =>
new float[,]
{
{ 5, 5, -3 },
@@ -35,7 +35,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the West gradient operator
///
- public static DenseMatrix KirschWest =>
+ public override DenseMatrix West =>
new float[,]
{
{ 5, -3, -3 },
@@ -46,7 +46,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the SouthWest gradient operator
///
- public static DenseMatrix KirschSouthWest =>
+ public override DenseMatrix SouthWest =>
new float[,]
{
{ -3, -3, -3 },
@@ -57,7 +57,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the South gradient operator
///
- public static DenseMatrix KirschSouth =>
+ public override DenseMatrix South =>
new float[,]
{
{ -3, -3, -3 },
@@ -68,7 +68,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the SouthEast gradient operator
///
- public static DenseMatrix KirschSouthEast =>
+ public override DenseMatrix SouthEast =>
new float[,]
{
{ -3, -3, -3 },
@@ -79,7 +79,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the East gradient operator
///
- public static DenseMatrix KirschEast =>
+ public override DenseMatrix East =>
new float[,]
{
{ -3, -3, 5 },
@@ -90,7 +90,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the NorthEast gradient operator
///
- public static DenseMatrix KirschNorthEast =>
+ public override DenseMatrix NorthEast =>
new float[,]
{
{ -3, 5, 5 },
diff --git a/src/ImageSharp/Processing/Processors/Convolution/LaplacianKernelFactory.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs
similarity index 100%
rename from src/ImageSharp/Processing/Processors/Convolution/LaplacianKernelFactory.cs
rename to src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs
diff --git a/src/ImageSharp/Processing/Processors/Convolution/LaplacianKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs
similarity index 100%
rename from src/ImageSharp/Processing/Processors/Convolution/LaplacianKernels.cs
rename to src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs
diff --git a/src/ImageSharp/Processing/Processors/Convolution/PrewittKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs
similarity index 100%
rename from src/ImageSharp/Processing/Processors/Convolution/PrewittKernels.cs
rename to src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs
diff --git a/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs
similarity index 100%
rename from src/ImageSharp/Processing/Processors/Convolution/RobertsCrossKernels.cs
rename to src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs
diff --git a/src/ImageSharp/Processing/Processors/Convolution/RobinsonKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs
similarity index 78%
rename from src/ImageSharp/Processing/Processors/Convolution/RobinsonKernels.cs
rename to src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs
index 4f47184e3..699d669ec 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/RobinsonKernels.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs
@@ -6,14 +6,14 @@ using SixLabors.ImageSharp.Primitives;
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
- /// Contains the kernels used for Robinson edge detection
+ /// Contains the kernels used for Robinson edge detection.
///
- internal static class RobinsonKernels
+ internal class RobinsonKernels : CompassKernels
{
///
/// Gets the North gradient operator
///
- public static DenseMatrix RobinsonNorth =>
+ public override DenseMatrix North =>
new float[,]
{
{ 1, 2, 1 },
@@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the NorthWest gradient operator
///
- public static DenseMatrix RobinsonNorthWest =>
+ public override DenseMatrix NorthWest =>
new float[,]
{
{ 2, 1, 0 },
@@ -35,7 +35,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the West gradient operator
///
- public static DenseMatrix RobinsonWest =>
+ public override DenseMatrix West =>
new float[,]
{
{ 1, 0, -1 },
@@ -46,7 +46,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the SouthWest gradient operator
///
- public static DenseMatrix RobinsonSouthWest =>
+ public override DenseMatrix SouthWest =>
new float[,]
{
{ 0, -1, -2 },
@@ -57,7 +57,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the South gradient operator
///
- public static DenseMatrix RobinsonSouth =>
+ public override DenseMatrix South =>
new float[,]
{
{ -1, -2, -1 },
@@ -68,7 +68,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the SouthEast gradient operator
///
- public static DenseMatrix RobinsonSouthEast =>
+ public override DenseMatrix SouthEast =>
new float[,]
{
{ -2, -1, 0 },
@@ -79,7 +79,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the East gradient operator
///
- public static DenseMatrix RobinsonEast =>
+ public override DenseMatrix East =>
new float[,]
{
{ -1, 0, 1 },
@@ -90,7 +90,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
///
/// Gets the NorthEast gradient operator
///
- public static DenseMatrix RobinsonNorthEast =>
+ public override DenseMatrix NorthEast =>
new float[,]
{
{ 0, 1, 2 },
diff --git a/src/ImageSharp/Processing/Processors/Convolution/ScharrKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs
similarity index 100%
rename from src/ImageSharp/Processing/Processors/Convolution/ScharrKernels.cs
rename to src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs
diff --git a/src/ImageSharp/Processing/Processors/Convolution/SobelKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs
similarity index 100%
rename from src/ImageSharp/Processing/Processors/Convolution/SobelKernels.cs
rename to src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs
diff --git a/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs
index c3188676f..fc73903c7 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs
@@ -1,20 +1,16 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
- /// Applies edge detection processing to the image using the Kirsch operator filter.
+ /// Defines edge detection using the Kirsch operator filter.
+ /// See .
///
- /// The pixel format.
- internal class KirschProcessor : EdgeDetectorCompassProcessor
- where TPixel : struct, IPixel
+ public class KirschProcessor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public KirschProcessor(bool grayscale)
@@ -22,28 +18,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
}
- ///
- public override DenseMatrix North => KirschKernels.KirschNorth;
-
- ///
- public override DenseMatrix NorthWest => KirschKernels.KirschNorthWest;
-
- ///
- public override DenseMatrix West => KirschKernels.KirschWest;
-
- ///
- public override DenseMatrix SouthWest => KirschKernels.KirschSouthWest;
-
- ///
- public override DenseMatrix South => KirschKernels.KirschSouth;
-
- ///
- public override DenseMatrix SouthEast => KirschKernels.KirschSouthEast;
-
- ///
- public override DenseMatrix East => KirschKernels.KirschEast;
-
- ///
- public override DenseMatrix NorthEast => KirschKernels.KirschNorthEast;
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
+ {
+ return new EdgeDetectorCompassProcessor(new KirschKernels(), this.Grayscale);
+ }
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs b/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs
index f498d374c..18a53cb13 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs
@@ -9,17 +9,21 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
/// Applies edge detection processing to the image using the Laplacian 3x3 operator filter.
///
///
- /// The pixel format.
- internal class Laplacian3x3Processor : EdgeDetectorProcessor
- where TPixel : struct, IPixel
+ public class Laplacian3x3Processor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public Laplacian3x3Processor(bool grayscale)
- : base(LaplacianKernels.Laplacian3x3, grayscale)
+ : base(grayscale)
{
}
+
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
+ {
+ return new EdgeDetectorProcessor(LaplacianKernels.Laplacian3x3, this.Grayscale);
+ }
}
}
diff --git a/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs b/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs
index 558acf7b3..1c95ca490 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs
@@ -1,25 +1,27 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
-
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
- /// Applies edge detection processing to the image using the Laplacian 5x5 operator filter.
- ///
+ /// Defines edge detection processing using the Laplacian 5x5 operator filter.
+ /// .
///
- /// The pixel format.
- internal class Laplacian5x5Processor : EdgeDetectorProcessor
- where TPixel : struct, IPixel
+ public class Laplacian5x5Processor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public Laplacian5x5Processor(bool grayscale)
- : base(LaplacianKernels.Laplacian5x5, grayscale)
+ : base(grayscale)
+ {
+ }
+
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
{
+ return new EdgeDetectorProcessor(LaplacianKernels.Laplacian5x5, this.Grayscale);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs
index 6cc65dc58..d904d69b1 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs
@@ -1,25 +1,27 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
-
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
/// Applies edge detection processing to the image using the Laplacian of Gaussian operator filter.
- ///
+ /// See .
///
- /// The pixel format.
- internal class LaplacianOfGaussianProcessor : EdgeDetectorProcessor
- where TPixel : struct, IPixel
+ public class LaplacianOfGaussianProcessor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public LaplacianOfGaussianProcessor(bool grayscale)
- : base(LaplacianKernels.LaplacianOfGaussianXY, grayscale)
+ : base(grayscale)
+ {
+ }
+
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
{
+ return new EdgeDetectorProcessor(LaplacianKernels.LaplacianOfGaussianXY, this.Grayscale);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs
index 75ef4dac6..939b1e0c5 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs
@@ -1,25 +1,27 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
-
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
- /// Applies edge detection processing to the image using the Prewitt operator filter.
- ///
+ /// Defines edge detection using the Prewitt operator filter.
+ /// See .
///
- /// The pixel format.
- internal class PrewittProcessor : EdgeDetector2DProcessor
- where TPixel : struct, IPixel
+ public class PrewittProcessor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public PrewittProcessor(bool grayscale)
- : base(PrewittKernels.PrewittX, PrewittKernels.PrewittY, grayscale)
+ : base(grayscale)
+ {
+ }
+
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
{
+ return new EdgeDetector2DProcessor(PrewittKernels.PrewittX, PrewittKernels.PrewittY, this.Grayscale);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs
index d685860f6..ff41b6c69 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs
@@ -6,20 +6,24 @@ using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
- /// Applies edge detection processing to the image using the Roberts Cross operator filter.
- ///
+ /// Defines edge detection processing using the Roberts Cross operator filter.
+ /// See .
///
- /// The pixel format.
- internal class RobertsCrossProcessor : EdgeDetector2DProcessor
- where TPixel : struct, IPixel
+ public class RobertsCrossProcessor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public RobertsCrossProcessor(bool grayscale)
- : base(RobertsCrossKernels.RobertsCrossX, RobertsCrossKernels.RobertsCrossY, grayscale)
+ : base(grayscale)
{
}
+
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
+ {
+ return new EdgeDetector2DProcessor(RobertsCrossKernels.RobertsCrossX, RobertsCrossKernels.RobertsCrossY, this.Grayscale);
+ }
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs
index 193c1008d..603a81f67 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs
@@ -7,15 +7,13 @@ using SixLabors.ImageSharp.Primitives;
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
- /// Applies edge detection processing to the image using the Robinson operator filter.
- ///
+ /// Defines edge detection using the Robinson operator filter.
+ /// See .
///
- /// The pixel format.
- internal class RobinsonProcessor : EdgeDetectorCompassProcessor
- where TPixel : struct, IPixel
+ internal class RobinsonProcessor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public RobinsonProcessor(bool grayscale)
@@ -23,28 +21,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
}
- ///
- public override DenseMatrix North => RobinsonKernels.RobinsonNorth;
-
- ///
- public override DenseMatrix NorthWest => RobinsonKernels.RobinsonNorthWest;
-
- ///
- public override DenseMatrix West => RobinsonKernels.RobinsonWest;
-
- ///
- public override DenseMatrix SouthWest => RobinsonKernels.RobinsonSouthWest;
-
- ///
- public override DenseMatrix South => RobinsonKernels.RobinsonSouth;
-
- ///
- public override DenseMatrix SouthEast => RobinsonKernels.RobinsonSouthEast;
-
- ///
- public override DenseMatrix East => RobinsonKernels.RobinsonEast;
-
- ///
- public override DenseMatrix NorthEast => RobinsonKernels.RobinsonNorthEast;
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
+ {
+ return new EdgeDetectorCompassProcessor(new RobinsonKernels(), this.Grayscale);
+ }
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs
index 79fc0e79f..d23ba5338 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs
@@ -6,20 +6,24 @@ using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
- /// Applies edge detection processing to the image using the Scharr operator filter.
+ /// Defines edge detection processing using the Scharr operator filter.
///
///
- /// The pixel format.
- internal class ScharrProcessor : EdgeDetector2DProcessor
- where TPixel : struct, IPixel
+ public class ScharrProcessor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public ScharrProcessor(bool grayscale)
- : base(ScharrKernels.ScharrX, ScharrKernels.ScharrY, grayscale)
+ : base(grayscale)
{
}
+
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
+ {
+ return new EdgeDetector2DProcessor(ScharrKernels.ScharrX, ScharrKernels.ScharrY, this.Grayscale);
+ }
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs
index 3ca53f6f0..157bb62e5 100644
--- a/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs
@@ -2,24 +2,37 @@
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Processing.Processors.Convolution
{
///
- /// The Sobel operator filter.
- ///
+ /// Defines edge detection using the Sobel operator filter.
+ /// See .
///
- /// The pixel format.
- internal class SobelProcessor : EdgeDetector2DProcessor
- where TPixel : struct, IPixel
+ public class SobelProcessor : EdgeDetectorProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// Whether to convert the image to grayscale before performing edge detection.
public SobelProcessor(bool grayscale)
- : base(SobelKernels.SobelX, SobelKernels.SobelY, grayscale)
+ : base(grayscale)
{
}
+
+ ///
+ public override IImageProcessor CreatePixelSpecificProcessor()
+ {
+ return new EdgeDetector2DProcessor(SobelKernels.SobelX, SobelKernels.SobelY, this.Grayscale);
+ }
+
+ // TODO: Move this to an appropriate extension method if possible.
+ internal void ApplyToFrame(ImageFrame frame, Rectangle sourceRectangle, Configuration configuration)
+ where TPixel : struct, IPixel
+ {
+ var processorImpl = new EdgeDetector2DProcessor(SobelKernels.SobelX, SobelKernels.SobelY, this.Grayscale);
+ processorImpl.Apply(frame, sourceRectangle, configuration);
+ }
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs
index 6de717afd..0e744dd96 100644
--- a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs
@@ -53,7 +53,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
Configuration configuration = source.GetConfiguration();
// Detect the edges.
- new SobelProcessor(false).Apply(temp, sourceRectangle, configuration);
+ new SobelProcessor(false).ApplyToFrame(temp, sourceRectangle, configuration);
// Apply threshold binarization filter.
new BinaryThresholdProcessor(this.Threshold).Apply(temp, sourceRectangle, configuration);
diff --git a/tests/ImageSharp.Tests/Processing/Convolution/DetectEdgesTest.cs b/tests/ImageSharp.Tests/Processing/Convolution/DetectEdgesTest.cs
index cf5feac27..07b9b1b8c 100644
--- a/tests/ImageSharp.Tests/Processing/Convolution/DetectEdgesTest.cs
+++ b/tests/ImageSharp.Tests/Processing/Convolution/DetectEdgesTest.cs
@@ -21,8 +21,8 @@ namespace SixLabors.ImageSharp.Tests.Processing.Convolution
this.operations.DetectEdges();
// TODO: Enable once we have updated the images
- // SobelProcessor processor = this.Verify>();
- // Assert.True(processor.Grayscale);
+ SobelProcessor processor = this.Verify();
+ Assert.True(processor.Grayscale);
}
[Fact]
@@ -31,45 +31,45 @@ namespace SixLabors.ImageSharp.Tests.Processing.Convolution
this.operations.DetectEdges(this.rect);
// TODO: Enable once we have updated the images
- // SobelProcessor processor = this.Verify>(this.rect);
- // Assert.True(processor.Grayscale);
+ SobelProcessor processor = this.Verify(this.rect);
+ Assert.True(processor.Grayscale);
}
public static IEnumerable