| | |
| | from typing import Union |
| |
|
| | import mmcv |
| | import numpy as np |
| | import torch |
| | from torch import Tensor |
| |
|
| |
|
| | def imrenormalize(img: Union[Tensor, np.ndarray], img_norm_cfg: dict, |
| | new_img_norm_cfg: dict) -> Union[Tensor, np.ndarray]: |
| | """Re-normalize the image. |
| | |
| | Args: |
| | img (Tensor | ndarray): Input image. If the input is a Tensor, the |
| | shape is (1, C, H, W). If the input is a ndarray, the shape |
| | is (H, W, C). |
| | img_norm_cfg (dict): Original configuration for the normalization. |
| | new_img_norm_cfg (dict): New configuration for the normalization. |
| | |
| | Returns: |
| | Tensor | ndarray: Output image with the same type and shape of |
| | the input. |
| | """ |
| | if isinstance(img, torch.Tensor): |
| | assert img.ndim == 4 and img.shape[0] == 1 |
| | new_img = img.squeeze(0).cpu().numpy().transpose(1, 2, 0) |
| | new_img = _imrenormalize(new_img, img_norm_cfg, new_img_norm_cfg) |
| | new_img = new_img.transpose(2, 0, 1)[None] |
| | return torch.from_numpy(new_img).to(img) |
| | else: |
| | return _imrenormalize(img, img_norm_cfg, new_img_norm_cfg) |
| |
|
| |
|
| | def _imrenormalize(img: Union[Tensor, np.ndarray], img_norm_cfg: dict, |
| | new_img_norm_cfg: dict) -> Union[Tensor, np.ndarray]: |
| | """Re-normalize the image.""" |
| | img_norm_cfg = img_norm_cfg.copy() |
| | new_img_norm_cfg = new_img_norm_cfg.copy() |
| | for k, v in img_norm_cfg.items(): |
| | if (k == 'mean' or k == 'std') and not isinstance(v, np.ndarray): |
| | img_norm_cfg[k] = np.array(v, dtype=img.dtype) |
| | |
| | if 'bgr_to_rgb' in img_norm_cfg: |
| | img_norm_cfg['rgb_to_bgr'] = img_norm_cfg['bgr_to_rgb'] |
| | img_norm_cfg.pop('bgr_to_rgb') |
| | for k, v in new_img_norm_cfg.items(): |
| | if (k == 'mean' or k == 'std') and not isinstance(v, np.ndarray): |
| | new_img_norm_cfg[k] = np.array(v, dtype=img.dtype) |
| | img = mmcv.imdenormalize(img, **img_norm_cfg) |
| | img = mmcv.imnormalize(img, **new_img_norm_cfg) |
| | return img |
| |
|