TITLE: Happy Birthday Programming
AUTHOR: Eugene Wallingford
DATE: June 08, 2016 2:48 PM
Yesterday, I wrote me some Java. It was fun.
A few days ago, I started wondering if there was something unique
I could send my younger daughter for her birthday today. My
daughters and I were all born in presidential election years,
which is neat little coincidence. This year's election is special
for the birthday girl: it is her first opportunity to vote for the
president. She has participated in the process throughout, which
has seen both America's most vibrant campaign for progressive
candidate in at least forty years and the first nomination of a
woman by a major party. Both of these are important to her.
In the spirit of programming and presidential politics, I decided
to write a computer program to convert images into the style of
Shepard Fairey's iconic Obama "Hope" poster and then use it to
create a few images for her.
I dusted off Dr. Java and fired up some code I wrote when I
taught media computation in our intro course
many years ago.
It had been a long time since I had written any Java at all, but
it came back just like riding a bike. More than decade of
writing code in a language burns some pretty deep grooves in the
I found RGB values to simulate the four colors in Fairey's poster
in an old message to the mediacomp mailing list:
Color darkBlue = new Color(0, 51, 76);
Color lightBlue = new Color(112, 150, 158);
Color red = new Color(217, 26, 33);
Color yellow = new Color(252, 227, 166);
Then came some experimentation...
I liked the outputs of this third effort quite a bit, at least for
the photos I gave it as input. Two of them worked out especially
well. With a little doctoring in Photoshop, they would have an
even more coherent feel to them, like an artist might produce with
a keener eye. Pretty good results for a few fun minutes of
Now, let's hope my daughter likes them. I don't think she's ever
received a computer-generated present before, at least not generated
by a program her dad wrote!
The images I created were gifts to her, so I'll not share them here.
But if you've read this far, you deserve a little something, so I
give you these:
Now that is change we can all believe in.
- First, I tried turning each pixel into the Fairey color to
which it was closest. That gave an image that was grainy
and full of lines, almost like a negative.
- Then I calculated the saturation of each pixel (the average
of its RGB values) and translated the pixel into one of the
four colors depending on which quartile it was in. If the
saturation was less than 256/4, it went dark blue; if it
was less than 256/2, it went red; and so on. This gave a
better result, but some images ended up having way too much
of one or two of the colors.
- Attempt #2 skews the outputs because in many images (most?)
the saturation values are not distributed evenly over the
four quartiles. So I wrote a function to "normalize" the
quartiles. I recorded all of the saturation values in the
image and divided them evenly across the four colors. The
result was an image with an equal numbers of pixels assigned
to each of the four colors.