Skip to content

High-performance digital image processing with CUDA's Fast Fourier Transform and frequency-domain filtering

Notifications You must be signed in to change notification settings

hilbertcube/Frequency-Domain

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Frequency Domain

GPU-accelerated image processing using CUDA and cuFFT for frequency domain filtering and restoration.

** Still in development **

Features

Frequency Domain Filters

  • Low-Pass Filters: Noise reduction and smoothing
  • High-Pass Filters: Edge enhancement and sharpening
  • Band-Pass Filters: Specific frequency range isolation
  • Band-Reject Filters: Notch filtering for specific frequency removal

Filter Types

Each filter mode supports three implementation types:

  • Ideal: Sharp cutoff (may cause ringing artifacts)
  • Gaussian: Smooth transition (best for most cases)
  • Butterworth: Configurable sharpness (adjustable order)

Image Restoration Techniques

  • Unsharp Masking: Advanced edge enhancement
  • Noise Reduction: Remove high-frequency noise
  • Edge Detection: Extract edge information
  • Frequency Band Enhancement: Target specific patterns

Structure

src/
├── cuda_utils.cuh           # CUDA error checking, DeviceBuffer wrapper
├── image_gpu.cuh            # Image loading/saving with stb_image
├── image_conversion.cuh     # Image <-> Complex conversions, FFT utilities
├── frequency_filters.cuh    # All frequency domain filter kernels
├── image_restoration.cuh    # High-level restoration API
├── fft.cuh                  # FFT wrapper functions
├── scale.cuh                # FFT scaling utilities
└── ...

Quick Start

Basic Usage Example

#include "src/image_restoration.cuh"

int main() {
    // Load input image
    Image input("input.png");
    Image output(input.width, input.height, 1);
    
    // Configure filter parameters
    FilterParams params;
    params.type = FilterType::GAUSSIAN;
    params.cutoff_freq = 50.0f;
    
    // Apply low-pass filter for noise reduction
    ImageRestoration::restoreImage(input, output, 
                                   RestorationMode::LOW_PASS, params);
    
    // Save result
    stbi_write_png("output.png", output.width, output.height, 1, 
                   output.image_data, output.width);
    
    return 0;
}

Advanced: Unsharp Masking

FilterParams params;
params.unsharp_amount = 1.5f;  // Enhancement strength
params.unsharp_radius = 30.0f; // Blur radius

ImageRestoration::unsharpMask(input, output, params);

Using Different Filter Types

// Ideal filter (sharp cutoff)
params.type = FilterType::IDEAL;
params.cutoff_freq = 50.0f;

// Butterworth filter (customizable)
params.type = FilterType::BUTTERWORTH;
params.cutoff_freq = 50.0f;
params.butterworth_order = 2;  // Higher = sharper transition

// Gaussian filter (smooth)
params.type = FilterType::GAUSSIAN;
params.cutoff_freq = 50.0f;

Band-Pass Filtering

FilterParams params;
params.type = FilterType::GAUSSIAN;
params.low_freq = 20.0f;
params.high_freq = 60.0f;
params.center_freq = 40.0f;
params.bandwidth = 20.0f;

ImageRestoration::restoreImage(input, output, 
                               RestorationMode::BAND_PASS, params);

API Reference

RestorationMode Enum

  • LOW_PASS - Smooth/blur, remove high frequencies
  • HIGH_PASS - Sharpen, remove low frequencies
  • BAND_PASS - Keep only specific frequency range
  • BAND_REJECT - Remove specific frequency range
  • UNSHARP_MASK - Advanced sharpening technique

FilterType Enum

  • IDEAL - Sharp cutoff (ideal filter)
  • GAUSSIAN - Smooth Gaussian rolloff
  • BUTTERWORTH - Configurable transition steepness

FilterParams Structure

struct FilterParams {
    FilterType type;              // Filter implementation type
    float cutoff_freq;            // Cutoff frequency (low/high-pass)
    float low_freq;               // Band-pass lower bound
    float high_freq;              // Band-pass upper bound
    float center_freq;            // Band-pass center
    float bandwidth;              // Band-pass width
    int butterworth_order;        // Butterworth filter order
    float unsharp_amount;         // Unsharp mask strength
    float unsharp_radius;         // Unsharp mask blur radius
};

ImageRestoration Class

Main Methods

