Exemple #1
0
        public static Bitmap GetCoreImage(Bitmap initialImage, Filter filter)
        {
            var g    = ComplexImage.FromBitmap(initialImage);
            var core = filter != Filter.Predict ? WienerFilter.GetCore(g, filter) : WienerPredictFilter.Core;
            var h    = GetComplexImageFromMatrix(core);

            for (int i = 0; i < h.Height; i++)
            {
                for (int j = 0; j < h.Width; j++)
                {
                    h.Data[i, j] *= 255;
                }
            }

            return(h.ToBitmap());
        }
        public static Bitmap Filter(Bitmap initialImage, Bitmap broken)
        {
            var g   = ComplexImage.FromBitmap(broken);
            var G   = ImageHelper.GetComplexImageFromMatrix(ImageHelper.FFT2(ImageHelper.ToVector(g.Data)));
            var snr = ImageHelper.GetSNR(g.Data);

            var filters = new ImageHelper.Filter[]
            {
                ImageHelper.Filter.Gauss,
                ImageHelper.Filter.MotionLeftToRight,
                ImageHelper.Filter.MotionRightToLeft,
            };

            var bestImages = new Bitmap[filters.Length];
            var cores      = new List <double[, ]>();

            for (int i = 0; i < filters.Length; i++)
            {
                var previousf = broken;
                var nextf     = broken;

                var prevQuality = 0.0;
                var nextQuality = 0.0;
                var k           = 0;
                var matrixSize  = 1;
                var eps         = 0.1;
                var core        = new double[matrixSize, matrixSize];

                do
                {
                    matrixSize += 2;
                    snr         = snrs[matrixSize];

                    previousf = nextf;

                    core = GetCore(g, filters[i], matrixSize);

                    var h = ImageHelper.GetComplexImageFromMatrix(core);
                    var H = ImageHelper.GetComplexImageFromMatrix(ImageHelper.FFT2(ImageHelper.ToVector(h.Data)));

                    var F = WienerFilter.GetF(H, G, snr);
                    var f = ImageHelper.GetComplexImageFromMatrix(ImageHelper.BFT2(ImageHelper.ToVector(F.Data)));
                    ImageHelper.Rotate(f);

                    nextf = f.ToBitmap();

                    prevQuality = ImageHelper.GetPSNR(initialImage, previousf);
                    nextQuality = ImageHelper.GetPSNR(initialImage, nextf);

                    //Console.WriteLine($"{nextQuality} {filters[i]} {matrixSize}");
                    k++;
                } while (nextQuality - prevQuality > eps || k < 2);

                bestImages[i] = previousf;
                cores.Add(core);
            }

            var psnrs = new List <double>();

            for (int i = 0; i < bestImages.Length; i++)
            {
                psnrs.Add(ImageHelper.GetPSNR(initialImage, bestImages[i]));
            }

            var bestIndex = psnrs.IndexOf(psnrs.Max());

            Core = cores[bestIndex];
            return(bestImages[bestIndex]);
        }