I recently switched from playing my last-gen consoles (i.e. ones that output mostly 640*480 without AA, so Wii as well) on a old CRT to dscaler'ing them to a LCD. As aliasing in 640*480 images upscaled to 1080p really hurts my eyes, I searched for some filtering algorithms that would use the awesome processing power of modern PCs to improve the picture. Surprisingly, it seems like no one ever tried something like this (or I missed it ).
Now, I have enough of a signal processing background to know that, in this case, where we don't have more information than what's in the image, "enhancing" it is quite an audacious claim. However, I did have a plan: to use known outside information (on the structure of aliasing artifacts) to improve the image while retaining nearly all detail.
So, these were my goals:
- input are RGBA images (and nothing else)
- reduce edge aliasing
- while retaining as much detail as possible
- with an algorithm that can run 640*480 in realtime on modern systems (GPUs, G80)
I thought it should be possible to at least do better than the only current filter I know of, blurring. My idea was a combination of something like a inverse Perona-Malik filter together with morphological recognition of aliasing structures (but only on 3x3 neighborhoods to maintain the realtime requirements). Before implementing a potential realtime version, I first experimented a bit in Matlab: here's what I came up with.
From left to right: Original image, filtered, XOR, XOR marked in original - all at 2x magnification. I have a few more test images, none of which are as impressive as this one. However, what I'm happy with is that the algorithm never seems to lose significant detail from the original picture, and only modifies the pixels it determines to be aliased edges. Even the dithering patterns in this shot (from a PSP game) remain untouched. Obviously, such conservative filtering also misses some aliasing, but that is preferrable to me to overblurring textures or details.
Do any of you know of other efforts to implement post-processing AA without additional information? What do you think of my try? Any other ideas? (Please remember that this is only intended for cases where you have no way to change the rendering or access the original data. Otherwise doing "real" AA is an order of magnitude more efficient)
Now, I have enough of a signal processing background to know that, in this case, where we don't have more information than what's in the image, "enhancing" it is quite an audacious claim. However, I did have a plan: to use known outside information (on the structure of aliasing artifacts) to improve the image while retaining nearly all detail.
So, these were my goals:
- input are RGBA images (and nothing else)
- reduce edge aliasing
- while retaining as much detail as possible
- with an algorithm that can run 640*480 in realtime on modern systems (GPUs, G80)
I thought it should be possible to at least do better than the only current filter I know of, blurring. My idea was a combination of something like a inverse Perona-Malik filter together with morphological recognition of aliasing structures (but only on 3x3 neighborhoods to maintain the realtime requirements). Before implementing a potential realtime version, I first experimented a bit in Matlab: here's what I came up with.
From left to right: Original image, filtered, XOR, XOR marked in original - all at 2x magnification. I have a few more test images, none of which are as impressive as this one. However, what I'm happy with is that the algorithm never seems to lose significant detail from the original picture, and only modifies the pixels it determines to be aliased edges. Even the dithering patterns in this shot (from a PSP game) remain untouched. Obviously, such conservative filtering also misses some aliasing, but that is preferrable to me to overblurring textures or details.
Do any of you know of other efforts to implement post-processing AA without additional information? What do you think of my try? Any other ideas? (Please remember that this is only intended for cases where you have no way to change the rendering or access the original data. Otherwise doing "real" AA is an order of magnitude more efficient)