Most recent posts

Median stack mode: getting rid of people

Before we went away last week to Belgium, I was reading about a technique for removing people from your photos using Photoshop. I think I’d heard or read about it before way back when but had never really investigated the technique properly. This time though, I delved in deeper to see if I could do it myself. I suppose it was prompted by this short video that takes the technique to an extreme (notice how the shots with just the protagonist and no crowds are stationary/static so the technique can be applied).

In essence you take half a dozen shots of the same scene, at the same exposure, at the same focal length, at 5 second or so intervals, and then get Photoshop to “average out” the content of all the images, discarding those pixels that are not replicated among all the images. The theory is that passing people/cars/whatever are only present in one of the images and so would be discarded from the aggregate.

So while in Bruges I decided to try it out. Why Bruges? Because, holy cow, there were a gazillion people wandering around. Every photo I took had tourists in it.

My first attempt was just outside our hotel, facing down Oude Burg to Wollestraat at the end. A nice old merchant house from 1579. Since I didn’t have a tripod with me, I used a column on the building on the left to prop my camera on to minimize wobble. I took 9 photos (not that I was really counting) over a period of 30 or so seconds, trying to ensure that the people in view were moving across the scene.

Set of photos of Bruges Merchant House

Original photos of house

Later on, I imported them into Adobe Lightroom, selected the nine photos, and then right-clicked and selected Edit In…, then Open as Layers in Photoshop.

At this point I was ready to follow the steps detailed in the Photoshop Help. First step was to align the images, to remove the inevitable wobble as I took the photos. (Select > All Layers, followed by Edit > Auto-Align Layers | Auto). Next the images had to be gathered in to a Smart Object (Layer > Smart Objects > Convert to Smart Object). At this point, the magic was ready to be unleashed: selecting a Stack Mode (Layer > Smart Objects > Stack Mode). The one to use is Median to remove unwanted objects, such as people – in essence, the output color for a particular pixel is the median of all the pixels in the same position in the images.

Once that is done, you can rasterize the image stack and save it. Here’s the resulting image:

Bruges Merchant house (stacked)

Stacked photo of house

All told, not too bad. However, what I didn’t realize when taking the photos is that in the majority of the images had someone in the lower right corner. Yes, people were moving, but every time I happened to take a photo someone was around there. The stacked image therefore has “ghosts” in that corner. Something to bear in mind the next time I try this technique out.

The next day, I had another crack at it: taking a photo of the front door of the Provinciaal Hof in the Grote Markt. A nice sunny day with lots of people walking around. I took 10 photos this time and tried to space them out more. (My camera prop this time was a set of bleachers that had been erected in the Markt for the procession a couple of days before.)

Set of photos of Provinciaal Hof

Original photos of Provinciaal Hof

After importing them and running through the image stack process, the result was this:

Provinciaal Hof (stacked)

Stacked photo of Provinciaal Hof

Way better. In fact this time there are no ghosts at all: it just looked as if I had been extremely lucky and taken a photo when there were no passersby.

All in all, even though I only tried this technique twice with this particular vacation, I shall certainly be experimenting more with it in the future.


Album cover for The Jazzmasters 4Now playing:
The Jazzmasters - Visions of Illusion
(from The Jazzmasters 4)

Calculating the date of Easter for a particular year

A long time ago, in a galaxy far, far away – OK, it was in London in 1993 – I added a DateEaster function to my personal Dates unit, written in Borland Pascal 7. So: 16-bit DOS for all you oldies. For a bit of fun, I shall present it here with some commentary. At the time I was really proud of this unit: the majority of it was written in assembly for speed reasons (it was used in a swaps trading app I was writing) and it could calculate things like days between two dates (including on a 360-day basis...


Using Node to run JavaScript from Sublime Text

A quick one, more for my benefit next time I have to set this up in the future. Sometimes, I’m writing some JavaScript that can be divorced from a web page. Maybe it’s a weird bit of code, maybe I’m experimenting with (say) functional programming, maybe it’s just a small self-contained function, but I’d really like to test it right there and then, rather than copy/paste it and use the developer tools in my browser. For Sublime Text, we can set up a “ build system ” to do this. First install node...


Professional theme? Sure, except for these bits…

Back in January , I pulled the trigger on a new theme for this blog. I recognized some time ago that I am not a very good web designer (I can do small tweaks to CSS but not comprehensive composition) and it would be far better to buy something that’s well designed and then spend the time wrapping the output from the blog engine to this new look and feel. And that, pretty much, is what happened. I bought a professionally designed theme (making sure it was responsive), and hacked away at the templates...


Script from my very first appearance on stage

In a week where I am about to tread the boards again for the first time in over a year, my sister was sorting out some of our parents’ documents, found this page and scanned/sent it to me this morning. It is nothing less than the “script” – if I may call it that – of what I had to learn as announcer (or perhaps, more accurately, narrator?) for a production of Snow White and the Seven Dwarves that our school was putting on. The wrinkle is, we were living in France at the time so it’s in French. Even...


SlySoft is dead, long live RedFox!

A week or so ago, the SlySoft website was suddenly replaced by a terse announcement that “[d]ue to recent regulatory requirements we have had to cease all activities.” I’m willing to bet that most of my readers haven’t heard of SlySoft or their main product, AnyDVD. In essence, AnyDVD is an app that circumvents the DRM present in all DVDs and Blu-ray discs, at the driver level. There are two reasons for doing this. The first is to circumvent the region encoding used by DVDs, and this was the initial...


Don’t configure Windows 10 with your Microsoft account unless you want a five letter name

A bit abrupt a headline, no? Well, it cost me a couple of hours by doing so. The scenario is this: you’ve just bought /acquired/factory reset a laptop with Windows 10 installed. The first thing you have to do then is configure it: you know, define the language to be used, the timezone, connect to the WiFi, set up an account on the machine, and so on. It’s this latter part that’s the problem. Windows would love you to use your Microsoft account to do so. It gives you a lot of benefits, such as sharing...


Goodbye Dell XPS 13, hello Dell XPS 13

Last year, having tried out a Surface Pro 3 and disliking it, I bought a Dell XPS 13 ultrabook as my “travel” computer. This year? Well, Dell refreshed the range, added more memory and and a bigger SSD and suddenly I was looking at my 5-year-old Dell XPS 15z and thinking it was time to replace that. And what better way to replace it by having a single laptop that I used all the time? The other consideration that factored into the calculation was that the new XPS 13 not only has more “space” but it...


Thinking functionally in JavaScript – a fun interlude

I’ve been talking about functional JavaScript for a few posts, but, to be honest, it’s nice to put the theory aside and just practice thinking and writing functionally. With that in mind, let see what we can do about fixing some “copy-n-paste” code. I bought a theme for this site a month or so back – you’re looking at it. As part of the theme, you get some HTML showing what various types of pages look like, the CSS to render it all, and some JavaScript. Usually the HTML/CSS is fine, but then I take...


Thinking functionally in JavaScript (part three)

In continuing this series of posts about functional JavaScript ( one , two ), I whimsically wondered if we could apply the SOLID principles of object-oriented programming . We took a look at S last time (the Single Responsibility Principle), and were fairly successful. The principle I introduced there was not only that the functions we write should do one thing and do it well. If we can embrace global immutability, so much the better (in other words, the function should not have side effects ). Small...