Turning into Turing,
an Informal Inquiry,
2022
TL;DR:
If you repeatedly rotate an image (100’s or 1000’s of times) in Photoshop® using one of the bicubic interpolation methods, it will produce a Turing pattern.
Rotational Growth in Photoshop®
I stumbled into this one while working on a different project where I scripted the rotation of an image in preparation for an animation. When I looked at the last frame though, I noticed the image looked washed out and with odd patterning. Some sort of generational loss was happening to the image and I remembered previous exmaples of exploiting and celebrating the degradation process, like Alvin Lucier’s I Am Sitting in a Room, saving a jpeg hundreds of times, and the like; I knew I needed to push the rotational distorion as far as I could.
The Inquiry:
Let’s use this image of a rainbow gradient:
and rotate it 72 times in 5 degree increments so we’ve done a full rotation and should be back to the original:
As you should be able to see in the animation, the gradient no longer looks the same after 360°. If we then take only the frames from multiples of 360°, the image begins to grow and show the characteristics of a Turing pattern:
Interpolation Algorithm Differences
Depending on the interpolation method you use, a different result occurs.
Interpolation Algorithm | 5° × 72 iterations = 1 revolution (360°) | 5° × 3240 iterations = 45 revolutions (16200°) |
Bicubic | ||
Bicubic Sharper | ||
Bicubic Smoother | ||
Bilinear | ||
Nearest Neighbor |
Interpolation Algorithms Not Included in Photoshop®
Adobe Photoshop® only has the above 5 interpolation methods to choose from (we’ll mostly ignore Bilinear and Nearest Neighbor from here on as they don’t produce Turing patterns). The utility software suite ImageMagick contains a whole host of other interpolation (11) & filtering (31) algorithms that can be used when rotating images. Too many to fit on this page, so see 5 degrees of ImageMagick rotation:
What about the pixel rotation popularized in Matt Parker’s “Rotation without rotating” video?
Well, even the three-shear rotation that Matt use degrades the image over repeated rotations, though it does keep the same number and color of pixels as the original. The key to the entropy process is that each image rotation uses the resulting image of the previous rotation’s interpolation calculations, not repeatedly using the starting image. That means pixel placements are a moving target, and iterative degradation ensues similar to nearest neighbor.
What about “my esoteric / favorite” method?
Let’s find out! Send them my way and add to the list...
Interpolation Algorithm | 5° × 72 iterations = 1 revolution (360°) | 5° × 3240 iterations = 45 revolutions (16200°) |
Three-Shear | ||
RotSprite | all pixels got eaten after 575° |
Degrees per Rotation Differences
Let’s have a look at how the patterns change based on the degree that you execute each rotation iteration. I’ve done all the integer degrees that evenly split 360º as well two small decimal degrees. Note that rotating by 90° or 180° have no effect as they are lossless transformations.
Rotation Info | Bicubic | Bicubic Sharper | Bicubic Smoother |
0.25° 1440 iterations 1 revolution 360° |
|||
0.25° 4320 iterations 3 revolutions 1440° |
|||
0.5° 720 iterations 1 revolution 360° |
|||
0.5° 3600 iterations 5 revolutions 1800° |
|||
1° 360 iterations 1 revolution 360° |
|||
1° 3240 iterations 9 revolutions 3240° |
|||
2° 180 iterations 1 revolution 360° |
|||
2° 3240 iterations 18 revolutions 6480° |
|||
3° 120 iterations 1 revolution 360° |
|||
3° 3240 iterations 27 revolutions 9720° |
|||
4° 90 iterations 1 revolution 360° |
|||
4° 3240 iterations 36 revolutions 12960° |
|||
5° 72 iterations 1 revolution 360° |
|||
5° 3240 iterations 45 revolutions 16200° |
|||
6° 60 iterations 1 revolution 360° |
|||
6° 3240 iterations 54 revolutions 19440° |
|||
8° 45 iterations 1 revolution 360° |
|||
8° 3240 iterations 72 revolutions 25920° |
|||
9° 40 iterations 1 revolution 360° |
|||
9° 3240 iterations 81 revolutions 29160° |
|||
10° 36 iterations 1 revolution 360° |
|||
10° 3240 iterations 90 revolutions 32400° |
|||
12° 30 iterations 1 revolution 360° |
|||
12° 3240 iterations 108 revolutions 38880° |
|||
15° 24 iterations 1 revolution 360° |
|||
15° 3240 iterations 135 revolutions 54600° |
|||
18° 20 iterations 1 revolution 360° |
|||
18° 3240 iterations 162 revolutions 58320° |
|||
20° 18 iterations 1 revolution 360° |
|||
20° 3240 iterations 180 revolutions 64800° |
|||
24° 15 iterations 1 revolution 360° |
|||
24° 3240 iterations 216 revolutions 77760° |
|||
30° 12 iterations 1 revolution 360° |
|||
30° 3240 iterations 270 revolutions 109200° |
|||
36° 10 iterations 1 revolution 360° |
|||
36° 3240 iterations 324 revolutions 116640° |
|||
40° 9 iterations 1 revolution 360° |
|||
40° 3240 iterations 360 revolutions 129600° |
|||
45° 8 iterations 1 revolution 360° |
|||
45° 3240 iterations 405 revolutions 54600° |
|||
60° 6 iterations 1 revolution 360° |
|||
60° 3240 iterations 540 revolutions 109200° |
|||
72° 5 iterations 1 revolution 360° |
|||
72° 3240 iterations 648 revolutions 116640° |
|||
120° 3 iterations 1 revolution 360° |
|||
120° 3240 iterations 1080 revolutions 109200° |
what’s this guy doing?!? |
Single Color
I think the pattern that Bicubic makes is the same no matter what color is being used (to research more), while the other two are different based on color
Rotation Info | Bicubic | Bicubic Sharper | Bicubic Smoother |
5° 72 iterations 1 revolution 360° |
|||
5° 3240 iterations 45 revolutions 16200° |
Two Colors
When two flat colors are used, there is an interesting reaction based on the differences between the RGB values of the two colors.
Rotation and color info | 60 iterations / 1 revolution (360°) | Correlation of RGB values | 3240 iterations / 54 revolutions (19440°) |
6° Red & Magenta |
only the two colors |
||
6° Red & Yellow |
only the two colors |
||
6° Green & Yellow |
only the two colors |
||
6° Blue & Magenta |
only the two colors |
||
6° Red & Dark Red |
only one color and black |
||
6° Green & Light Green |
only one color and white |
||
6° Red & Blue |
the two colors, their secondary color, and black |
||
6° Green & Blue |
the two colors, their secondary color, and black |
||
6° Red & Green |
the two colors, their secondary color, and black |
||
6° Green & Magenta |
the two colors, white, and black |
||
6° Blue & Yellow |
the two colors, white, and black |
||
6° Greyish & Salmonish |
primary colors, secondary colors, white, and black |
||
6° Greyish & Salmonish (16-bit color) |
primary colors, secondary colors, white, and black |
Has somebody already done this?
Since this is one of those super simple things that anyone can do—they just need to be the first to find it,—I was worried I had spent a whole bunch of time repeating something someone else had done already. I was also aware of other projects that use repeated actions to expose generational loss that I mentioned earlier, but nothing that focused specifically on rotation as the impetus, and nothing that ended up with Turing patterns. After some cybersearching, I could only find things that were close, but nothing that hit on the Turing pattern aspect.
I think the closest was all the way back in 1999 when Helmut Dersch tested the quality of different interpolation algorithms by rotating images in 5° increments 36 times to 180° of the original (I chose 5° for my original samples in their honor). I am including a resampling of the images they used in the tests to give a look at what Helmet might have discovered back then. The second closest was a variation on something I was aware of (resaving jpegs), rotational jpeg compression. Here I think the degradation relies more on the unique qualities of jpegs, and doesn’t result in the novel patterning.
I did also come across another artist who found a way to make Turing patterns in Photoshop® using repeated blurring and sharpening of images. Given the way this method works, you have much greater control over the resulting Turing pattern. My method relies on the reaction-diffusion system happening at a pixel level, and so the variety of end results is pretty limited.
Revising Helmet Dersch’s tests | Monument | Test | Ken Turkowski’s Zone Plate |
The original images | |||
Same settings as original experiment, except 1° instead of 5° Bicubic, 1° 180 iterations 0.5 revolutions 180° then flipped 180° |
|||
Bicubic, 5° 72 iterations 1 revolution 360° |
|||
Bicubic, 5° 3240 iterations 45 revolution 16'200° |
|||
Bicubic Sharper, 5° 72 iterations 1 revolution 360° |
|||
Bicubic Sharper, 5° 3240 iterations 45 revolution 16'200° |
|||
Bicubic Smoother, 5° 72 iterations 1 revolution 360° |
|||
Bicubic Smoother, 5° 3240 iterations 45 revolution 16'200° |
A note about the size of the images on this page:
The rotated images often contain a vast network of pixels that extend around the visible patterns. These pixels are 99/100% transparent, making them virtually imperceptible. They also added a lot of extraneous bloat to the page. As a fix, I have trimmed many of the resulting images to only show the visible pixels. I'm including here an example of the true extent of one image and, to show the hidden network of pixels, another version where I have removed the alpha (transparency) channel.
Rotation Info | Original result of rotations | Original with no transparency |
Bicubic, 5° 3240 iterations 45 revolutions 16200° |
What about if we rotate the image 5 degrees and then immediately rotate it -5 degrees over and over?
Interpolation algorithm | 72 iterations | 3240 iterations |
Bicubic Sharper |
Or rotate 5 degrees for one full revolution (360°) and then rotate it -5 degrees for a full revolution (-360°)?
Interpolation algorithm | 144 iterations (since 72 wil be the same as original) | 3240 iterations |
Bicubic Sharper back and forth |
||
Bicubic Sharper one direction |
Photoshop® Script:
I’m working on a script that allows people to create their own Turing patterns and animations. You can find it on github.
References / Related / Further Reading / etc.:
- So much ImageMagick info on interpolation and filters
- Helmut Dersch’s Testing Interpolator Quality from 1999
- PetaPixel on Repeated JPEG Rotation
- Degrading jpeg images with repeated rotation
- PetaPixel on Saving JPEGs hundreds of times
- Lossy jpgs
- Degradation by rotation in ImageMagick
- Andrew Werth’s Turing Patterns in Photoshop®
- Any number of Photoshop® Turing pattern tutorials on YouTube
- Video feedback and how it works
- Alvin Lucier’s I Am Sitting in a Room
- Cory Arcangel’s Untitled homage to Lucier
- PetaPixel on I Am Sitting in a Video Room canzona’s YouTube take
- MKBHD’s update of I Am Sitting in a Video Room (above), with decent explanation
- Sitting In Stagram by Pete Ashton
- Reregrammer by Patrick Koziol - first image
- reaction diffusion playground great list of references links too!
- Recursive image rotation with source code by r_vizzz
- banana ¯\_(ツ)_/¯
- Turing pattern (wikipedia)
- Generation Loss (wikipedia)
- Emergence (wikipedia)
- Reaction–diffusion system (wikipedia)
- Bicubic interpolation (wikipedia)
To research further:
- Rotate around corners vs center: images get wildly off center, but how different are they?
- Combining different degrees, filters, etc.
- Does scaling up and down ever achieve similar results? Neil Cicierega covered content aware scaling with his updated script, but doesn't create Turing patterns.
Assorted other images from the process:
Bicubic, 1° for 720 iterations |
Nearest Neighbor, 1° for 360 iterations |
Hi Neil! |
Three-Shear Rotation, 1° for 360 iterations |
Three-Shear Rotation, 10° for 36 iterations All the pixels are there... but still mixed up |
Rotsprite Rotation, 10° for 36 iterations |
Bicubic Smoother, .3333° |
original Rotsprite Rotation, 1° for 360 iterations |