From d5cc405212426afcef3301151668a75accebd431 Mon Sep 17 00:00:00 2001 From: popow Date: Wed, 4 Jul 2018 20:37:00 +0200 Subject: [PATCH] luminance levels is now a parameter of the constructor, defaults to 65536 --- .../HistogramEqualizationExtension.cs | 6 ++-- .../HistogramEqualizationProcessor.cs | 28 ++++++++++++++----- .../HistogramEqualizationTests.cs | 8 ++++-- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/ImageSharp/Processing/Normalization/HistogramEqualizationExtension.cs b/src/ImageSharp/Processing/Normalization/HistogramEqualizationExtension.cs index b40064515..aa3c86d24 100644 --- a/src/ImageSharp/Processing/Normalization/HistogramEqualizationExtension.cs +++ b/src/ImageSharp/Processing/Normalization/HistogramEqualizationExtension.cs @@ -15,9 +15,11 @@ namespace SixLabors.ImageSharp.Processing.Normalization /// /// The pixel format. /// The image this method extends. + /// The number of different luminance levels. Typical values are 256 for 8-bit grayscale images + /// or 65536 for 16-bit grayscale images.Defaults to 65536. /// A histogram equalized grayscale image. - public static IImageProcessingContext HistogramEqualization(this IImageProcessingContext source) + public static IImageProcessingContext HistogramEqualization(this IImageProcessingContext source, int luminanceLevels = 65536) where TPixel : struct, IPixel - => source.ApplyProcessor(new HistogramEqualizationProcessor()); + => source.ApplyProcessor(new HistogramEqualizationProcessor(luminanceLevels)); } } diff --git a/src/ImageSharp/Processing/Normalization/HistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Normalization/HistogramEqualizationProcessor.cs index ac6d23725..782df4762 100644 --- a/src/ImageSharp/Processing/Normalization/HistogramEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Normalization/HistogramEqualizationProcessor.cs @@ -18,25 +18,39 @@ namespace SixLabors.ImageSharp.Processing.Normalization internal class HistogramEqualizationProcessor : ImageProcessor where TPixel : struct, IPixel { + /// + /// Initializes a new instance of the class. + /// + /// The number of different luminance levels. Typical values are 256 for 8-bit grayscale images + /// or 65536 for 16-bit grayscale images.Defaults to 65536. + public HistogramEqualizationProcessor(int luminanceLevels = 65536) + { + Guard.MustBeGreaterThan(luminanceLevels, 0, nameof(luminanceLevels)); + + this.LuminanceLevels = luminanceLevels; + } + + /// + /// Gets the luminance levels. + /// + public int LuminanceLevels { get; } + /// protected override void OnFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration) { MemoryAllocator memoryAllocator = configuration.MemoryAllocator; int numberOfPixels = source.Width * source.Height; - bool is16bitPerChannel = typeof(TPixel) == typeof(Rgb48) || typeof(TPixel) == typeof(Rgba64); - Span pixels = source.GetPixelSpan(); // build the histogram of the grayscale levels - int luminanceLevels = is16bitPerChannel ? 65536 : 256; - using (IBuffer histogramBuffer = memoryAllocator.AllocateClean(luminanceLevels)) - using (IBuffer cdfBuffer = memoryAllocator.AllocateClean(luminanceLevels)) + using (IBuffer histogramBuffer = memoryAllocator.AllocateClean(this.LuminanceLevels)) + using (IBuffer cdfBuffer = memoryAllocator.AllocateClean(this.LuminanceLevels)) { Span histogram = histogramBuffer.GetSpan(); for (int i = 0; i < pixels.Length; i++) { TPixel sourcePixel = pixels[i]; - int luminance = this.GetLuminance(sourcePixel, luminanceLevels); + int luminance = this.GetLuminance(sourcePixel, this.LuminanceLevels); histogram[luminance]++; } @@ -50,7 +64,7 @@ namespace SixLabors.ImageSharp.Processing.Normalization { TPixel sourcePixel = pixels[i]; - int luminance = this.GetLuminance(sourcePixel, luminanceLevels); + int luminance = this.GetLuminance(sourcePixel, this.LuminanceLevels); double luminanceEqualized = cdf[luminance] / numberOfPixelsMinusCdfMin; pixels[i].PackFromVector4(new Vector4((float)luminanceEqualized)); diff --git a/tests/ImageSharp.Tests/Processing/Normalization/HistogramEqualizationTests.cs b/tests/ImageSharp.Tests/Processing/Normalization/HistogramEqualizationTests.cs index 7a750ff8b..2fc49db8a 100644 --- a/tests/ImageSharp.Tests/Processing/Normalization/HistogramEqualizationTests.cs +++ b/tests/ImageSharp.Tests/Processing/Normalization/HistogramEqualizationTests.cs @@ -10,8 +10,10 @@ namespace SixLabors.ImageSharp.Tests.Processing.Normalization { public class HistogramEqualizationTests { - [Fact] - public void HistogramEqualizationTest() + [Theory] + [InlineData(256)] + [InlineData(65536)] + public void HistogramEqualizationTest(int luminanceLevels) { // arrange byte[] pixels = new byte[] @@ -48,7 +50,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Normalization }; // act - image.Mutate(x => x.HistogramEqualization()); + image.Mutate(x => x.HistogramEqualization(luminanceLevels)); // assert for (int y = 0; y < 8; y++)