A 15x15 grid of images produced by our Convolutional GAN trained on the ImageNet dataset.

Generative Adversarial Networks

The final project for my Deep Learning course completed in collaboration with Ben Fisk. This project revolved around implementing Generative Adversarial Networks (GANs) to produce synthetic images which look visually similar to the training data. GANs are a type of generative deep model which aim to replicate training data by simultaneously training a generator and a discriminator. The two components of the GAN play a two-player mini-max game where the generator aims to trick the discriminator into believing its generated examples are part of the real dataset while the discriminator is trying to maximize its ability to correctly distinguish between real and fake data....

December 8, 2023 · 5 min
A stitched image of the Norris Student Center and University Main Library at Northwestern.

Panoramic Image Stitching

Image stitching is the process of combining several images of a scene taken from approximately the same viewpoint but at different angles to create a larger resulting image. One of the underlying assumptions of this process is that the fields of view of the images to be stitched slightly overlap. This assumption allows for the detection of common features within the images. The relative positions of the features allows for the calculation of a matrix transformation which describes how to warp one image to fit the coordinate system of another....

December 6, 2023 · 18 min
Each step of the Hough Transform for line detection applied to various test images.

Basic Computer Vision Tasks

The following are a few of the most interesting projects completed for the Intro to Computer Vision course which implement several basic computer vision tasks. The results seen in each of these reports were produced by implementing the relevant algorithms from scratch using NumPy. OpenCV was only used for loading images or drawing on top of images. Canny Edge Detection The purpose of this project was to implement the Canny Edge detection algorithm which consists of 5 main steps: gaussian smoothing, calculating the image gradient, selecting thresholds for the gradient magnitude, thinning the gradient magnitudes by suppressing non-maxima, and finally, linking strong edges along weaker edges....

November 28, 2023 · 16 min
A render with parallel rays going into three Luneburg lenses with different profiles then into three circles with different indices of refraction.

2D Ray Tracing in Python with Continuous Refraction

This was the final project for a Computational Optics seminar completed in collaboration with Claire Paré. Made in a jupyter notebook with numpy and matplotlib, the first aim of this project was to create a simplified version of this 2D ray-optics simulator. The initial goal was to show the paths of light rays through transparent spheres with various indices of refraction and accurately model Fresnel effects to showcase how the amount of reflected and refracted light depends on the index of refraction and incoming ray angle....

June 7, 2023 · 2 min