I think we can agree that, as far as upscaling/reconstruction filters go, Catrom bicubic and Lanczos (2 lobe) windowed sinc are among the best approaches. However, if one examines the image from a distance from the screen (especially relevant to pc monitor usage), then I think we can also agree that the image becomes highly aliased/blocky. There’s a particular distance at which the perceived screen pixels reach a point of maximum sharpness or acutance. This is where we should be testing our shaders and presets to ensure that they look okay at any screen distance/size. This is why there tend to be two different CRT shader/preset approaches–sharp or smooth. The former looks good up close to the screen (where the image naturally becomes smoother) and the latter from a further distance (or smaller screen size).
The current best practice smoother approach will take one of these upscaling filters (eg, Catrom or Lanczos) and then apply a second Gaussian blur pass, or similar. The problem with this is that it will blur everything together–both the things that look good and we want to remain sharp and clear and the things we want smoothed (like harsh texture patterns or ringing artifacts). I realized that it would be better if we could have an upscaling/reconstruction filter that does both natively, thus working with the upscaler, rather than against it. The result of my search: EWA Cubics. It preserves details and smooths just where you’d want it. I’ve tested it and can confirm that the resulting image will be, paradoxically, both sharper and smoother than the aforementioned 2 pass approach. Smoothing during reconstruction/upscaling can preserve perceived sharpness better than reconstructing sharply and then blurring afterward.
With the old approach the first pass already creates a high-resolution image with its own edge structure, ringing, stair-step emphasis, and texture pattern. The Gaussian blur then operates on that already-created output image. It cannot distinguish between “bad sharpness” and “good sharpness.” It just diffuses everything: real edges, ringing, pixel texture, line contrast, and fine detail. With EWA-Cubics, the smoothing is built into the resampling itself, so the filter can blend neighbouring source pixels at the moment the new samples are being created. That tends to reduce the harsh high-frequency pixel texture without first producing a too-sharp intermediate image that then needs to be blurred back down in a post-hoc way.
EWA stands for elliptical weighted average. It’s also known as a radial, cylindrical, or circular reconstruction filter. It will sample in a uniform circular/radial manner unless the image is stretched/distorted in a non-uniform manner (thus the ellipse is the more general case).
Why is this better and why does it result in a more natural, pleasing looking image? I think it’s because the prior best practice case of using Catrom or Lanczos etc, are called separable or orthogonal filters that sample along each axis, thus they are grid-aligned and may result in an overly harsh, angular appearance, emphasizing aliasing; also they are strict interpolation filters, meaning when the output sample lands exactly on a source texel center, the original texel is reproduced exactly. So there may be no inherent pixel blending in the separable/orthogonal filter case, whereas there pretty much always is in the case of the EWA filter family (more detail on that below). Finally, because of its circular/radial sampling approach, I think it more naturally aligns with the image display done on a CRT in that such a display exhibits more of a gaussian-style blur from the phosphor glow. This EWA approach, therefore, obviates the need to do a second blur pass (which is detrimental to the image). The reduced ringing of these EWA filters also obviates the need for an anti-ringing filter (which, in any case, can cause its own issues, as HunterK knows all too well from my many edits…!
).
EWA filters tend to blend textured pixel patterns better, especially around diagonals, curves, and mixed high-frequency detail due to their radial sampling nature, not unlike Gaussian radial sampling (except with the negative lobes which allow them to function properly as reconstruction filters, unlike standard Gaussian).
Due to how they sample, EWA filters are much higher energy than their separable cousins. So Catrom and Lanczos EWA look incredibly bad as they have very strong negative lobes. Conversely, this means named filters that looked overly smooth in the separable case look much sharper and clearer in the EWA case. This is why Mitchell (Mitchell-Netravali, specifically) looks excellent in the EWA use case, despite looking very glow-y, blurry, yet still somewhat aliased, in the standard bicubic case.
Note: even though you’ll find this in the Interpolation folder, it isn’t, strictly-speaking, an interpolation filter per se given the intrinsic sampling from neighbouring pixels. That said, the Robidoux EWA filter was specifically designed to exactly preserve horizontal and vertical lines in the no-op/unscaled case; it also just happens to virtually eliminate aliasing in the max acutance viewing distance case. RobidouxSharp EWA was specifically designed to preserve images containing pure black and white pixels with the minimum of error in the “no-distort” case. Specifically, the weightings of orthogonal neighbouring pixels will exactly match the negative weightings of diagonal neighbouring pixels in a ‘no-distort’ case. It is very similar in sharpness to traditional Catrom and Lanczos, but with less ringing and with a smoother, less processed look (especially in textures). Finally, it is just a coincidence that Mitchell happens to land pretty much exactly right in between the two on the Cubic Keys line (which sum to 1 as in 1B+2C). Mitchell also produces near equivalent ‘sharp’ results for the ‘no distort’ case. So you can consider it a pseudo-interpolation filter.

Side note: you might be wondering why is this called a cubic shader instead of bicubic and does that mean it’s inferior or less technically sophisticated (?). No, being radial it is still a 2d filter like bicubic and the formula is more sophisticated than the bicubic case, but it just doesn’t sample separately along x & y, so the convention is to refer to it as a cubic filter.
Dev note: I also tried EWA Jinc2 which is a Jinc windowed Jinc filter and is the EWA analogue of Lanczos being a Sinc windowed Sinc filter, but it was too blurry, despite it similarly being the most “mathematically ideal” in terms of energy preservation and being the ideal low-pass filter for the EWA case.
I firmly believe that this should be the default RA shader. Let me know what you think after trying it out!
Credit: Nicolas Robidoux and the ImageMagick team. A treasure trove of info:




