# Task 1: import cv2 import numpy as np import matplotlib.pyplot as plt import os # Optional: print working directory print("Current working directory:", os.getcwd()) # Task 1: # Load image using full path img = cv2.imread(r'F:\Img_Processing\Lab2\image2.jpg') if img is None: raise FileNotFoundError("Could not load image.") # Convert to grayscale img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Display image and histogram side by side plt.figure(figsize=(10, 4)) plt.subplot(1, 2, 1) plt.title('Grayscale Image') plt.imshow(img, cmap='gray') plt.axis('off') plt.subplot(1, 2, 2) plt.title('Histogram') hist = cv2.calcHist([img], [0], None, [256], [0, 256]) plt.plot(hist) plt.tight_layout() plt.show() # Task 2: # Apply 3 filters and display with original avg_filter = cv2.blur(img, (10, 10)) gaussian_filter = cv2.GaussianBlur(img, (11, 11), 0) median_filter = cv2.medianBlur(img, 11) # Display original and filtered images plt.figure(figsize=(12, 4)) plt.subplot(1, 4, 1) plt.title('Original') plt.imshow(img, cmap='gray') plt.axis('off') plt.subplot(1, 4, 2) plt.title('Averaging') plt.imshow(avg_filter, cmap='gray') plt.axis('off') plt.subplot(1, 4, 3) plt.title('Gaussian') plt.imshow(gaussian_filter, cmap='gray') plt.axis('off') plt.subplot(1, 4, 4) plt.title('Median') plt.imshow(median_filter, cmap='gray') plt.axis('off') plt.tight_layout() plt.show() # Helper function to show image and histogram side by side def show_image_and_hist(image, title): plt.figure(figsize=(10, 4)) plt.subplot(1, 2, 1) plt.title(title) plt.imshow(image, cmap='gray') plt.axis('off') plt.subplot(1, 2, 2) plt.title('Histogram') hist = cv2.calcHist([image], [0], None, [256], [0, 256]) plt.plot(hist) plt.tight_layout() plt.show() # Task 3: Add noises and show with histogram # Gaussian Noise gauss_noise = np.random.normal(0, 25, img.shape).astype(np.float32) gauss_noisy_img = img.astype(np.float32) + gauss_noise gauss_noisy_img = np.clip(gauss_noisy_img, 0, 255).astype(np.uint8) show_image_and_hist(gauss_noisy_img, "Gaussian Noisy Image") # Salt & Pepper Noise sp_img = img.copy() prob = 0.02 # 2% noise num_salt = np.ceil(prob * img.size * 0.5) num_pepper = np.ceil(prob * img.size * 0.5) # Add salt (white) coords = [np.random.randint(0, i - 1, int(num_salt)) for i in img.shape] sp_img[tuple(coords)] = 255 # Add pepper (black) coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in img.shape] sp_img[tuple(coords)] = 0 salt_noisy_img = sp_img show_image_and_hist(salt_noisy_img, "Salt and Pepper Noise Image") # Periodic Noise per_noise = np.zeros_like(img, dtype=np.uint8) for i in range(0, img.shape[0], 10): for j in range(0, img.shape[1], 10): per_noise[i, j] = 255 per_noisy_img = cv2.add(img, per_noise) show_image_and_hist(per_noisy_img, "Periodic Noise Image") # Task 4: Apply all 3 filters to each noisy image def apply_filters_and_show(noisy_img, title_prefix): # Apply filters avg = cv2.blur(noisy_img, (10, 10)) gaussian = cv2.GaussianBlur(noisy_img, (11, 11), 0) median = cv2.medianBlur(noisy_img, 11) # Display plt.figure(figsize=(12, 4)) plt.subplot(1, 4, 1) plt.title(f'{title_prefix} Noisy') plt.imshow(noisy_img, cmap='gray') plt.axis('off') plt.subplot(1, 4, 2) plt.title('Averaging') plt.imshow(avg, cmap='gray') plt.axis('off') plt.subplot(1, 4, 3) plt.title('Gaussian') plt.imshow(gaussian, cmap='gray') plt.axis('off') plt.subplot(1, 4, 4) plt.title('Median') plt.imshow(median, cmap='gray') plt.axis('off') plt.tight_layout() plt.show() # Apply to each noisy image apply_filters_and_show(gauss_noisy_img, "Gaussian Noise") apply_filters_and_show(salt_noisy_img, "Salt Noise") apply_filters_and_show(per_noisy_img, "Periodic Noise")