__   ___  ___       _______       ___  _______   
|/"| /  ")|"  |     /"     "|     |"  ||   _  "\  
(: |/   / ||  |    (: ______)     ||  |(. |_)  :) 
|    __/  |:  |     \/    |       |:  ||:     \/  
(// _  \   \  |___  // ___)_   ___|  / (|  _  \\  
|: | \  \ ( \_|:  \(:      "| /  :|_/ )|: |_)  :) 
(__|  \__) \_______)\_______)(_______/ (_______/  
			
			

Viewing Columbo at a Distance

Inspired by Taylor Arnold and Lauren Tilton’s Distant Viewing: Computational Exploration of Digital Images , Frank Fischer's network analysis of Curb, and the Columbo Screenshots BlueSky bot, I decided to take a look at the colors of Columbo.

Firstly, I wanted to be able to find the Columbo frame with the average color closest to a given color. In order to do this, I first got my hands on a low-resolution (360p) rip of the entirety of Columbo. Then, using the cv2 Python wrapper for OpenCV, I iterated through every frame and recorded each frame’s average red, green, and blue value (deleting the black bars at the top and bottom of the frames when necessary) , along with the episode number, season number, and frame count. The resulting Pandas DataFrame was 10,782,016 rows long, each row representing a frame, and the resulting CSV weighed in at 1gb. Reasonably hefty.

This process took about eight hours (I challenge my dear friend/mortal enemy Siddha Mavuram to do it faster). But once it was done, I was pretty close to being able to color match Columbo frames. All I had to do next was find a loss function. I settled on summed squared error, i.e. finding the difference between the frames’ RGB values and the desired RGB values, squaring them, and summing them. Then all you need to do is find the frame with the lowest loss.

For example, suppose I want to find the frame with the color #3a5133 (a dark green). All I need to do is calculate this loss for the ~11,000,000 frames (with Pandas NumPy this actually takes no time at all), then sort the frames by ascending loss and take the first. In this case, the frame with the lowest loss is this one:


green 3a5133 07 02 murder under glass 48865

#3a5133 – Season 07 Episode 02 – Murder Under Glass – Frame 48865

A nice bunch of bell peppers with a very attractive color.

Using this color matching, you can produce color palettes of frames, like the ones below.




Greens

green 162113 02 04 dagger of the mind 82219

#162113 – Season 02 Episode 04 – Dagger of the Mind – Frame 82219

green 22301e 03 04 double exposure 4290

#22301e – Season 03 Episode 04 – Double Exposure – Frame 4290

green 2f3f29 10 08 butterfly in shades of grey 29757

#2f3f29 – Season 10 Episode 08 – Butterfly in Shades of Grey – Frame 29757

green 3a5133 07 02 murder under glass 48865

#3a5133 – Season 07 Episode 02 – Murder Under Glass – Frame 48865

green 485b42 05 03 identity crisis 85034

#485b42 – Season 05 Episode 03 – Identity Crisis – Frame 85034

green 55684f 04 03 by dawns early light 36220

#55684f – Season 04 Episode 03 – By Dawn's Early Light – Frame 36220




Muted Rainbow



#8b0000 – Season 10 Episode 14 – Columbo Likes the Night Life – Frame 157164



#ff8c00 – Season 02 Episode 07 – The Most Dangerous Match – Frame 1137



#cccc00 – Season 02 Episode 03 – The Most Crucial Game – Frame 116812



#006400 – Season 10 Episode 14 – Columbo Likes the Night Life – Frame 28782



#00008b – Season 02 Episode 07 – The Most Dangerous Match – Frame 2104



#4b0082 – Season 10 Episode 14 – Columbo Likes the Night Life – Frame 76194



#8b008b – Season 00 Episode 01 – Prescription Murder – Frame 1300




Pastels



#ffb3ba – Season 01 Episode 06 – Short Fuse – Frame 30171



#ffdfba – Season 01 Episode 06 – Short Fuse – Frame 131438



#ffffba – Season 09 Episode 02 – Columbo Cries Wolf – Frame 4437



#baffc9 – Season 02 Episode 03 – The Most Crucial Game – Frame 20353



#bae1ff – Season 10 Episode 14 – Columbo Likes the Night Life – Frame 76917



#e0bbe4 – Season 02 Episode 07 – The Most Dangerous Match – Frame 29120




Rainbow



#ff0000 – Season 00 Episode 02 – Ransom for a Dead Man – Frame 99188



#ff7f00 – Season 02 Episode 07 – The Most Dangerous Match – Frame 1137



#ffff00 – Season 02 Episode 03 – The Most Crucial Game – Frame 116807



#00ff00 – Season 02 Episode 07 – The Most Dangerous Match – Frame 1680



#0000ff – Season 02 Episode 07 – The Most Dangerous Match – Frame 1981



#4b0082 – Season 10 Episode 14 – Columbo Likes the Night Life – Frame 76194



#9400d3 – Season 02 Episode 07 – The Most Dangerous Match – Frame 2571

Four of the seven colors from the Rainbow pallete come from the same episode. S02E07 The Most Dangerous Match begins with a dream sequence with a shifting, rainbow strobe effect, meaning that if you’re looking for highly saturated, monocolor Columbo frames, its your best bet nine times out of ten.

To see just how crazy this strobe effect is in terms of color value saturation, take a look at the first five minutes of this episode compared to the first five minutes of the episodes that come directly before and after.

most dangerous match chart stitch in crime chart double shock chart

Cool as these frames are, they are outliers, and I got to wondering what the general color distribution of Columbo looks like. To take a look at it, I took a sample of 1,000 frames and visualized each of them as a point of that color in 3D space, with their RGB values as xyz coordinates. This is that general distribution:

general sample

As you can see, the xyz coordinates tend to increase and decrease together, clustering around the center diagonal of the cube, and producing colors that are, on average, pretty gray, although we get some colorful scallion-style divergence at the top. The average color (visualized below) is a dark gray.

average

But the outliers really are the most fun, and I wanted to see them in this format too. To this end, I added a boolean column (“outlier”) to the combined data frame, which was true when a given frame had a zscore of three or higher, and false otherwise. Sampling from the outliers produces this visualization:

outlier

And sampling 500 from each (outlier and non-outlier) gives a broad (if quantitatively inaccurate) account of the colors of Columbo:

stratified

In general, it seems the average color palette of Columbo is muted and rather dark. The figure below illustrates the average RGB values per episode throughout the series.

rbg per ep

The colors seem to be generally the same over the course of the series, although season 8 is significantly darker than the rest. In 1989, after a 12 year hiatus, ABC releases new episodes (the first 7 seasons ran on NBC). Here, the format of the show switches from 4:3 to 16:9 (at least in my rip). The first episode of season 8 (Columbo Goes to the Guillotine) is just about as dark as the show gets, and we don't return to normal until season 9. It seems the ABC execs wanted a change of tone (let's call it "Columbo goes dark"), but reverted to the old brightness in the following seasons.



#172036 – Season 08 Episode 01 – Columbo Goes to the Guillotine – Frame 18901

I was also curious to see how colors change over the course of the episode. Across episodes, I took the average color of each frame, and came up with the below graph. The divot at around ten minutes is interesting, but I don’t know how to explain it. My only guess is that around 10 minutes, the murders usually take place… An avenue for future research.

average colors per frame

Perhaps we learned a little bit more about Columbo? Maybe, maybe not. Anyway, as a finale, here is Columbo made out of frames from Columbo:

columbo of columbo