// 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 ) ); }