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