Похоже, что Pillow изменяет размер с помощью треугольного фильтра для LINEAR, тогда как для upsize libvips выполняет простую интерполяцию. libvips использует треугольный фильтр для уменьшения размера.
Если представить пиксели:
A
B
C
Затем Pillow вычисляет новый пиксель между A и B, пиксель в позиции B и новый пиксель между B и C как:
(A + B) / 2
(A + B) / 4 + B / 2 + (B + C) / 4
(B + C) / 2
Принимая во внимание, что libvips вычисляет:
(A + B) / 2
B
(B + C) / 2
Вы можете получить эффект фильтра треугольника, выполнив сначала очень мягкое размытие. Если я изменю вашу программу на:
img = pyvips.Image.new_from_file('mypic.png', access='sequential')
img = img.gaussblur(0.45, precision='float', min_ampl=0.01).cast('uchar')
out = img.resize(2, kernel='linear')
out.write_to_file('mypic_vips_resized_blur.png')
т. сделать маленький радиус, с высокой точностью gaussblur
сначала я получу:
Где слева направо изображения: 1) простой двойной пиксель x2, 2) подушка LINEAR
, 3) libvips linear
и 4) libvips gaussblur
+ linear
. Вам, вероятно, нужно будет нажать на изображение, иначе ваш браузер уменьшит его и размыт.
2) и 4) кажутся достаточно близкими к моим (не очень) глазам. 3) кажется, возможно, более правдивым к оригиналу, поскольку звуки и шум, присутствующие в оригинале, не были сглажены.