Gaussian Noise & Filtering

Theory

Gaussian noise is a type of statistical noise where pixel intensity variations follow a normal (Gaussian) distribution. It commonly simulates sensor noise in digital images. To reduce Gaussian noise, various filters are applied:

  • Mean Filter: Smoothens the image by averaging pixel values in a neighborhood.
  • Gaussian Filter: Weighted averaging giving more importance to central pixels.
  • Geometric Mean Filter: Reduces noise while better preserving edges compared to arithmetic mean.

Python Code


import cv2
import numpy as np
import matplotlib.pyplot as plt

def add_gaussian_noise(image, mean=0, sigma=50):
    row, col, ch = image.shape
    gauss = np.random.normal(mean, sigma, (row, col, ch))
    noisy_image = np.clip(image + gauss, 0, 255)
    return noisy_image.astype(np.uint8)

def geometric_mean_filter(image, kernel_size):
    height, width, channels = image.shape
    output_image = np.copy(image)
    offset = kernel_size // 2
    for i in range(offset, height - offset):
        for j in range(offset, width - offset):
            for c in range(channels):
                kernel = image[i - offset:i + offset + 1, j - offset:j + offset + 1, c]
                flattened = kernel.flatten().astype(np.float64)
                flattened[flattened == 0] = 1
                geom_mean = np.exp(np.mean(np.log(flattened)))
                output_image[i, j, c] = np.clip(geom_mean, 0, 255)
    return output_image.astype(np.uint8)

# Load image
image = cv2.imread('assets/bird.png')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Add Gaussian noise
noisy_image = add_gaussian_noise(image)

# Apply filters
mean_filtered = cv2.blur(noisy_image, (5, 5))
gaussian_filtered = cv2.GaussianBlur(noisy_image, (3, 3), 1)
gm_filtered = geometric_mean_filter(noisy_image, 3)

# Display results
plt.figure(figsize=(12, 8))
plt.subplot(2,3,1); plt.imshow(image); plt.title("Original"); plt.axis("off")
plt.subplot(2,3,2); plt.imshow(noisy_image); plt.title("Noisy Image"); plt.axis("off")
plt.subplot(2,3,3); plt.imshow(mean_filtered); plt.title("Mean Filtered"); plt.axis("off")
plt.subplot(2,3,4); plt.imshow(gaussian_filtered); plt.title("Gaussian Filtered"); plt.axis("off")
plt.subplot(2,3,5); plt.imshow(gm_filtered); plt.title("Geometric Mean Filter"); plt.axis("off")
plt.tight_layout()
plt.show()
        

Output

Gaussian Noise Filtering Example