A Simple Image Processing Pipeline

This assignment is due at 11:59pm on November 15th.

In this (somewhat) mini-assignment you will write a very simple image processing pipeline for a set of RAW images read out from the sensor of the much-anticipated kPhone 869s. As shown in the figure below, the images your program receives are the result of Bayer filter light attenuation, and have other defects like, noise, dead pixels, and lens vinetting. Your job is to produce a high quality image for display.

Image 1

Getting Started

Grab the assignment starter code.

git clone git+ssh://linux.andrew.cmu.edu/afs/cs/academic/class/15869-f13/code/asst3_repo.git

Due to use of C++11, building the code on Linux requires G++ 4.8 (all cluster machines had been updated to have it). A Visual Studio build is also included in the starter code.

Linux Build Instructions:

The codebase using CMake as its cross-platform make utility. We suggest an out-of-source build using cmake, which you can perform via the following steps:

Assuming your top-level source directory is called: SOURCEDIR ...

// 1. Create a build directory anywhere you like

// 2. Enter the build directory

// 3. Configure the build

At this point your build should be configured, and you can compile the renderer simply by typing:


Running the starter code:

NOTICE: on Andrew linux machines, you'd need to add /usr/local/lib/gcc/lib64 you your dynamic library search path. For example:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/gcc/lib64

Now you can run the renderer. Just run ./bin/camerapipeline PATH_TO_SOURCEDIR/Images/sibenik.noise.bmp image.bmp. The result will be an output image image.bmp that is the result of processing sibenik.noise.bmp. At the moment, the starter code only brightens the image (it merely serves as an example of accessing the raw pixel data).

Assignment notes

  • You may implement this assignment in any way you wish. Certainly, you will have to demosaic the image. How to handle noise, bad pixels, and vinetting artifacts are up to you. You may adopt techniques discussion in Lectures 13, 14, and 16,
  • The following is the Bayer filter pattern used on the kPhone sensor. Pixel (0,0) is the top-left of the image. Image 2
  • In the Images/ directory, you will find eight example images (two versions of fairy, sibenik, san-miguel, and 'gray'). You should start by trying to process XXXX.noise.bmp. Then attempt the harder XXXX.noise_vignette.bmp files.
  • You may find it useful to use the results of processing gray.noise.bmp in the processing of the vignetted images.
  • After your image processing chain is producing results that you are happy with, please take a stab at improving the performance of your code. Consider the tricks we discussed in Lecture 15.


Assignment handin directories will be created for you at: /afs/cs/academic/class/15869-f13/handin/asst3/ANDREWID

For convenience, Ph.D. students with a CS account should access this directory with CS credentials (e.g., via login from a CS linux server, like: linux.gp.cs.cmu.edu). You can check which account (@cs or @andrew) was given premission to access your directory by typing fs la from your handin directory.

Undergrad and masters students without CS accounts should use their andrew credentials. You may need to run aklog cs.cmu.edu to avoid AFS permission issues.

Code Handin

Please hand in the CameraPipeline directory of your modified source tree (I should be able to build and run the code on Andrew Linux machines) by dropping this directory into a freshly checked out tree. Specifically, my scripts will be looking for a directory:


Writeup Handin

In the top level of your handin directory, please include as a short writeup describing how you decided to implement your image processing pipeline. First describe what filters you used. Second, describe how you improved the performance of the pipeline and what speedup did you achieve. I'll be looking for the file: