uv映射在低分辨率上工作不好(警告:很多图像)

时间:2016-08-25 19:39:45

标签: python numpy image-processing scipy uv-mapping

TL; DR:有没有办法缩小UV贴图和纹理而不会降低生成结果的质量?

全文:

我正在尝试开发一个简单的渲染引擎,它将从.EXR文件中获取UV贴图,在其上放置纹理并提供给客户端。整个过程如下:

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和纹理时,结果对于具有大图案的织物来说看起来不错。例如。有很多细线的面料会产生类似莫尔条纹的效果。以下是浏览器按比例缩小的高分辨率结果示例(这是可以接受的): High resolution scaled down

和由UV和纹理组成的结果以编程方式缩小(这是没办法的): Built from resized UV and texture

以下是我如何缩放纹理和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。有助于云纹,但却杀死了面料:
  2. blur

    1. 使用原始大小的纹理(无下采样):结果看起来太尖锐且也有 莫尔条纹效应;很多其他面料看起来很糟糕
    2. enter image description here

0 个答案:

没有答案