CatEye.Core.HistogramCollector.CollectData C# (CSharp) Method

CollectData() public method

public CollectData ( IBitmapCore image ) : void
image IBitmapCore
return void
        public void CollectData(IBitmapCore image)
        {
            double light_max = 0;
            for (int i = 0; i < image.Width; i++)
            for (int j = 0; j < image.Height; j++)
            {
                double light = Math.Sqrt(image.RedChannel[i, j] * image.RedChannel[i, j] +
                                         image.GreenChannel[i, j] * image.GreenChannel[i, j] +
                                         image.BlueChannel[i, j] * image.BlueChannel[i, j]) / Math.Sqrt(3);

                int light_inx = (int)(light / mMaxLight * mLines);
                if (light_inx >= mLines) light_inx = mLines - 1;
                mLightHistogramData[light_inx] += 1;
                if (mLightHistogramData[light_inx] > light_max)
                    light_max = mLightHistogramData[light_inx];

                int red_inx = (int)(image.RedChannel[i, j] / mMaxLight * mLines);
                if (red_inx >= mLines) red_inx = mLines - 1;
                mRedHistogramData[red_inx] += 1;

                int green_inx = (int)(image.GreenChannel[i, j] / mMaxLight * mLines);
                if (green_inx >= mLines) green_inx = mLines - 1;
                mGreenHistogramData[green_inx] += 1;

                int blue_inx = (int)(image.BlueChannel[i, j] / mMaxLight * mLines);
                if (blue_inx >= mLines) blue_inx = mLines - 1;
                mBlueHistogramData[blue_inx] += 1;
            }
            for (int i = 0; i < mLines; i++)
            {
                mLightHistogramData[i] /= light_max;
                mRedHistogramData[i] /= light_max;
                mGreenHistogramData[i] /= light_max;
                mBlueHistogramData[i] /= light_max;
            }
        }

Usage Example

示例#1
0
        public void CutHighlights(double cut, double softness, int lines, double tailValueAtLeast, ProgressReporter callback)
        {
            double maxlight = CalcMaxLight();
            HistogramCollector sc = new HistogramCollector(maxlight, lines);
            sc.CollectData(this);
            double red_tail = sc.LineToScale(sc.FindHighTailRed(tailValueAtLeast));
            double green_tail = sc.LineToScale(sc.FindHighTailGreen(tailValueAtLeast));
            double blue_tail = sc.LineToScale(sc.FindHighTailBlue(tailValueAtLeast));
            double min_tail = Math.Min(red_tail, Math.Min(green_tail, blue_tail));
            double max_tail = Math.Max(red_tail, Math.Max(green_tail, blue_tail));

            // Building highlights matrix
            double delta = softness;	// Highlight distance
            double alpha = Math.Log(2) / delta;
            double q = min_tail + cut * (max_tail - min_tail);
            for (int j = 0; j < mHeight; j++)
            {
                if (j % REPORT_EVERY_NTH_LINE == 0 && callback != null)
                {
                    if (!callback((double)j / mHeight)) throw new UserCancelException();
                }

                for (int i = 0; i < mWidth; i++)
                {
                    if (r_chan[i, j] > q) r_chan[i, j] = (float)q;
                    if (g_chan[i, j] > q) g_chan[i, j] = (float)q;
                    if (b_chan[i, j] > q) b_chan[i, j] = (float)q;

                    double x = Math.Sqrt(r_chan[i, j] * r_chan[i, j] +
                                         g_chan[i, j] * g_chan[i, j] +
                                         b_chan[i, j] * b_chan[i, j]) / Math.Sqrt(3) / q;
                    double beta = Math.Log(q) - alpha;
                    hl_chan[i, j] = (float)((Math.Exp(alpha * x + beta) - Math.Exp(beta)) / (Math.Exp(alpha + beta) - Math.Exp(beta)));
                }
            }
        }
All Usage Examples Of CatEye.Core.HistogramCollector::CollectData