diff --git a/src/ImageProcessor/ImageFactory.cs b/src/ImageProcessor/ImageFactory.cs index b21f6f986..496906c0a 100644 --- a/src/ImageProcessor/ImageFactory.cs +++ b/src/ImageProcessor/ImageFactory.cs @@ -441,11 +441,23 @@ namespace ImageProcessor return this; } - public ImageFactory DetectEdges(IEdgeFilter filter) + /// + /// Detects the edges in the current image. + /// + /// + /// The to detect edges with. + /// + /// + /// Whether to convert the image to greyscale first - Defaults to true. + /// + /// + /// The current instance of the class. + /// + public ImageFactory DetectEdges(IEdgeFilter filter, bool greyscale = true) { if (this.ShouldProcess) { - DetectEdges detectEdges = new DetectEdges { DynamicParameter = filter }; + DetectEdges detectEdges = new DetectEdges { DynamicParameter = new Tuple(filter, greyscale) }; this.CurrentImageFormat.ApplyProcessor(detectEdges.ProcessImage, this); } diff --git a/src/ImageProcessor/ImageProcessor.csproj b/src/ImageProcessor/ImageProcessor.csproj index faa73bd1b..4bb47105a 100644 --- a/src/ImageProcessor/ImageProcessor.csproj +++ b/src/ImageProcessor/ImageProcessor.csproj @@ -78,6 +78,10 @@ + + + + Code diff --git a/src/ImageProcessor/Imaging/Convolution.cs b/src/ImageProcessor/Imaging/Convolution.cs index 22d66bad8..8e9495637 100644 --- a/src/ImageProcessor/Imaging/Convolution.cs +++ b/src/ImageProcessor/Imaging/Convolution.cs @@ -26,7 +26,7 @@ namespace ImageProcessor.Imaging private readonly double standardDeviation = 1.4; /// - /// Whether to use use dynamic divider for edges. + /// Whether to use dynamic divider for edges. /// private bool useDynamicDividerForEdges = true; diff --git a/src/ImageProcessor/Imaging/EdgeDetection/ConvolutionFilter.cs b/src/ImageProcessor/Imaging/EdgeDetection/ConvolutionFilter.cs index 2307df335..5db8316db 100644 --- a/src/ImageProcessor/Imaging/EdgeDetection/ConvolutionFilter.cs +++ b/src/ImageProcessor/Imaging/EdgeDetection/ConvolutionFilter.cs @@ -1,4 +1,13 @@ - +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) James South. +// Licensed under the Apache License, Version 2.0. +// +// +// The convolution filter for applying gradient operators to detect edges within an image. +// +// -------------------------------------------------------------------------------------------------------------------- + namespace ImageProcessor.Imaging.EdgeDetection { using System; @@ -6,61 +15,137 @@ namespace ImageProcessor.Imaging.EdgeDetection using System.Drawing.Imaging; using ImageProcessor.Common.Extensions; - + using ImageProcessor.Imaging.Filters; + /// - /// http://pastebin.com/xHHD3pXi + /// The convolution filter for applying gradient operators to detect edges within an image. /// public class ConvolutionFilter { + /// + /// The edge filter. + /// private readonly IEdgeFilter edgeFilter; - public ConvolutionFilter(IEdgeFilter edgeFilter) + /// + /// Whether to produce a greyscale output. + /// + private readonly bool greyscale; + + /// + /// Initializes a new instance of the class. + /// + /// + /// The to apply. + /// + /// + /// Whether to produce a greyscale output. + /// + public ConvolutionFilter(IEdgeFilter edgeFilter, bool greyscale) { this.edgeFilter = edgeFilter; + this.greyscale = greyscale; } + /// + /// Processes the given bitmap to apply the current instances . + /// + /// The image to process. + /// A processed bitmap. public Bitmap ProcessFilter(Bitmap source) { - double[,] horizontalFilter = this.edgeFilter.HorizontalMatrix; - double[,] verticallFilter = this.edgeFilter.VerticalMatrix; - int width = source.Width; int height = source.Height; - int maxWidth = width - 1; - int maxHeight = height - 1; Bitmap destination = new Bitmap(width, height, PixelFormat.Format32bppArgb); - using (FastBitmap sourceBitmap = new FastBitmap(source)) + Bitmap input = new Bitmap(width, height, PixelFormat.Format32bppArgb); + + using (Graphics graphics = Graphics.FromImage(input)) { - using (FastBitmap destinationBitmap = new FastBitmap(destination)) + Rectangle rectangle = new Rectangle(0, 0, width, height); + if (this.greyscale) { - for (int y = 1; y < maxHeight; y++) + // If it's greyscale apply a colormatix to the image. + using (ImageAttributes attributes = new ImageAttributes()) { - for (int x = 1; x < maxWidth; x++) - { - double newX = 0; - double newY = 0; + attributes.SetColorMatrix(ColorMatrixes.GreyScale); + graphics.DrawImage(source, rectangle, 0, 0, width, height, GraphicsUnit.Pixel, attributes); + } + } + else + { + // Fixes an issue with transparency not converting properly. + graphics.Clear(Color.Transparent); + graphics.DrawImage(source, rectangle); + } + } + + try + { + double[,] horizontalFilter = this.edgeFilter.HorizontalGradientOperator; + double[,] verticallFilter = this.edgeFilter.VerticalGradientOperator; + + int filterXOffset = (horizontalFilter.GetLength(1) - 1) / 2; + int filterYOffset = (horizontalFilter.GetLength(0) - 1) / 2; + int maxWidth = width - filterXOffset; + int maxHeight = height - filterYOffset; - for (int hw = -1; hw < 2; hw++) + using (FastBitmap sourceBitmap = new FastBitmap(input)) + { + using (FastBitmap destinationBitmap = new FastBitmap(destination)) + { + // Loop through the pixels. + for (int y = filterYOffset; y < maxHeight; y++) + { + for (int x = filterXOffset; x < maxWidth; x++) { - for (int wi = -1; wi < 2; wi++) + double rX = 0; + double rY = 0; + double gX = 0; + double gY = 0; + double bX = 0; + double bY = 0; + + // Apply each matrix multiplier to the color components for each pixel. + for (int fy = -1; fy < filterYOffset; fy++) { - double component = sourceBitmap.GetPixel(x + wi, y + hw).B; - newX += horizontalFilter[hw + 1, wi + 1] * component; - newY += verticallFilter[hw + 1, wi + 1] * component; + for (int fx = -1; fx < filterXOffset; fx++) + { + Color currentColor = sourceBitmap.GetPixel(x + fx, y + fy); + double r = currentColor.R; + double g = currentColor.G; + double b = currentColor.B; + + rX += horizontalFilter[fy + 1, fx + 1] * r; + rY += verticallFilter[fy + 1, fx + 1] * r; + + gX += horizontalFilter[fy + 1, fx + 1] * g; + gY += verticallFilter[fy + 1, fx + 1] * g; + + bX += horizontalFilter[fy + 1, fx + 1] * b; + bY += verticallFilter[fy + 1, fx + 1] * b; + } } - } - byte value = Math.Sqrt((newX * newX) + (newY * newY)).ToByte(); - Color tempcolor = Color.FromArgb(value, value, value); - destinationBitmap.SetPixel(x, y, tempcolor); + // Apply the equation and sanitize. + byte red = Math.Sqrt((rX * rX) + (rY * rY)).ToByte(); + byte green = Math.Sqrt((gX * gX) + (gY * gY)).ToByte(); + byte blue = Math.Sqrt((bX * bX) + (bY * bY)).ToByte(); + + Color newColor = Color.FromArgb(red, green, blue); + destinationBitmap.SetPixel(x, y, newColor); + } } } } } + finally + { + // We created a new image. Cleanup. + input.Dispose(); + } return destination; - } } } diff --git a/src/ImageProcessor/Imaging/EdgeDetection/CostellaEdgeFilter.cs b/src/ImageProcessor/Imaging/EdgeDetection/CostellaEdgeFilter.cs new file mode 100644 index 000000000..96f8034ef --- /dev/null +++ b/src/ImageProcessor/Imaging/EdgeDetection/CostellaEdgeFilter.cs @@ -0,0 +1,68 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) James South. +// Licensed under the Apache License, Version 2.0. +// +// +// The Costella operator filter. +// +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace ImageProcessor.Imaging.EdgeDetection +{ + /// + /// The Costella operator filter. + /// + /// + public class CostellaEdgeFilter : IEdgeFilter + { + /// + /// Gets the horizontal gradient operator. + /// + public double[,] HorizontalGradientOperator + { + get + { + return new double[,] + { { -1, -1, -1, -1, -1, }, + { -1, -1, -1, -1, -1, }, + { -1, -1, 24, -1, -1, }, + { -1, -1, -1, -1, -1, }, + { -1, -1, -1, -1, -1 }, }; + return new double[,] + { + { -1, -3, 0, 3, 1 }, + { -1, -3, 0, 3, 1 }, + { -1, -3, 0, 3, 1 }, + { -1, -3, 0, 3, 1 }, + { -1, -3, 0, 3, 1 } + }; + } + } + + /// + /// Gets the vertical gradient operator. + /// + public double[,] VerticalGradientOperator + { + get + { + return new double[,] + { { -1, -1, -1, -1, -1, }, + { -1, -1, -1, -1, -1, }, + { -1, -1, 24, -1, -1, }, + { -1, -1, -1, -1, -1, }, + { -1, -1, -1, -1, -1 }, }; + return new double[,] + { + { 1, 1, 1, 1, 1 }, + { 3, 3, 3, 3, 3 }, + { 0, 0, 0, 0, 0 }, + { -3, -3, -3, -3, -3 }, + { -1, -1, -1, -1, -1 } + }; + } + } + } +} diff --git a/src/ImageProcessor/Imaging/EdgeDetection/IEdgeFilter.cs b/src/ImageProcessor/Imaging/EdgeDetection/IEdgeFilter.cs index bf30c7cf9..4ddee1b46 100644 --- a/src/ImageProcessor/Imaging/EdgeDetection/IEdgeFilter.cs +++ b/src/ImageProcessor/Imaging/EdgeDetection/IEdgeFilter.cs @@ -1,9 +1,28 @@ -namespace ImageProcessor.Imaging.EdgeDetection +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) James South. +// Licensed under the Apache License, Version 2.0. +// +// +// Describes properties for creating edge detection filters. +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace ImageProcessor.Imaging.EdgeDetection { + /// + /// Describes properties for creating edge detection filters. + /// public interface IEdgeFilter { - double[,] HorizontalMatrix { get; } + /// + /// Gets the horizontal gradient operator. + /// + double[,] HorizontalGradientOperator { get; } - double[,] VerticalMatrix { get; } + /// + /// Gets the vertical gradient operator. + /// + double[,] VerticalGradientOperator { get; } } } diff --git a/src/ImageProcessor/Imaging/EdgeDetection/PrewittEdgeFilter.cs b/src/ImageProcessor/Imaging/EdgeDetection/PrewittEdgeFilter.cs new file mode 100644 index 000000000..da6650208 --- /dev/null +++ b/src/ImageProcessor/Imaging/EdgeDetection/PrewittEdgeFilter.cs @@ -0,0 +1,52 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) James South. +// Licensed under the Apache License, Version 2.0. +// +// +// The Prewitt operator filter. +// +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace ImageProcessor.Imaging.EdgeDetection +{ + /// + /// The Prewitt operator filter. + /// + /// + public class PrewittEdgeFilter : IEdgeFilter + { + /// + /// Gets the horizontal gradient operator. + /// + public double[,] HorizontalGradientOperator + { + get + { + return new double[,] + { + { -1, 0, 1 }, + { -1, 0, 1 }, + { -1, 0, 1 } + }; + } + } + + /// + /// Gets the vertical gradient operator. + /// + public double[,] VerticalGradientOperator + { + get + { + return new double[,] + { + { 1, 1, 1 }, + { 0, 0, 0 }, + { -1, -1, -1 } + }; + } + } + } +} diff --git a/src/ImageProcessor/Imaging/EdgeDetection/RobertsCrossEdgeFilter.cs b/src/ImageProcessor/Imaging/EdgeDetection/RobertsCrossEdgeFilter.cs new file mode 100644 index 000000000..b05b5836d --- /dev/null +++ b/src/ImageProcessor/Imaging/EdgeDetection/RobertsCrossEdgeFilter.cs @@ -0,0 +1,50 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) James South. +// Licensed under the Apache License, Version 2.0. +// +// +// The Roberts Cross operator filter. +// +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace ImageProcessor.Imaging.EdgeDetection +{ + /// + /// The Roberts Cross operator filter. + /// + /// + public class RobertsCrossEdgeFilter : IEdgeFilter + { + /// + /// Gets the horizontal gradient operator. + /// + public double[,] HorizontalGradientOperator + { + get + { + return new double[,] + { + { 1, 0 }, + { 0, -1 } + }; + } + } + + /// + /// Gets the vertical gradient operator. + /// + public double[,] VerticalGradientOperator + { + get + { + return new double[,] + { + { 0, 1 }, + { -1, 0 } + }; + } + } + } +} diff --git a/src/ImageProcessor/Imaging/EdgeDetection/ScharrEdgeFilter.cs b/src/ImageProcessor/Imaging/EdgeDetection/ScharrEdgeFilter.cs new file mode 100644 index 000000000..89645f54f --- /dev/null +++ b/src/ImageProcessor/Imaging/EdgeDetection/ScharrEdgeFilter.cs @@ -0,0 +1,52 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) James South. +// Licensed under the Apache License, Version 2.0. +// +// +// The Scharr operator filter. +// +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace ImageProcessor.Imaging.EdgeDetection +{ + /// + /// The Scharr operator filter. + /// + /// + public class ScharrEdgeFilter : IEdgeFilter + { + /// + /// Gets the horizontal gradient operator. + /// + public double[,] HorizontalGradientOperator + { + get + { + return new double[,] + { + { -3, 0, 3 }, + { -10, 0, 10 }, + { -3, 0, 3 } + }; + } + } + + /// + /// Gets the vertical gradient operator. + /// + public double[,] VerticalGradientOperator + { + get + { + return new double[,] + { + { 3, 10, 3 }, + { 0, 0, 0 }, + { -3, -10, -3 } + }; + } + } + } +} diff --git a/src/ImageProcessor/Imaging/EdgeDetection/SobelEdgeFilter.cs b/src/ImageProcessor/Imaging/EdgeDetection/SobelEdgeFilter.cs index ac71d1caa..6fa59a8fb 100644 --- a/src/ImageProcessor/Imaging/EdgeDetection/SobelEdgeFilter.cs +++ b/src/ImageProcessor/Imaging/EdgeDetection/SobelEdgeFilter.cs @@ -1,26 +1,51 @@ -namespace ImageProcessor.Imaging.EdgeDetection +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) James South. +// Licensed under the Apache License, Version 2.0. +// +// +// The Sobel operator filter. +// +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace ImageProcessor.Imaging.EdgeDetection { + /// + /// The Sobel operator filter. + /// + /// public class SobelEdgeFilter : IEdgeFilter { - public double[,] HorizontalMatrix + /// + /// Gets the horizontal gradient operator. + /// + public double[,] HorizontalGradientOperator { get { - return new double[,] - { { -1, 0, 1, }, - { -2, 0, 2, }, - { -1, 0, 1, }, }; + return new double[,] + { + { -1, 0, 1 }, + { -2, 0, 2 }, + { -1, 0, 1 } + }; } } - public double[,] VerticalMatrix + /// + /// Gets the vertical gradient operator. + /// + public double[,] VerticalGradientOperator { get { - return new double[,] - { { 1, 2, 1, }, - { 0, 0, 0, }, - { -1, -2, -1, }, }; + return new double[,] + { + { 1, 2, 1 }, + { 0, 0, 0 }, + { -1, -2, -1 } + }; } } } diff --git a/src/ImageProcessor/Imaging/FastBitmap.cs b/src/ImageProcessor/Imaging/FastBitmap.cs index 97af88356..db8d80643 100644 --- a/src/ImageProcessor/Imaging/FastBitmap.cs +++ b/src/ImageProcessor/Imaging/FastBitmap.cs @@ -156,12 +156,12 @@ namespace ImageProcessor.Imaging /// The at the given pixel. public Color GetPixel(int x, int y) { - if ((x < 0) || (x >= this.width)) + if ((x < 0) || (x > this.width)) { throw new ArgumentOutOfRangeException("x", "Value cannot be less than zero or greater than the bitmap width."); } - if ((y < 0) || (y >= this.height)) + if ((y < 0) || (y > this.height)) { throw new ArgumentOutOfRangeException("y", "Value cannot be less than zero or greater than the bitmap height."); } diff --git a/src/ImageProcessor/Processors/DetectEdges.cs b/src/ImageProcessor/Processors/DetectEdges.cs index a368d6f9a..9df1e5184 100644 --- a/src/ImageProcessor/Processors/DetectEdges.cs +++ b/src/ImageProcessor/Processors/DetectEdges.cs @@ -1,16 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) James South. +// Licensed under the Apache License, Version 2.0. +// +// +// Produces an image with the detected edges highlighted. +// +// -------------------------------------------------------------------------------------------------------------------- namespace ImageProcessor.Processors { + using System; + using System.Collections.Generic; using System.Drawing; using ImageProcessor.Common.Exceptions; using ImageProcessor.Imaging.EdgeDetection; + /// + /// Produces an image with the detected edges highlighted. + /// public class DetectEdges : IGraphicsProcessor { /// @@ -53,24 +62,27 @@ namespace ImageProcessor.Processors { Bitmap newImage = null; Image image = factory.Image; - IEdgeFilter filter = this.DynamicParameter; - try - { - ConvolutionFilter convolutionFilter = new ConvolutionFilter(filter); + Tuple parameters = this.DynamicParameter; + IEdgeFilter filter = parameters.Item1; + bool greyscale = parameters.Item2; + + //try + //{ + ConvolutionFilter convolutionFilter = new ConvolutionFilter(filter, greyscale); newImage = convolutionFilter.ProcessFilter((Bitmap)image); image.Dispose(); image = newImage; - } - catch (Exception ex) - { - if (newImage != null) - { - newImage.Dispose(); - } + //} + //catch (Exception ex) + //{ + // if (newImage != null) + // { + // newImage.Dispose(); + // } - throw new ImageProcessingException("Error processing image with " + this.GetType().Name, ex); - } + // throw new ImageProcessingException("Error processing image with " + this.GetType().Name, ex); + //} return image; } diff --git a/src/ImageProcessor/Settings.StyleCop b/src/ImageProcessor/Settings.StyleCop index 085067600..9e50dcc98 100644 --- a/src/ImageProcessor/Settings.StyleCop +++ b/src/ImageProcessor/Settings.StyleCop @@ -8,6 +8,8 @@ gps mmmm orig + Scharr + Sobel specifier ss subfile diff --git a/src/ImageProcessorConsole/Program.cs b/src/ImageProcessorConsole/Program.cs index 4adeb1238..16a821272 100644 --- a/src/ImageProcessorConsole/Program.cs +++ b/src/ImageProcessorConsole/Program.cs @@ -46,7 +46,7 @@ namespace ImageProcessorConsole di.Create(); } - IEnumerable files = GetFilesByExtensions(di, ".jpg"); + IEnumerable files = GetFilesByExtensions(di, ".png"); //IEnumerable files = GetFilesByExtensions(di, ".gif", ".webp", ".bmp", ".jpg", ".png", ".tif"); foreach (FileInfo fileInfo in files) @@ -77,7 +77,7 @@ namespace ImageProcessorConsole //.Constrain(size) //.ReplaceColor(Color.FromArgb(255, 1, 107, 165), Color.FromArgb(255, 1, 165, 13), 80) .Resize(layer) - .DetectEdges(new SobelEdgeFilter()) + .DetectEdges(new CostellaEdgeFilter(), false) //.Filter(MatrixFilters.Comic) //.Filter(MatrixFilters.HiSatch) //.Pixelate(8) diff --git a/src/ImageProcessorConsole/images/input/Bikesgray.png.REMOVED.git-id b/src/ImageProcessorConsole/images/input/Bikesgray.png.REMOVED.git-id new file mode 100644 index 000000000..defbf8e5e --- /dev/null +++ b/src/ImageProcessorConsole/images/input/Bikesgray.png.REMOVED.git-id @@ -0,0 +1 @@ +93b93eade2c7697a0a8fe9363d493a8a59de245a \ No newline at end of file diff --git a/src/ImageProcessorConsole/images/input/Valve_original_(1).PNG.REMOVED.git-id b/src/ImageProcessorConsole/images/input/Valve_original_(1).PNG.REMOVED.git-id new file mode 100644 index 000000000..6659a180b --- /dev/null +++ b/src/ImageProcessorConsole/images/input/Valve_original_(1).PNG.REMOVED.git-id @@ -0,0 +1 @@ +bdff6764fd5c4e3054ba7d8c43cc8c29be0e6f5e \ No newline at end of file diff --git a/src/ImageProcessorConsole/images/input/circle2.png b/src/ImageProcessorConsole/images/input/circle2.png new file mode 100644 index 000000000..8637ac54b --- /dev/null +++ b/src/ImageProcessorConsole/images/input/circle2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dd59c277b646f15b0223c028ddfb0fa7d5edcb2609882e2c6841e5b2714cd67 +size 3182 diff --git a/src/ImageProcessorConsole/images/output/Bikesgray.png b/src/ImageProcessorConsole/images/output/Bikesgray.png new file mode 100644 index 000000000..31e18fbd4 --- /dev/null +++ b/src/ImageProcessorConsole/images/output/Bikesgray.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7eb6df312d356346d0d7f5d55c657a4a3a08f11d293c93f56447137a49190d0f +size 17319 diff --git a/src/ImageProcessorConsole/images/output/Valve_original_(1).PNG b/src/ImageProcessorConsole/images/output/Valve_original_(1).PNG new file mode 100644 index 000000000..fb30d23e9 --- /dev/null +++ b/src/ImageProcessorConsole/images/output/Valve_original_(1).PNG @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d74259c087adb38c335a3162c56f1c3ae344e098f2471d79d702d80a95907a3 +size 4066 diff --git a/src/ImageProcessorConsole/images/output/circle.png b/src/ImageProcessorConsole/images/output/circle.png new file mode 100644 index 000000000..53b70b1c3 --- /dev/null +++ b/src/ImageProcessorConsole/images/output/circle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:343794bc824674c81cd8ba90acd3bb690d43c84d363e3375e8ee42207867f977 +size 7011 diff --git a/src/ImageProcessorConsole/images/output/circle2.png b/src/ImageProcessorConsole/images/output/circle2.png new file mode 100644 index 000000000..9359c3136 --- /dev/null +++ b/src/ImageProcessorConsole/images/output/circle2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:662cd66659e03b0ca18e62d2e9bdc69e62e082fad9a0316348db031f67092497 +size 4407 diff --git a/src/ImageProcessorConsole/images/output/monster.png.REMOVED.git-id b/src/ImageProcessorConsole/images/output/monster.png.REMOVED.git-id new file mode 100644 index 000000000..91da330d3 --- /dev/null +++ b/src/ImageProcessorConsole/images/output/monster.png.REMOVED.git-id @@ -0,0 +1 @@ +ef1fdff21802713450cf2f81321c0605962ec6f5 \ No newline at end of file diff --git a/src/ImageProcessorConsole/images/output/night-bridge.png.REMOVED.git-id b/src/ImageProcessorConsole/images/output/night-bridge.png.REMOVED.git-id new file mode 100644 index 000000000..60d52025b --- /dev/null +++ b/src/ImageProcessorConsole/images/output/night-bridge.png.REMOVED.git-id @@ -0,0 +1 @@ +fad7e5225f13c9d35d9e877c93e2bb44da7404c0 \ No newline at end of file