private FlatArray2DArray <int>[] GetMidResConvolution2(PhysicalImage physicalImage) { int GetConvolution(IEnumerable <int> convolutionPixels, double[] filter) { int value = (int)convolutionPixels .Zip(filter, (a, b) => a * b) .Sum(); value = value < 0 ? 0 : value; value = value > 255 ? 255 : value; return(value); } FastBitmap.FastBitmap bitmap = _loader.LoadImage(physicalImage.ImagePath); var bitmapAsIntensity = new FastBitmapToIntensity2DArrayAdapter(bitmap); var convolution135Result = new FlatArray2DArray <int>(new int[bitmap.Width * bitmap.Height], bitmap.Width, bitmap.Height); var convolution45Result = new FlatArray2DArray <int>(new int[bitmap.Width * bitmap.Height], bitmap.Width, bitmap.Height); var convolutionHorizontalResult = new FlatArray2DArray <int>(new int[bitmap.Width * bitmap.Height], bitmap.Width, bitmap.Height); var convolutionVerticalResult = new FlatArray2DArray <int>(new int[bitmap.Width * bitmap.Height], bitmap.Width, bitmap.Height); var convolutionEdgeResult = new FlatArray2DArray <int>(new int[bitmap.Width * bitmap.Height], bitmap.Width, bitmap.Height); bitmap.Lock(); for (int y = 0; y < bitmap.Height; y++) { for (int x = 0; x < bitmap.Width; x++) { var convolutionPixels = GetConvolutionPixels(bitmapAsIntensity, new Rectangle(x - 1, y - 1, 3, 3)).ToArray(); convolution135Result[x, y] = GetConvolution(convolutionPixels, StatsGenerator.MidRes135Filter); convolution45Result[x, y] = GetConvolution(convolutionPixels, StatsGenerator.MidRes45Filter); convolutionHorizontalResult[x, y] = GetConvolution(convolutionPixels, StatsGenerator.MidResHorizontalFilter); convolutionVerticalResult[x, y] = GetConvolution(convolutionPixels, StatsGenerator.MidResVerticalFilter); convolutionEdgeResult[x, y] = GetConvolution(convolutionPixels, StatsGenerator.MidResEdgeFilter); } } bitmap.Unlock(); var convolutionResults = new[] { convolution135Result, convolution45Result, convolutionHorizontalResult, convolutionVerticalResult, convolutionEdgeResult, }; return(convolutionResults); }
private FlatArray2DArray <int> Reduce(FlatArray2DArray <int> source) { var rect = new Rectangle(0, 0, source.Width, source.Height); var subRects = GetReductionIdentityRectangles(rect); var reduced = subRects .Select(r => ApplyFilter(GetConvolutionPixels(source, r).ToArray(), ReduceIdentityFilter)); return(new FlatArray2DArray <int>(reduced, source.Width / 5, source.Height / 5)); }