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++)