public unsafe static void ShowTransformedImage(WriteableBitmap image, TransformStrategy transformStrategy, Spectrum spectrum)
        {
            List <List <List <Complex> > > transform = TransformImage(image, transformStrategy);

            SwapQuadrants(transform);
            ShowSpectrum(image, transform, spectrum);
        }
        public unsafe static void ShowFilterEffect(WriteableBitmap image, TransformStrategy transformStrategy, Filter filter)
        {
            List <List <List <Complex> > > transform = TransformImage(image, transformStrategy);

            SwapQuadrants(transform);
            transform.ForEach(x => filter.ApplyFilter(x));
            SwapQuadrants(transform);
            ReverseTransform(transform, transformStrategy);
            SwapImage(image, transform);
        }
        private unsafe static List <List <List <Complex> > > TransformImage(WriteableBitmap image, TransformStrategy transformStrategy)
        {
            image.Lock();
            byte *imagePointer = (byte *)image.BackBuffer;
            int   stride       = image.BackBufferStride;

            List <List <List <Complex> > > transformedImage = new List <List <List <Complex> > >();

            for (int c = 0; c < ImageConstants.numberOfColors; c++)
            {
                List <List <Complex> > colorPlane = new List <List <Complex> >();

                for (int i = 0; i < image.PixelHeight; i++)
                {
                    List <Complex> row = new List <Complex>();

                    for (int j = 0; j < image.PixelWidth; j++)
                    {
                        int index = i * stride + j * ImageConstants.bytesPerPixel + c;
                        row.Add(new Complex(imagePointer[index], 0));
                    }

                    colorPlane.Add(transformStrategy.TransformSignal(row));
                }

                transformedImage.Add(colorPlane);
            }

            for (int c = 0; c < ImageConstants.numberOfColors; c++)
            {
                List <List <Complex> > colorPlane = transformedImage[c];
                for (int i = 0; i < image.PixelWidth; i++)
                {
                    List <Complex> column            = Enumerable.Range(0, colorPlane.Count).Select(x => colorPlane[x][i]).ToList();
                    List <Complex> transformedColumn = transformStrategy.TransformSignal(column);
                    for (int j = 0; j < colorPlane.Count; j++)
                    {
                        colorPlane[j][i] = transformedColumn[j];
                    }
                }
            }

            image.Unlock();

            return(transformedImage);
        }
        private unsafe static void ReverseTransform(List <List <List <Complex> > > transform, TransformStrategy transformStrategy)
        {
            for (int c = 0; c < ImageConstants.numberOfColors; c++)
            {
                List <List <Complex> > colorPlane = transform[c];

                for (int i = 0; i < colorPlane.Count; i++)
                {
                    colorPlane[i] = transformStrategy.ReverseSignalTransform(colorPlane[i]);
                }

                for (int i = 0; i < colorPlane[0].Count; i++)
                {
                    List <Complex> column            = Enumerable.Range(0, colorPlane.Count).Select(x => colorPlane[x][i]).ToList();
                    List <Complex> transformedColumn = transformStrategy.ReverseSignalTransform(column);
                    for (int j = 0; j < colorPlane.Count; j++)
                    {
                        colorPlane[j][i] = transformedColumn[j];
                    }
                }
            }
        }