(Py) Vips vs Pillow повышение качества изображения - PullRequest
0 голосов
/ 29 октября 2018

Изменение размера изображения до 200% приводит к разнице в качестве между подушкой и 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')

Оригинал:
original
Подушка:
Pillow
Випс:
Vips

Абстрактные примеры (10 * 10 пикселей)

Оригинал:
Original
Подушка Билинейная:
Pillow Bilinear
Випс линейный:
Vips linear

1 Ответ

0 голосов
/ 30 октября 2018

Похоже, что Pillow изменяет размер с помощью треугольного фильтра для LINEAR, тогда как для upsize 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 + linear. Вам, вероятно, нужно будет нажать на изображение, иначе ваш браузер уменьшит его и размыт.

2) и 4) кажутся достаточно близкими к моим (не очень) глазам. 3) кажется, возможно, более правдивым к оригиналу, поскольку звуки и шум, присутствующие в оригинале, не были сглажены.

...