Source code for sigima.proc.image.fourier
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
"""
Fourier computation module
--------------------------
This module implements Fourier transform operations and related spectral analysis tools
for images.
Main features include:
- Forward and inverse Fast Fourier Transform (FFT)
- Magnitude and phase spectrum calculation
- Power spectral density (PSD) computation
Fourier analysis is commonly used for frequency-domain filtering and periodicity
analysis in images.
"""
# pylint: disable=invalid-name # Allows short reference names like x, y, ...
# Note:
# ----
# - All `guidata.dataset.DataSet` parameter classes must also be imported
# in the `sigima.params` module.
# - All functions decorated by `computation_function` must be imported in the upper
# level `sigima.proc.image` module.
from __future__ import annotations
import sigima.tools.image
from sigima.config import _
from sigima.objects.image import ImageObj
from sigima.proc.base import FFTParam, SpectrumParam
from sigima.proc.decorator import computation_function
from sigima.proc.image.base import Wrap1to1Func, dst_1_to_1
# NOTE: Only parameter classes DEFINED in this module should be included in __all__.
# Parameter classes imported from other modules (like sigima.proc.base) should NOT
# be re-exported to avoid Sphinx cross-reference conflicts. The sigima.params module
# serves as the central API point that imports and re-exports all parameter classes.
__all__ = [
"fft",
"ifft",
"magnitude_spectrum",
"phase_spectrum",
"psd",
]
[docs]
@computation_function()
def fft(src: ImageObj, p: FFTParam | None = None) -> ImageObj:
"""Compute FFT with :py:func:`sigima.tools.image.fft2d`
Args:
src: input image object
p: parameters
Returns:
Output image object
"""
if p is None:
p = FFTParam()
dst = dst_1_to_1(src, "fft")
dst.data = sigima.tools.image.fft2d(src.data, shift=p.shift)
dst.save_attr_to_metadata("xunit", "")
dst.save_attr_to_metadata("yunit", "")
dst.save_attr_to_metadata("zunit", "")
dst.save_attr_to_metadata("xlabel", _("Frequency"))
dst.save_attr_to_metadata("ylabel", _("Frequency"))
return dst
[docs]
@computation_function()
def ifft(src: ImageObj, p: FFTParam | None = None) -> ImageObj:
"""Compute inverse FFT with :py:func:`sigima.tools.image.ifft2d`
Args:
src: input image object
p: parameters
Returns:
Output image object
"""
if p is None:
p = FFTParam()
dst = dst_1_to_1(src, "ifft")
dst.data = sigima.tools.image.ifft2d(src.data, shift=p.shift)
dst.restore_attr_from_metadata("xunit", "")
dst.restore_attr_from_metadata("yunit", "")
dst.restore_attr_from_metadata("zunit", "")
dst.restore_attr_from_metadata("xlabel", "")
dst.restore_attr_from_metadata("ylabel", "")
return dst
[docs]
@computation_function()
def magnitude_spectrum(src: ImageObj, p: SpectrumParam | None = None) -> ImageObj:
"""Compute magnitude spectrum
with :py:func:`sigima.tools.image.magnitude_spectrum`
Args:
src: input image object
p: parameters
Returns:
Output image object
"""
decibel = p is not None and p.decibel
dst = dst_1_to_1(src, "magnitude_spectrum", f"dB={decibel}")
dst.data = sigima.tools.image.magnitude_spectrum(src.data, log_scale=decibel)
dst.xunit = dst.yunit = dst.zunit = ""
dst.xlabel = dst.ylabel = _("Frequency")
return dst
[docs]
@computation_function()
def phase_spectrum(src: ImageObj) -> ImageObj:
"""Compute phase spectrum
with :py:func:`sigima.tools.image.phase_spectrum`
Args:
src: input image object
Returns:
Output image object
"""
dst = Wrap1to1Func(sigima.tools.image.phase_spectrum)(src)
dst.xunit = dst.yunit = dst.zunit = ""
dst.xlabel = dst.ylabel = _("Frequency")
return dst
[docs]
@computation_function()
def psd(src: ImageObj, p: SpectrumParam | None = None) -> ImageObj:
"""Compute power spectral density
with :py:func:`sigima.tools.image.psd`
Args:
src: input image object
p: parameters
Returns:
Output image object
"""
decibel = p is not None and p.decibel
dst = dst_1_to_1(src, "psd", f"dB={decibel}")
dst.data = sigima.tools.image.psd(src.data, log_scale=decibel)
dst.xunit = dst.yunit = dst.zunit = ""
dst.xlabel = dst.ylabel = _("Frequency")
return dst