| 1 |
1 |
Back to subject |
AI for Image Analysis - 20A30702b (Theory) |
Sept. 17, 2025 |
Unit - 4 Next Part02 |
Adding Text to Images
👉 Use cv2.putText()
import cv2
import matplotlib.pyplot as plt
# Load image
img1 = cv2.imread("images/parrot.jpg")
output = img1.copy()
# Put text on image
cv2.putText(output, "Hello OpenCV!", (50, 100),
cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
# Convert BGR → RGB for matplotlib
output_rgb = cv2.cvtColor(output, cv2.COLOR_BGR2RGB)
# Display safely in notebook
plt.imshow(output_rgb)
plt.axis('on')
plt.title("Text on Image")
plt.show()

Changing the Shape of Images
resized = cv2.resize(img1, (300, 300))
cropped = img1[50:200, 100:300] # crop region
flipped = cv2.flip(img1, 1) # horizontal flip

6. Effecting Image Thresholding
👉 Binary thresholding and adaptive thresholding.
import numpy as np
from skimage.transform import (hough_line, hough_line_peaks, hough_circle, hough_circle_peaks)
from skimage.draw import circle_perimeter
from skimage.feature import canny
from skimage.data import astronaut
from skimage.io import imread, imsave
from skimage.color import rgb2gray, gray2rgb, label2rgb
from skimage import img_as_float
from skimage.morphology import skeletonize
from skimage import data, img_as_float
import matplotlib.pyplot as plt
from matplotlib import cm
from skimage.filters import sobel, threshold_otsu
from skimage.feature import canny
from skimage.segmentation import felzenszwalb, slic, quickshift, watershed
from skimage.segmentation import mark_boundaries, find_boundaries
# Load and preprocess image
image = rgb2gray(imread('images/horse.jpg'))
thresh = threshold_otsu(image)
binary = image > thresh
# Plotting
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(20, 15))
ax = axes.ravel()
ax[0].imshow(image, cmap=plt.cm.gray)
ax[0].set_title('Original', size=20)
ax[0].axis('off')
ax[1].hist(image.ravel(), bins=256, density=True) # <-- use density instead of normed
ax[1].set_title('Histogram', size=20)
ax[1].axvline(thresh, color='r')
ax[2].imshow(binary, cmap=plt.cm.gray)
ax[2].set_title('Thresholded (Otsu)', size=20)
ax[2].axis('off')
ax[3].axis('off')
plt.tight_layout()
plt.show()

Performing Histogram Equalization.
import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread
from skimage.color import rgb2gray
from skimage.filters.rank import enhance_contrast
from skimage.morphology import disk
from skimage import exposure, img_as_ubyte
# Helper function
def plot_gray_image(ax, image, title):
ax.imshow(image, cmap='gray')
ax.set_title(title)
ax.axis('off')
ax.set_adjustable('box') # valid value
# Load image and convert to grayscale
image = rgb2gray(imread('images/squirrel.jpg'))
# Add noise
sigma = 0.05
noisy_image = np.clip(image + sigma * np.random.standard_normal(image.shape), 0, 1)
# Convert to uint8 for rank filters
noisy_uint8 = img_as_ubyte(noisy_image)
# Local morphological contrast enhancement
enhanced_image = enhance_contrast(noisy_uint8, disk(5))
# Adaptive histogram equalization (works with float)
equalized_image = exposure.equalize_adapthist(noisy_image)
# Plot results
fig, axes = plt.subplots(1, 3, figsize=(18, 7), sharex=True, sharey=True)
axes1, axes2, axes3 = axes.ravel()
plot_gray_image(axes1, noisy_image, 'Original')
plot_gray_image(axes2, enhanced_image / 255.0, 'Local morphological contrast enhancement') # normalize for display
plot_gray_image(axes3, equalized_image, 'Adaptive Histogram equalization')
plt.show()
 |