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


A simple game made with Unity attempting to recreate the Wii Play Tanks mini game as part of the final project of my Game Design and Development course completed in just a couple days. Available to play online here. Use WASD/Arrow keys to move your tank. Point and shoot down all enemy tanks to progress to the next level. There are 5 levels in total. Note: you’ll need to turn on sound, enter full screen mode, then click to play!...

December 4, 2023 · 1 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

Ray Tracing Realistic Cameras

This project was part of an independent study where I, along with a few other students, were extending a pre-existing ray tracer made by a PhD student, Kelly Jiang. What follows is the report I submitted for the project that runs through the different camera systems I implemented with a brief explainer and example results of each. Introduction Ray tracing has the unique advantage of easily simulating many different types of cameras....

June 7, 2023 · 14 min
The result of ray tracing the 'Complex' scene. This scene showcases all the aspects of this ray tracer with several shapes that have been scaled, rotated, and translated to various positions,  different types of materials including a transparent glass sphere, recursive reflections, and soft shadows from multiple light sources.

Ray Tracing With WebGL

This was the second project I completed for my intermediate graphics class and my introduction to ray tracing. The goal of this project was to create a simple ray tracer with implicitly defined shapes such as spheres, cubes, and cylinders with various types of materials that are illuminated using the Phong reflection model. The ray tracer also features recursive reflections, soft shadows, transparency, and shape tranformations such translation, rotation, and scaling along any given axis....

March 13, 2023 · 2 min
From left to right: cloth simulation, a 'fire' simulation, boids, a tornado.

Particle Systems With WebGL

The first of two projects completed for my intermediate computer graphics class. The goal of this project was to simulate and render multiple different kinds of particle systems simultaneously in a navigable 3D environment. The project consists of a cloth simulation, a Reeve’s particle fire, a boids simulation, and a position-dependent force vector field tornado. Almost all input parameters for the different particle systems are adjustable by the user allowing them to play with different combinations of settings and see how they effect the simulations....

February 14, 2023 · 2 min

Finding Bigfoot - Data Visualization

This is a data visualization project based off data collected by the Bigfoot Field Researchers Organization (BFRO) which is available for download here. This was group project completed by Ben Fisk, Jamie Lee, Yousef Farge, and myself. The goal of this project was to make a convincing data visualization using D3.js to explore Bigfoot sightings and allow the user to determine if the legend of Bigfoot holds any merit or is pure fiction....

December 1, 2022 · 2 min

Lighting and Materials in WebGL

The goal of this project was to experiment with different lighting styles and materials by hand-coding shaders that implement different lighting calculation techniques with adjustable material properties. The scene consists of a number of different objects. In the foreground are a hand-coded cube and sphere along with a teapot and bunny which all slowly rotate. In the background are a series of animated connected assemblies featuring: a set of square pyramids rotating about each other and a rotating together along the red track, a recursively drawn tree, and a “wagging” tail....

June 7, 2022 · 1 min