private unsafe void ProcessImage( UnmanagedImage image, byte* mask, int maskLineSize )
{
// get image dimension
int width = image.Width;
int height = image.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 pixelSize = ( image.PixelFormat == PixelFormat.Format24bppRgb ) ? 3 : 4;
int offset = image.Stride - width * pixelSize;
int maskOffset = maskLineSize - width;
// do the job
byte * p = (byte*) image.ImageData.ToPointer( );
if ( mask == null )
{
// for each line
for ( int y = 0; y < height; y++ )
{
// for each pixel
for ( int x = 0; x < width; x++, p += pixelSize )
{
rgb.Red = p[RGB.R];
rgb.Green = p[RGB.G];
rgb.Blue = p[RGB.B];
// convert to YCbCr color space
AForge.Imaging.YCbCr.FromRGB( 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;
}
}
else
{
// for each line
for ( int y = 0; y < height; y++ )
{
// for each pixel
for ( int x = 0; x < width; x++, p += pixelSize, mask++ )
{
if ( *mask == 0 )
continue;
rgb.Red = p[RGB.R];
rgb.Green = p[RGB.G];
rgb.Blue = p[RGB.B];
// convert to YCbCr color space
AForge.Imaging.YCbCr.FromRGB( 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;
mask += maskOffset;
}
}
// create histograms
yHistogram = new ContinuousHistogram( yhisto, new Range( 0.0f, 1.0f ) );
cbHistogram = new ContinuousHistogram( cbhisto, new Range( -0.5f, 0.5f ) );
crHistogram = new ContinuousHistogram( crhisto, new Range( -0.5f, 0.5f ) );
yHistogramWithoutBlack = new ContinuousHistogram( yhistoWB, new Range( 0.0f, 1.0f ) );
cbHistogramWithoutBlack = new ContinuousHistogram( cbhistoWB, new Range( -0.5f, 0.5f ) );
crHistogramWithoutBlack = new ContinuousHistogram( crhistoWB, new Range( -0.5f, 0.5f ) );
}