Image filtering and super-resolution
NumPy image filters and a neural network for upscaling images.

One convolution primitive
I wrote a general 2D convolution routine in NumPy and built mean, Gaussian, Laplacian, and Sobel filters on it. The implementation supports constant, reflect, and edge padding, then compares the resulting smoothing and edge maps against OpenCV references. The opening figure collects outputs from those filters.
Boundary behavior
The checkerboard experiment makes padding choices visible at the border. With a 21 × 21 kernel, constant padding fades the edge into a gray band, while reflect and edge padding retain the pattern to the boundary.

Four-times super-resolution
For the second part, I trained a residual CNN with 16 residual blocks, a global skip connection, and two PixelShuffle stages. It was trained on DIV2K with L1 loss and evaluated at 4× enlargement on 12 test images. The average was 25.68 dB PSNR and 0.6951 SSIM.


Observed limit
The natural-image examples are sharper than the low-resolution inputs, but the checkerboard result shows ringing near abrupt synthetic edges. That limitation is part of the recorded evaluation, alongside the model's sensitivity to noisy inputs.
