June 20th, 2024

Atkinson Dithering (2021)

The Macintosh in 1984 introduced Atkinson dithering, enhancing image contrast with a unique error spreading pattern. iKe allows users to apply Atkinson dithering effects by converting images to grayscale matrices.

Read original articleLink Icon
Atkinson Dithering (2021)

In 1984, the Macintosh introduced high-resolution displays with Atkinson dithering, a technique developed by Bill Atkinson for creating visually appealing images using a limited black and white palette. Atkinson's algorithm, a variation of Floyd-Steinberg dithering, spreads error in a broader pattern, resulting in subjectively nicer-looking images with richer contrast. The algorithm preserves only 3/4ths of the error, simplifying the error propagation process. Compared to Floyd-Steinberg dithering, Atkinson's method enhances contrast but may lose some detail in very light or dark areas. Implementing Atkinson dithering in iKe involves converting images to grayscale matrices and applying the dithering algorithm to each pixel. By leveraging iKe's capabilities, users can experiment with Atkinson dithering effects on images.

Related

Eight million pixels and counting: improving texture atlas allocation in Firefox (2021)

Eight million pixels and counting: improving texture atlas allocation in Firefox (2021)

Improving texture atlas allocation in WebRender with the guillotiere crate reduces texture memory usage. The guillotine algorithm was replaced due to fragmentation issues, leading to a more efficient allocator. Visualizing the atlas in SVG aids debugging. Rust's simplicity and Cargo fuzz testing are praised for code development and robustness. Enhancements in draw call batching and texture upload aim to boost performance on low-end Intel GPUs by optimizing texture atlases.

Spending 3 months investigating a 7-year old bug and fixing it in 1 line of code

Spending 3 months investigating a 7-year old bug and fixing it in 1 line of code

A developer fixed a seven-year-old bug in an iPad accessory causing missed MIDI messages by optimizing a modulo operation. The bug's resolution improved the audio processor's efficiency significantly.

The First Spatial Computing Hack

The First Spatial Computing Hack

Ryan Pickren found a Safari bug letting websites flood a user's space with 3D objects. Apple fixed it (CVE-2024-27812) in June after Ryan's report. The bug exploited Apple AR Kit Quick Look, launching objects without consent.

Show HN: Feedback on Sketch Colourisation

Show HN: Feedback on Sketch Colourisation

The GitHub repository contains SketchDeco, a project for colorizing black and white sketches without training. It includes setup instructions, usage guidelines, acknowledgments, and future plans. Users can seek support if needed.

Mip-Splatting: Alias-Free 3D Gaussian Splatting

Mip-Splatting: Alias-Free 3D Gaussian Splatting

The paper introduces Mip-Splatting, enhancing 3D Gaussian Splatting by addressing artifacts with a 3D smoothing filter and a 2D Mip filter, achieving alias-free renderings and improved image fidelity in 3D rendering applications.

Link Icon 21 comments
By @mungoman2 - 4 months
To avoid changing the overall brightness like in the examples it is important to work on linearized values or to adjust the running error accordingly. It's not correct to work on the encoded sRGB values of the image directly. This is a very common mistake in blog articles about diy image filtering.
By @JKCalhoun - 4 months
I fell in love with the original Macintosh display. It was so crisp, the black and white pixels so beautiful (especially if you had come off the typical computer hooked up to a TV). Combine that with the beautiful dithering and I almost shunned color when it came along.

