コード例 #1
0
        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);
            }
        }