CV-HW-3

How to apply down sampling in 2D case? What is the matrix?


Using a Gaussian filter to smooth the image and then downsample the image by a factor of 2.
We can apply twice the 1D Gaussian filter to the image in the x direction and then in the y direction. then we can downsample the image by a factor of 2 in the x direction and then in the y direction.


Suppose the image is a 2D matrix.

with size

The Gaussian filter is a 2D matrix

The Downsample matrix is a 2D matrix.

The downsampled image is

import random
import numpy as np
def generate_matrix():
    matrix = []
    random.seed(0)
    for i in range(8):
        row = []
        for j in range(8):
            row.append(random.randint(0, 9))
        matrix.append(row)
    return matrix
def downsample(matrix, G_x, G_y):
    print("Apply G_x to matrix")
    new_matrix = np.matmul(G_x, matrix)*0.0625
    print(new_matrix)
    print("Apply G_y to new_matrix")
    new_matrix = np.matmul(new_matrix, G_y)*0.0625
    print("Downsampled Matrix:")
    print(new_matrix)
    return new_matrix

G_x = [[6, 4, 1, 0, 0, 0, 0, 0], [1, 4, 6, 4, 1, 0, 0, 0],   [0, 0, 1, 4, 6, 4, 1, 0], [0, 0, 0, 0, 1, 4, 6, 4]]

G_y = [[6,1,0,0],
       [4,4,0,0],
       [1,6,1,0],
       [0,4,4,0],
       [0,1,6,1],
       [0,0,4,4],
       [0,0,1,6],
       [0,0,0,4]]

matrix = generate_matrix()
matrix = np.array(matrix)
G_x = np.array(G_x)
G_y = np.array(G_y)
print("Original Matrix:")
print(matrix)

print("G_x:")
print(G_x)
print("G_y:")
print(G_y)

downsampled_matrix = downsample(matrix, G_x, G_y)

Result

    Original Matrix (8x8):
    [[6 6 0 4 8 7 6 4]
     [7 5 9 3 8 2 4 2]
     [1 9 4 8 9 2 4 1]
     [1 5 7 8 1 5 6 5]
     [9 3 8 7 7 8 4 0]
     [8 0 1 6 0 9 7 5]
     [3 5 1 3 9 3 3 2]
     [8 7 1 1 5 8 7 1]]
    
    G_x Filter:
    [[6 4 1 0 0 0 0 0]
     [1 4 6 4 1 0 0 0]
     [0 0 1 4 6 4 1 0]
     [0 0 0 0 1 4 6 4]]
    
    G_y Filter:
    [[6 1 0 0]
     [4 4 0 0]
     [1 6 1 0]
     [0 4 4 0]
     [0 1 6 1]
     [0 0 4 4]
     [0 0 1 6]
     [0 0 0 4]]
    Apply G_x to matrix
    [[4.0625 4.0625 2.5    2.75   5.5625 3.25   3.5    2.0625]
     [3.3125 6.4375 6.     6.4375 6.5625 3.4375 4.625  2.375 ]
     [5.875  3.25   5.3125 6.8125 4.     6.8125 5.1875 2.6875]
     [5.6875 3.8125 1.375  3.3125 5.0625 5.875  4.875  2.25  ]]
    Apply G_y to new_matrix
    Downsampled Matrix:
    [[2.6953125  3.2421875  3.9609375  2.98828125]
     [3.2265625  6.0859375  5.59375    3.59765625]
     [3.34765625 5.125      5.5625     4.5703125 ]
     [3.171875   2.96875    4.5859375  4.17578125]]

How to apply up sampling in 2D case? What is the matrix?


Firstly, fill the zeros in the image by the nearest neighbor interpolation.
Then apply the 2D Gaussian filter to the image.

Suppose the image is a 2D matrix with size .

Insert zeros in the image to get a new image with size .

The Gaussian filter is a 2D matrix


import numpy as np
from scipy.ndimage import convolve

def upsample(matrix, G):
    print("Original Matrix (4x4):")
    print(matrix)
    
    new_matrix = np.zeros((8, 8))    
    new_matrix[::2, ::2] = matrix
    print("\nUpsampled Matrix (Insert Zeros):")
    print(new_matrix)
    
    new_matrix = convolve(new_matrix, G, mode='reflect')
    
    print("\nUpsampled Matrix (After Applying Gaussian Filter):")
    print(new_matrix)
    
    return new_matrix

matrix = generate_matrix(4)
matrix = np.array(matrix)

G = [[1, 2, 1], [2, 4, 2], [1, 2, 1]]
G = np.array(G)

upsampled_matrix = upsample(matrix, G)



