CS448f: Image Processing
for Photography and Vision

Fall 2009

Instructor: Andrew Adams
Gates 376
Office Hours:
Tue, Thu 3:30-5:30pm
TA: Jennifer Dolson
Gates 360
Office Hours:
Mon, Wed 10:15-11:30am

Where and when

Gates Building Room #392
Tuesday and Thursday 2:15-3:30pm

Schedule and Lecture Notes

Sep 22 - 1.1:
Course description and some stuff to give you the flavor of the course and help you decide if you want to take it. Basically I'm going to show things I think are interesting. If you agree that they are interesting then you should enjoy the course.

Lectures notes.
Other materials.

Sep 24 - 1.2:
Sampling and reconstruction. What is an image? Data Structures, Rotating, resizing, warping. Assignment 1 released (rotation competition).

Lecture notes.
Other materials.
Assignment 1 - Rotate.

Sep 29 - 2.1:
Filters for Sharpening and Denoising.

Lecture notes on Sharpening.
Lecture notes on denoising.
Other materials.

Oct 1 - 2.2:
Tone-Mapping and Fast Filtering.

Lecture notes on Tone-Mapping.
Lecture notes on Fast Filtering.
Other materials.
Assignment 2 - Fast Gaussian Blur.

Oct 6 - 3.1:
Rotate competition and fast filtering continued.

Lecture notes on Fast Filtering.
Other materials.

Oct 8 - 3.2:
Fast bilateral and non-local means (see above lecture notes). Overview of alignment.

Lecture notes on alignment.
Other materials.

Oct 13 - 4.1:
Gaussian Blur competition and Alignment (see lecture notes above).

Assignment 3 - Alignment.
Other materials.

Oct 15 - 4.2:
RANSAC v Hough (see end of lecture notes above). Fun with aligned images.

Lecture notes on blending and pyramids.
Updated version of ImageStack, with Tyler's super-fast Gaussian blur.
Other materials.

Oct 20 - 5.1:
Wavelets and Compression.

Lecture notes on wavelets.
Other materials.
Project description page.

Oct 22 - 5.2:
Wavelets continued (see lecture notes above). The gradient domain.

Lecture notes on wavelets.
Lecture notes on the gradient domain.
Other materials.

Oct 27 - 6.1:
Assignment 3 competition (SURF wins!). Deconvolution.

Lecture notes on deconvolution.
Other materials.

Oct 29 - 6.2:
Seam Carving and Graph Cuts.

Lecture notes on Seam Carving and Graph Cuts.
Other materials.

Nov 3 - 7.1:
Katarina Van Heusen - Exposure Fusion.
Varun Ganapathi - Image Deformation using Moving Least Squares.

Nov 5 - 7.2:
Hyatt Moore - Single Image Haze Removal Using Dark Channel Prior.
Ben Olson - Deconvolution using natural image priors.

Nov 10 - 8.1:
Curt Harting - Seam Carving for Images and Video.
Jiajing Xu - Moving Gradients
Justin Solomon - A comparison of edge-preserving filters.

Nov 12 - 8.2:
Yinfeng Qin (Roy) - Multi-Operator Media Retargeting
Eric Chu - Locally Adapted Hierarchical Basis Preconditioning
Sung Hee Park - PatchMatch

Nov 17 - 9.1:
Jared Duke - Coordinates for Instant Image Closing
Vilhelm Hedberg - Edge-Preserving Decompositions for Multi-Scale Tone and Detail Manipulation
Tyler Mullen - PatchMatch redux

Nov 19 - 9.2:
Dmitri Makarov - Optimizing Content-Preserving Projections for Wide-Angle Images
Neeraj Agrawal and Ritvik Mudur - GradientShop
Christopher Fajardo - Two-scale Tone Management for Photographic Look

Course Description

