import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filterMore Filters!
img = plt.imread("ImageSq.jpeg")
Nx, Ny, Nz = np.shape(img)
print(f"Height: {Nx}, Width: {Ny}, RGB: {Nz}")
plt.imshow(img)
plt.show()Height: 6069, Width: 4855, RGB: 3

print(img)[[[ 86  62  38]
  [ 86  62  38]
  [ 86  62  38]
  ...
  [164 132 109]
  [164 132 109]
  [164 132 109]]
 [[ 86  62  38]
  [ 86  62  38]
  [ 86  62  38]
  ...
  [164 132 109]
  [164 132 109]
  [164 132 109]]
 [[ 86  62  38]
  [ 86  62  38]
  [ 86  62  38]
  ...
  [164 132 109]
  [164 132 109]
  [164 132 109]]
 ...
 [[156 129 100]
  [156 129 100]
  [156 129 100]
  ...
  [146 118  94]
  [146 118  94]
  [146 118  94]]
 [[156 129 100]
  [156 129 100]
  [156 129 100]
  ...
  [146 118  94]
  [146 118  94]
  [146 118  94]]
 [[156 129 100]
  [156 129 100]
  [156 129 100]
  ...
  [146 118  94]
  [146 118  94]
  [146 118  94]]]
The RGB Channels
imgR, imgG, imgB = img.copy(), img.copy(), img.copy()
imgR[:, :, (1, 2)] = 0
imgG[:, :, (0, 2)] = 0
imgB[:, :, (0, 1)] = 0
fig, ax = plt.subplots(nrows = 1, ncols = 3, figsize=(15, 15))
ax[0].imshow(imgR)
ax[1].imshow(imgG)
ax[2].imshow(imgB)
plt.show()
The Grayscale Image
rgb_weights = [0.2989, 0.5870, 0.1140]
grayscale_image = np.dot(img, rgb_weights)
plt.imshow(grayscale_image, cmap = "gray")
plt.show()
print(np.shape(grayscale_image))
print(grayscale_image)(6069, 4855)
[[ 66.4314  66.4314  66.4314 ... 138.9296 138.9296 138.9296]
 [ 66.4314  66.4314  66.4314 ... 138.9296 138.9296 138.9296]
 [ 66.4314  66.4314  66.4314 ... 138.9296 138.9296 138.9296]
 ...
 [133.7514 133.7514 133.7514 ... 123.6214 123.6214 123.6214]
 [133.7514 133.7514 133.7514 ... 123.6214 123.6214 123.6214]
 [133.7514 133.7514 133.7514 ... 123.6214 123.6214 123.6214]]
Max Pooling
def max_pool(image, kernel_size, stride):
    image_height, image_width, channels = image.shape
    kernel_height, kernel_width = kernel_size[0], kernel_size[1]
    output_height = (image_height - kernel_height) // stride + 1
    output_width = (image_width - kernel_width) // stride + 1
    output = np.zeros((output_height, output_width, 3))
    for c in range(channels):
        for i in range(0, output_height * stride, stride):
            for j in range(0, output_width * stride, stride):
                output[i // stride, j // stride, c] = np.max(image[i : i + kernel_height, j : j + kernel_width, c])
    final = output.astype(np.uint8)
    return finalimgnew = max_pool(img, (3, 3), 3)imgnewarray([[[ 86,  62,  38],
        [ 86,  62,  38],
        [ 86,  62,  38],
        ...,
        [164, 132, 109],
        [164, 132, 109],
        [164, 132, 109]],
       [[ 86,  62,  38],
        [ 86,  62,  38],
        [ 86,  62,  38],
        ...,
        [164, 132, 109],
        [164, 132, 109],
        [164, 132, 109]],
       [[ 86,  62,  38],
        [ 86,  62,  38],
        [ 86,  62,  38],
        ...,
        [164, 132, 109],
        [164, 132, 109],
        [164, 132, 109]],
       ...,
       [[160, 130, 102],
        [160, 130, 102],
        [160, 130, 102],
        ...,
        [147, 119,  95],
        [147, 119,  95],
        [147, 119,  95]],
       [[159, 129, 101],
        [159, 129, 101],
        [160, 130, 102],
        ...,
        [147, 119,  95],
        [147, 119,  95],
        [147, 119,  95]],
       [[156, 129, 100],
        [156, 129, 100],
        [156, 129, 100],
        ...,
        [148, 120,  96],
        [146, 118,  94],
        [146, 118,  94]]], dtype=uint8)
imgnew.shape(2023, 1618, 3)
Max Pooled using \(3\times3\) filter and stride = \(3\) Final Image: \((2023, 1618)\)
plt.imshow(imgnew)
plt.imsave("MaxPooled.jpeg", imgnew)imgnew1 = max_pool(imgnew, (3, 3), 3)imgnew1.shape(674, 539, 3)
Further Max Pooled using \(3\times3\) filter and stride = \(3\) Final Image: \((674, 539)\)
plt.imshow(imgnew1)
plt.imsave("FurtherMaxPooled.jpeg", imgnew1)Average Pooling
def avg_pool(image, kernel_size, stride):
    image_height, image_width, channels = image.shape
    kernel_height, kernel_width = kernel_size[0], kernel_size[1]
    output_height = (image_height - kernel_height) // stride + 1
    output_width = (image_width - kernel_width) // stride + 1
    output = np.zeros((output_height, output_width, 3))
    for c in range(channels):
        for i in range(0, output_height * stride, stride):
            for j in range(0, output_width * stride, stride):
                output[i // stride, j // stride, c] = np.mean(image[i : i + kernel_height, j : j + kernel_width, c])
    final = output.astype(np.uint8)
    return finalimgavg = avg_pool(img, (3, 3), 3)
imgavg.shape(2023, 1618, 3)
Average Pooled using \(3\times3\) filter and stride = \(3\) Final Image: \((2023, 1618)\)
plt.imshow(imgavg)
plt.imsave("AvgPooled.jpeg", imgavg)