Пример #1
0
        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);
        }
Пример #2
0
        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));
        }