CSC 427: Data Structures and Algorithm Analysis
Fall 2004

HW3: Matrices and Inheritance


For this assignment, you will extend the Pixmap class that was discussed in lectures, in order to allow for more transformations on portable images. Currently, the operations defined for a Pixmap are Read (from a file), Horizontal Reflect (alogn the x-axis), Vertical Reflect (along the y-axis), Invert (negative image), and Write (to a file). The Pixmap class works on images of type PBM, PGM, and PPM by making use of a hierarchy of Pixel classes: MonoPixel, GrayPixel, and ColorPixel. For this assignment, you will need to add new member functions to the Pixmap class, and correspondingly add member functions to all of the classes in the Pixel hierarchy. Note: polymorphism should be preserved by your additions. That is, your new member functions in the Pixelmap class should work no matter which type of image is is being manipulated.

To get started, you will need to download the following files: Pixel.h, Pixel.cpp, Pixmap.h, Pixmap.cpp, Matrix.h and pix.cpp. For testing purposes, you will also want to download an image viewer that can display PBM/PGM/PPM files. A popular free viewer, IrfanView, is available for downloading at www.irfanview.com. The image files reed.pbm, reed.pgm, and reed.ppm are available for your viewing pleasure.

For each of these new operations, modify the Pixmap and Pixel clases appropriately, then add the corresponding menu options to pix.cpp for testing.

Enlarge:
doubles the dimensions of the image and expands each pixel accordingly. For example, a 10x20 image would be enlarged to 20x40, and the pixel at (0,0) would be expanded to fill (0,0), (0,1), (1,0), and (1,1).


Sharpen:
sharpens the picture by scaling the pixel values to use the largest range possible. If max and min are the maximum and minimum pixel values in the picture, respectively, then each pixel is assigned a new value as follows: newPixelValue = (oldPixelValue - min) * maxPossiblePixelValue / (max - min) Note: any rounding should occur as late as possible.


Blur:
blurs the picture (and so removes any perturbations) using the median smoothing algorithm. Each pixel should be replaced by the median value stored in that pixel and the eight adjacent pixels.


Overlay:
overlays the picture read from an input stream on top of the current picture. That is, corresponding pixels are added using modulo arithmetic (i.e., adding 1 to the maximum possible pixel size wraps around to 0). In order for an overlay to make sense, the two pictures must be of the same type and size. Otherwise, an error message should be displayed and no changes made to the current image.


Split:
splits the image into two files, whose names are specified by the user. The first file should have random values for each pixel, and the second should have pixel values assigned so that the two images, when overlaid, produce the original.


Advice: Attempt this assignment in stages. Implement one member function at a time, add the corresponding menu option to the driver program, and then test that function thoroughly before beginning on the next one. Before testing functions on large pictures, try them out on small, hand-made pictures for which you can accurately predict the desired effect.