diff --git a/src/ImageProcessorCore/Samplers/Processors/Convolution/BoxBlurProcessor.cs b/src/ImageProcessorCore/Samplers/Processors/Convolution/BoxBlurProcessor.cs index 4a2adee7b..a67dbe647 100644 --- a/src/ImageProcessorCore/Samplers/Processors/Convolution/BoxBlurProcessor.cs +++ b/src/ImageProcessorCore/Samplers/Processors/Convolution/BoxBlurProcessor.cs @@ -35,12 +35,12 @@ namespace ImageProcessorCore.Processors /// /// Gets the horizontal gradient operator. /// - public float[,] KernelX { get; } + public float[][] KernelX { get; } /// /// Gets the vertical gradient operator. /// - public float[,] KernelY { get; } + public float[][] KernelY { get; } /// public override void Apply(ImageBase target, ImageBase source, Rectangle targetRectangle, Rectangle sourceRectangle, int startY, int endY) @@ -52,11 +52,17 @@ namespace ImageProcessorCore.Processors /// Create a 1 dimensional Box kernel. /// /// Whether to calculate a horizontal kernel. - /// The - private float[,] CreateBoxKernel(bool horizontal) + /// The + private float[][] CreateBoxKernel(bool horizontal) { int size = this.kernelSize; - float[,] kernel = horizontal ? new float[1, size] : new float[size, 1]; + float[][] kernel = horizontal ? new float[1][] : new float[size][]; + + if (horizontal) + { + kernel[0] = new float[size]; + } + float sum = 0.0f; for (int i = 0; i < size; i++) @@ -65,11 +71,11 @@ namespace ImageProcessorCore.Processors sum += x; if (horizontal) { - kernel[0, i] = x; + kernel[0][i] = x; } else { - kernel[i, 0] = x; + kernel[i] = new[] { x }; } } @@ -78,14 +84,14 @@ namespace ImageProcessorCore.Processors { for (int i = 0; i < size; i++) { - kernel[0, i] = kernel[0, i] / sum; + kernel[0][i] = kernel[0][i] / sum; } } else { for (int i = 0; i < size; i++) { - kernel[i, 0] = kernel[i, 0] / sum; + kernel[i][0] = kernel[i][0] / sum; } } diff --git a/src/ImageProcessorCore/Samplers/Processors/Convolution/Convolution2PassFilter.cs b/src/ImageProcessorCore/Samplers/Processors/Convolution/Convolution2PassFilter.cs index f66ac08a7..48a5927fe 100644 --- a/src/ImageProcessorCore/Samplers/Processors/Convolution/Convolution2PassFilter.cs +++ b/src/ImageProcessorCore/Samplers/Processors/Convolution/Convolution2PassFilter.cs @@ -22,7 +22,7 @@ namespace ImageProcessorCore.Processors /// /// The horizontal gradient operator. /// The vertical gradient operator. - public Convolution2PassFilter(float[,] kernelX, float[,] kernelY) + public Convolution2PassFilter(float[][] kernelX, float[][] kernelY) { this.KernelX = kernelX; this.KernelY = kernelY; @@ -31,18 +31,18 @@ namespace ImageProcessorCore.Processors /// /// Gets the horizontal gradient operator. /// - public float[,] KernelX { get; } + public float[][] KernelX { get; } /// /// Gets the vertical gradient operator. /// - public float[,] KernelY { get; } + public float[][] KernelY { get; } /// public override void Apply(ImageBase target, ImageBase source, Rectangle targetRectangle, Rectangle sourceRectangle, int startY, int endY) { - float[,] kernelX = this.KernelX; - float[,] kernelY = this.KernelY; + float[][] kernelX = this.KernelX; + float[][] kernelY = this.KernelY; ImageBase firstPass = new Image(source.Width, source.Height); this.ApplyConvolution(firstPass, source, sourceRectangle, startY, endY, kernelX); @@ -61,10 +61,10 @@ namespace ImageProcessorCore.Processors /// The index of the row within the source image to start processing. /// The index of the row within the source image to end processing. /// The kernel operator. - private void ApplyConvolution(ImageBase target, ImageBase source, Rectangle sourceRectangle, int startY, int endY, float[,] kernel) + private void ApplyConvolution(ImageBase target, ImageBase source, Rectangle sourceRectangle, int startY, int endY, float[][] kernel) { - int kernelHeight = kernel.GetLength(0); - int kernelWidth = kernel.GetLength(1); + int kernelHeight = kernel.Length; + int kernelWidth = kernel[0].Length; int radiusY = kernelHeight >> 1; int radiusX = kernelWidth >> 1; @@ -103,7 +103,7 @@ namespace ImageProcessorCore.Processors offsetX = offsetX.Clamp(0, maxX); Vector4 currentColor = sourcePixels[offsetX, offsetY].ToVector4(); - destination += kernel[fy, fx] * currentColor; + destination += kernel[fy][fx] * currentColor; } } diff --git a/src/ImageProcessorCore/Samplers/Processors/Convolution/GuassianBlurProcessor.cs b/src/ImageProcessorCore/Samplers/Processors/Convolution/GuassianBlurProcessor.cs index d735b79c6..d8a1b0907 100644 --- a/src/ImageProcessorCore/Samplers/Processors/Convolution/GuassianBlurProcessor.cs +++ b/src/ImageProcessorCore/Samplers/Processors/Convolution/GuassianBlurProcessor.cs @@ -73,12 +73,12 @@ namespace ImageProcessorCore.Processors /// /// Gets the horizontal gradient operator. /// - public float[,] KernelX { get; } + public float[][] KernelX { get; } /// /// Gets the vertical gradient operator. /// - public float[,] KernelY { get; } + public float[][] KernelY { get; } /// public override void Apply(ImageBase target, ImageBase source, Rectangle targetRectangle, Rectangle sourceRectangle, int startY, int endY) @@ -90,12 +90,18 @@ namespace ImageProcessorCore.Processors /// Create a 1 dimensional Gaussian kernel using the Gaussian G(x) function /// /// Whether to calculate a horizontal kernel. - /// The - private float[,] CreateGaussianKernel(bool horizontal) + /// The + private float[][] CreateGaussianKernel(bool horizontal) { int size = this.kernelSize; float weight = this.sigma; - float[,] kernel = horizontal ? new float[1, size] : new float[size, 1]; + float[][] kernel = horizontal ? new float[1][] : new float[size][]; + + if (horizontal) + { + kernel[0] = new float[size]; + } + float sum = 0.0f; float midpoint = (size - 1) / 2f; @@ -106,11 +112,11 @@ namespace ImageProcessorCore.Processors sum += gx; if (horizontal) { - kernel[0, i] = gx; + kernel[0][i] = gx; } else { - kernel[i, 0] = gx; + kernel[i] = new[] { gx }; } } @@ -119,14 +125,14 @@ namespace ImageProcessorCore.Processors { for (int i = 0; i < size; i++) { - kernel[0, i] = kernel[0, i] / sum; + kernel[0][i] = kernel[0][i] / sum; } } else { for (int i = 0; i < size; i++) { - kernel[i, 0] = kernel[i, 0] / sum; + kernel[i][0] = kernel[i][0] / sum; } } diff --git a/src/ImageProcessorCore/Samplers/Processors/Convolution/GuassianSharpenProcessor.cs b/src/ImageProcessorCore/Samplers/Processors/Convolution/GuassianSharpenProcessor.cs index e3a578ff7..6d0382ee9 100644 --- a/src/ImageProcessorCore/Samplers/Processors/Convolution/GuassianSharpenProcessor.cs +++ b/src/ImageProcessorCore/Samplers/Processors/Convolution/GuassianSharpenProcessor.cs @@ -75,12 +75,12 @@ namespace ImageProcessorCore.Processors /// /// Gets the horizontal gradient operator. /// - public float[,] KernelX { get; } + public float[][] KernelX { get; } /// /// Gets the vertical gradient operator. /// - public float[,] KernelY { get; } + public float[][] KernelY { get; } /// public override void Apply(ImageBase target, ImageBase source, Rectangle targetRectangle, Rectangle sourceRectangle, int startY, int endY) @@ -92,12 +92,18 @@ namespace ImageProcessorCore.Processors /// Create a 1 dimensional Gaussian kernel using the Gaussian G(x) function /// /// Whether to calculate a horizontal kernel. - /// The - private float[,] CreateGaussianKernel(bool horizontal) + /// The + private float[][] CreateGaussianKernel(bool horizontal) { int size = this.kernelSize; float weight = this.sigma; - float[,] kernel = horizontal ? new float[1, size] : new float[size, 1]; + float[][] kernel = horizontal ? new float[1][] : new float[size][]; + + if (horizontal) + { + kernel[0] = new float[size]; + } + float sum = 0; float midpoint = (size - 1) / 2f; @@ -108,11 +114,11 @@ namespace ImageProcessorCore.Processors sum += gx; if (horizontal) { - kernel[0, i] = gx; + kernel[0][i] = gx; } else { - kernel[i, 0] = gx; + kernel[i] = new[] { gx }; } } @@ -126,12 +132,12 @@ namespace ImageProcessorCore.Processors if (i == midpointRounded) { // Calculate central value - kernel[0, i] = (2f * sum) - kernel[0, i]; + kernel[0][i] = (2f * sum) - kernel[0][i]; } else { // invert value - kernel[0, i] = -kernel[0, i]; + kernel[0][i] = -kernel[0][i]; } } } @@ -142,12 +148,12 @@ namespace ImageProcessorCore.Processors if (i == midpointRounded) { // Calculate central value - kernel[i, 0] = (2 * sum) - kernel[i, 0]; + kernel[i][0] = (2 * sum) - kernel[i][0]; } else { // invert value - kernel[i, 0] = -kernel[i, 0]; + kernel[i][0] = -kernel[i][0]; } } } @@ -157,14 +163,14 @@ namespace ImageProcessorCore.Processors { for (int i = 0; i < size; i++) { - kernel[0, i] = kernel[0, i] / sum; + kernel[0][i] = kernel[0][i] / sum; } } else { for (int i = 0; i < size; i++) { - kernel[i, 0] = kernel[i, 0] / sum; + kernel[i][0] = kernel[i][0] / sum; } }