Пример #1
0
        public static Bitmap Filter(Bitmap initialImage, ImageHelper.Filter filter, double alpha, double delta)
        {
            var n = initialImage.Width;

            var A  = GetA(initialImage, delta);
            var E  = GenerateEMatrix(n);
            var At = Matrix.Transpose(A);

            var Ea = E.Multiply(alpha);
            //var AtA2 = At.Multiply(A);
            var AtA           = m(At, A);
            var sum           = Ea.Add(AtA);
            var reverseMatrix = sum.Inverse();

            //var Wy2 = reverseMatrix.Multiply(At);
            var Wy = m(reverseMatrix, At);
            var b  = ImageHelper.BitmapToMatrix(initialImage);
            //var a2 = Wy.Multiply(b);
            var a = m(Wy, b);

            var norm = ImageHelper.Normalize(a);

            return(ImageHelper.ToBitmap(norm));
            //return a.ToBitmap();
        }
Пример #2
0
        private void btn_Sharpen_Click(object sender, EventArgs e)
        {
            var sw = new Stopwatch();

            var    initialImage       = (Bitmap)Image.FromFile(openFileDialog1.FileName);
            Bitmap reconstructedImage = (Bitmap)Image.FromFile(openFileDialog1.FileName);;

            if (pictureBox2.Image != null)
            {
                var brokenImage = (Bitmap)pictureBox2.Image;

                sw.Start();
                reconstructedImage = SharpenFilter.Sharpen(brokenImage, kernelSize);
                pictureBox3.Image  = reconstructedImage;
            }
            else
            {
                sw.Start();
                var brokenImage = SharpenFilter.Sharpen(initialImage, kernelSize);
                pictureBox2.Image = brokenImage;
            }

            sw.Stop();

            Filter = ImageHelper.Filter.Sharpen;
            //MessageBox.Show(sw.Elapsed.TotalSeconds.ToString());
            MessageBox.Show($"{ImageHelper.GetPSNR(initialImage, reconstructedImage)}");
        }
Пример #3
0
        private void btn_motion_Click(object sender, EventArgs e)
        {
            var sw = new Stopwatch();

            sw.Start();

            var initialImage = (Bitmap)Image.FromFile(openFileDialog1.FileName);
            //var brokenImage = MotionFilter.Motion(initialImage, kernelSize, Direction.LeftToRight);
            var brokenImage = MotionFilter.Motion(initialImage, kernelSize, Direction.RightToLeft);

            pictureBox2.Image = brokenImage;

            sw.Stop();
            //Filter = ImageHelper.Filter.MotionLeftToRight;
            Filter = ImageHelper.Filter.MotionRightToLeft;
        }
Пример #4
0
        private void btn_Gaussian_Click(object sender, EventArgs e)
        {
            var sw = new Stopwatch();

            sw.Start();

            var initialImage = (Bitmap)Image.FromFile(openFileDialog1.FileName);
            var brokenImage  = GaussianFilter.Blur(initialImage, kernelSize);

            pictureBox2.Image = brokenImage;

            sw.Stop();

            Filter = ImageHelper.Filter.Gauss;
            //MessageBox.Show(sw.Elapsed.TotalSeconds.ToString());
        }
Пример #5
0
        public static Bitmap Filter(Bitmap initialImage, ImageHelper.Filter filter)
        {
            var g = ComplexImage.FromBitmap(initialImage);
            var h = ImageHelper.GetComplexImageFromMatrix(GetCore(g, filter));

            var snr = ImageHelper.GetSNR(g.Data);

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

            var F = GetF(H, G, 0.035);

            var f = ImageHelper.GetComplexImageFromMatrix(ImageHelper.BFT2(ImageHelper.ToVector(F.Data)));

            ImageHelper.Rotate(f);

            return(f.ToBitmap());
        }
Пример #6
0
        public static double[,] GetCore(ComplexImage g, ImageHelper.Filter filter)
        {
            var matrixSize = 0;
            var matrix     = new double[matrixSize, matrixSize];

            switch (filter)
            {
            case ImageHelper.Filter.Gauss:
                matrixSize = GaussianFilter.BlurSize;
                matrix     = GaussianFilter.GetCore();
                break;

            case ImageHelper.Filter.Sharpen:
                matrixSize = SharpenFilter.SharpSize;
                matrix     = SharpenFilter.GetCore();
                break;

            case ImageHelper.Filter.MotionLeftToRight:
                matrixSize             = MotionFilter.MotionSize;
                MotionFilter.Direction = Direction.LeftToRight;
                matrix = MotionFilter.GetCore();
                break;

            case ImageHelper.Filter.MotionRightToLeft:
                matrixSize             = MotionFilter.MotionSize;
                MotionFilter.Direction = Direction.RightToLeft;
                matrix = MotionFilter.GetCore();
                break;

            default:
                break;
            }

            var result = new double[g.Width, g.Height];

            for (int l = 0; l < g.Height / 2 - matrixSize / 2 - 1; l++)
            {
                for (int k = 0; k < g.Width / 2 - matrixSize / 2 - 1; k++)
                {
                    result[l, k] = 0;
                }
            }

            for (int l = g.Height / 2 + matrixSize / 2; l < g.Height; l++)
            {
                for (int k = g.Width / 2 + matrixSize / 2; k < g.Width; k++)
                {
                    result[l, k] = 0;
                }
            }

            for (int l = g.Height / 2 - matrixSize / 2 - 1; l < g.Height / 2 + matrixSize / 2; l++)
            {
                for (int k = g.Width / 2 - matrixSize / 2 - 1; k < g.Width / 2 + matrixSize / 2; k++)
                {
                    result[l, k] = matrix[l - (g.Height / 2 - matrixSize / 2 - 1), k - (g.Width / 2 - matrixSize / 2 - 1)];
                }
            }

            return(result);
        }
Пример #7
0
        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]);
        }