19ECE455
BIOMEDICAL SIGNAL PROCESSING
ASSIGNMENT - 1
Akshaya (CB.EN.U4ECE22006)
MARCH 31, 2025
ECE
Amrita Vishwa Vidyapeetham
Akshaya, CB.EN.U4ECE22006
19ECE455
BIOMEDICAL SIGNAL PROCESSING - SIMULATION ASSIGNMENT 1
Q1) Write a python program to apply suitable spatial filtering to remove the noise for
the below various noisy images and write the inference.
{SOLUTION}
FIG1: SPATIAL FILTERING FOR RICIAN NOISE
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import img_as_float
from skimage.restoration import denoise_nl_means, estimate_sigma
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Rician_Noise.png"
noisy_img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
noisy_img = img_as_float(noisy_img) # Convert to float for processing
sigma_est = np.mean(estimate_sigma(noisy_img))
h_values = [0.03, 0.05, 0.10]
fig, ax = plt.subplots(1, 4, figsize=(15, 5))
ax[0].imshow(noisy_img, cmap='gray')
ax[0].set_title("Noisy Image")
1|Page
Akshaya, CB.EN.U4ECE22006
ax[0].axis("off")
for i, h in enumerate(h_values):
denoised_img = denoise_nl_means(
noisy_img, h=h, fast_mode=True,
patch_size=5, patch_distance=6, channel_axis=None
)
ax[i+1].imshow(denoised_img, cmap='gray')
ax[i+1].set_title(f"Denoised (h={h})")
ax[i+1].axis("off")
plt.tight_layout()
plt.show()
Output:
________________________________________________________________
FIG2: SPATIAL FILTERING FOR SALT AND PEPPER NOISE
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
2|Page
Akshaya, CB.EN.U4ECE22006
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import img_as_float
from skimage.restoration import denoise_nl_means
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\SaltPepper_Noise.png"
noisy_img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
noisy_img = img_as_float(noisy_img) # Convert to float for processing
kernel_sizes = [5, 7,9]
fig, ax = plt.subplots(1, 4, figsize=(15, 5))
ax[0].imshow(noisy_img, cmap='gray')
ax[0].set_title("Noisy Image")
ax[0].axis("off")
for i, k in enumerate(kernel_sizes):
denoised_img = cv2.medianBlur((noisy_img * 255).astype(np.uint8), k)
ax[i+1].imshow(denoised_img, cmap='gray')
ax[i+1].set_title(f"Denoised (k={k})")
ax[i+1].axis("off")
plt.tight_layout()
plt.show()
Output:
________________________________________________________________
3|Page
Akshaya, CB.EN.U4ECE22006
FIG3: SPATIAL FILTERING FOR GAUSSIAN NOISE
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import img_as_float
from skimage.filters import gaussian
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Gaussian_Noise.png"
noisy_img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
noisy_img = img_as_float(noisy_img) # Convert to float for processing
sigma_values = [0.7, 1.3, 1.7]
fig, ax = plt.subplots(1, 4, figsize=(15, 5))
ax[0].imshow(noisy_img, cmap='gray')
ax[0].set_title("Noisy Image")
ax[0].axis("off")
for i, sigma in enumerate(sigma_values):
denoised_img = gaussian(noisy_img, sigma=sigma)
ax[i+1].imshow(denoised_img, cmap='gray')
ax[i+1].set_title(f"Denoised (σ={sigma})")
4|Page
Akshaya, CB.EN.U4ECE22006
ax[i+1].axis("off")
plt.tight_layout()
plt.show()
Output:
________________________________________________________________
FIG4: SPATIAL FILTERING FOR PERIODIC NOISE
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
def remove_periodic_noise(image_path, kernel_sizes):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
print("Error: Unable to load image.")
5|Page
Akshaya, CB.EN.U4ECE22006
return
fig, axes = plt.subplots(len(kernel_sizes), 3, figsize=(15, 10))
for i, k in enumerate(kernel_sizes):
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
rows, cols = image.shape
crow, ccol = rows // 2 , cols // 2
mask = np.ones((rows, cols), np.uint8)
r=k
mask[crow-r:crow+r, ccol-r:ccol+r] = 0
fshift_filtered = fshift * mask
f_ishift = np.fft.ifftshift(fshift_filtered)
image_filtered = np.fft.ifft2(f_ishift)
image_filtered = np.abs(image_filtered)
axes[i, 0].imshow(image, cmap='gray')
axes[i, 0].set_title("Original Image")
axes[i, 0].axis('off')
axes[i, 1].imshow(magnitude_spectrum, cmap='gray')
axes[i, 1].set_title(f"Magnitude Spectrum (Kernel {k})")
axes[i, 1].axis('off')
axes[i, 2].imshow(image_filtered, cmap='gray')
axes[i, 2].set_title(f"Filtered Image (Kernel {k})")
axes[i, 2].axis('off')
plt.tight_layout()
plt.show()
kernel_sizes = [3, 9, 12]
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Periodic_Noise.png"
remove_periodic_noise(image_path, kernel_sizes)
6|Page
Akshaya, CB.EN.U4ECE22006
Output:
________________________________________________________________
FIG5: SPATIAL FILTERING FOR SPECKLE NOISE
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
7|Page
Akshaya, CB.EN.U4ECE22006
@author: subramanian
"""
import cv2
import cv2
import numpy as np
import matplotlib.pyplot as plt
def remove_speckle_noise(image_path, kernel_sizes):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
print("Error: Unable to load image.")
return
fig, axes = plt.subplots(len(kernel_sizes), 3, figsize=(15, 10))
for i, k in enumerate(kernel_sizes):
gaussian_filtered = cv2.GaussianBlur(image, (k, k), 0)
median_filtered = cv2.medianBlur(image, k)
bilateral_filtered = cv2.bilateralFilter(image, k, 75, 75)
axes[i, 0].imshow(gaussian_filtered, cmap='gray')
axes[i, 0].set_title(f"Gaussian Filter (Kernel {k})")
axes[i, 0].axis('off')
axes[i, 1].imshow(median_filtered, cmap='gray')
axes[i, 1].set_title(f"Median Filter (Kernel {k})")
axes[i, 1].axis('off')
axes[i, 2].imshow(bilateral_filtered, cmap='gray')
axes[i, 2].set_title(f"Bilateral Filter (Kernel {k})")
axes[i, 2].axis('off')
plt.tight_layout()
plt.show()
kernel_sizes = [5, 7, 9]
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Speckle_Noise.png"
remove_speckle_noise(image_path, kernel_sizes)
8|Page
Akshaya, CB.EN.U4ECE22006
Output:
________________________________________________________________
Q2) Write a program in Python to explore different methods for improving the visual
quality of the below medical images.
{SOLUTION}
FIG6: Image Negative
9|Page
Akshaya, CB.EN.U4ECE22006
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
def apply_image_negative(image_path):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
print("Error: Unable to load image.")
return
image_negative = 255 - image
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(image, cmap='gray')
axes[0].set_title("Original Image")
axes[0].axis('off')
axes[1].imshow(image_negative, cmap='gray')
axes[1].set_title("Image Negative")
axes[1].axis('off')
plt.tight_layout()
plt.show()
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig6.png"
apply_image_negative(image_path)
10 | P a g e
Akshaya, CB.EN.U4ECE22006
Output:
________________________________________________________________
FIG7: Image Thresholding
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig7.png"
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
11 | P a g e
Akshaya, CB.EN.U4ECE22006
_, binary_thresh = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
_, otsu_thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
adaptive_thresh = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
plt.figure(figsize=(12, 5))
plt.subplot(1, 4, 1)
plt.imshow(image, cmap='gray')
plt.title("Original Image")
plt.axis("off")
plt.subplot(1, 4, 2)
plt.imshow(binary_thresh, cmap='gray')
plt.title("Global Thresholding")
plt.axis("off")
plt.subplot(1, 4, 3)
plt.imshow(otsu_thresh, cmap='gray')
plt.title("Otsu's Thresholding")
plt.axis("off")
plt.subplot(1, 4, 4)
plt.imshow(adaptive_thresh, cmap='gray')
plt.title("Adaptive Thresholding")
plt.axis("off")
plt.show()
Output:
________________________________________________________________
12 | P a g e
Akshaya, CB.EN.U4ECE22006
FIG8: Image Grey Level Slicing with Background
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig8.png"
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
min_gray = 110
max_gray = 200
highlight_value = 255
sliced_image = np.where((image >= min_gray) & (image <= max_gray), highlight_value, image)
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(image, cmap='gray')
plt.title("Original Image")
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(sliced_image, cmap='gray')
plt.title("Gray Level Slicing with Background")
13 | P a g e
Akshaya, CB.EN.U4ECE22006
plt.axis("off")
plt.show()
Output:
________________________________________________________________
FIG9: CONTRAST STRETCHING
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig9.png"
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
min_pixel = 109
14 | P a g e
Akshaya, CB.EN.U4ECE22006
max_pixel = 200
stretched_image = np.clip((image - min_pixel) * (255 / (max_pixel - min_pixel)), 0,
255).astype(np.uint8)
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title("Original Image")
plt.axis("off")
plt.subplot(1, 2, 2)
plt.imshow(stretched_image, cmap='gray')
plt.title("Enhanced Contrast Stretched Image")
plt.axis("off")
plt.show()
Output:
________________________________________________________________
FIG10:HISTOGRAM PROCESSING
15 | P a g e
Akshaya, CB.EN.U4ECE22006
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
def histogram_equalization(image_path):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
equalized = cv2.equalizeHist(image)
return image, equalized
def adaptive_histogram_equalization(image_path, clip_limit=3.0, tile_grid_size=(8, 8)):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=tile_grid_size)
clahe_image = clahe.apply(image)
return image, clahe_image
def plot_images_with_histograms(original, processed, title1="Original", title2="Processed"):
plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1)
plt.imshow(original, cmap='gray')
plt.title(title1)
plt.axis("off")
plt.subplot(2, 2, 2)
plt.imshow(processed, cmap='gray')
plt.title(title2)
plt.axis("off")
plt.subplot(2, 2, 3)
plt.hist(original.ravel(), bins=256, range=[0,256], color='blue', alpha=0.7)
plt.title(f"Histogram of {title1}")
plt.subplot(2, 2, 4)
16 | P a g e
Akshaya, CB.EN.U4ECE22006
plt.hist(processed.ravel(), bins=256, range=[0,256], color='red', alpha=0.7)
plt.title(f"Histogram of {title2}")
plt.show()
if __name__ == "__main__":
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig10.png"
original, equalized = histogram_equalization(image_path)
plot_images_with_histograms(original, equalized, "Original Image", "Histogram Equalized
Image")
original, clahe_image = adaptive_histogram_equalization(image_path, clip_limit=3.0)
plot_images_with_histograms(original, clahe_image, "Original Image", "CLAHE Enhanced
Image")
Output:
________________________________________________________________
FIG11: LOG TRANSFORMATION
17 | P a g e
Akshaya, CB.EN.U4ECE22006
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
def log_transformation(image_path):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
print("Error: Unable to load image.")
return
c = 255 / np.log(1 + np.max(image))
log_image = c * np.log(1 + image.astype(np.float32))
log_image = np.uint8(log_image)
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title("Original Image")
plt.imshow(image, cmap='gray')
plt.axis("off")
plt.subplot(1, 2, 2)
plt.title("Log Transformed Image")
plt.imshow(log_image, cmap='gray')
plt.axis("off")
plt.show()
log_transformation(r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig11.png")
18 | P a g e
Akshaya, CB.EN.U4ECE22006
Output:
________________________________________________________________
FIG12: INVERSE LOG
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
def log_transformation(image_path):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
print("Error: Unable to load image.")
return
c = 255 / np.log(1 + np.max(image))
19 | P a g e
Akshaya, CB.EN.U4ECE22006
log_image = c * np.log(1 + image.astype(np.float32))
log_image = np.uint8(log_image)
inv_log_image = np.exp(image.astype(np.float32) / c) - 1
inv_log_image = np.uint8(inv_log_image)
plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
plt.title("Original Image")
plt.imshow(image, cmap='gray')
plt.axis("off")
plt.subplot(1, 3, 2)
plt.title("Log Transformed Image")
plt.imshow(log_image, cmap='gray')
plt.axis("off")
plt.subplot(1, 3, 3)
plt.title("Inverse Log Transformed Image")
plt.imshow(inv_log_image, cmap='gray')
plt.axis("off")
plt.show()
log_transformation(r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig12.png")
Output:
________________________________________________________________
FIG13: POWER LAW TRANSFORMATION
20 | P a g e
Akshaya, CB.EN.U4ECE22006
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
def power_law_transformation(image_path, gamma):
try:
img = Image.open(image_path).convert('L')
img_array = np.array(img)
normalized_img = img_array / 255.0
transformed_img = np.power(normalized_img, gamma)
transformed_img = (transformed_img * 255).astype(np.uint8)
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(img_array, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(transformed_img, cmap='gray')
plt.title(f'Power Law Transformation (gamma={gamma})')
plt.axis('off')
plt.show()
except FileNotFoundError:
print(f"Error: Image file not found at {image_path}")
except Exception as e:
print(f"An error occurred: {e}")
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig13.png"
21 | P a g e
Akshaya, CB.EN.U4ECE22006
gamma_value = 0.6
power_law_transformation(image_path, gamma_value)
Output:
________________________________________________________________
FIG14: BIT PLANE SLICING
Source Code:
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:45:17 2025
@author: subramanian
"""
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
def bit_plane_slicing(image_path, bit_planes_to_display=None):
22 | P a g e
Akshaya, CB.EN.U4ECE22006
try:
img = Image.open(image_path).convert('L')
img_array = np.array(img)
rows, cols = img_array.shape
bit_planes = []
for bit in range(8):
bit_plane = np.zeros((rows, cols), dtype=np.uint8)
for i in range(rows):
for j in range(cols):
if (img_array[i, j] >> bit) & 1:
bit_plane[i, j] = 255
bit_planes.append(bit_plane)
if bit_planes_to_display is None:
bit_planes_to_display = list(range(8))
num_planes = len(bit_planes_to_display)
plt.figure(figsize=(15, 5))
for i, plane_index in enumerate(bit_planes_to_display):
plt.subplot(1, num_planes, i + 1)
plt.imshow(bit_planes[plane_index], cmap='gray')
plt.title(f'Bit Plane {plane_index}')
plt.axis('off')
plt.show()
except FileNotFoundError:
print(f"Error: Image file not found at {image_path}")
except Exception as e:
print(f"An error occurred: {e}")
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig14.png"
bit_plane_slicing(image_path)
Output:
23 | P a g e
Akshaya, CB.EN.U4ECE22006
________________________________________________________________
FIG15: IMAGE MASKING
Source Code:
# -*- coding: utf-8 -*-
"""Created on Mon Mar 31 10:45:17 2025
@author: subramanian"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
def process_image(image_path):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
print("Error: Unable to read the image.")
return
laplacian = cv2.Laplacian(image, cv2.CV_64F)
laplacian = np.uint8(np.absolute(laplacian))
sharpened_laplacian = cv2.addWeighted(image, 1.5, laplacian, -0.5, 0)
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
sobel_magnitude = np.sqrt(sobel_x*2 + sobel_y*2)
24 | P a g e
Akshaya, CB.EN.U4ECE22006
sobel_magnitude = np.uint8(np.absolute(sobel_magnitude))
smoothed_sobel = cv2.GaussianBlur(sobel_magnitude, (5, 5), 0)
mask_image = cv2.multiply(sobel_magnitude, smoothed_sobel)
final_sharpened = cv2.addWeighted(image, 1.5, mask_image, -0.5, 0)
plt.figure(figsize=(15, 10))
plt.subplot(2, 3, 1)
plt.title("Original Image")
plt.imshow(image, cmap='gray')
plt.axis("off")
plt.subplot(2, 3, 2)
plt.title("Laplacian Image")
plt.imshow(laplacian, cmap='gray')
plt.axis("off")
plt.subplot(2, 3, 3)
plt.title("Sharpened (Laplacian)")
plt.imshow(sharpened_laplacian, cmap='gray')
plt.axis("off")
plt.subplot(2, 3, 4)
plt.title("Sobel Magnitude")
plt.imshow(sobel_magnitude, cmap='gray')
plt.axis("off")
plt.subplot(2, 3, 5)
plt.title("Smoothed Sobel")
plt.imshow(smoothed_sobel, cmap='gray')
plt.axis("off")
plt.subplot(2, 3, 6)
plt.title("Final Sharpened Image")
plt.imshow(final_sharpened, cmap='gray')
plt.axis("off")
plt.show()
image_path = r"C:\Users\subramanian\Desktop\SEM 6\19ECE455- Biomedical Signal
Processing\New folder\Fig15.png"
process_image(image_path)
25 | P a g e
Akshaya, CB.EN.U4ECE22006
Output:
________________________________________________________________
26 | P a g e