python - (Py)Vips vs Pillow 提升画质
问题描述
将图像大小调整为 200% 会在 Pillow 和 pyvips 之间产生质量差异。
虽然 Pillow 在再现方面非常准确,但 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 像素)
解决方案
看起来 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')
IE。先做一个小半径,高精度gaussblur
,我得到:
从左到右的图像是 1) 一个简单的 x2 像素双精度、2) Pillow LINEAR
、3) libvipslinear
和 4) libvips gaussblur
+ linear
。您可能需要单击图像,否则您的浏览器会将其缩小并模糊。
2) 和 4) 看起来离我(不是很好)的眼睛很近。3)似乎可以说对原作更真实,因为原作中存在的振铃和噪音没有被消除。
推荐阅读
- uwp - 如何为游戏创建附加组件?
- javascript - 如何在反应中用玩笑和酶测试表单提交?
- git - squash 后提交加倍并合并到 master
- c++ - Valgrind 在动态分配指针数组时检测到内存泄漏
- python - 如何使用 python 在两个文件中找到匹配的 DNA 序列?
- java - 为什么Java的Double Metaphone只给出四个字母代码?
- sql - Oracle Live SQL:ORA-00907:缺少右括号 -
- scala - 播放框架 scala 项目
- css - Visual Studio 中的 CSS 表与浏览器中的 CSS 表不匹配
- python - Patsy 和 Pandas 之间的标准化结果不同 - Python