// Full restoration pipeline
static void restoreImage(const Image& input, Image& output,
                        RestorationMode mode, const FilterParams& params);

// Specialized unsharp masking
static void unsharpMask(const Image& input, Image& output, 
                       const FilterParams& params);

// Apply filter to frequency domain data (advanced)
static void applyFilter(cufftComplex* d_freq_data, int width, int height,
                       RestorationMode mode, const FilterParams& params);

Low-Level API

For advanced users who want direct access to kernels:

Image Conversion (image_conversion.cuh)

// Convert image to complex for FFT
__global__ void imageToComplex(unsigned char* img_data, 
                              cufftComplex* complex_data,
                              int width, int height, int channels);

// Convert complex back to image
__global__ void complexToImage(cufftComplex* complex_data, 
                              unsigned char* image_data, 
                              int width, int height);

// Center frequency spectrum
__global__ void fftShift(cufftComplex* data, cufftComplex* output, 
                        int width, int height);

Frequency Filters (frequency_filters.cuh)

// Low-pass filters
__global__ void idealLowPassFilter(cufftComplex* freq_data, ...);
__global__ void gaussianLowPassFilter(cufftComplex* freq_data, ...);
__global__ void butterworthLowPassFilter(cufftComplex* freq_data, ...);

// High-pass filters
__global__ void idealHighPassFilter(cufftComplex* freq_data, ...);
__global__ void gaussianHighPassFilter(cufftComplex* freq_data, ...);
__global__ void butterworthHighPassFilter(cufftComplex* freq_data, ...);

// Band-pass filters
__global__ void idealBandPassFilter(cufftComplex* freq_data, ...);
__global__ void gaussianBandPassFilter(cufftComplex* freq_data, ...);
__global__ void butterworthBandPassFilter(cufftComplex* freq_data, ...);

// Band-reject filter
__global__ void bandRejectFilter(cufftComplex* freq_data, ...);

Building

Prerequisites

  • CUDA Toolkit (11.0+)
  • CMake (3.18+)
  • C++ compiler with C++14 support

Compilation

mkdir build
cd build
cmake ..
cmake --build . --config Release

Running Examples

# Run the demonstration program
./sharpening images/input.png

# Output will be in images/restored/

Examples Output

The sharpening.cu demonstration program generates:

Noise Reduction (Low-Pass):

  • lowpass_gaussian.png - Smooth noise reduction
  • lowpass_butterworth.png - Controlled transition
  • lowpass_ideal.png - Sharp cutoff

Edge Enhancement (High-Pass):

  • highpass_gaussian.png - Smooth edge enhancement
  • highpass_butterworth.png - Adjustable sharpness
  • highpass_ideal.png - Maximum sharpness

Band-Pass Filtering:

  • bandpass_gaussian.png - Specific frequency range
  • bandpass_butterworth.png - Controlled band selection
  • bandpass_ideal.png - Sharp band isolation

Unsharp Masking:

  • unsharp_light.png - Subtle enhancement (1.2x)
  • unsharp_medium.png - Moderate enhancement (1.5x)
  • unsharp_strong.png - Strong enhancement (2.0x)

Usage & Performance Tips

  1. Use Gaussian filters for general purposes (smooth, no ringing)
  2. Adjust cutoff frequencies based on image size (larger images need higher values)
  3. Butterworth order: 2-4 is usually optimal
  4. Unsharp masking: Start with amount=1.5, radius=30 and adjust
  5. Memory: All operations use GPU memory for maximum performance

Theory

Frequency Domain Filtering

Images are transformed to frequency domain using 2D FFT, where:

  • Low frequencies = smooth regions, overall structure
  • High frequencies = edges, fine details, noise

Filtering in frequency domain is multiplication, which corresponds to convolution in spatial domain.

Filter Characteristics

  • Ideal: H(u,v) = 1 inside cutoff, 0 outside (sharp but ringing)
  • Gaussian: H(u,v) = exp(-D²/2σ²) (smooth, no ringing)
  • Butterworth: H(u,v) = 1/(1+(D/D₀)^2n) (adjustable smoothness)

Where D is distance from frequency center.

License

You can do whatever you want LICENSE

References

  • Rafael C. Gonzalez & Richard E. Woods, "Digital Image Processing"
  • NVIDIA cuFFT Documentation
  • stb_image library by Sean Barrett

About

High-performance digital image processing with CUDA's Fast Fourier Transform and frequency-domain filtering

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published