public void ClooExecuteHistogramN()
        {
            var gpuHist = new ClooBuffer<uint>(Context, Cloo.ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.AllocateHostPointer, 64);
            var cpuHist = new CpuBuffer<uint>(64);

            var gpuImage = CreateClooImageByteRgbA(100, 100);
            ClooImaging.HistogramN(Queue, gpuImage, gpuHist, 4);
            gpuHist.ReadFromDevice(Queue);

            // compare GPU histogram with CPU version
            CpuImaging.HistogramN(gpuImage, cpuHist, 4);
            Assert.AreNotEqual(0, cpuHist.HostBuffer.Sum(x => x));
            Assert.AreEqual(cpuHist.HostBuffer.Sum(x => x), gpuHist.HostBuffer.Sum(x => x));

            // check each value
            for (int i = 0; i < cpuHist.HostBuffer.Length; i++)
                Assert.AreEqual(cpuHist.HostBuffer[i], gpuHist.HostBuffer[i], "Histogram comparison failed at index " + i);
        }
        public void ClooExecuteHistogramBackprojection()
        {
            var gpuHist = new ClooBuffer<uint>(Context, Cloo.ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.AllocateHostPointer, 64);

            var srcImage = CreateClooImageByteRgbA(100, 100);
            var dstImage = CreateClooImageByteA(100, 100);
            srcImage.HostBuffer.Clear();
            srcImage.WriteToDevice(Queue);
            ClooImaging.HistogramN(Queue, srcImage, gpuHist, 4);
            gpuHist.ReadFromDevice(Queue);

            ClooImaging.HistogramBackprojection(Queue, srcImage, dstImage, gpuHist, gpuHist, 4);
            dstImage.ReadFromDevice(Queue);

            // check each value
            for (int i = 0; i < dstImage.HostBuffer.Length; i++)
                Assert.AreEqual((byte)255, dstImage.HostBuffer[i], "Destination image mismatched probability at index " + i);

            // TODO: add more tests here
        }