Nyquist Theorem for Images
The Nyquist theorem applies to images too — not just audio. In images, it is about sampling spatial detail, not time.
Simple Explanation
The Nyquist theorem states that to accurately represent an image without losing detail, the sampling rate must be at least twice the highest spatial frequency.
What is Spatial Frequency?
Spatial frequency means how quickly pixel values change across the image.
- High spatial frequency = sharp edges, fine details
- Low spatial frequency = smooth areas
Meaning in Image Terms
If the image has very fine details, you need more pixels to capture them correctly. If you don’t sample enough pixels, aliasing happens (weird patterns, jagged edges, moiré).
Nyquist Rule for Images
If the highest detail frequency is f, then:
sampling rate ≥ 2f
In image terms:
pixels per unit distance ≥ 2 × (cycles per unit distance)
Real-World Meaning
- Camera sensor: must have enough pixels (resolution) to capture the detail
- Display: must have enough pixels to show it
What Happens if Nyquist is Violated?
You get aliasing, such as:
- Jagged edges
- Moiré patterns
- Staircase lines
How to Avoid Aliasing
- Use an anti-aliasing filter (removes high-frequency detail before sampling)
- Use higher resolution (more pixels = higher sampling rate)
Summary
| Concept | Image Meaning |
|---|---|
| Sampling | Pixels in the image |
| Frequency | Detail level / edge density |
| Nyquist limit | Need at least 2 pixels per detail cycle |
| Violation | Aliasing (jagged lines) |
How to Calculate Spatial Frequency from Real Images
You can calculate spatial frequency from real images using two methods: a simple visual estimate or a precise Fourier Transform (FFT) approach.
Method 1: Estimate from Repeating Patterns (Simple)
If the image has repeating lines or stripes, you can measure the distance between repeats.
Example: If stripes repeat every 5 pixels, then:
frequency = 1 / period = 1 / 5 = 0.2 cycles/pixel
Steps:
- Open the image
- Zoom in to see repeating pattern clearly
- Measure distance between two repeating points (in pixels)
Method 2: Use FFT (Fast Fourier Transform)
FFT converts the image from space domain to frequency domain. It shows which frequencies exist and how strong they are.
Example Python code using OpenCV:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Load image as grayscale
img = cv2.imread('image.jpg', 0)
# Apply FFT
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# Magnitude spectrum
magnitude = 20 * np.log(np.abs(fshift))
plt.imshow(magnitude, cmap='gray')
plt.title('Frequency Domain')
plt.show()
In the FFT output: center = low frequency (smooth areas) bright spots far from center = high frequency details
Convert FFT Distance to Real Units
If you know:
- Image pixel size (mm/pixel)
- Image resolution
You can convert distance to frequency using:
f = d / (N × Î”x)
Where:
- d = distance from center in FFT
- N = image size in pixels
- Δx = mm per pixel
Example:
If image is 1000 pixels wide, pixel size = 0.01 mm/pixel, and d = 250:
f = 250 / (1000 × 0.01) = 25 cycles/mm
Summary
- Simple method: measure repeating pattern distance → frequency = 1/period
- Accurate method: use FFT → find highest frequency peak → convert to cycles/mm
Want help?
If you want, I can help you:
- Run FFT on your image
- Extract highest frequency automatically
- Provide code for MATLAB / Python / OpenCV
MATLAB Example: Finding Spatial Frequency Using FFT
The following MATLAB code demonstrates how to generate a simple sinusoidal image, compute its Fourier Transform, and determine the highest spatial frequency present. Comments are written in plain language for clarity.
% Define the physical size of each pixel and the overall image size
pixelSize_mm = 0.01; % millimeters per pixel
N = 64; % image will be N x N pixels
% Create coordinate grids for the image
[x, y] = meshgrid(1:N, 1:N);
% Generate a sinusoidal pattern with a known spatial frequency
freq = 2; % spatial frequency in cycles/mm
img = 128 + 127 * sin(2*pi*freq*x*pixelSize_mm);
% Ensure image is in double precision for accurate calculations
img = double(img);
% If the image is RGB, convert to grayscale
if size(img,3) == 3
img = rgb2gray(img);
end
% Compute the 2D Fast Fourier Transform of the image
F = fft2(img);
Fshift = fftshift(F);
% Compute the magnitude spectrum for visualization
mag = abs(Fshift);
% Determine the size of the image
[M, N] = size(img);
% Remove the center (DC) component for peak detection
centerRow = ceil(M/2);
centerCol = ceil(N/2);
mag(centerRow, centerCol) = 0;
% Locate the position of the highest frequency peak
[maxVal, idx] = max(mag(:));
[row, col] = ind2sub(size(mag), idx);
% Convert pixel distances to spatial frequency in cycles/mm
fx = (col - centerCol) / (N * pixelSize_mm);
fy = (row - centerRow) / (M * pixelSize_mm);
f_max = sqrt(fx^2 + fy^2);
% Display the highest spatial frequency
fprintf('Highest spatial frequency: %.2f cycles/mm\n', f_max);
% Visualize the frequency spectrum
figure;
imagesc(log(1 + mag));
colormap gray;
axis image;
colorbar;
title('Log Magnitude Spectrum');
% Visualize the original sinusoidal image
figure;
imagesc(img);
colormap gray;
axis image;
colorbar;
title('Input Sinusoidal Image');
This example shows how to simulate an image with a known spatial frequency, use FFT to analyze its frequency content, and visualize both the original image and its spectrum. This is useful for understanding how sampling rates affect image detail and for verifying the Nyquist theorem in practice.