diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistEqualizationProcessor.cs
index 218d2680f9..ad0543bcfd 100644
--- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistEqualizationProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistEqualizationProcessor.cs
@@ -26,11 +26,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization
/// or 65536 for 16-bit grayscale images.
/// Indicating whether to clip the histogram bins at a specific value.
/// The histogram clip limit. Histogram bins which exceed this limit, will be capped at this value.
- /// The grid size of the adaptive histogram equalization.
+ /// The grid size of the adaptive histogram equalization. Minimum value is 4.
public AdaptiveHistEqualizationProcessor(int luminanceLevels, bool clipHistogram, int clipLimit, int gridSize)
: base(luminanceLevels, clipHistogram, clipLimit)
{
- Guard.MustBeGreaterThan(gridSize, 8, nameof(gridSize));
+ Guard.MustBeGreaterThanOrEqualTo(gridSize, 4, nameof(gridSize));
this.GridSize = gridSize;
}
@@ -84,14 +84,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization
}
// Calculate the cumulative distribution function, which will map each input pixel in the current grid to a new value.
- cdf.Clear();
int cdfMin = this.ClipHistogramEnabled ? this.CalculateCdf(cdf, histogramCopy) : this.CalculateCdf(cdf, histogram);
float numberOfPixelsMinusCdfMin = pixelsInGrid - cdfMin;
// Map the current pixel to the new equalized value
int luminance = this.GetLuminance(source[x, y], this.LuminanceLevels);
float luminanceEqualized = cdf[luminance] / numberOfPixelsMinusCdfMin;
- targetPixels[x, y].PackFromVector4(new Vector4((float)luminanceEqualized));
+ targetPixels[x, y].PackFromVector4(new Vector4(luminanceEqualized));
// Remove top most row from the histogram, mirroring rows which exceeds the borders.
Span rowSpan = this.GetPixelRow(source, x - halfGridSize, y - halfGridSize, this.GridSize);
diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs
index 423840097d..6f3bfc13fe 100644
--- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs
@@ -36,10 +36,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization
int numberOfPixels = source.Width * source.Height;
Span pixels = source.GetPixelSpan();
- // Build the histogram of the grayscale levels.
using (IBuffer histogramBuffer = memoryAllocator.AllocateClean(this.LuminanceLevels))
using (IBuffer cdfBuffer = memoryAllocator.AllocateClean(this.LuminanceLevels))
{
+ // Build the histogram of the grayscale levels.
Span histogram = histogramBuffer.GetSpan();
for (int i = 0; i < pixels.Length; i++)
{
diff --git a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationOptions.cs b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationOptions.cs
index 20aa113ac7..fb021f3050 100644
--- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationOptions.cs
+++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationOptions.cs
@@ -26,9 +26,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization
///
/// Gets or sets the histogram clip limit. Histogram bins which exceed this limit, will be capped at this value.
- /// Defaults to 80.
+ /// Defaults to 60.
///
- public int ClipLimit { get; set; } = 80;
+ public int ClipLimit { get; set; } = 60;
///
/// Gets or sets the size of the grid for the adaptive histogram equalization. Defaults to 32.
diff --git a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs
index 298de13881..243763d741 100644
--- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs
@@ -101,9 +101,12 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization
}
int addToEachBin = (int)Math.Floor(sumOverClip / (double)this.LuminanceLevels);
- for (int i = 0; i < histogram.Length; i++)
+ if (addToEachBin > 0)
{
- histogram[i] += addToEachBin;
+ for (int i = 0; i < histogram.Length; i++)
+ {
+ histogram[i] += addToEachBin;
+ }
}
}