def __call__(self, results): """Call function. Args: results (dict): A dict containing the necessary information and data for augmentation. Returns: dict: A dict containing the processed data and information. """ if self.file_client is None: self.file_client = FileClient(self.io_backend, **self.kwargs) filepaths = results[f'{self.key}_path'] if not isinstance(filepaths, list): raise TypeError( f'filepath should be list, but got {type(filepaths)}') filepaths = [str(v) for v in filepaths] imgs = [] shapes = [] if self.save_original_img: ori_imgs = [] for filepath in filepaths: img_bytes = self.file_client.get(filepath) img = mmcv.imfrombytes(img_bytes, flag=self.flag, channel_order=self.channel_order) # HWC # convert to y-channel, if specified if self.convert_to is not None: if self.channel_order == 'bgr' and self.convert_to.lower( ) == 'y': img = mmcv.bgr2ycbcr(img, y_only=True) elif self.channel_order == 'rgb': img = mmcv.rgb2ycbcr(img, y_only=True) else: raise ValueError('Currently support only "bgr2ycbcr" or ' '"bgr2ycbcr".') if img.ndim == 2: img = np.expand_dims(img, axis=2) imgs.append(img) shapes.append(img.shape) if self.save_original_img: ori_imgs.append(img.copy()) results[self.key] = imgs results[f'{self.key}_path'] = filepaths results[f'{self.key}_ori_shape'] = shapes if self.save_original_img: results[f'ori_{self.key}'] = ori_imgs return results
def to_y_channel(img): """Change to Y channel of YCbCr. Args: img (ndarray): Images with range [0, 255]. Returns: (ndarray): Images with range [0, 255] (float type) without round. """ img = img.astype(np.float32) / 255. if img.ndim == 3 and img.shape[2] == 3: img = mmcv.rgb2ycbcr(img, y_only=True) img = img[..., None] return img * 255
def __call__(self, results): """Call function. Args: results (dict): A dict containing the necessary information and data for augmentation. Returns: dict: A dict containing the processed data and information. """ filepath = str(results[f'{self.key}_path']) if self.file_client is None: self.file_client = FileClient(self.io_backend, **self.kwargs) if self.use_cache: if self.cache is None: self.cache = dict() if filepath in self.cache: img = self.cache[filepath] else: img_bytes = self.file_client.get(filepath) img = mmcv.imfrombytes(img_bytes, flag=self.flag, channel_order=self.channel_order, backend=self.backend) # HWC self.cache[filepath] = img else: img_bytes = self.file_client.get(filepath) img = mmcv.imfrombytes(img_bytes, flag=self.flag, channel_order=self.channel_order, backend=self.backend) # HWC if self.convert_to is not None: if self.channel_order == 'bgr' and self.convert_to.lower() == 'y': img = mmcv.bgr2ycbcr(img, y_only=True) elif self.channel_order == 'rgb': img = mmcv.rgb2ycbcr(img, y_only=True) else: raise ValueError('Currently support only "bgr2ycbcr" or ' '"bgr2ycbcr".') if img.ndim == 2: img = np.expand_dims(img, axis=2) results[self.key] = img results[f'{self.key}_path'] = filepath results[f'{self.key}_ori_shape'] = img.shape if self.save_original_img: results[f'ori_{self.key}'] = img.copy() return results
def test_rgb2ycbcr(): with pytest.raises(TypeError): # The img type should be np.float32 or np.uint8 in_img = np.random.rand(10, 10, 3).astype(np.uint64) mmcv.rgb2ycbcr(in_img) # float32 in_img = np.random.rand(10, 10, 3).astype(np.float32) out_img = mmcv.rgb2ycbcr(in_img) computed_ycbcr = np.empty_like(in_img) for i in range(in_img.shape[0]): for j in range(in_img.shape[1]): r, g, b = in_img[i, j] y = 16 + r * 65.481 + g * 128.553 + b * 24.966 cb = 128 - r * 37.797 - g * 74.203 + b * 112.0 cr = 128 + r * 112.0 - g * 93.786 - b * 18.214 computed_ycbcr[i, j, :] = [y, cb, cr] computed_ycbcr /= 255. assert_array_almost_equal(out_img, computed_ycbcr, decimal=2) # y_only=True out_img = mmcv.rgb2ycbcr(in_img, y_only=True) computed_y = np.empty_like(out_img, dtype=out_img.dtype) for i in range(in_img.shape[0]): for j in range(in_img.shape[1]): r, g, b = in_img[i, j] y = 16 + r * 65.481 + g * 128.553 + b * 24.966 computed_y[i, j] = y computed_y /= 255. assert_array_almost_equal(out_img, computed_y, decimal=2) # uint8 in_img = (np.random.rand(10, 10, 3) * 255).astype(np.uint8) out_img = mmcv.rgb2ycbcr(in_img) computed_ycbcr = np.empty_like(in_img) in_img = in_img / 255. for i in range(in_img.shape[0]): for j in range(in_img.shape[1]): r, g, b = in_img[i, j] y = 16 + r * 65.481 + g * 128.553 + b * 24.966 cb = 128 - r * 37.797 - g * 74.203 + b * 112.0 cr = 128 + r * 112.0 - g * 93.786 - b * 18.214 y, cb, cr = y.round(), cb.round(), cr.round() computed_ycbcr[i, j, :] = [y, cb, cr] assert_image_almost_equal(out_img, computed_ycbcr) # y_only=True in_img = (np.random.rand(10, 10, 3) * 255).astype(np.uint8) out_img = mmcv.rgb2ycbcr(in_img, y_only=True) computed_y = np.empty_like(out_img, dtype=out_img.dtype) in_img = in_img / 255. for i in range(in_img.shape[0]): for j in range(in_img.shape[1]): r, g, b = in_img[i, j] y = 16 + r * 65.481 + g * 128.553 + b * 24.966 y = y.round() computed_y[i, j] = y assert_image_almost_equal(out_img, computed_y)