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)); }
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)); }
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]; }
public static Target GetAcceleratorTarget(AcceleratorTarget acceleratorTarget) { if (acceleratorTarget == AcceleratorTarget.DX9) { return(_dx9Target); } else { return(_multicoreTarget); } }
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); }