Due Date - 10/15/2010

The goal of this programming assignment is to evaluate five linear and non-linear smoothing techniques to determine the "optimal" method for noise removal. This will be done by adding noise to images, performing smoothing, and calculating the mean squared error (MSE) between the original image and the smoothed-noise image. The combination of method/parameters with the lowest MSE will be declared "optimal".

To perform your experiments, you will add different types of synthetic noise to your input image. The im_short class provides three noise generating functions:

- NoiseUniform(int range) -- adds uniformly distributed random values between [-range/2..range/2] to each input pixel.
- NoiseGaussian(float stddev) -- adds zero mean Gaussian noise with standard deviation of stddev to each input pixel.
- NoiseImpulse(char type, float fraction) -- adds salt (type=s) pepper (type=p) or salt and pepper (type=b) noise to a randomly selected fraction [0..1] of input pixels.

Once you have created several noisy images, you will be comparing the performance of the following five smoothing methods that are part of the im_short class:

- Binomial() -- performs one iteration of Binomial smoothing with 3x3 mask.
- Median(int xdim, int ydim) -- performs median filtering with specified neighborhood region.
- Gaussian(float sigma) -- performs Gaussian smoothing with filter width given by sigma.
- OutlierRemoval(int xdim, int ydim, float threshold) -- locates and removes outliers by comparing central pixel to mean of neighborhood.
- kNN(int xdim, int ydim, int K) -- calculates average of K pixels closest in intensity to central pixel in specified neighborhood region.

In order to determine the "optimal" method for each type of noise, you must write a function that calculates the MSE between two images, and an automated framework to search for the best combination of smoothing parameters for each of the five methods above. To keep things simple, work with symmetric neighborhoods (xdim=ydim).

Before you implement your program to find "optimal" smoothing methods/parameters you should experiment using "menu" program. All of the methods listed above can be invoked using commands of the form "./menu method param1 param2 infile outfile". Use this information to select the noise generation parameters you want to use for each noise method, and to select a range of values to explore for each of the smoothing methods.

In this project, you will probably end up evaluating hundreds of combinations of methods/parameters to select the "optimal" method for each noise image. Save this testing output in tables that can be included in your written report. You may want to read portions of this data into a speadsheet to see if there are patterns in the MSE value as parameters vary.

When you have completed your C++ program, write a short report (less than one page long) describing what the objectives were, what you did, and the status of the program. Does it work properly for all test cases? Are there any known problems? Save this report in a separate text file to be submitted electronically.

In this class, we will be using electronic project submission to make sure that all students hand their programming projects and labs on time, and to perform automatic analysis of all programs that are submitted. When you have completed the tasks above go to the class web site to "submit" your documentation, C++ program, and testing files.

The dates on your electronic submission will be used to verify that you met the due date above. All late projects will receive reduced credit (50% off if less than 24 hours late, no credit if more than 24 hours late), so hand in your best effort on the due date.

You should also PRINT a copy of these files and hand them into your teaching assistant in your next lab. Include a title page which has your name and uaid, and attach your hand written design notes from above.