Back to photostream

1000 Milestone

In september of 2019 I challenged myself to upload one photo every day to flickr.

That forced me to browse my then ~90k Lightroom catalog, select, review, and edit shots to find something to post.

And of course it also provided me with an incentive to take my gear out more regularly, even if the pandemic reduced the opportunity to travel, leading to some monotony in the available subjects.

 

Today marks a streak of 1,000 daily pictures:

www.flickr.com/photos/christiancorsano/albums/72157711201...

 

It is not always top quality shots, but I am still proud of the result, and more importantly of keeping the pace going.

Lack of time also led me to dramatically reduce the time I spend on the site, and I deeply apologize for not commenting or even responding to all your lovely comments, which I used to do in the beginning.

Hopefuly I will manage to fit that in my daily routine again soon.

 

And if you read that far, thank you so much for your visit !

 

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

Now for some technical details about this particular piece, as contrary to my 1st year celebration, this is more than just a montage:

 

This picture is generated by a small throwaway C# program, using Flickr APIs and a handful of dependencies (mainly ImageSharp).

The code starts loading all pages of the album, then proceed to load the size for each photo to get the URL of the "Large Square" 150px x 150px thumbnail and download them to memory.

This can take a couple of minutes, especially since I avoid hitting the Flickr API too hard (downloading the photos is fine though, so they are fetched in parallel), so the photo infos and thumbnails are cached to disk to allow quick iterations on the fun part: building the mosaic.

 

I went for 42 columns and 24 rows, which gives 1008 tiles to fill. It does mean that I take 8 random pictures and duplicate them to fill the gaps.

Going for the max resolution (because why not), final mosaic is 6300px x 3600px.

Next step is to prepare the pattern I want to match, here simple "1000" in text, so I generate a small image with the black text, written in 64pt.

It is low resolution, but that's fine as the scaled up version will have a nice blur that we would have to apply anyway.

 

To fill the pattern I started dumb, got okay results, tried a smarter solution, which made it worse, and went back to the dumb solution to refine it a bit.

The dumb solution was to compute the brightness of each of the photos, do the same with each tile of the text pattern, order the photos and tiles by that value and distribute them.

The smarter solution was to replace the brightness by the computation of a perceptive hash of each image and pattern tile, to be able to get a similarity score for each of them and place the best match on the tiles.

It didn't work well, I suspect because the hashing algorithm work best for very similar picture and here most of the pattern tiles are completely white or black gradient.

So taking some of the more involved sorting and matching and reinstating the brightness approach is what I went for.

 

Even with that, the lack of very dark pictures in my set meant cheating a bit, and I do reapply the text as a 0.2 opacity darkening mask on top of the completed mosaic.

 

If I ever get to rework the code to make it somewhat readable I might share it, so let me know if you are interested.

8,484 views
160 faves
32 comments
Uploaded on June 3, 2022