示例#1
0
        // Selection changed in component combo
        private void componentCombo_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            AForge.Math.HistogramD h = null;
            RangeD input             = new RangeD(0, 1);
            RangeD output            = new RangeD(0, 1);

            if (componentCombo.SelectedIndex == 0)
            {
                // satureation
                h      = imgStat.Saturation;
                input  = inSaturation;
                output = outSaturation;
            }
            else
            {
                // luminance
                h      = imgStat.Luminance;
                input  = inLuminance;
                output = outLuminance;
            }

            histogram.Values = h.Values;

            inMinBox.Text  = input.Min.ToString("F3");
            inMaxBox.Text  = input.Max.ToString("F3");
            outMinBox.Text = output.Min.ToString("F3");
            outMaxBox.Text = output.Max.ToString("F3");

            // input slider
            inSlider.Min = (int)(input.Min * 255);
            inSlider.Max = (int)(input.Max * 255);
            // output slider
            outSlider.Min = (int)(output.Min * 255);
            outSlider.Max = (int)(output.Max * 255);
        }
        // Selection changed in component combo
        private void componentCombo_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            AForge.Math.HistogramD h = null;
            RangeD input             = new RangeD(0, 1);
            RangeD output            = new RangeD(0, 1);
            double start             = 0;

            switch (componentCombo.SelectedIndex)
            {
            case 0:
                // Y
                h      = imgStat.Y;
                input  = inY;
                output = outY;
                break;

            case 1:
                // Cb
                h      = imgStat.Cb;
                input  = inCb;
                output = outCb;
                start  = -0.5;
                break;

            case 2:
                // Cr
                h      = imgStat.Cr;
                input  = inCr;
                output = outCr;
                start  = -0.5;
                break;
            }

            histogram.Values = h.Values;

            inMinBox.Text  = input.Min.ToString("F3");
            inMaxBox.Text  = input.Max.ToString("F3");
            outMinBox.Text = output.Min.ToString("F3");
            outMaxBox.Text = output.Max.ToString("F3");

            // input slider
            inSlider.Min = (int)((input.Min - start) * 255);
            inSlider.Max = (int)((input.Max - start) * 255);
            // output slider
            outSlider.Min = (int)((output.Min - start) * 255);
            outSlider.Max = (int)((output.Max - start) * 255);
        }
        // Gather statistics
        private void ProcessImage( BitmapData imageData, int width, int height )
        {
            pixels = pixelsWithoutBlack = 0;

            int[]	yhisto  = new int[256];
            int[]	cbhisto = new int[256];
            int[]	crhisto = new int[256];

            int[]	yhistoWB	= new int[256];
            int[]	cbhistoWB	= new int[256];
            int[]	crhistoWB	= new int[256];

            RGB		rgb = new RGB( );
            YCbCr	ycbcr = new YCbCr( );

            int offset = imageData.Stride - width * 3;

            // do the job
            unsafe
            {
                byte * p = (byte *) imageData.Scan0.ToPointer( );

                // for each line
                for ( int y = 0; y < height; y++ )
                {
                    // for each pixel
                    for ( int x = 0; x < width; x++, p += 3 )
                    {
                        rgb.Red		= p[RGB.R];
                        rgb.Green	= p[RGB.G];
                        rgb.Blue	= p[RGB.B];

                        // convert to YCbCr color space
                        AForge.Imaging.ColorConverter.RGB2YCbCr( rgb, ycbcr );

                        yhisto [(int) ( ycbcr.Y * 255 )]++;
                        cbhisto[(int) ( ( ycbcr.Cb + 0.5 ) * 255 )]++;
                        crhisto[(int) ( ( ycbcr.Cr + 0.5 ) * 255 )]++;

                        pixels++;

                        if ( ( ycbcr.Y != 0.0 ) || ( ycbcr.Cb != 0.0 ) || ( ycbcr.Cr != 0.0 ) )
                        {
                            yhistoWB [(int) ( ycbcr.Y * 255 )]++;
                            cbhistoWB[(int) ( ( ycbcr.Cb + 0.5 ) * 255 )]++;
                            crhistoWB[(int) ( ( ycbcr.Cr + 0.5 ) * 255 )]++;

                            pixelsWithoutBlack++;
                        }
                    }
                    p += offset;
                }
            }

            // create histograms
            yHistogram  = new HistogramD( yhisto , new RangeD(  0.0, 1.0 ) );
            cbHistogram = new HistogramD( cbhisto, new RangeD( -0.5, 0.5 ) );
            crHistogram = new HistogramD( crhisto, new RangeD( -0.5, 0.5 ) );

            yHistogramWithoutBlack  = new HistogramD( yhistoWB , new RangeD(  0.0, 1.0 ) );
            cbHistogramWithoutBlack = new HistogramD( cbhistoWB, new RangeD( -0.5, 0.5 ) );
            crHistogramWithoutBlack = new HistogramD( crhistoWB, new RangeD( -0.5, 0.5 ) );
        }