将图像大小调整为200%会产生枕头和pyvips之间的质量差异。
虽然枕头在复制上非常精确,但贵宾会夸大噪音和对比度。
我需要使用贵宾非常大的图像,但质量不令人满意。你知道如何从贵宾那里得到更好的升级吗?(从我收集到的文件来看,提升规模对重要人物来说并不是那么重要,大多数人认为已经进入了降低规模的阶段)。
例子:
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像素)
原件:
枕头双线性:
贵宾线性:
最佳答案
看起来枕头是用一个三角形的线性滤波器进行放大,而对于放大的libvips则是做简单的插值。libvips使用三角形过滤器进行缩小。
如果你想象像素:
A
B
C
然后枕头计算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)libvipslinear
,和4)libvipsgaussblur
+linear
。你可能需要点击图片,否则你的浏览器会缩小并模糊它。(2)和(4)看起来很接近我(不是很大)的眼睛。3)由于原稿中的铃声和噪音尚未被消除,因此可以说对原稿更为真实。