0% found this document useful (0 votes)
13 views27 pages

BSP Assgmt

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views27 pages

BSP Assgmt

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

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

You might also like