(Py)Vips vs Pillow 提升图像质量

(Py)Vips vs Pillow upscaling image quality

将图像大小调整为 200% 会在 Pillow 和 pyvips 之间产生质量差异。

虽然 Pillow 的再现非常准确,但 vips 夸大了噪点和对比度。

我需要对非常大的图片使用vips,但是质量不尽如人意。知道如何从 vips 获得更好的升级吗? (从我收集到的文档中,升级对于 vips 来说并不是那么重要,而且大多数人都想到了降级)。

示例:

from PIL import Image
import pyvips
import numpy as np

#Vips
img = pyvips.Image.new_from_file("mypic.jpg", access='sequential')
out = img.resize(2, kernel = "linear")
out.write_to_file("mypic_vips_resized.tif")

#Pillow
img = np.array(Image.open("mypic.jpg"))
h, w = img.shape[:2]
out = Image.fromarray(img,mode="RGB")
out = out.resize((w*2,h*2), Image.BILINEAR)
out.save("mypic_PIL_resized.tif", format='TIFF', compression='None')

原文:

枕头:

贵宾:

抽象示例(10*10 像素)

原文:

枕头双线性:

线性 VIP:

看起来 Pillow 正在使用 LINEAR 的三角形过滤器进行放大,而对于放大 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) Pillow LINEAR,3) libvips linear,以及 4) libvips gaussblur + linear。您可能需要单击图像,否则您的浏览器会将其缩小并模糊。

2) 和 4) 看起来相当接近我(不是很好)的眼睛。 3) 可以说对原作更真实,因为原作中的振铃和噪音没有被消除。