From adb06efe29ab3c4d9b94b496564584688ec40801 Mon Sep 17 00:00:00 2001 From: popow Date: Sat, 4 Aug 2018 18:53:08 +0200 Subject: [PATCH] small improvements --- .../Normalization/AdaptiveHistEqualizationProcessor.cs | 7 +++---- .../Normalization/GlobalHistogramEqualizationProcessor.cs | 2 +- .../Normalization/HistogramEqualizationOptions.cs | 4 ++-- .../Normalization/HistogramEqualizationProcessor.cs | 7 +++++-- 4 files changed, 11 insertions(+), 9 deletions(-) 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; + } } }