New Year's Redactions

My earlier text redaction demos were done in my OpenGL setup, using a pixelation effect overlaid on a text document. This was rather simple, but it required some manual tweaking to align the pixelation grid with the text. I've now redone the effect in text mode using Python, and besides unifying the text and "graphics" more cleanly, it makes certain extra features easier, such as this incremental redaction. Of course, video sources as used in the previous post also work.

A particular feature of the unified text + graphics process is that redactions won't exceed the length of each line. In the OpenGL version, the draw area had to be limited to the text rectangle manually, but now it works as it should have done all along.

#2026 #trumpmemes #epsteinmemes #jeffreyepstein #epsteinfiles #halftoneart #raster #pixelart #textmode #textmodeart #oldskool #xterm #pythoncode #algorithmicart #algorist

What shall we find in the Epstein files?
What shall we find in the Epstein files?
What shall we find in the Epstein files
early in the morning?

Model: @noira_musti

#trumpmemes #epsteinmemes #jeffreyepstein #epsteinfiles #halftoneart #raster #pixelart #realtime #opengl #pythoncode #algorithmicart #algorist

Trump found in the Epstein files! A little Xmas fun with image quantization.

#donaldtrump #trumpmemes #jeffreyepstein #epsteinfiles #halftoneart #raster #pixelart #algorithmicart #algorist

Testing the Gosper curve in my variable iteration halftoning setup. So far I've only used the Hilbert curve this way, and things get a bit coarser with the Gosper, so it was harder to find images that make nice results. So here we are with the old Venus again.

The number of points multiplies by 4 for Hilbert and 7 for Gosper on each step, so the latter has to get by with fewer iterations for a sensible resolution. Here we have 6 iterations for 6 grey levels.

#halftoneart #gospercurve #planefillingcurve #spacefillingcurve #singlelinedrawing #pythoncode #opengl #algorithmicart #algorist #mathart #laskutaide #ittaide #kuavataide #iterati

In the last post, Tis Veugen suggested dithering with the Gosper curve. At first I thought this doesn't make sense, since the curve lives on a hexagonal lattice, while dithering is generally done at the native pixel level, which means a square lattice. But as I thought about this further, it started to look like a fun challenge. Besides, the square grid hasn't always been the native way to organize pixels; for example, some old CRTs also used a hex lattice.

So I was really just making up excuses for the extra work. First I had to set up interpolated sampling, which would come for free in OpenGL, but now I was working on the CPU. The Gosper curve was also new to me, and I implemented it in my own way from first principles using IFS ideas, like I'd done earlier with the Peano curve.

For comparison, here's also a version with the boustrophedon curve on a hexagon, since I already had that curve function in my toolbox. Finally there's also the raw Gosper curve, though a smaller version to give a clearer idea.

#dithering #halftoneart #raster #pixelart #gospercurve #planefillingcurve #spacefillingcurve #pythoncode #opengl #algorithmicart #algorist #mathart #laskutaide #ittaide #kuavataide #iterati

The previous demo made me dig deeper into dithering algorithms. It's something I should have done years ago, as I've been using simple random dithering now and then, and I hadn't even thought of gamma correction. One algorithm in particular caught my eye: Riemersma dithering, which uses the Hilbert curve. Compared to the usual matrices for error diffusion, the curve approach seemed easier to implement in some ways, as it has fewer edge issues.

More interestingly, it struck a chord with my earlier experiments with space-filling curves in image processing. So it was a kind of familiar territory, but it also seemed esoteric enough that I could imagine making some new discoveries. For example, play with other plane-filling curves besides the Hilbert.

The first image uses the boustrophedon curve, which makes the vertical wave patterns I recall from a number of non-dithering demos. The second curve is what I call the diagstrophedon, a diagonal zig-zag starting from the top left corner, and I think its wavy artefacts make a nice match for Venus's hair.

Then in image 3 we have Hilbert, which doesn't seem to make any particular artefacts, and I guess that's a good thing for dithering. Finally 4 uses the Peano curve, which makes some fun wiggles in light areas.

#dithering #riemersmadithering #stippling #halftoneart #raster #pixelart #hilbertcurve #peanocurve #planefillingcurve #spacefillingcurve #pythoncode #opengl #algorithmicart #algorist #mathart #laskutaide #ittaide #kuavataide #iterati

I came across this halftoning idea sometime last week. While the idea was relatively easy to understand and fun to implement, I've spent quite a lot of time trying to make the result look nice.

In each row, the image is split into bins containing roughly the same sum of lightness value. This is nice to implement when the number of lines/bins is a power of 2, so we can recurse with a binary split. Thus the line density varies by average lightness. The problem is that density is considered along the x-axis. If things change a lot between rows, the lines get slanted, so they appear more dense. Here I've included some averaging between neighbouring rows to make thing a bit smoother.

I'm also including a fun glitch from the early tests. The line-density system includes the set of point coordinates and the graph structure (which point is connected to which). What happened here is my generic graph generator that simply finds the nearest neighbours of each point. So in the light areas that are compressed horizontally, the nearest neighbours were left and right.

#halftoneart #lineart #patterns #texture #pythoncode #opengl #algorithmicart #algorist #mathart #laskutaide #ittaide #kuavataide #iterati