Images of the Russian Empire: Colorizing the Prokudin-Gorskii photo collection

by Nir Levin

Overview

In this project, I took black/white images from the Prokudin-Gorskii photo collection and constructed their color versions. This was possible because each b/w image was taken with three separate color filters, one for each of red, green, and blue. This effectively made three channels that I could combine to reconstruct the color image.

Naïve approach

The main challenge with the reconstruction was to figure out how each channel should be aligned in order to produce a clear image. With the smaller pictures, it was easy to just brute force a 15 by 15 area of offsets. For each offset for a pair of channels I was trying to align, I'd calculate the L2 norm of their differences. I would take the offset with the smallest L2 norm, assuming that that was the most aligned. I did this for green vs blue and then red vs blue.

G: [5, 2], R: [12, 3]
G: [-3, 2], R: [3, 2]
G: [3, 3], R: [6, 3]

A More Efficient Approach

The above approach is too inefficient. For much larger images, I opted to use a recursive approach to find the optimal alignment. First, I would scale down the channels to 10% their original size, then run the naïve approach on them. This would give me a general idea of where the optimal alignment is. I'd then scale the channels to 25% their original size and run the naïve algorithm, but starting from the alignment given to me by the previous iteration. Then 50%, 75%, 100% in order to slowly hone in on the correct alignment. As long as the correct alignment was within 200 pixels or so, this method worked. I shaved off time by cropping out more of the boundary.





G: [25, 4], R: [58, -4]
G: [59, 17], R: [123, 15]
G: [41, 17], R: [89, 23]
G: [52, 8], R: [112, 12]
G: [82, 11], R: [179, 13]
G: [51, 27], R: [108, 37]
G: [78, 29], R:[175, 37]
G: [52, 15], R: [111, 12]
G: [43, 7], R: [86, 32]
G: [53, -1], R: [105, -12]

Emir

The special case with Emir resulted from the the massive disparity between the three color channels. The offset between the channels is too large for my algorithm to handle.

G: [48, 24], R: [0, -196]

Custom Selection


G: [11, 45], R: [29, 72]
G: [11, 17], R: [35, 18]
G: [26, 19], R: [56, 27]