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(); }
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)}"); }
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; }
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()); }
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()); }
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); }
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]); }