Over the past decade a family of new algorithmic tools for image processing have arisen and have proven to have broad applicability. Many of them are so useful they have become basic tools in Adobe Photoshop, yet they are not covered by traditional image processing classes. This family includes techniques like gradient domain manipulations, fast edge-preserving filters, aligning and combining bursts of images, and image segmentation with graph-cuts.

For an algorithm to be a useful tool in your mental toolbox, you need a deep understanding of how it works. For this reason the course will be focused on actually implementing these algorithms in C++ using a stripped-down open-source image processing framework (ImageStack). In the second half of the course, you'll pick a recent paper on one of these techniques and implement it.

However, before these techniques are taught, you'll need to have a solid image processing foundation to build on, and so the first part of the course will deal with traditional image processing issues like sampling and reconstruction, linear filters, and geometric operations like rotating and warping images, with an emphasis on efficient and accurate implementations.

During this portion of the course students will all implement some basic algorithms within ImageStack, and competitions will be held to select which submissions will become a permanent part of ImageStack (with student permission). As an example, one such competition will be: implement a rotation algorithm (that runs within a time limit), such that when an image is rotated by 1 degree 360 times, it's as close as possible to the original.

Prerequisites and Relationship to Other Courses

You'll be expected to know basic linear algebra and calculus. You need not have dealt with pixels before, though the undergraduate computer graphics course (CS148) would be helpful, as would the undergraduate digital photography course (CS178). However, we do not require you to have taken these. You'll need to be comfortable writing object-oriented C++ code (ie CS106B and CS108).

This course will feed into the computer vision course (CS223b), the computational photography course (CS448A), and to a lesser extent the more advanced computer graphics course (CS248), which all run in Winter. A solid image processing background and an awareness of new techniques will be helpful to you in all three of these courses.

Assessable Materials

Your grade for the course is divided as follows: The assignments are worth 60%, and your project is worth 40%. The assignment score is broken down into 30% for your best assignment, 20% for your next best assignment, and 10% for your worst assignment. There are no exams. We've tried to front-load the assessable work so you have less to do as you get busier with your other classes. You get 2 late days for your assignments, and no late days for the project (it doesn't really work with project presentations). Attendance is mandatory. You're allowed up to two unexplained absences. If you can't make the class for some good reason just send me an email.


The first assignment will get you to implement an image rotation algorithm that is both fast and accurate. You'll be graded on both criteria. There will be a competition to see whose implementation is the fastest (given an accuracy requirement), and the most accurate (given a speed requirement). Fabulous prizes will be awarded (probably candy).

The second assignment will be a similar competition for fast accurate Gaussian blurs, and the third assignment will be another competition, this time for quickly aligning a sequence of images. Your assignment grades will be mostly based on meeting requirements, though there will be extra points available for doing well in the competitions.

For your project, you'll be implementing a cool technique from a recent siggraph paper (or a paper from a similar conference). These techniques will be shared at the end of the course (with your permission), so we can all walk away from the course with an image processing library full of the latest and greatest stuff. Towards the second half of the course you'll give a medium length presentation on the paper you chose, and show off your implementation progress so far. At the end of the course you'll submit your completed implementation, and give a short demo of it in class. The first presentation is worth 10% of your grade for the course, the second presentation and submitted material is worth 30%.

I should say one thing up front that might not be the norm for upper level CS courses. Code readability will count for your grade. As it says above, I'd like everyone to be able to walk away from this class with a bunch of useful code, so your code is going to have to be understandable by your fellow students.


  • Do I have the right background to take this course?
    Email Andrew (abadams at stanford.edu) or come and find him in his office (Gates 376) to find out. Basically, you shouldn't be scared of a little linear algebra, you should be good at coding in C++, and it would help if you already know what a pixel is.

  • Do I have to share my code with everyone at the end of the course? I thought my assignment work was my own. You don't have to share your code with the class, but it is strongly encouraged. Not sharing your code will not affect your grade.

  • Does the 'f' stand for fail?
    The 'f' doesn't stand for fail. I won't fail anyone who submits a serious attempt at every assignment.