protected override void ProcessImage(object sender) { try { this.CheckInputs(); Bitmap input = this.WorkspaceViewModel.Input; this.Width = input.Width / 2; this.Height = input.Height / 2; Complex[,] redFourier = FFT.FFT2(input, PixelSelector.Red); Complex[,] greenFourier = FFT.FFT2(input, PixelSelector.Green); Complex[,] blueFourier = FFT.FFT2(input, PixelSelector.Blue); Complex redConstElement = redFourier[0, 0].Clone(); Complex greenConstElement = greenFourier[0, 0].Clone(); Complex blueCosntElement = blueFourier[0, 0].Clone(); FFT.ReverseQuarters(redFourier); FFT.ReverseQuarters(greenFourier); FFT.ReverseQuarters(blueFourier); int[,] redPhase = FFT.GetPhaseShiftSpectrum(redFourier); int[,] greenPhase = FFT.GetPhaseShiftSpectrum(greenFourier); int[,] bluePhase = FFT.GetPhaseShiftSpectrum(blueFourier); Task.Run(() => { Application.Current.Dispatcher.Invoke(delegate { ImageView imageView = new ImageView("Phase shift spectrum", this.GetImageFromChannels(redPhase, greenPhase, bluePhase)); imageView.Show(); }); }); int[,] redAmplitude = FFT.GetAmplitudeSpectrum(redFourier); int[,] greenAmplitude = FFT.GetAmplitudeSpectrum(greenFourier); int[,] blueAmplitude = FFT.GetAmplitudeSpectrum(blueFourier); Task.Run(() => { Application.Current.Dispatcher.Invoke(delegate { ImageView imageView = new ImageView("Amplitude spectrum", this.GetImageFromChannels(redAmplitude, greenAmplitude, blueAmplitude)); imageView.Show(); }); }); this.ProcessChannel(redFourier); this.ProcessChannel(greenFourier); this.ProcessChannel(blueFourier); this.DisplayMask(redFourier); FFT.ReverseQuarters(redFourier); FFT.ReverseQuarters(greenFourier); FFT.ReverseQuarters(blueFourier); redFourier[0, 0] = redConstElement; greenFourier[0, 0] = greenConstElement; blueFourier[0, 0] = blueCosntElement; int[,] red = FFT.IFFT2(redFourier); int[,] blue = FFT.IFFT2(blueFourier); int[,] green = FFT.IFFT2(greenFourier); Bitmap output = this.GetImageFromChannels(red, green, blue); for (int i = 0; i < input.Width; i++) { for (int j = 0; j < input.Height; j++) { output.SetPixel(i, j, Color.FromArgb(red[i, j], green[i, j], blue[i, j])); } } this.WorkspaceViewModel.Output = output; } catch (Exception e) { Notify.Error(e.Message); } }