Result

    Original Matrix (4x4):
    [[6 6 0 4]
     [8 7 6 4]
     [7 5 9 3]
     [8 2 4 2]]
    
    Upsampled Matrix (Insert Zeros):
    [[6. 0. 6. 0. 0. 0. 4. 0.]
     [0. 0. 0. 0. 0. 0. 0. 0.]
     [8. 0. 7. 0. 6. 0. 4. 0.]
     [0. 0. 0. 0. 0. 0. 0. 0.]
     [7. 0. 5. 0. 9. 0. 3. 0.]
     [0. 0. 0. 0. 0. 0. 0. 0.]
     [8. 0. 2. 0. 4. 0. 2. 0.]
     [0. 0. 0. 0. 0. 0. 0. 0.]]
    
    Upsampled Matrix (After Applying Gaussian Filter):
    [[54. 36. 36. 18.  0. 12. 24. 12.]
     [42. 27. 26. 19. 12. 14. 16.  8.]
     [48. 30. 28. 26. 24. 20. 16.  8.]
     [45. 27. 24. 27. 30. 22. 14.  7.]
     [42. 24. 20. 28. 36. 24. 12.  6.]
     [45. 22. 14. 20. 26. 18. 10.  5.]
     [48. 20.  8. 12. 16. 12.  8.  4.]
     [24. 10.  4.  6.  8.  6.  4.  2.]]

How to apply Laplacian in 2D case? What is the matrix?


Downsample the image by a factor of 2 and then upsample the image by a factor of 2.
The Laplacian filter can be get by using the original image minus the upsampled image.


matrix = generate_matrix(8)
matrix = np.array(matrix)

downsampled_matrix = downsample(matrix, G_x, G_y)
upsampled_matrix = upsample(downsampled_matrix, G)

laplacian_matrix = matrix - upsampled_matrix

print("\nLaplacian Matrix:")
print(laplacian_matrix)

Result


    Downsampled Matrix:
    [[2.6953125  3.2421875  3.9609375  2.98828125]
     [3.2265625  6.0859375  5.59375    3.59765625]
     [3.34765625 5.125      5.5625     4.5703125 ]
     [3.171875   2.96875    4.5859375  4.17578125]]

    Upsampled Matrix (Insert Zeros):
    [[2.6953125  0.         3.2421875  0.         3.9609375  0.
      2.98828125 0.        ]
     [0.         0.         0.         0.         0.         0.
      0.         0.        ]
     [3.2265625  0.         6.0859375  0.         5.59375    0.
      3.59765625 0.        ]
     [0.         0.         0.         0.         0.         0.
      0.         0.        ]
     [3.34765625 0.         5.125      0.         5.5625     0.
      4.5703125  0.        ]
     [0.         0.         0.         0.         0.         0.
      0.         0.        ]
     [3.171875   0.         2.96875    0.         4.5859375  0.
      4.17578125 0.        ]
     [0.         0.         0.         0.         0.         0.
      0.         0.        ]]
    
    Upsampled Matrix (After Applying Gaussian Filter):
    [[24.2578125  17.8125     19.453125   21.609375   23.765625   20.84765625
      17.9296875   8.96484375]
     [17.765625   15.25       18.65625    18.8828125  19.109375   16.140625
      13.171875    6.5859375 ]
     [19.359375   18.625      24.34375    23.359375   22.375      18.3828125
      14.390625    7.1953125 ]
     [19.72265625 17.78515625 22.421875   22.3671875  22.3125     19.32421875
      16.3359375   8.16796875]
     [20.0859375  16.9453125  20.5        21.375      22.25       20.265625
      18.28125     9.140625  ]
     [19.55859375 14.61328125 16.1875     18.2421875  20.296875   18.89453125
      17.4921875   8.74609375]
     [19.03125    12.28125    11.875      15.109375   18.34375    17.5234375
      16.703125    8.3515625 ]
     [ 9.515625    6.140625    5.9375      7.5546875   9.171875    8.76171875
       8.3515625   4.17578125]]
    
    Laplacian Matrix:
    [[-18.2578125  -11.8125     -19.453125   -17.609375   -15.765625
      -13.84765625 -11.9296875   -4.96484375]
     [-10.765625   -10.25        -9.65625    -15.8828125  -11.109375
      -14.140625    -9.171875    -4.5859375 ]
     [-18.359375    -9.625      -20.34375    -15.359375   -13.375
      -16.3828125  -10.390625    -6.1953125 ]
     [-18.72265625 -12.78515625 -15.421875   -14.3671875  -21.3125
      -14.32421875 -10.3359375   -3.16796875]
     [-11.0859375  -13.9453125  -12.5        -14.375      -15.25
      -12.265625   -14.28125     -9.140625  ]
     [-11.55859375 -14.61328125 -15.1875     -12.2421875  -20.296875
       -9.89453125 -10.4921875   -3.74609375]
     [-16.03125     -7.28125    -10.875      -12.109375    -9.34375
      -14.5234375  -13.703125    -6.3515625 ]
     [ -1.515625     0.859375    -4.9375      -6.5546875   -4.171875
       -0.76171875  -1.3515625   -3.17578125]]