Skip to main content

Instructions

Most of the instructions for this assignment are included in jupyter notebooks. I should add that these notebooks were originally written by Steve Marschner when we tried re-designing the assignments during a virtual offering of the course in 2020. I've made a few updates since then, but you should imagine most of the narrative in Steve's calming voice. If you encounter links to any funky videos, those were probably added by me later on.

High-Level Tasks
Warning: Using Library Functions

Do not use library functions that defeat the purpose of this assignment. You will fail the assignment and it will be considered a violation of academic integrity. For example, you cannot use np.convolve() in Part 3. If you're unsure if you can use something, please ask in a public post on Ed.

The instructions for each individual part will be found in the notebooks themselves, so we will focus on providing a higher-level overview of everything here.

Part 1: Pointwise Image Operations

The first part of the assignment explores pointwise image operations, focusing on those that transform raw digital sensor data into the kinds of pretty photographs you expect from cameras. You can find the instructions for this part in Photography.ipynb.

Tasks in [Photography.ipynb]:

Implement the following:

  • rawInt16ToFloat()
  • white_balance()
  • color_transform()

Choose values for the following:

  • black_level
  • gray
  • linear_exposure
  • filmic_exposure

Part 2: Image Warping

We can think of pointwise image operations as changing the values at each image point without changing their position in the image. Image warping does the opposite: we change positions while keeping values the same.

In the second part of the assignment, we look at some simple image warping operations. In particular, we will see how to correct for the distortion of a wide-angle lens. Here we will also explore the effects of different interpolation methods, which let us treat the image as a function over the continuous plane (not just a discrete set of sample locations). You can find the instructions for this part in Distortion.ipynb.

Tasks in [Distortion.ipynb]:

Implement the following:

  • shift_image_to_left()
  • rotate_image()
  • undistort_image()

Part 3: Image Filtering

Tasks in [Filtering.ipynb]:

Implement the following:

  • gen_gaussian_filter()
  • convolve()
  • convolve_sep()
  • unsharp_mask()

In the operations explored by parts 1 and 3, each output value depended on only one input value. For pointwise operations, it was the input value found at the same pixel coordinate. For image warping, it was the input value found at some other location in the image. For convolutions, we will break free from these chains, and compute output values that are a combination of MULTIPLE INPUT VALUES! More specifically, each output will be a given linear combination of input values from its own local neighborhood.

The final part of the assignment is about convolution with arbitrary 2D filters and separable 2D filters. It looks at image blurring and sharpening. You can find the instructions for it in Filtering.ipynb.