UV-отображение плохо работает при низком разрешении (предупреждение: много изображений)

TL; DR: существует ли способ уменьшить и UV-карту и текстуру без потери качества полученного результата?

Полная история:

Я пытаюсь разработать простой механизм рендеринга, который возьмет UV-карту из файла .EXR, поместит на нее текстуру и подаст ее клиенту. Весь процесс выглядит следующим образом:

from PIL import Image import numpy as np texture = Image.open("texture.png") texture_array = np.asarray(txt).transpose(1, 0, 2) # assume reading EXR file and grabbing only R and G channels from it uv = read_exr() # scale indexes to texture size uv[..., 0] *= texture.size[0] uv[..., 1] *= texture.size[1] map = uv.astype('uint16') # use numpy indexing to produce the result result = texture_array[map[..., 0], map[..., 1]] # downsample for smoother image image = Image.fromarray(result, "RGB").resize((2048, 2048), Image.LANCZOS) 

Произведенное изображение – рубашка, а текстура – это сканирование ткани. УФ фактически состоит из нескольких файлов, поскольку каждая часть рубашки может иметь разные варианты.

Все работает отлично на высоком разрешении, но я подумал о том, чтобы сделать «предварительную» версию для показа на веб-странице. Теперь проблема в том, что когда я пытаюсь масштабировать UV и текстуру вниз, результат выглядит только прилично для ткани с большими узорами. Например, ткань с множеством тонких линий создает муароподобные эффекты. Ниже приведены примеры высокого разрешения, уменьшенные браузером (это приемлемо): Высокое разрешение уменьшено

и результат состоит из УФ и текстуры, которые программно уменьшались (это не так): Построено из измененного UV и текстуры

Вот как я масштабирую как текстуру, так и УФ:

 from scipy.ndimage.interpolation import zoom uv = zoom(uv, [0.25, 0.25, 1], order=1) # higher order produces negative values texture = texture.resize((1024, 1024), Image.LANCZOS) 

Я также попытался использовать cv2 для масштабирования UV, но он дает тот же результат.

Крайне важно иметь возможность создавать эту миниатюрную версию, так как создание версии с высоким разрешением занимает несколько секунд, а миниатюра – за несколько секунд. К сожалению, я не могу предугадать все возможные комбинации из-за большого количества различных вариантов.

Интересно, есть ли какие-то трюки, чтобы результат с низким разрешением выглядел лучше, в идеале выглядел так же, как и исходное изображение с пониженным разрешением. Я бы очень признателен за любые идеи, так как я не очень много разбираюсь в обработке изображений и пока не нашел подходящего решения.

Вот что я пробовал без везения:

  1. Размытие текстуры немного гауссовского размытия + UnsharpMask. Помогает с муаром, но убивает тон ткани:

пятно

  1. Используйте текстуру оригинального размера (без уменьшения): результат выглядит слишком резким, а также имеет муароподобный эффект; выглядит ужасно для многих других тканей

введите описание изображения здесь

    Python - лучший язык программирования в мире.