Brief Overview

In this project, we took images that were produced by Prokudin-Gorskii glass plate to create a single color image. For each picture, there are three glass plate images, each of which represents RBG values. By overlaying and aligning the three images, we are then able to create a single color image.

My Approach

My initial approach was to take two images at a time (Green and Blue, Red and Blue) and align them by shifting either the Green or the Red image to match up with the Blue. To determine if the images matched up, I calculated the L2 norm as well as the normalized cross-correlation but found they were generally pretty similiar.

This approach worked fine until the Monastery image. This did not align properly to the image, and ended up aligning to the borders. I rationalized this because most of the image is white, and thus the dark borders create a larger difference if they are not aligned, thus the shifting would want to minimize the norm and align by the borders. I was able to overcome this issue through a constant cropping of 10% on each of the 4 sides.

The large pictures were too large to be able to simply shift the image to find the minimum norm. Thus, I implemented pyraminding. I took the image that was passed in and recursively scaled the image down by half till it was under 50px on one side. From there, I was able to do a much small shift to find the best fit on the coarser image. I returned this shift up and then applied that shift to one twice the size. Since the coarser image took care of most of the shifting, a small region was sufficent to accomodate alignment. Thus, the small shifts were passed up on each scaled down image until it reached the original. This method boosted an immense speed up.

This approach failed on the Emir picture. This was due to the poor selection of features as Amir's bright blue suit meant that one image was very dark at his suit while another was nearly white. This meant that minimizing the norm would not be a strong represenation of alignment. To solve this. We needed edge detection and I used skimage.filters.sobel. I then passed in an image or only edges to the alignment function. This addition worked for all the images.

ALL OFFSETS WILL BE LISTED (GREEN/BLUE) AND (RED/BLUE)

Small Images

Cathedral (5, 2) (12, 3)

Monastery (-3, 2) (3, 2)

Nativity (3, 1) (8, 0)

Settlers (7, 0) (15, -1)

Big Images

Three Generations (53, 14) (112, 11)

Icon (41, 17) (90, 23)

Harvesters (60, 17) (124, 14)

Lady (52, 9) (112, 12)

Self Portrait (79, 29) (176, 37)

Train (42, 6) (87, 32)

Turkmen (56, 21) (116, 28)

Village (64, 12) (138, 22)

Emir (49, 24) (107, 40)

Custom Images

Gorok (45, -19) (103, -36)

Hill (2, -1) (10, -2)

Rivers (54, 9) (121, 19)