Good article, but IMO none of the discussed downsampling methods are actually ideal.
The ideal is trilinear sampling instead of bilinear. Easy to do with GPU APIs, in D3D11 it’s ID3D11DeviceContext.GenerateMips API call to generate full set of mip levels of the input texture, then generate each output pixel with trilinear sampler. When doing non-uniform downsampling, use anisotropic sampler instead of trilinear.
Not sure high level image processing libraries like the mentioned numpy, PIL or TensorFlow are doing anything like that, though.
The ideal is trilinear sampling instead of bilinear. Easy to do with GPU APIs, in D3D11 it’s ID3D11DeviceContext.GenerateMips API call to generate full set of mip levels of the input texture, then generate each output pixel with trilinear sampler. When doing non-uniform downsampling, use anisotropic sampler instead of trilinear.
Not sure high level image processing libraries like the mentioned numpy, PIL or TensorFlow are doing anything like that, though.