Show HN: ASCII Art with Overstrike(github.com) |
Show HN: ASCII Art with Overstrike(github.com) |
I'm not kidding. The ASCII character set was actually designed to permit overstriking to yield a variety of characters such as, e.g., á. But of course, this follows from the fact that the typefaces used in typewriters were so designed. Historically that is how people wrote characters like á and ç back in the age of typewriters. This is also why Spanish rules made accents on capital letters optional: it wasn't easy to typeset those on typewriters.
The way to encode á, then, was: a BS ' (a, backspace, apostrophe).
Do I have sources for this? I've lost track of them, and I'm not going to look just now...
The Teletype doesn't do backspace (!) but can do carriage-return... so e.g. to print "Björk" , the text is: BJORK(CR)(space)(space)(quote). I have a Teensy microcontroller that already handles some ANSI-escape characters, and implements the 'backspace' ^[[D this way (https://github.com/hughpyle/ASR33/blob/master/firmware/ansi_...). Next on the backlog is "bold", using a similar strategy. Fun times :)
I was wondering if I should try this for a more complete set of unicode characters (opposed to just block graphics), but I'd need find a good way to match slightly off positioning. Perhaps just register the same character multiple times, shifted by one px in each direction?
Several interesting things there. The use of Structured Similarity Index (SSIM) is probably better/faster than the Histogram of Oriented Gradients (HOG) that my project uses. And then, at runtime, I'm still doing a brute-force match (which is really slow) -- clearly there are big performance gains to be made by training a classifier.
Their results are really good!
I'm not completely convinced by their distinction between "tone-based" and "structure-based", though. When they talk about structure, it seems to primarily mean 'edges'. Instead maybe a more useful distinction would be between "local optimization" (at the level of a single printed character), and optimizing "globally" or over a wider area of the image, and so allowing an iterative optimizer to find a really compact representation.