(I believe I've read that Atkinson's dithering didn't come about until scanner software was needed for the Macintosh and so he wrote his own dithering code.)

By @WoodenChair - 4 months
This was the article that inspired me to study the MacPaint format. I ended up writing first a Python program that can do Atkinson dithering of a modern image and then save it as a MacPaint file for display on a retro Mac. That code is a chapter in my upcoming book. I then added 9 more 1-bit dithering algorithms and turned it into a Swift/AppKit app so it's easy to use if you want to Atkinson dither your own images and transfer them over to your retro Macs:

https://apps.apple.com/us/app/retro-dither-b-w-is-beautiful/...

By @garaetjjte - 4 months
By @NelsonMinar - 4 months
These days dithering is a lost technique other than as an arty effect. It's a shame, digital video playback would really benefit from it as a way to eliminate posterization.
By @lukko - 4 months
Thanks for sharing this.

I once used Floyd-Steinberg dithering to make 3D voxel prints from brain MRI scans [0]. You just convert the scan to full white and black values to represent different inks, and it means you don't have to do any segmentation and can represent fine structures much more accurately.

May be interesting to try with Atkinson dithering too, although the loss of detail may be an issue.

[0] https://www.lukehale.com/voxelprinting/

By @feverzsj - 4 months
Error diffusions are hard to be parallelized. They're also not stable, meaning moving pixel may look different in different frame. But they usually give best result for static images.
By @londons_explore - 4 months
I would like to see the ideas of dithering applied to voting systems.

Ie. Imagine a country with hundreds of elected officials, each of which represents a town or city. Each official is part of a party.

A dithering-like system could be used during the vote so that the country as a whole is fairly represented, and most towns also are represented by who the majority of their population wants.

It would work by, during an election, whenever a candidate is chosen for a location, any votes for other parties get transferred to neighbouring towns and cities. That is done repeatedly until every towns seat is filled, and nearly every voters vote has an impact (if not in their local town, then it gets to help a candidate of the same party nearbyish)

By @tiffanyh - 4 months
Am I the only person who thinks the Floyd-Steinberg dithering is superior is clarity and detail?

The Atkinson dithering makes the image appear overexposed/blown-out (not true to the original image).

By @nullc - 4 months
This PHD thesis is the best technical coverage of dither science that I've seen:

https://uwspace.uwaterloo.ca/bitstream/handle/10012/3867/the...

Among the things it covers is the design of a noise shaping filter with a more symmetrical response than the Floyd-Steinberg one.

By @bryanthompson - 4 months
One really nice use case for dithering that I've found is for building graphics for 8-bit (Pico-8 and Picotron) games and toys.

I made a ruby script that can take a graphic and scale it to whatever size, then it uses a closest color match to substitute colors for the _very_ limited Pico* palette and applies dithering to make it look attractive. I like Stenberg the most, but have played with Atkinson and am still feeling around a bit.

By @moribvndvs - 4 months
I never really paid attention to the grid-like artifacts[0] that FSD and some other dithering algorithms cause when a dithered image is scaled way down (as is the case of the thumbnails in this article).

[0] https://en.m.wikipedia.org/wiki/Moir%C3%A9_pattern

By @OnlyMortal - 4 months
This just reminded me of the “secret” bitmap of the dev team hidden in the OS.

I recall using Macsbug to show it.

By @jd3 - 4 months
I remember creating an X-Face[0] using Atkinson Dithering for my SeaMonkey add-on MessageFaces[1]!

You can create one online here[2], but it doesn't seem to support Atkinson for whatever reason.

[0]: https://en.wikipedia.org/wiki/X-Face

[1]: https://github.com/JohnDDuncanIII/messagefaces

[2]: https://www.dairiki.org/xface/

By @AceJohnny2 - 4 months
Why is the Floyd-Steinberg error diffusion kernel so uneven? What's the output like if the error is distributed equally among the bottom-right pixels?

And this is a naive question, but could one construct a kernel that diffuses the error across all surrounding pixels, not just the bottom+right? I get that this will cause recursion difficulties as error bounces back-and-forth between neighboring pixels, but is that resolvable?

By @tiffanyh - 4 months
More example (and algorithms) can be found here:

https://brucebcampbell.wordpress.com/wp-content/uploads/2013...

By @leni536 - 4 months
There is implementation variance on whether you apply the dithering consistently left to right on each row or you alternate. Floyd-Steinberg definitely benefits from the latter approach.

Also whether you apply the dithering in a linear colorspace.

By @GuB-42 - 4 months
Just curious, does the website name "Beyond Loom" has anything to do with the video game "Loom" (1990)?
By @antirez - 4 months
Floyd-Steinberg looks a lot better IMHO.
By @kibwen - 4 months
Dithering can still be a striking aesthetic choice. Low Tech Magazine is my go-to example: https://solar.lowtechmagazine.com/

From their About page:

"Thus, instead of using full-colour high-resolution images, we chose to convert all images to black and white, with four levels of grey in-between. These black-and-white images are then coloured according to the pertaining content category via the browser’s native image manipulation capacities. Compressed through this dithering plugin, images featured in the articles add much less load to the content: compared to the old website, the images are roughly ten times less resource-intensive."