Source code for blenderproc.python.postprocessing.SGMUtility

import cv2
import numpy as np
from PIL import Image


[docs]def resize(img, new_size, method="nearest"): method = method.lower() if "lanczos" in method: return np.asarray(Image.fromarray(img).resize(new_size, Image.LANCZOS)) elif "nearest" in method: return np.asarray(Image.fromarray(img).resize(new_size, Image.NEAREST)) else: raise Exception("Unknown resizing method")
# https://github.com/kujason/ip_basic/blob/master/ip_basic/depth_map_utils.py
[docs]def fill_in_fast(depth_map, max_depth=100.0, custom_kernel=None, extrapolate=False, blur_type='bilateral'): """Fast, in-place depth completion. :param depth_map: projected depths :param max_depth: max depth value for inversion :param custom_kernel: kernel to apply initial dilation :param extrapolate: whether to extrapolate by extending depths to top of the frame, and applying a 31x31 \ full kernel dilation :param blur_type: 'bilateral' - preserves local structure (recommended), 'gaussian' - provides lower RMSE :return: depth_map: dense depth map """ # Full kernels FULL_KERNEL_5 = np.ones((5, 5), np.uint8) FULL_KERNEL_7 = np.ones((7, 7), np.uint8) FULL_KERNEL_31 = np.ones((31, 31), np.uint8) if custom_kernel is None: custom_kernel = FULL_KERNEL_5 # Invert valid_pixels = (depth_map > 0.1) depth_map[valid_pixels] = max_depth - depth_map[valid_pixels] # Dilate depth_map = cv2.dilate(depth_map, custom_kernel) # Hole closing depth_map = cv2.morphologyEx(depth_map, cv2.MORPH_CLOSE, FULL_KERNEL_5) # Fill empty spaces with dilated values empty_pixels = (depth_map < 0.1) dilated = cv2.dilate(depth_map, FULL_KERNEL_7) depth_map[empty_pixels] = dilated[empty_pixels] # Extend highest pixel to top of image if extrapolate: top_row_pixels = np.argmax(depth_map > 0.1, axis=0) top_pixel_values = depth_map[top_row_pixels, range(depth_map.shape[1])] for pixel_col_idx in range(depth_map.shape[1]): depth_map[0:top_row_pixels[pixel_col_idx], pixel_col_idx] = \ top_pixel_values[pixel_col_idx] # Large Fill empty_pixels = depth_map < 0.1 dilated = cv2.dilate(depth_map, FULL_KERNEL_31) depth_map[empty_pixels] = dilated[empty_pixels] # Median blur depth_map = cv2.medianBlur(depth_map, 5) # Bilateral or Gaussian blur if blur_type == 'bilateral': # Bilateral blur depth_map = cv2.bilateralFilter(depth_map, 5, 1.5, 2.0) elif blur_type == 'gaussian': # Gaussian blur valid_pixels = (depth_map > 0.1) blurred = cv2.GaussianBlur(depth_map, (5, 5), 0) depth_map[valid_pixels] = blurred[valid_pixels] # Invert valid_pixels = (depth_map > 0.1) depth_map[valid_pixels] = max_depth - depth_map[valid_pixels] return depth_map