【问题标题】:(Py)Vips vs Pillow upscaling image quality(Py)Vips vs Pillow 提升画质
【发布时间】:2018-10-29 17:14:44
【问题描述】:

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

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

我需要为非常大的图像使用 vip,但质量不能令人满意。知道如何从贵宾那里获得更好的升级吗? (从我收集到的文档中,升级对贵宾来说并不是那么重要,而且大多数想法都转向了降级)。

示例:

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 像素)

原文:

枕头双线性:

贵宾线性:

【问题讨论】:

  • 您正在使用不同的升迁方法 --- bilinear 用于枕头,cubic 用于 pyvips。尝试将 vip 设置为 linear,它们应该匹配。您可以尝试使用其他 pyvips 内核:最近的、线性的、立方的、米切尔、lanczos2、lanczos3。
  • @jcupitt 图片实际上来自 vips 线性(我尝试了所有方法来获得最接近的匹配)只是我的缩写代码中的一个错误。
  • 我使代码 sn-p 可行,如果您将原件另存为 mypic.jpg,您应该能够看到差异(但是我不知道 SO 是否与上传的 jpg 混淆)。无论如何,适用于任何图像。
  • 你是对的,libvips resize 运算符使用简单的插值双线性进行高档,而 Pillow 使用三角形过滤器。您可以通过在放大之前进行模糊来获得三角形滤镜的效果。我会做出正确的回答。

标签: python python-imaging-library vips


【解决方案1】:

看起来 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) 似乎可以说对原作更真实,因为原作中存在的振铃和噪音尚未消除。

【讨论】:

  • 非常感谢您的详细解释。我已经尝试了建议的 gaussblur,它确实改善了结果。我仍然发现 Pillow 版本更令人愉悦,即使对单个图像的复制不那么忠实。但是,由于我正在处理约 15 个图像的图像堆栈并计算平均值和中值,因此枕头的输出对我来说确实看起来更好(与 gauss-vips 相比,噪音更少,对比度更好)。线性过滤器的枕头变体是否有可能在 libvips 中实现?我知道升级不是优先事项,但仍然符合枕头最初的目标。
  • 最后一句我的意思当然是vips最初的目标。
  • 当然,在 libvips 跟踪器上打开一个问题,我们可以将其标记为增强。你能解释一下你的整个管道吗?也许可以在其他点添加模糊。
  • 很好,会的!我的管道:使用几个手持连拍,目的是在相机中获取超出拜耳滤镜的图像信息 -> 缩放到 200% -> 对齐(hugin) -> 计算堆栈中每个像素的平均值/中值。结果是在解析更精细细节的意义上具有更高分辨率的图片,因为记录角度的微小差异会改变拜耳滤波器上边缘的对象位置,因此我们理论上可以获得完整的广告 nMP 分辨率,而不是外推的 nMP。宾得将其引入为像素偏移,仅精确移动传感器。
  • 啊,好的,是的,我做过类似的事情。我会使用 libvips 插值缩放到 200%——在处理结束之前你不想做任何额外的平滑。我想你会发现 avg / median 增加了很多。 libvips 在图像堆栈libvips.github.io/libvips/API/current/… 上有一个用于排名过滤器的运算符
猜你喜欢
  • 2019-05-20
  • 2017-05-09
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2017-12-26
  • 2012-05-18
  • 2016-04-05
  • 2016-04-01
相关资源
最近更新 更多