コード例 #1
0
        public static YDataFloat GenerateEdgeDetectionAverageAccel(AcceleratorTarget acceleratorTarget, IEnumerable <YDataFloat> edgeMapList)
        {
            var target = GetAcceleratorTarget(acceleratorTarget);

            var firstEdgeMap = edgeMapList.First();

            var width   = firstEdgeMap.Width;
            var height  = firstEdgeMap.Height;
            var maximum = firstEdgeMap.MaximumValue;

            FloatParallelArray fpTotals = null;
            var edgeMapCount            = 0;

            foreach (var edgeMap in edgeMapList)
            {
                var fpInput = new FloatParallelArray(edgeMap.Data);

                if (fpTotals == null)
                {
                    fpTotals = fpInput;
                }
                else
                {
                    fpTotals = ParallelArrays.Add(fpTotals, fpInput);
                }

                edgeMapCount++;
            }

            var fpOutput = ParallelArrays.Divide(fpTotals, edgeMapCount);

            var output = target.ToArray2D(fpOutput);

            return(new YDataFloat(output, maximum));
        }
コード例 #2
0
        public static YDataFloat GenerateEdgeDetectedImageAccel(AcceleratorTarget acceleratorTarget, YDataFloat imageData)
        {
            var target = GetAcceleratorTarget(acceleratorTarget);

            var width  = imageData.Width;
            var height = imageData.Height;

            var fpInput = new FloatParallelArray(imageData.Data);

            var fpInputX = ParallelArrays.Shift(fpInput, new int[] { 1, 0 });
            var fpInputY = ParallelArrays.Shift(fpInput, new int[] { 0, 1 });

            var fpDX     = ParallelArrays.Subtract(fpInputX, fpInput);
            var fpDY     = ParallelArrays.Subtract(fpInputY, fpInput);
            var fpTotals = ParallelArrays.Add(fpDX, fpDY);

            var fpOutput = ParallelArrays.Divide(fpTotals, 2.0f);

            fpOutput = ParallelArrays.Add(fpOutput, imageData.MaximumValue / 2.0f);
            fpOutput = ParallelArrays.Max(fpOutput, 0.0f);
            fpOutput = ParallelArrays.Min(fpOutput, imageData.MaximumValue);

            var output = target.ToArray2D(fpOutput);

            return(new YDataFloat(output, imageData.MaximumValue));
        }
コード例 #3
0
        public static void CalculateAverageAndMaximumAccel(AcceleratorTarget acceleratorTarget, float[,] imageData, out float average, out float maximum)
        {
            var target = GetAcceleratorTarget(acceleratorTarget);

            int width  = imageData.GetLength(0);
            int height = imageData.GetLength(1);

            var fpInput = new FloatParallelArray(imageData);

            var fpAverage = ParallelArrays.Sum(fpInput);

            fpAverage = ParallelArrays.Divide(fpAverage, (float)(width * height));
            fpAverage = ParallelArrays.Pad(fpAverage, new int[] { 0 }, new int[] { 1 }, 0.0f);

            var fpMaximum = ParallelArrays.MaxVal(fpInput);

            fpMaximum = ParallelArrays.Pad(fpMaximum, new int[] { 1 }, new int[] { 0 }, 0.0f);

            var fpOutput = ParallelArrays.Add(fpAverage, fpMaximum);

            var output = target.ToArray1D(fpOutput);

            average = output[0];
            maximum = output[1];
        }
コード例 #4
0
 public static Target GetAcceleratorTarget(AcceleratorTarget acceleratorTarget)
 {
     if (acceleratorTarget == AcceleratorTarget.DX9)
     {
         return(_dx9Target);
     }
     else
     {
         return(_multicoreTarget);
     }
 }
コード例 #5
0
        public static void AdvanceEdgeDetectionAverageAccel(AcceleratorTarget acceleratorTarget, ref YDataFloat edgeMapAverage, YDataFloat edgeDataNew, YDataFloat edgeDataOld, int edgeMapAverageCount)
        {
            var target = GetAcceleratorTarget(acceleratorTarget);

            var   width  = edgeMapAverage.Width;
            var   height = edgeMapAverage.Height;
            float edgeMapAverageCountFloat = edgeMapAverageCount;

            var fpAverage = new FloatParallelArray(edgeMapAverage.Data);
            var fpNew     = new FloatParallelArray(edgeDataNew.Data);
            var fpOld     = new FloatParallelArray(edgeDataOld.Data);

            var fpAdjust = ParallelArrays.Subtract(fpNew, fpOld);

            fpAdjust = ParallelArrays.Divide(fpAdjust, edgeMapAverageCountFloat);

            var fpOutput = ParallelArrays.Subtract(fpAverage, fpAdjust);

            var output = target.ToArray2D(fpOutput);

            edgeMapAverage = new YDataFloat(output, edgeMapAverage.MaximumValue);
        }