From e6011f05f2af655251b8eea430f9ccfed8c9ea07 Mon Sep 17 00:00:00 2001 From: popow Date: Mon, 6 Aug 2018 19:32:25 +0200 Subject: [PATCH] clipLimit now in percent of the total number of pixels in the grid --- .../HistogramEqualizationExtension.cs | 6 +++--- .../AdaptiveHistEqualizationProcessor.cs | 8 ++++---- .../GlobalHistogramEqualizationProcessor.cs | 8 ++++---- .../HistogramEqualizationOptions.cs | 6 +++--- .../HistogramEqualizationProcessor.cs | 18 ++++++++++-------- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/ImageSharp/Processing/HistogramEqualizationExtension.cs b/src/ImageSharp/Processing/HistogramEqualizationExtension.cs index 3a279cc5fc..af83934741 100644 --- a/src/ImageSharp/Processing/HistogramEqualizationExtension.cs +++ b/src/ImageSharp/Processing/HistogramEqualizationExtension.cs @@ -40,15 +40,15 @@ namespace SixLabors.ImageSharp.Processing switch (options.Method) { case HistogramEqualizationMethod.Global: - processor = new GlobalHistogramEqualizationProcessor(options.LuminanceLevels, options.ClipHistogram, options.ClipLimit); + processor = new GlobalHistogramEqualizationProcessor(options.LuminanceLevels, options.ClipHistogram, options.ClipLimitPercentage); break; case HistogramEqualizationMethod.Adaptive: - processor = new AdaptiveHistEqualizationProcessor(options.LuminanceLevels, options.ClipHistogram, options.ClipLimit, options.GridSize); + processor = new AdaptiveHistEqualizationProcessor(options.LuminanceLevels, options.ClipHistogram, options.ClipLimitPercentage, options.GridSize); break; default: - processor = new GlobalHistogramEqualizationProcessor(options.LuminanceLevels, options.ClipHistogram, options.ClipLimit); + processor = new GlobalHistogramEqualizationProcessor(options.LuminanceLevels, options.ClipHistogram, options.ClipLimitPercentage); break; } diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistEqualizationProcessor.cs index ad0543bcfd..d13a0edf62 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistEqualizationProcessor.cs @@ -25,10 +25,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization /// The number of different luminance levels. Typical values are 256 for 8-bit grayscale images /// 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. + /// Histogram clip limit in percent of the total pixels in the grid. Histogram bins which exceed this limit, will be capped at this value. /// 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) + public AdaptiveHistEqualizationProcessor(int luminanceLevels, bool clipHistogram, float clipLimitPercentage, int gridSize) + : base(luminanceLevels, clipHistogram, clipLimitPercentage) { Guard.MustBeGreaterThanOrEqualTo(gridSize, 4, nameof(gridSize)); @@ -80,7 +80,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { // Clipping the histogram, but doing it on a copy to keep the original un-clipped values for the next iteration. histogram.CopyTo(histogramCopy); - this.ClipHistogram(histogramCopy, this.ClipLimit); + this.ClipHistogram(histogramCopy, this.ClipLimitPercentage, pixelsInGrid); } // Calculate the cumulative distribution function, which will map each input pixel in the current grid to a new value. diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs index 6f3bfc13fe..f7a4349106 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs @@ -23,9 +23,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization /// The number of different luminance levels. Typical values are 256 for 8-bit grayscale images /// 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. - public GlobalHistogramEqualizationProcessor(int luminanceLevels, bool clipHistogram, int clipLimit) - : base(luminanceLevels, clipHistogram, clipLimit) + /// Histogram clip limit in percent of the total pixels. Histogram bins which exceed this limit, will be capped at this value. + public GlobalHistogramEqualizationProcessor(int luminanceLevels, bool clipHistogram, float clipLimitPercentage) + : base(luminanceLevels, clipHistogram, clipLimitPercentage) { } @@ -50,7 +50,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization if (this.ClipHistogramEnabled) { - this.ClipHistogram(histogram, this.ClipLimit); + this.ClipHistogram(histogram, this.ClipLimitPercentage, numberOfPixels); } // Calculate the cumulative distribution function, which will map each input pixel to a new value. diff --git a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationOptions.cs b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationOptions.cs index fb021f3050..9a6502854f 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationOptions.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationOptions.cs @@ -25,10 +25,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization public bool ClipHistogram { get; set; } = true; /// - /// Gets or sets the histogram clip limit. Histogram bins which exceed this limit, will be capped at this value. - /// Defaults to 60. + /// Gets or sets the histogram clip limit in percent of the total pixels in the grid. Histogram bins which exceed this limit, will be capped at this value. + /// Defaults to 0.35. /// - public int ClipLimit { get; set; } = 60; + public float ClipLimitPercentage { get; set; } = 0.035f; /// /// 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 243763d741..bf46390328 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs @@ -19,15 +19,15 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization /// The number of different luminance levels. Typical values are 256 for 8-bit grayscale images /// or 65536 for 16-bit grayscale images. /// Indicates, if histogram bins should be clipped. - /// The histogram clip limit. Histogram bins which exceed this limit, will be capped at this value. - protected HistogramEqualizationProcessor(int luminanceLevels, bool clipHistogram, int clipLimit) + /// Histogram clip limit in percent of the total pixels in the grid. Histogram bins which exceed this limit, will be capped at this value. + protected HistogramEqualizationProcessor(int luminanceLevels, bool clipHistogram, float clipLimitPercentage) { Guard.MustBeGreaterThan(luminanceLevels, 0, nameof(luminanceLevels)); - Guard.MustBeGreaterThan(clipLimit, 1, nameof(clipLimit)); + Guard.MustBeGreaterThan(clipLimitPercentage, 0.0f, nameof(clipLimitPercentage)); this.LuminanceLevels = luminanceLevels; this.ClipHistogramEnabled = clipHistogram; - this.ClipLimit = clipLimit; + this.ClipLimitPercentage = clipLimitPercentage; } /// @@ -41,9 +41,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization public bool ClipHistogramEnabled { get; } /// - /// Gets the histogram clip limit. Histogram bins which exceed this limit, will be capped at this value. + /// Gets the histogram clip limit in percent of the total pixels in the grid. Histogram bins which exceed this limit, will be capped at this value. /// - public int ClipLimit { get; } + public float ClipLimitPercentage { get; } /// /// Calculates the cumulative distribution function. @@ -87,9 +87,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization /// the values over the clip limit to all other bins equally. /// /// The histogram to apply the clipping. - /// The histogram clip limit. Histogram bins which exceed this limit, will be capped at this value. - protected void ClipHistogram(Span histogram, int clipLimit) + /// Histogram clip limit in percent of the total pixels in the grid. Histogram bins which exceed this limit, will be capped at this value. + /// The numbers of pixels inside the grid. + protected void ClipHistogram(Span histogram, float clipLimitPercentage, int pixelCount) { + int clipLimit = Convert.ToInt32(pixelCount * clipLimitPercentage); int sumOverClip = 0; for (int i = 0; i < histogram.Length; i++) {