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