# FourierFiltering

| Support            | ![](assets/images/sample_programs/applies_to/cpp.svg) ![](assets/images/sample_programs/applies_to/cs.svg) ![](assets/images/sample_programs/applies_to/qt.svg)   |
|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Required licenses  | **EasyImage**                                                                                                                                                     |
| Recommended images | `Samples Images/EasyImage/dirty_switch.tif` and `Samples Images/EasyImage/mask.tif`                                                                               |
| Location           | `Image Processing/FourierFiltering`                                                                                                                               |

## Purpose

This sample program demonstrates how to:

* Compute the direct Fourier transform.
* Compute the inverse Fourier transform.

The process steps are:

1. Load a grayscale image and a mask.
2. Compute the direct Fourier transform on the grayscale image.
3. Apply the mask on the frequency domain of the image using the method `Mask` of the `EFourierImage`.
4. Compute the inverse Fourier transform of this masked frequency image.

![](assets/images/sample_programs/image_processing-fourierfiltering.webp)

## Code highlights

1. Compute the direct Fourier transform.
   ```c++
   EImageBW8 grayscale; // should be already loaded

   EFourierImage frequencyImage(grayscale.GetWidth() * 2, grayscale.GetHeight());
   frequency.SetFrequentialDomainFormat(EFrequentialDomainFormat_ComplexExtended);
 
   EFourierTransformer fourier;
   fourier.DirectTransform(grayscale, frequency);
   frequencyImage.Shift(); // optional, depends on your mask
   ```
2. Mask the image.
   ```c++
   EImageBW8 mask; // should be already loaded

   EFourierImage maskedFrequency;
   frequencyImage.Mask(maskedFrequency, mask);
   maskedFrequency.InverseShift(); // optional, depends on your mask
   ```
3. Compute the inverse Fourier transform.
   ```c++
   EImageBW8 filtered;

   filtered.SetSize(grayscale.GetWidth(),grayscale.GetHeight());
   EFourierTransformer fourier;
   Fourier.InverseTransform(maskedFrequency, filtered);
   ```
4. (Optional) Visualize the frequency image.
   ```c++
   EImageBW8 magnitude(grayscale.GetWidth(), grayscale.GetHeight());
   EImageBW8 phase(grayscale.GetWidth(), grayscale.GetHeight());

   frequencyImage.ComputeMagnitude(magnitude); // magnitude can now be saved or drawn using a draw adapter
   frequencyImage.ComputePhase(phase); // phase can now be saved or drawn using a draw adapter
   ```
