| import numpy as np |
| from PIL import Image |
| import trimesh |
| import pymeshlab |
|
|
| class imageSuperNet: |
| def __init__(self, model_path) -> None: |
| from realesrgan import RealESRGANer |
| from basicsr.archs.rrdbnet_arch import RRDBNet |
|
|
| model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=23, num_grow_ch=32, scale=4) |
| upsampler = RealESRGANer( |
| scale=4, |
| model_path=model_path, |
| dni_weight=None, |
| model=model, |
| tile=0, |
| tile_pad=10, |
| pre_pad=0, |
| half=True, |
| gpu_id=None, |
| ) |
| self.upsampler = upsampler |
|
|
| def __call__(self, image): |
| if isinstance(image, Image.Image): |
| output, _ = self.upsampler.enhance(np.array(image)) |
| output = Image.fromarray(output) |
| elif isinstance(image, np.ndarray): |
| output, _ = self.upsampler.enhance(image) |
| else: |
| raise ValueError(f"Unsupported image type: {type(image)}") |
| return output |
|
|
| def remesh_mesh(mesh_path, remesh_path): |
| mesh = mesh_simplify_trimesh(mesh_path, remesh_path) |
| return mesh |
|
|
|
|
| def mesh_simplify_trimesh(inputpath, outputpath, target_count=40000): |
| |
| ms = pymeshlab.MeshSet() |
| if inputpath.endswith(".glb"): |
| ms.load_new_mesh(inputpath, load_in_a_single_layer=True) |
| else: |
| ms.load_new_mesh(inputpath) |
| ms.save_current_mesh(outputpath.replace(".glb", ".obj"), save_textures=False) |
| |
| courent = trimesh.load(outputpath.replace(".glb", ".obj"), force="mesh") |
| face_num = courent.faces.shape[0] |
|
|
| if face_num > target_count: |
| courent = courent.simplify_quadric_decimation(target_count) |
| courent.export(outputpath) |
| return courent |
|
|