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
Accord.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
Accord.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));
}