protected override void OnBeginRender (ISurface src, ISurface dst, Rectangle roi) { var histogram = new HistogramRgb (); histogram.UpdateHistogram (src, src.Bounds); op = histogram.MakeLevelsAuto (); }
public object Clone() { LevelOp copy = new LevelOp(colorInLow, colorInHigh, (float[])gamma.Clone(), colorOutLow, colorOutHigh); copy.CurveB = (byte[])this.CurveB.Clone(); copy.CurveG = (byte[])this.CurveG.Clone(); copy.CurveR = (byte[])this.CurveR.Clone(); return(copy); }
public void SetFromLeveledHistogram (HistogramRgb inputHistogram, LevelOp upo) { if (inputHistogram == null || upo == null) { return; } Clear (); float[] before = new float[3]; float[] slopes = new float[3]; for (int c = 0; c < 3; c++) { long[] channelHistogramOutput = histogram[c]; long[] channelHistogramInput = inputHistogram.histogram[c]; for (int v = 0; v <= 255; v++) { ColorBgra after = ColorBgra.FromBgr ((byte)v, (byte)v, (byte)v); upo.UnApply (after, before, slopes); if (after[c] > upo.ColorOutHigh[c] || after[c] < upo.ColorOutLow[c] || (int)Math.Floor (before[c]) < 0 || (int)Math.Ceiling (before[c]) > 255 || float.IsNaN (before[c])) { channelHistogramOutput[v] = 0; } else if (before[c] <= upo.ColorInLow[c]) { channelHistogramOutput[v] = 0; for (int i = 0; i <= upo.ColorInLow[c]; i++) { channelHistogramOutput[v] += channelHistogramInput[i]; } } else if (before[c] >= upo.ColorInHigh[c]) { channelHistogramOutput[v] = 0; for (int i = upo.ColorInHigh[c]; i < 256; i++) { channelHistogramOutput[v] += channelHistogramInput[i]; } } else { channelHistogramOutput[v] = (int)(slopes[c] * Utility.Lerp ( channelHistogramInput[(int)Math.Floor (before[c])], channelHistogramInput[(int)Math.Ceiling (before[c])], before[c] - Math.Floor (before[c]))); } } } OnHistogramUpdated (); }
public object Clone () { LevelOp copy = new LevelOp (colorInLow, colorInHigh, (float[])gamma.Clone (), colorOutLow, colorOutHigh); copy.CurveB = (byte[])this.CurveB.Clone (); copy.CurveG = (byte[])this.CurveG.Clone (); copy.CurveR = (byte[])this.CurveR.Clone (); return copy; }