Some of you may be familiar with the blog post I made about mpv's scaling filters a while ago, but it was never really meant to be shared as much as it did. That page was originally the result of an assignment that I had during my undergrad, when I was formally studying digital image processing for the first time. Naturally, it was full of mistakes and the results weren't particularly scientific. I got a lot of feedback and the page ended up evolving in an organic way, but it still has some fundamental issues that can not be fixed without a major change in the methodology.
From the top of my head I can enumerate the following problems:
So, to address these issues:
With that out of the way, we can proceed with the real introduction.
Resampling is the process of changing the number of samples of a discrete signal to obtain a new discrete representation of the underlying continuous signal. This definition comes from the idea of having a sensor of some kind producing an analog continuous-time voltage/current variance which is then periodically sampled and quantised into predefined amplitude levels so we can store it in bits/bytes.
The easiest and most classic way of resampling to a higher sample rate is via linear interpolation, if you want to find a value between two points you can simply draw a line between them. Linear interpolation can be done in a cartesian plane, through both axis, creating what we call "bilinear" interpolation. Bilinear interpolation is the simplest interpolation algorithm, the easiest to compute and probably the most widespread one.
But can something as simple as just drawing a line between 2 points give us good results? Sometimes it does, sometimes it doesn't. It really depends on the signal. Instead of taking 2 points and drawing a line, we could take more than 2 points and draw a higher-degree curve. The shape of the curve depends on the weights used in the calculation, and these weights depend on the chosen filter. The number of input samples in the calculation depends on the length/radius/support of the filter. If you want to understand how this is actually done, I suggest simply reading this explanation.
In short, the most common way of resampling images is treating each row/column as an independent 1-D signal and simply going over all of them until you have resampled the entire image. This means you have to choose a dimension to resample first but this is pretty much inconsequential to the end result. The resampling algorithm itself is pretty simple, for each output sample you simply centralise the filter on top of it and see which input samples end up inside of the window after you compute their equivalent positions, then you multiply these inputs by their corresponding weights depending on their distance to the centre.
There's a different method, usually called polar/cylindrical/elliptical resampling, that does the operation in the 2-D domain directly. The only difference here is that all samples that fit inside the 2-D filter will now be weighted simultaenously, which may drastically change how some filters behave since we're only calling the filter once per output pixel rather than twice as before.
In this page I'll include results for both orthogonal and polar resampling. It's important to note that polar resampling implementations are generally slower and most filters weren't really designed to be used in this way (the most "famous" exception being polar lanczos, since we replace the Sinc function with its 2-D "equivalent", the Jinc/sombrero function).
As stated before the entire Manga109 dataset will be used in this comparison. This dataset has manga covers that look like this:
The dataset is downsampled with:
magick mogrify -filter box -resize 50% -path low_res inputs/*.png
The dataset is then brought back up with the following command for orthogonal resampling:
magick mogrify -filter {resampling_filter} -resize 200% -path high_res low_res/*.png
For polar resampling,
Likewise, for the results in sigmoid light, the resampling arguments are wrapped by
The
['Bartlett',
'Blackman',
'Bohman',
'Box',
'Catrom',
'Cosine',
'Cubic',
'Gaussian',
'Hamming',
'Hann',
'Hermite',
'Jinc',
'Kaiser',
'Lagrange',
'Lanczos',
'Lanczos2',
'Lanczos2Sharp',
'LanczosRadius',
'LanczosSharp',
'Mitchell',
'Parzen',
'Point',
'Quadratic',
'Robidoux',
'RobidouxSharp',
'Sinc',
'SincFast',
'Spline',
'CubicSpline',
'Triangle',
'Welch']
For a better explanation of these filters, please check this page from Imagemagick.
The result is then evaluated with MAE, PSNR, SSIM and MS-SSIM. All calculations are done after grayscale conversion and in double-precision floating-point for accuracy. Metrics are normalised between [0, 1] and then averaged together.
Please note that some of those filters are just aliases to other filters or aliases to Sinc/Jinc with different windows.
LanczosRadius is a Jinc-windowed Jinc squished to have its third zero crossing at 3 instead of 3.2383154841662362. Likewise, LanczosSharp and Lanczos2Sharp are also just squished Jinc-windowed Jincs.
| Filter | MAE | PSNR | SSIM | MS-SSIM | MAE (N) | PSNR (N) | SSIM (N) | MS-SSIM (N) | Mean | ||
| LanczosSharp | 1.63E-02 | 30.6337 | 0.9424 | 0.9963 | 1.0000 | 0.9987 | 0.9912 | 1.0000 | 0.9975 | ||
| Hamming | 1.64E-02 | 30.6396 | 0.9415 | 0.9961 | 0.9914 | 1.0000 | 0.9783 | 0.9876 | 0.9893 | ||
| Cosine | 1.64E-02 | 30.6098 | 0.9410 | 0.9960 | 0.9839 | 0.9932 | 0.9712 | 0.9859 | 0.9836 | ||
| Welch | 1.65E-02 | 30.6264 | 0.9407 | 0.9960 | 0.9801 | 0.9970 | 0.9656 | 0.9848 | 0.9819 | ||
| Lanczos | 1.64E-02 | 30.5507 | 0.9413 | 0.9960 | 0.9837 | 0.9797 | 0.9746 | 0.9853 | 0.9808 | ||
| LanczosRadius | 1.64E-02 | 30.5507 | 0.9413 | 0.9960 | 0.9837 | 0.9797 | 0.9746 | 0.9853 | 0.9808 | ||
| Hann | 1.65E-02 | 30.5460 | 0.9410 | 0.9959 | 0.9790 | 0.9786 | 0.9703 | 0.9793 | 0.9768 | ||
| Kaiser | 1.65E-02 | 30.5161 | 0.9412 | 0.9959 | 0.9804 | 0.9718 | 0.9729 | 0.9803 | 0.9764 | ||
| Bartlett | 1.65E-02 | 30.4825 | 0.9409 | 0.9960 | 0.9757 | 0.9641 | 0.9693 | 0.9832 | 0.9731 | ||
| Blackman | 1.66E-02 | 30.3811 | 0.9407 | 0.9958 | 0.9680 | 0.9410 | 0.9657 | 0.9751 | 0.9625 | ||
| Bohman | 1.66E-02 | 30.3536 | 0.9406 | 0.9958 | 0.9658 | 0.9347 | 0.9644 | 0.9752 | 0.9600 | ||
| Polar_Catrom | 1.67E-02 | 30.2479 | 0.9430 | 0.9957 | 0.9532 | 0.9106 | 1.0000 | 0.9688 | 0.9581 | ||
| Polar_Lagrange | 1.70E-02 | 30.3406 | 0.9418 | 0.9952 | 0.9296 | 0.9317 | 0.9824 | 0.9476 | 0.9478 | ||
| Parzen | 1.67E-02 | 30.2463 | 0.9399 | 0.9957 | 0.9532 | 0.9102 | 0.9553 | 0.9705 | 0.9473 | ||
| Polar_LanczosRadius | 1.68E-02 | 30.3589 | 0.9387 | 0.9955 | 0.9477 | 0.9359 | 0.9378 | 0.9593 | 0.9452 | ||
| Lanczos2Sharp | 1.72E-02 | 29.9065 | 0.9380 | 0.9958 | 0.9073 | 0.8326 | 0.9267 | 0.9769 | 0.9109 | ||
| Polar_RobidouxSharp | 1.72E-02 | 29.9422 | 0.9371 | 0.9956 | 0.9070 | 0.8408 | 0.9142 | 0.9651 | 0.9068 | ||
| Lanczos2 | 1.74E-02 | 29.8084 | 0.9359 | 0.9950 | 0.8808 | 0.8102 | 0.8964 | 0.9385 | 0.8815 | ||
| Polar_LanczosSharp | 1.74E-02 | 30.0370 | 0.9339 | 0.9942 | 0.8808 | 0.8624 | 0.8683 | 0.9010 | 0.8781 | ||
| CubicSpline | 1.74E-02 | 29.8369 | 0.9353 | 0.9947 | 0.8816 | 0.8167 | 0.8888 | 0.9239 | 0.8777 | ||
| Catrom | 1.75E-02 | 29.7356 | 0.9356 | 0.9951 | 0.8773 | 0.7936 | 0.8928 | 0.9398 | 0.8759 | ||
| Sinc | 1.83E-02 | 30.3542 | 0.9306 | 0.9941 | 0.7953 | 0.9348 | 0.8197 | 0.8925 | 0.8606 | ||
| SincFast | 1.83E-02 | 30.3542 | 0.9306 | 0.9941 | 0.7953 | 0.9348 | 0.8197 | 0.8925 | 0.8606 | ||
| Polar_Cosine | 1.77E-02 | 29.9092 | 0.9320 | 0.9938 | 0.8540 | 0.8333 | 0.8400 | 0.8776 | 0.8512 | ||
| Polar_Lanczos | 1.77E-02 | 29.9092 | 0.9320 | 0.9938 | 0.8540 | 0.8333 | 0.8400 | 0.8776 | 0.8512 | ||
| Polar_Welch | 1.77E-02 | 29.9092 | 0.9320 | 0.9938 | 0.8540 | 0.8333 | 0.8400 | 0.8776 | 0.8512 | ||
| Polar_Bartlett | 1.78E-02 | 29.7965 | 0.9319 | 0.9938 | 0.8462 | 0.8075 | 0.8392 | 0.8784 | 0.8428 | ||
| Polar_CubicSpline | 1.81E-02 | 29.6894 | 0.9386 | 0.9929 | 0.8094 | 0.7831 | 0.9359 | 0.8384 | 0.8417 | ||
| Polar_Hann | 1.78E-02 | 29.8095 | 0.9317 | 0.9937 | 0.8451 | 0.8105 | 0.8365 | 0.8741 | 0.8416 | ||
| Polar_Mitchell | 1.79E-02 | 29.5418 | 0.9326 | 0.9944 | 0.8359 | 0.7494 | 0.8493 | 0.9080 | 0.8356 | ||
| Polar_Hamming | 1.79E-02 | 29.7119 | 0.9308 | 0.9933 | 0.8305 | 0.7882 | 0.8225 | 0.8578 | 0.8248 | ||
| Polar_Kaiser | 1.80E-02 | 29.6355 | 0.9305 | 0.9933 | 0.8248 | 0.7708 | 0.8192 | 0.8574 | 0.8180 | ||
| Polar_Lanczos2Sharp | 1.82E-02 | 29.4531 | 0.9305 | 0.9936 | 0.8089 | 0.7291 | 0.8188 | 0.8695 | 0.8066 | ||
| Lagrange | 1.82E-02 | 29.4284 | 0.9304 | 0.9933 | 0.8074 | 0.7235 | 0.8170 | 0.8562 | 0.8010 | ||
| Polar_Robidoux | 1.84E-02 | 29.2776 | 0.9294 | 0.9935 | 0.7861 | 0.6890 | 0.8032 | 0.8648 | 0.7858 | ||
| Polar_Blackman | 1.83E-02 | 29.3886 | 0.9286 | 0.9929 | 0.7901 | 0.7144 | 0.7916 | 0.8367 | 0.7832 | ||
| Polar_Bohman | 1.84E-02 | 29.3591 | 0.9284 | 0.9929 | 0.7859 | 0.7077 | 0.7887 | 0.8363 | 0.7796 | ||
| Polar_Lanczos2 | 1.86E-02 | 29.2216 | 0.9267 | 0.9924 | 0.7591 | 0.6763 | 0.7642 | 0.8132 | 0.7532 | ||
| Polar_Parzen | 1.87E-02 | 29.1267 | 0.9263 | 0.9924 | 0.7491 | 0.6546 | 0.7583 | 0.8111 | 0.7433 | ||
| RobidouxSharp | 1.92E-02 | 28.8410 | 0.9242 | 0.9918 | 0.7012 | 0.5894 | 0.7279 | 0.7840 | 0.7006 | ||
| Polar_Hermite | 1.99E-02 | 28.1264 | 0.9212 | 0.9944 | 0.6342 | 0.4262 | 0.6837 | 0.9086 | 0.6632 | ||
| Hermite | 2.00E-02 | 28.2341 | 0.9206 | 0.9932 | 0.6228 | 0.4508 | 0.6755 | 0.8528 | 0.6505 | ||
| Mitchell | 1.98E-02 | 28.5839 | 0.9205 | 0.9906 | 0.6451 | 0.5307 | 0.6737 | 0.7298 | 0.6448 | ||
| Robidoux | 2.01E-02 | 28.4212 | 0.9180 | 0.9899 | 0.6083 | 0.4935 | 0.6376 | 0.6932 | 0.6082 | ||
| Polar_Triangle | 2.05E-02 | 28.1544 | 0.9160 | 0.9904 | 0.5644 | 0.4326 | 0.6093 | 0.7181 | 0.5811 | ||
| Polar_Box | 2.12E-02 | 26.8881 | 0.9114 | 0.9960 | 0.4971 | 0.1436 | 0.5424 | 0.9849 | 0.5420 | ||
| Box | 2.12E-02 | 26.8881 | 0.9114 | 0.9960 | 0.4971 | 0.1436 | 0.5424 | 0.9849 | 0.5420 | ||
| Point | 2.12E-02 | 26.8881 | 0.9114 | 0.9960 | 0.4971 | 0.1436 | 0.5424 | 0.9849 | 0.5420 | ||
| Polar_Point | 2.13E-02 | 27.9395 | 0.9109 | 0.9879 | 0.4907 | 0.3836 | 0.5347 | 0.5985 | 0.5019 | ||
| Polar_Sinc | 2.13E-02 | 27.9395 | 0.9109 | 0.9879 | 0.4907 | 0.3836 | 0.5347 | 0.5985 | 0.5019 | ||
| Polar_SincFast | 2.13E-02 | 27.9395 | 0.9109 | 0.9879 | 0.4907 | 0.3836 | 0.5347 | 0.5985 | 0.5019 | ||
| Triangle | 2.13E-02 | 27.9395 | 0.9109 | 0.9879 | 0.4907 | 0.3836 | 0.5347 | 0.5985 | 0.5019 | ||
| Jinc | 2.14E-02 | 28.0855 | 0.9083 | 0.9862 | 0.4816 | 0.4169 | 0.4974 | 0.5197 | 0.4789 | ||
| Polar_Quadratic | 2.27E-02 | 27.3819 | 0.8997 | 0.9841 | 0.3406 | 0.2563 | 0.3739 | 0.4214 | 0.3481 | ||
| Polar_Gaussian | 2.31E-02 | 27.2447 | 0.8979 | 0.9841 | 0.3020 | 0.2250 | 0.3474 | 0.4183 | 0.3232 | ||
| Gaussian | 2.31E-02 | 27.2435 | 0.8979 | 0.9841 | 0.3016 | 0.2247 | 0.3472 | 0.4179 | 0.3229 | ||
| Quadratic | 2.33E-02 | 27.1775 | 0.8957 | 0.9828 | 0.2818 | 0.2096 | 0.3154 | 0.3571 | 0.2910 | ||
| Polar_Jinc | 2.50E-02 | 27.3668 | 0.8971 | 0.9800 | 0.1050 | 0.2528 | 0.3361 | 0.2251 | 0.2298 | ||
| Polar_Cubic | 2.56E-02 | 26.4018 | 0.8773 | 0.9765 | 0.0465 | 0.0325 | 0.0496 | 0.0589 | 0.0469 | ||
| Polar_Spline | 2.56E-02 | 26.4018 | 0.8773 | 0.9765 | 0.0465 | 0.0325 | 0.0496 | 0.0589 | 0.0469 | ||
| Cubic | 2.61E-02 | 26.2593 | 0.8739 | 0.9753 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | ||
| Spline | 2.61E-02 | 26.2593 | 0.8739 | 0.9753 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
| Filter | MAE | PSNR | SSIM | MS-SSIM | MAE (N) | PSNR (N) | SSIM (N) | MS-SSIM (N) | Mean | ||
| LanczosSharp | 1.52E-02 | 31.3479 | 0.9460 | 0.9965 | 1.0000 | 0.9948 | 1.0000 | 1.0000 | 0.9987 | ||
| Hamming | 1.52E-02 | 31.3730 | 0.9454 | 0.9963 | 0.9967 | 1.0000 | 0.9913 | 0.9886 | 0.9942 | ||
| Cosine | 1.53E-02 | 31.3339 | 0.9448 | 0.9962 | 0.9882 | 0.9919 | 0.9820 | 0.9866 | 0.9872 | ||
| Welch | 1.53E-02 | 31.3536 | 0.9445 | 0.9962 | 0.9864 | 0.9960 | 0.9775 | 0.9855 | 0.9863 | ||
| Lanczos | 1.53E-02 | 31.2639 | 0.9449 | 0.9962 | 0.9848 | 0.9774 | 0.9841 | 0.9859 | 0.9831 | ||
| LanczosRadius | 1.53E-02 | 31.2639 | 0.9449 | 0.9962 | 0.9848 | 0.9774 | 0.9841 | 0.9859 | 0.9831 | ||
| Hann | 1.53E-02 | 31.2639 | 0.9448 | 0.9961 | 0.9828 | 0.9774 | 0.9815 | 0.9800 | 0.9804 | ||
| Kaiser | 1.53E-02 | 31.2270 | 0.9449 | 0.9961 | 0.9820 | 0.9698 | 0.9834 | 0.9811 | 0.9791 | ||
| Bartlett | 1.54E-02 | 31.1787 | 0.9447 | 0.9962 | 0.9770 | 0.9598 | 0.9800 | 0.9837 | 0.9751 | ||
| Blackman | 1.55E-02 | 31.0656 | 0.9443 | 0.9960 | 0.9650 | 0.9363 | 0.9740 | 0.9757 | 0.9628 | ||
| Bohman | 1.55E-02 | 31.0317 | 0.9441 | 0.9960 | 0.9617 | 0.9293 | 0.9721 | 0.9758 | 0.9597 | ||
| Polar_LanczosRadius | 1.56E-02 | 31.0592 | 0.9424 | 0.9957 | 0.9496 | 0.9350 | 0.9469 | 0.9620 | 0.9484 | ||
| Parzen | 1.57E-02 | 30.9041 | 0.9435 | 0.9959 | 0.9463 | 0.9029 | 0.9620 | 0.9711 | 0.9456 | ||
| Polar_Catrom | 1.59E-02 | 30.7084 | 0.9458 | 0.9955 | 0.9258 | 0.8624 | 0.9960 | 0.9552 | 0.9348 | ||
| Polar_Lagrange | 1.60E-02 | 30.8271 | 0.9448 | 0.9951 | 0.9114 | 0.8869 | 0.9813 | 0.9355 | 0.9288 | ||
| Lanczos2Sharp | 1.62E-02 | 30.4732 | 0.9412 | 0.9960 | 0.8895 | 0.8136 | 0.9284 | 0.9763 | 0.9020 | ||
| Polar_RobidouxSharp | 1.62E-02 | 30.5326 | 0.9404 | 0.9958 | 0.8919 | 0.8259 | 0.9169 | 0.9666 | 0.9003 | ||
| Polar_LanczosSharp | 1.63E-02 | 30.7277 | 0.9379 | 0.9945 | 0.8865 | 0.8664 | 0.8797 | 0.9064 | 0.8847 | ||
| Lanczos2 | 1.64E-02 | 30.3941 | 0.9394 | 0.9952 | 0.8680 | 0.7973 | 0.9012 | 0.9393 | 0.8764 | ||
| CubicSpline | 1.64E-02 | 30.4503 | 0.9390 | 0.9949 | 0.8720 | 0.8089 | 0.8953 | 0.9261 | 0.8756 | ||
| Catrom | 1.65E-02 | 30.3051 | 0.9390 | 0.9952 | 0.8611 | 0.7788 | 0.8958 | 0.9404 | 0.8690 | ||
| Polar_Cosine | 1.65E-02 | 30.5938 | 0.9361 | 0.9940 | 0.8608 | 0.8386 | 0.8525 | 0.8840 | 0.8590 | ||
| Polar_Lanczos | 1.65E-02 | 30.5938 | 0.9361 | 0.9940 | 0.8608 | 0.8386 | 0.8525 | 0.8840 | 0.8590 | ||
| Polar_Welch | 1.65E-02 | 30.5938 | 0.9361 | 0.9940 | 0.8608 | 0.8386 | 0.8525 | 0.8840 | 0.8590 | ||
| Sinc | 1.71E-02 | 30.8580 | 0.9350 | 0.9939 | 0.7971 | 0.8933 | 0.8361 | 0.8799 | 0.8516 | ||
| SincFast | 1.71E-02 | 30.8580 | 0.9350 | 0.9939 | 0.7971 | 0.8933 | 0.8361 | 0.8799 | 0.8516 | ||
| Polar_Bartlett | 1.66E-02 | 30.4517 | 0.9359 | 0.9940 | 0.8495 | 0.8092 | 0.8490 | 0.8835 | 0.8478 | ||
| Polar_Hann | 1.66E-02 | 30.4704 | 0.9358 | 0.9939 | 0.8468 | 0.8131 | 0.8478 | 0.8806 | 0.8471 | ||
| Polar_Hamming | 1.68E-02 | 30.3659 | 0.9348 | 0.9936 | 0.8335 | 0.7914 | 0.8336 | 0.8637 | 0.8305 | ||
| Polar_Mitchell | 1.69E-02 | 30.0976 | 0.9361 | 0.9946 | 0.8205 | 0.7358 | 0.8523 | 0.9101 | 0.8297 | ||
| Polar_Kaiser | 1.69E-02 | 30.2711 | 0.9345 | 0.9936 | 0.8235 | 0.7718 | 0.8295 | 0.8633 | 0.8220 | ||
| Polar_CubicSpline | 1.74E-02 | 29.9745 | 0.9412 | 0.9924 | 0.7728 | 0.7103 | 0.9279 | 0.8090 | 0.8050 | ||
| Polar_Lanczos2Sharp | 1.71E-02 | 30.0244 | 0.9342 | 0.9938 | 0.7981 | 0.7207 | 0.8247 | 0.8730 | 0.8041 | ||
| Lagrange | 1.71E-02 | 30.0057 | 0.9342 | 0.9935 | 0.7972 | 0.7168 | 0.8242 | 0.8594 | 0.7994 | ||
| Polar_Blackman | 1.73E-02 | 29.9797 | 0.9326 | 0.9931 | 0.7834 | 0.7114 | 0.7999 | 0.8419 | 0.7841 | ||
| Polar_Bohman | 1.73E-02 | 29.9431 | 0.9323 | 0.9931 | 0.7782 | 0.7038 | 0.7966 | 0.8414 | 0.7800 | ||
| Polar_Robidoux | 1.74E-02 | 29.8087 | 0.9330 | 0.9937 | 0.7706 | 0.6760 | 0.8065 | 0.8669 | 0.7800 | ||
| Polar_Lanczos2 | 1.76E-02 | 29.7891 | 0.9307 | 0.9926 | 0.7506 | 0.6719 | 0.7721 | 0.8183 | 0.7532 | ||
| Polar_Parzen | 1.77E-02 | 29.6714 | 0.9302 | 0.9925 | 0.7379 | 0.6476 | 0.7645 | 0.8151 | 0.7413 | ||
| RobidouxSharp | 1.82E-02 | 29.3276 | 0.9279 | 0.9919 | 0.6851 | 0.5763 | 0.7312 | 0.7848 | 0.6944 | ||
| Mitchell | 1.87E-02 | 29.0474 | 0.9243 | 0.9907 | 0.6295 | 0.5183 | 0.6768 | 0.7306 | 0.6388 | ||
| Polar_Hermite | 1.93E-02 | 28.3500 | 0.9231 | 0.9944 | 0.5688 | 0.3739 | 0.6591 | 0.9031 | 0.6262 | ||
| Hermite | 1.93E-02 | 28.5234 | 0.9230 | 0.9933 | 0.5758 | 0.4098 | 0.6585 | 0.8482 | 0.6231 | ||
| Robidoux | 1.91E-02 | 28.8703 | 0.9218 | 0.9900 | 0.5930 | 0.4816 | 0.6406 | 0.6940 | 0.6023 | ||
| Polar_Triangle | 1.96E-02 | 28.5161 | 0.9193 | 0.9905 | 0.5380 | 0.4083 | 0.6030 | 0.7173 | 0.5666 | ||
| Triangle | 2.02E-02 | 28.3304 | 0.9147 | 0.9879 | 0.4763 | 0.3698 | 0.5346 | 0.5977 | 0.4946 | ||
| Polar_Point | 2.02E-02 | 28.3304 | 0.9147 | 0.9879 | 0.4763 | 0.3698 | 0.5346 | 0.5977 | 0.4946 | ||
| Polar_Sinc | 2.02E-02 | 28.3304 | 0.9147 | 0.9879 | 0.4763 | 0.3698 | 0.5346 | 0.5977 | 0.4946 | ||
| Polar_SincFast | 2.02E-02 | 28.3304 | 0.9147 | 0.9879 | 0.4763 | 0.3698 | 0.5346 | 0.5977 | 0.4946 | ||
| Jinc | 2.02E-02 | 28.5496 | 0.9130 | 0.9863 | 0.4816 | 0.4152 | 0.5096 | 0.5242 | 0.4826 | ||
| Polar_Box | 2.12E-02 | 26.8881 | 0.9114 | 0.9960 | 0.3736 | 0.0711 | 0.4855 | 0.9770 | 0.4768 | ||
| Box | 2.12E-02 | 26.8881 | 0.9114 | 0.9960 | 0.3736 | 0.0711 | 0.4855 | 0.9770 | 0.4768 | ||
| Point | 2.12E-02 | 26.8881 | 0.9114 | 0.9960 | 0.3736 | 0.0711 | 0.4855 | 0.9770 | 0.4768 | ||
| Polar_Quadratic | 2.16E-02 | 27.7403 | 0.9039 | 0.9841 | 0.3305 | 0.2476 | 0.3741 | 0.4211 | 0.3433 | ||
| Polar_Gaussian | 2.20E-02 | 27.5755 | 0.9019 | 0.9840 | 0.2921 | 0.2135 | 0.3443 | 0.4164 | 0.3166 | ||
| Gaussian | 2.20E-02 | 27.5742 | 0.9019 | 0.9840 | 0.2917 | 0.2132 | 0.3440 | 0.4161 | 0.3162 | ||
| Quadratic | 2.22E-02 | 27.5198 | 0.8999 | 0.9828 | 0.2736 | 0.2019 | 0.3152 | 0.3565 | 0.2868 | ||
| Polar_Jinc | 2.34E-02 | 27.6758 | 0.9040 | 0.9800 | 0.1422 | 0.2342 | 0.3758 | 0.2275 | 0.2449 | ||
| Polar_Cubic | 2.44E-02 | 26.6982 | 0.8821 | 0.9764 | 0.0452 | 0.0317 | 0.0498 | 0.0593 | 0.0465 | ||
| Polar_Spline | 2.44E-02 | 26.6982 | 0.8821 | 0.9764 | 0.0452 | 0.0317 | 0.0498 | 0.0593 | 0.0465 | ||
| Cubic | 2.48E-02 | 26.5449 | 0.8787 | 0.9751 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | ||
| Spline | 2.48E-02 | 26.5449 | 0.8787 | 0.9751 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
Unsurprisingly, the Lanczos family is at the top. Lanczos is widely considered to be one of the best resampling filters, so this makes sense.
There are a few things worth talking about. The first one is that orthogonal LanczosSharp ended up on top of the table, a filter preset that is not meant to be used as an orthogonal filter.
If you want to give it a try on mpv, you can use
The second is that there are some Lanczos variants on top of the normal Lanczos: Hamming, Cosine and Welch. For the last two all you gotta do is set
The third is that Polar_Catrom is the best filter with only 2 lobes. For the orthogonal contenders, Lanczos2 beats Catrom, and Lanczos2Sharp beats them both.
To use Polar_Catrom on mpv, you can use
You might have also noticed that Polar_LanczosRadius is on top of Polar_LanczosSharp. Polar_LanczosRadius is sharpened to have its third zero crossing exactly at 3,
which corresponds to a blur factor of 0.9264075766146068 (3.0/3.2383154841662362). To try it on mpv you can use
As expected, upsampling in sigmoid light helps and makes all metrics go up. This is admittedly a mathematical gimmick, but it's hard to argue against the numbers.
As usual, the filters are ranked based on full-reference distortion metrics that may not always correlate with the human perception of quality, and your personal preference is entirely subjective. Please also keep in mind that only the named filters were scored, but you can make "custom" filters that may score higher using the expert controls.
The problem with downsampling evaluation is that we do not have a "ground truth" image, making it impossible for us to use the standard full-reference quality metrics. However, in the previous section I already made the concession that, at a 0.5x scaling ratio, the box filter is as good as it gets without producing any artifacts.
If we make the leap of faith that resampling filters will more or less keep their character regardless of scaling factor, we can use the output of box as the reference and compare other filters against it. So, in short, we want to find a filter that, at any scaling factor, will behave similarly to box at 0.5x. I'm calling this a leap of faith because this hypothesis most likely falls apart with extreme scaling factors, but as long as you keep it close to 0.5x it probably makes sense.
With that said, now we can proceed to the actual methodology. The reference is created with:
magick mogrify -filter box -resize 50% -path box_ref inputs/*.png
The dataset is then brought downsampled with the following command for orthogonal resampling:
magick mogrify -filter {resampling_filter} -resize 50% -path low_res box_ref/*.png
For polar downsampling,
Likewise, for the results in linear light, the resampling arguments are wrapped by
The
| Filter | MAE | PSNR | SSIM | MS-SSIM | MAE (N) | PSNR (N) | SSIM (N) | MS-SSIM (N) | Mean | ||
| Lanczos2Sharp | 3.83E-03 | 43.3791 | 0.9971 | 0.9998 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | ||
| Lanczos2 | 4.68E-03 | 41.6652 | 0.9959 | 0.9998 | 0.9522 | 0.8971 | 0.9807 | 0.9928 | 0.9557 | ||
| Catrom | 4.76E-03 | 41.5216 | 0.9958 | 0.9998 | 0.9478 | 0.8884 | 0.9793 | 0.9933 | 0.9522 | ||
| Polar_RobidouxSharp | 4.95E-03 | 41.2762 | 0.9956 | 0.9997 | 0.9372 | 0.8737 | 0.9766 | 0.9859 | 0.9434 | ||
| Polar_Hermite | 4.92E-03 | 40.6300 | 0.9958 | 0.9998 | 0.9388 | 0.8349 | 0.9791 | 0.9914 | 0.9360 | ||
| Parzen | 5.11E-03 | 40.9916 | 0.9954 | 0.9997 | 0.9279 | 0.8566 | 0.9722 | 0.9855 | 0.9356 | ||
| Polar_Mitchell | 5.27E-03 | 40.7177 | 0.9948 | 0.9997 | 0.9190 | 0.8402 | 0.9634 | 0.9896 | 0.9280 | ||
| Bohman | 5.39E-03 | 40.5648 | 0.9950 | 0.9997 | 0.9121 | 0.8310 | 0.9658 | 0.9818 | 0.9227 | ||
| Blackman | 5.50E-03 | 40.4083 | 0.9948 | 0.9996 | 0.9061 | 0.8216 | 0.9631 | 0.9805 | 0.9178 | ||
| CubicSpline | 5.65E-03 | 40.0895 | 0.9945 | 0.9996 | 0.8978 | 0.8024 | 0.9577 | 0.9809 | 0.9097 | ||
| Bartlett | 5.89E-03 | 40.0099 | 0.9941 | 0.9996 | 0.8838 | 0.7976 | 0.9521 | 0.9788 | 0.9031 | ||
| Polar_Robidoux | 5.79E-03 | 39.7433 | 0.9938 | 0.9997 | 0.8900 | 0.7816 | 0.9471 | 0.9851 | 0.9010 | ||
| LanczosSharp | 5.89E-03 | 39.7429 | 0.9944 | 0.9996 | 0.8842 | 0.7816 | 0.9567 | 0.9719 | 0.8986 | ||
| Kaiser | 6.00E-03 | 39.7090 | 0.9940 | 0.9996 | 0.8778 | 0.7796 | 0.9503 | 0.9740 | 0.8954 | ||
| Polar_Lanczos2Sharp | 5.95E-03 | 39.6486 | 0.9935 | 0.9997 | 0.8808 | 0.7759 | 0.9429 | 0.9820 | 0.8954 | ||
| Lanczos | 6.11E-03 | 39.4625 | 0.9939 | 0.9995 | 0.8716 | 0.7648 | 0.9492 | 0.9697 | 0.8888 | ||
| LanczosRadius | 6.11E-03 | 39.4625 | 0.9939 | 0.9995 | 0.8716 | 0.7648 | 0.9492 | 0.9697 | 0.8888 | ||
| Hann | 6.23E-03 | 39.4293 | 0.9936 | 0.9996 | 0.8647 | 0.7628 | 0.9438 | 0.9717 | 0.8857 | ||
| Polar_LanczosRadius | 6.25E-03 | 39.3482 | 0.9934 | 0.9995 | 0.8636 | 0.7579 | 0.9413 | 0.9681 | 0.8827 | ||
| Hermite | 6.13E-03 | 38.7508 | 0.9938 | 0.9996 | 0.8707 | 0.7220 | 0.9464 | 0.9735 | 0.8782 | ||
| Lagrange | 6.31E-03 | 39.0270 | 0.9930 | 0.9996 | 0.8604 | 0.7386 | 0.9339 | 0.9774 | 0.8776 | ||
| Cosine | 6.50E-03 | 38.9978 | 0.9933 | 0.9995 | 0.8497 | 0.7369 | 0.9384 | 0.9654 | 0.8726 | ||
| Hamming | 6.54E-03 | 38.9830 | 0.9932 | 0.9995 | 0.8474 | 0.7360 | 0.9365 | 0.9649 | 0.8712 | ||
| Welch | 6.74E-03 | 38.7385 | 0.9928 | 0.9995 | 0.8364 | 0.7213 | 0.9314 | 0.9630 | 0.8630 | ||
| Polar_Bohman | 6.78E-03 | 38.5274 | 0.9919 | 0.9996 | 0.8338 | 0.7086 | 0.9156 | 0.9720 | 0.8575 | ||
| Polar_Blackman | 6.82E-03 | 38.4997 | 0.9918 | 0.9996 | 0.8318 | 0.7069 | 0.9141 | 0.9714 | 0.8561 | ||
| Polar_Parzen | 6.82E-03 | 38.3159 | 0.9917 | 0.9996 | 0.8316 | 0.6959 | 0.9127 | 0.9727 | 0.8532 | ||
| Polar_Lanczos2 | 6.93E-03 | 38.2723 | 0.9915 | 0.9995 | 0.8253 | 0.6933 | 0.9095 | 0.9704 | 0.8496 | ||
| Polar_Kaiser | 7.02E-03 | 38.3664 | 0.9914 | 0.9995 | 0.8203 | 0.6989 | 0.9089 | 0.9658 | 0.8485 | ||
| Polar_Bartlett | 7.12E-03 | 38.4405 | 0.9913 | 0.9995 | 0.8148 | 0.7034 | 0.9073 | 0.9665 | 0.8480 | ||
| RobidouxSharp | 6.87E-03 | 37.9152 | 0.9917 | 0.9995 | 0.8291 | 0.6718 | 0.9132 | 0.9676 | 0.8454 | ||
| Polar_LanczosSharp | 7.22E-03 | 38.2044 | 0.9913 | 0.9994 | 0.8091 | 0.6892 | 0.9066 | 0.9575 | 0.8406 | ||
| Polar_Hamming | 7.26E-03 | 38.2059 | 0.9909 | 0.9995 | 0.8068 | 0.6893 | 0.9008 | 0.9639 | 0.8402 | ||
| Polar_Hann | 7.33E-03 | 37.9577 | 0.9910 | 0.9994 | 0.8029 | 0.6744 | 0.9021 | 0.9537 | 0.8333 | ||
| Polar_Cosine | 7.62E-03 | 37.7519 | 0.9904 | 0.9994 | 0.7865 | 0.6620 | 0.8914 | 0.9525 | 0.8231 | ||
| Polar_Lanczos | 7.62E-03 | 37.7519 | 0.9904 | 0.9994 | 0.7865 | 0.6620 | 0.8914 | 0.9525 | 0.8231 | ||
| Polar_Welch | 7.62E-03 | 37.7519 | 0.9904 | 0.9994 | 0.7865 | 0.6620 | 0.8914 | 0.9525 | 0.8231 | ||
| Mitchell | 7.65E-03 | 36.9061 | 0.9899 | 0.9994 | 0.7850 | 0.6112 | 0.8843 | 0.9525 | 0.8082 | ||
| Polar_Triangle | 7.97E-03 | 36.4602 | 0.9894 | 0.9992 | 0.7671 | 0.5844 | 0.8759 | 0.9402 | 0.7919 | ||
| Robidoux | 8.17E-03 | 36.3070 | 0.9887 | 0.9993 | 0.7558 | 0.5752 | 0.8636 | 0.9412 | 0.7840 | ||
| Triangle | 9.53E-03 | 34.9212 | 0.9853 | 0.9989 | 0.6787 | 0.4920 | 0.8091 | 0.9015 | 0.7203 | ||
| Jinc | 1.07E-02 | 34.4246 | 0.9818 | 0.9987 | 0.6104 | 0.4622 | 0.7532 | 0.8859 | 0.6779 | ||
| Polar_Catrom | 1.15E-02 | 33.5864 | 0.9863 | 0.9977 | 0.5677 | 0.4118 | 0.8255 | 0.7876 | 0.6482 | ||
| Polar_Lagrange | 1.18E-02 | 33.4384 | 0.9854 | 0.9975 | 0.5513 | 0.4030 | 0.8103 | 0.7597 | 0.6311 | ||
| Polar_Quadratic | 1.17E-02 | 33.1567 | 0.9781 | 0.9982 | 0.5551 | 0.3860 | 0.6931 | 0.8354 | 0.6174 | ||
| Polar_Gaussian | 1.21E-02 | 32.9220 | 0.9773 | 0.9981 | 0.5348 | 0.3719 | 0.6799 | 0.8199 | 0.6016 | ||
| Gaussian | 1.21E-02 | 32.9191 | 0.9773 | 0.9981 | 0.5345 | 0.3718 | 0.6797 | 0.8197 | 0.6014 | ||
| Quadratic | 1.25E-02 | 32.6161 | 0.9755 | 0.9979 | 0.5116 | 0.3536 | 0.6501 | 0.8067 | 0.5805 | ||
| Sinc | 1.42E-02 | 32.5248 | 0.9772 | 0.9965 | 0.4177 | 0.3481 | 0.6778 | 0.6661 | 0.5274 | ||
| SincFast | 1.42E-02 | 32.5248 | 0.9772 | 0.9965 | 0.4177 | 0.3481 | 0.6778 | 0.6661 | 0.5274 | ||
| Polar_Jinc | 1.52E-02 | 32.0175 | 0.9717 | 0.9951 | 0.3577 | 0.3176 | 0.5884 | 0.5210 | 0.4462 | ||
| Polar_CubicSpline | 1.62E-02 | 30.6892 | 0.9753 | 0.9955 | 0.3046 | 0.2378 | 0.6468 | 0.5597 | 0.4372 | ||
| Polar_Cubic | 1.56E-02 | 30.7526 | 0.9624 | 0.9966 | 0.3393 | 0.2416 | 0.4382 | 0.6759 | 0.4237 | ||
| Polar_Spline | 1.56E-02 | 30.7526 | 0.9624 | 0.9966 | 0.3393 | 0.2416 | 0.4382 | 0.6759 | 0.4237 | ||
| Cubic | 1.61E-02 | 30.4526 | 0.9599 | 0.9963 | 0.3074 | 0.2236 | 0.3976 | 0.6456 | 0.3935 | ||
| Spline | 1.61E-02 | 30.4526 | 0.9599 | 0.9963 | 0.3074 | 0.2236 | 0.3976 | 0.6456 | 0.3935 | ||
| Point | 2.16E-02 | 26.7292 | 0.9353 | 0.9900 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 |
| Filter | MAE | PSNR | SSIM | MS-SSIM | MAE (N) | PSNR (N) | SSIM (N) | MS-SSIM (N) | Mean | ||
| Lanczos2Sharp | 4.95E-03 | 38.8216 | 0.9954 | 0.9995 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | ||
| Polar_Hermite | 5.57E-03 | 38.3954 | 0.9944 | 0.9993 | 0.9634 | 0.9661 | 0.9834 | 0.9873 | 0.9751 | ||
| Lanczos2 | 5.87E-03 | 37.7769 | 0.9939 | 0.9994 | 0.9457 | 0.9170 | 0.9759 | 0.9907 | 0.9573 | ||
| Catrom | 5.93E-03 | 37.7853 | 0.9939 | 0.9994 | 0.9421 | 0.9176 | 0.9750 | 0.9922 | 0.9567 | ||
| Polar_Mitchell | 6.41E-03 | 37.4501 | 0.9929 | 0.9994 | 0.9134 | 0.8910 | 0.9592 | 0.9905 | 0.9385 | ||
| Polar_Robidoux | 6.74E-03 | 37.3414 | 0.9921 | 0.9994 | 0.8936 | 0.8824 | 0.9461 | 0.9910 | 0.9283 | ||
| Polar_RobidouxSharp | 6.51E-03 | 36.4056 | 0.9928 | 0.9990 | 0.9075 | 0.8080 | 0.9575 | 0.9626 | 0.9089 | ||
| Polar_Lanczos2Sharp | 7.14E-03 | 36.6543 | 0.9913 | 0.9992 | 0.8699 | 0.8278 | 0.9344 | 0.9805 | 0.9032 | ||
| Hermite | 6.89E-03 | 36.6145 | 0.9918 | 0.9990 | 0.8849 | 0.8246 | 0.9412 | 0.9567 | 0.9018 | ||
| Parzen | 6.76E-03 | 36.1156 | 0.9920 | 0.9991 | 0.8927 | 0.7849 | 0.9457 | 0.9651 | 0.8971 | ||
| CubicSpline | 7.15E-03 | 36.0303 | 0.9915 | 0.9990 | 0.8696 | 0.7782 | 0.9373 | 0.9633 | 0.8871 | ||
| Lagrange | 7.55E-03 | 36.1152 | 0.9905 | 0.9992 | 0.8457 | 0.7849 | 0.9208 | 0.9729 | 0.8811 | ||
| RobidouxSharp | 7.65E-03 | 36.1655 | 0.9898 | 0.9991 | 0.8396 | 0.7889 | 0.9090 | 0.9666 | 0.8760 | ||
| Bohman | 7.19E-03 | 35.5578 | 0.9911 | 0.9989 | 0.8669 | 0.7406 | 0.9300 | 0.9549 | 0.8731 | ||
| Polar_Parzen | 7.89E-03 | 36.0457 | 0.9894 | 0.9992 | 0.8252 | 0.7794 | 0.9036 | 0.9739 | 0.8706 | ||
| Blackman | 7.34E-03 | 35.3833 | 0.9907 | 0.9989 | 0.8578 | 0.7268 | 0.9243 | 0.9515 | 0.8651 | ||
| Polar_Lanczos2 | 8.17E-03 | 35.6640 | 0.9889 | 0.9991 | 0.8088 | 0.7491 | 0.8952 | 0.9665 | 0.8549 | ||
| Polar_Bohman | 8.11E-03 | 35.5960 | 0.9891 | 0.9991 | 0.8123 | 0.7437 | 0.8980 | 0.9650 | 0.8547 | ||
| Polar_Blackman | 8.18E-03 | 35.5097 | 0.9889 | 0.9990 | 0.8081 | 0.7368 | 0.8948 | 0.9636 | 0.8509 | ||
| Bartlett | 7.99E-03 | 34.8645 | 0.9890 | 0.9988 | 0.8196 | 0.6855 | 0.8970 | 0.9454 | 0.8369 | ||
| Mitchell | 8.43E-03 | 35.2522 | 0.9876 | 0.9988 | 0.7934 | 0.7163 | 0.8746 | 0.9430 | 0.8318 | ||
| Kaiser | 8.08E-03 | 34.5862 | 0.9890 | 0.9987 | 0.8141 | 0.6634 | 0.8962 | 0.9344 | 0.8270 | ||
| LanczosSharp | 7.98E-03 | 34.4037 | 0.9893 | 0.9985 | 0.8198 | 0.6489 | 0.9016 | 0.9232 | 0.8234 | ||
| Polar_Kaiser | 8.71E-03 | 34.7427 | 0.9875 | 0.9988 | 0.7764 | 0.6758 | 0.8728 | 0.9443 | 0.8174 | ||
| Lanczos | 8.22E-03 | 34.2942 | 0.9887 | 0.9985 | 0.8054 | 0.6402 | 0.8920 | 0.9219 | 0.8149 | ||
| LanczosRadius | 8.22E-03 | 34.2942 | 0.9887 | 0.9985 | 0.8054 | 0.6402 | 0.8920 | 0.9219 | 0.8149 | ||
| Polar_LanczosRadius | 8.34E-03 | 34.3307 | 0.9884 | 0.9985 | 0.7985 | 0.6431 | 0.8865 | 0.9228 | 0.8127 | ||
| Hann | 8.38E-03 | 34.3247 | 0.9881 | 0.9986 | 0.7959 | 0.6426 | 0.8825 | 0.9295 | 0.8126 | ||
| Polar_Triangle | 8.78E-03 | 34.6691 | 0.9866 | 0.9984 | 0.7722 | 0.6700 | 0.8587 | 0.9097 | 0.8026 | ||
| Robidoux | 8.96E-03 | 34.6811 | 0.9861 | 0.9986 | 0.7619 | 0.6709 | 0.8497 | 0.9250 | 0.8019 | ||
| Polar_Bartlett | 9.04E-03 | 34.4884 | 0.9863 | 0.9988 | 0.7568 | 0.6556 | 0.8541 | 0.9397 | 0.8016 | ||
| Polar_Hamming | 9.12E-03 | 34.4443 | 0.9862 | 0.9987 | 0.7521 | 0.6521 | 0.8519 | 0.9389 | 0.7988 | ||
| Cosine | 8.76E-03 | 33.8381 | 0.9873 | 0.9984 | 0.7737 | 0.6040 | 0.8691 | 0.9115 | 0.7896 | ||
| Hamming | 8.87E-03 | 33.7815 | 0.9871 | 0.9984 | 0.7671 | 0.5995 | 0.8660 | 0.9097 | 0.7856 | ||
| Polar_Hann | 9.30E-03 | 33.8552 | 0.9861 | 0.9984 | 0.7416 | 0.6053 | 0.8506 | 0.9101 | 0.7769 | ||
| Welch | 9.07E-03 | 33.6027 | 0.9864 | 0.9983 | 0.7550 | 0.5852 | 0.8548 | 0.9061 | 0.7753 | ||
| Polar_LanczosSharp | 9.35E-03 | 33.7994 | 0.9857 | 0.9984 | 0.7384 | 0.6009 | 0.8436 | 0.9129 | 0.7739 | ||
| Polar_Cosine | 9.77E-03 | 33.5466 | 0.9845 | 0.9984 | 0.7133 | 0.5808 | 0.8244 | 0.9069 | 0.7564 | ||
| Polar_Lanczos | 9.77E-03 | 33.5466 | 0.9845 | 0.9984 | 0.7133 | 0.5808 | 0.8244 | 0.9069 | 0.7564 | ||
| Polar_Welch | 9.77E-03 | 33.5466 | 0.9845 | 0.9984 | 0.7133 | 0.5808 | 0.8244 | 0.9069 | 0.7564 | ||
| Triangle | 1.04E-02 | 33.1958 | 0.9816 | 0.9977 | 0.6732 | 0.5529 | 0.7774 | 0.8510 | 0.7136 | ||
| Jinc | 1.23E-02 | 32.5182 | 0.9758 | 0.9974 | 0.5618 | 0.4991 | 0.6853 | 0.8250 | 0.6428 | ||
| Polar_Quadratic | 1.28E-02 | 31.5334 | 0.9730 | 0.9965 | 0.5328 | 0.4208 | 0.6393 | 0.7543 | 0.5868 | ||
| Polar_Gaussian | 1.33E-02 | 31.2125 | 0.9715 | 0.9961 | 0.5029 | 0.3953 | 0.6164 | 0.7226 | 0.5593 | ||
| Gaussian | 1.33E-02 | 31.2091 | 0.9715 | 0.9961 | 0.5025 | 0.3950 | 0.6161 | 0.7223 | 0.5590 | ||
| Quadratic | 1.37E-02 | 30.9959 | 0.9696 | 0.9960 | 0.4817 | 0.3781 | 0.5862 | 0.7104 | 0.5391 | ||
| Polar_Catrom | 1.55E-02 | 28.5710 | 0.9717 | 0.9927 | 0.3697 | 0.1854 | 0.6200 | 0.4432 | 0.4046 | ||
| Polar_Lagrange | 1.59E-02 | 28.4766 | 0.9704 | 0.9923 | 0.3495 | 0.1779 | 0.5979 | 0.4119 | 0.3843 | ||
| Polar_Cubic | 1.69E-02 | 29.2900 | 0.9545 | 0.9938 | 0.2917 | 0.2425 | 0.3432 | 0.5358 | 0.3533 | ||
| Polar_Spline | 1.69E-02 | 29.2900 | 0.9545 | 0.9938 | 0.2917 | 0.2425 | 0.3432 | 0.5358 | 0.3533 | ||
| Cubic | 1.75E-02 | 29.0000 | 0.9515 | 0.9933 | 0.2552 | 0.2195 | 0.2952 | 0.4940 | 0.3160 | ||
| Spline | 1.75E-02 | 29.0000 | 0.9515 | 0.9933 | 0.2552 | 0.2195 | 0.2952 | 0.4940 | 0.3160 | ||
| Polar_Jinc | 1.84E-02 | 29.0615 | 0.9569 | 0.9896 | 0.1975 | 0.2243 | 0.3811 | 0.1881 | 0.2477 | ||
| Sinc | 1.94E-02 | 27.5661 | 0.9549 | 0.9900 | 0.1405 | 0.1055 | 0.3491 | 0.2245 | 0.2049 | ||
| SincFast | 1.94E-02 | 27.5661 | 0.9549 | 0.9900 | 0.1405 | 0.1055 | 0.3491 | 0.2245 | 0.2049 | ||
| Polar_CubicSpline | 2.12E-02 | 26.2386 | 0.9534 | 0.9873 | 0.0313 | 0.0000 | 0.3260 | 0.0000 | 0.0893 | ||
| Point | 2.18E-02 | 26.5323 | 0.9331 | 0.9890 | 0.0000 | 0.0233 | 0.0000 | 0.1384 | 0.0404 |
The results were relatively predictable.
Catrom is known to be good at downsampling, and since Lanczos2 is just a slightly sharper Catrom, it ends up as the best orthogonal filter that isn't a meme.
For polar filters, Polar_RobidouxSharp is our top scorer in gamma light but Polar_Hermite takes the lead in linear light. I'd personally favour Polar_Hermite between the two, as it's faster and doesn't ring.
Both Lanczos (orthogonal Sinc-Sinc) and Polar_Lanczos (polar Jinc-Jinc) ended up with mediocre scores. That's a good thing because it shows the methodology can actually punish filters that are too ringy.
I think this test solidifies what was already common knowledge. BC-Splines are very good at downsampling, and pretty much all of them are near the top.
Nicolas Robidoux has a personal page with some recommendations, if you want a more qualitative approach.