(Py)Vips与枕头提升图像质量

时间:2018-10-29 17:14:44

标签: python python-imaging-library vips

将图像尺寸调整为200%会在枕头和pyvips之间产生质量差异。

虽然枕头的复制非常准确,但vips会放大噪点和对比度。

我需要对非常大的图像使用vips,但是质量不能令人满意。任何想法如何从VIP获得更好的升级? (从我收集的文档中得知,升级对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')

原件:
original
枕头:
Pillow
VIP:
Vips

抽象示例(10 * 10像素)

原件:
Original
双线性枕:
Pillow Bilinear
线性VIP:
Vips linear

1 个答案:

答案 0 :(得分:2)

看起来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,我得到:

enter image description here

图像从左到右分别是1)简单的x2像素双倍,2)枕头LINEAR,3)libvips linear和4)libvips gaussblur + {{ 1}}。您可能需要单击该图像,否则您的浏览器将其缩小并使其模糊。

2)和4)看起来相当接近我(不是很好)的眼睛。 3)似乎可以更真实地对待原件,因为原件中的振铃和噪音尚未消除。