Assignment 2
Assignment 2
ipynb - Colab
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Salt noise
coords = [np.random.randint(0, i - 1, num_salt) for i in img.shape]
noisy_img[tuple(coords)] = 255
# Pepper noise
coords = [np.random.randint(0, i - 1, num_pepper) for i in img.shape]
noisy_img[tuple(coords)] = 0
return noisy_img
# Show results
plt.figure(figsize=(12, 6))
plt.subplot(1, 4, 1), plt.imshow(image, cmap='gray'), plt.title('Original'), plt.axis('off')
plt.subplot(1, 4, 2), plt.imshow(gaussian_noise, cmap='gray'), plt.title('Gaussian Noise'), plt.axis('off')
plt.subplot(1, 4, 3), plt.imshow(sp_noise, cmap='gray'), plt.title('Salt & Pepper'), plt.axis('off')
plt.subplot(1, 4, 4), plt.imshow(vignette, cmap='gray'), plt.title('Uneven Illumination'), plt.axis('off')
plt.tight_layout()
plt.show()
https://colab.research.google.com/drive/1c-YnbIsIZJ8J0JYjSYZDOKnjdcUwwpVs#scrollTo=KOkv9qjbdGBc&printMode=true 1/9
4/16/25, 10:08 PM Untitled12.ipynb - Colab
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Apply modifications
gaussian_img = add_gaussian_noise(image)
sp_img = add_salt_pepper_noise(image)
vignette_img = apply_vignette(image)
plt.subplot(2, 2, 2)
plot_histogram(gaussian_img, 'Gaussian Noise Histogram')
plt subplot(2 2 3)
https://colab.research.google.com/drive/1c-YnbIsIZJ8J0JYjSYZDOKnjdcUwwpVs#scrollTo=KOkv9qjbdGBc&printMode=true 2/9
4/16/25, 10:08 PM Untitled12.ipynb - Colab
plt.subplot(2, 2, 3)
plot_histogram(sp_img, 'Salt & Pepper Histogram')
plt.subplot(2, 2, 4)
plot_histogram(vignette_img, 'Uneven Illumination Histogram')
plt.tight_layout()
plt.show()
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.subplot(2, 2, 1)
plt.imshow(image_gray, cmap='gray')
plt.title('Original Grayscale')
l i (' ff')
https://colab.research.google.com/drive/1c-YnbIsIZJ8J0JYjSYZDOKnjdcUwwpVs#scrollTo=KOkv9qjbdGBc&printMode=true 3/9
4/16/25, 10:08 PM Untitled12.ipynb - Colab
plt.axis('off')
plt.subplot(2, 2, 2)
plt.imshow(basic_thresh, cmap='gray')
plt.title('Basic Global Thresholding')
plt.axis('off')
plt.subplot(2, 2, 3)
plt.imshow(otsu_thresh, cmap='gray')
plt.title("Otsu's Thresholding")
plt.axis('off')
plt.subplot(2, 2, 4)
plt.imshow(multi_thresh, cmap='gray')
plt.title('Multispectral Thresholding (RGB)')
plt.axis('off')
plt.tight_layout()
plt.show()
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.segmentation import felzenszwalb, flood
https://colab.research.google.com/drive/1c-YnbIsIZJ8J0JYjSYZDOKnjdcUwwpVs#scrollTo=KOkv9qjbdGBc&printMode=true 4/9
4/16/25, 10:08 PM Untitled12.ipynb - Colab
from skimage.segmentation import felzenszwalb, flood
from skimage import img_as_float
# ----------------------------
# 1. Load & Resize Image
# ----------------------------
image_path = 'br.jpg' # 🔁 Replace with your file
image_color = cv2.imread(image_path)
if image_color is None:
raise FileNotFoundError("⚠️ Image not found. Check your path or upload again.")
# ----------------------------
# 2. Felzenszwalb Segmentation
# ----------------------------
felz_segments = felzenszwalb(resized_float, scale=100, sigma=0.5, min_size=50)
# ----------------------------
# 3. Region Growing (auto seed)
# ----------------------------
gray_resized = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY)
gray_norm = cv2.normalize(gray_resized, None, 0, 255, cv2.NORM_MINMAX)
# ----------------------------
# 4. Show Results
# ----------------------------
plt.figure(figsize=(15, 5))
# Original
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
# Region Growing
plt.subplot(1, 3, 2)
plt.imshow(region, cmap='gray')
plt.title(f'Region Growing\nAuto Seed: {seed_point}')
plt.axis('off')
# Felzenszwalb
plt.subplot(1, 3, 3)
plt.imshow(felz_segments, cmap='nipy_spectral')
plt.title("Felzenszwalb's Segmentation")
plt.axis('off')
plt.tight_layout()
plt.show()
https://colab.research.google.com/drive/1c-YnbIsIZJ8J0JYjSYZDOKnjdcUwwpVs#scrollTo=KOkv9qjbdGBc&printMode=true 5/9
4/16/25, 10:08 PM Untitled12.ipynb - Colab
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.segmentation import flood
# ----------------------------
# 1. Load and Resize Image
# ----------------------------
image_path = 'br.jpg' # Replace with your image file name
image_color = cv2.imread(image_path)
resized_image = cv2.resize(image_color, (256, 256))
gray_original = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY)
# ----------------------------
# 2. Add Gaussian Noise
# ----------------------------
def add_gaussian_noise(img, mean=0, sigma=50):
noise = np.random.normal(mean, sigma, img.shape).astype(np.float32)
noisy = np.clip(img.astype(np.float32) + noise, 0, 255).astype(np.uint8)
return noisy
gray_noisy = add_gaussian_noise(gray_original)
# ----------------------------
# 3. Apply Thresholding
# ----------------------------
_, basic_thresh = cv2.threshold(gray_original, 127, 255, cv2.THRESH_BINARY)
# ----------------------------
# 4. Region Growing Segmentation
# ----------------------------
# Normalize and auto-pick brightest point as seed
gray_norm = cv2.normalize(gray_original, None, 0, 255, cv2.NORM_MINMAX)
_, _, _, max_loc = cv2.minMaxLoc(gray_norm)
seed_point = (max_loc[1], max_loc[0]) # (row, col)
region = flood(gray_norm, seed_point, tolerance=50)
# ----------------------------
# 5. Display Side-by-Side Comparison
# ----------------------------
plt.figure(figsize=(14, 8))
https://colab.research.google.com/drive/1c-YnbIsIZJ8J0JYjSYZDOKnjdcUwwpVs#scrollTo=KOkv9qjbdGBc&printMode=true 6/9
4/16/25, 10:08 PM Untitled12.ipynb - Colab
plt.subplot(2, 2, 2)
plt.imshow(gray_noisy, cmap='gray')
plt.title("After Gaussian Noise")
plt.axis('off')
plt.subplot(2, 2, 4)
plt.imshow(region, cmap='gray')
plt.title(f"Region Growing (Seed: {seed_point})")
plt.axis('off')
plt.tight_layout()
plt.show()
import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# ----------------------------------------
https://colab.research.google.com/drive/1c-YnbIsIZJ8J0JYjSYZDOKnjdcUwwpVs#scrollTo=KOkv9qjbdGBc&printMode=true 7/9
4/16/25, 10:08 PM Untitled12.ipynb - Colab
# 1. Load & Resize Image
# ----------------------------------------
image_path = 'br.jpg' # 🔁 Replace with your image filename
image_color = cv2.imread(image_path)
if image_color is None:
raise FileNotFoundError("⚠️ Image not found. Please check the path.")
# ----------------------------------------
# 2. Prepare Features (Intensity + Position)
# ----------------------------------------
X = []
for i in range(rows):
for j in range(cols):
intensity = gray[i, j]
X.append([intensity, i, j])
X = np.array(X)
# ----------------------------------------
# 3. Train KMeans (2 clusters: foreground & background)
# ----------------------------------------
kmeans = KMeans(n_clusters=2, random_state=0, n_init=10)
labels = kmeans.fit_predict(X_scaled)
# ----------------------------------------
# 4. Display Results
# ----------------------------------------
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(gray, cmap='gray')
plt.title('Original Grayscale')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(segmented_img, cmap='gray')
plt.title('KMeans Segmentation (2 Clusters)')
plt.axis('off')
plt.tight_layout()
plt.show()
https://colab.research.google.com/drive/1c-YnbIsIZJ8J0JYjSYZDOKnjdcUwwpVs#scrollTo=KOkv9qjbdGBc&printMode=true 8/9
4/16/25, 10:08 PM Untitled12.ipynb - Colab
https://colab.research.google.com/drive/1c-YnbIsIZJ8J0JYjSYZDOKnjdcUwwpVs#scrollTo=KOkv9qjbdGBc&printMode=true 9/9