模糊和运动模糊增强

时间:2019-11-21 17:45:36

标签: tensorflow deeplab

我正在使用Deeplabv3 +存储库,我想知道如何将运动模糊和模糊用作增强。我已经进行了一些扩充,例如随机缩放(示例)。

但是,我找不到任何开箱即用的解决方案来在Tensorflow上应用运动模糊。 有谁知道任何图书馆或如何建立这种转变?

def randomly_scale_image_and_label(image, label=None, scale=1.0):
  """Randomly scales image and label.

  Args:
    image: Image with shape [height, width, 3].
    label: Label with shape [height, width, 1].
    scale: The value to scale image and label.

  Returns:
    Scaled image and label.
  """
  # No random scaling if scale == 1.
  if scale == 1.0:
    return image, label
  image_shape = tf.shape(image)
  new_dim = tf.cast(
      tf.cast([image_shape[0], image_shape[1]], tf.float32) * scale,
      tf.int32)

  # Need squeeze and expand_dims because image interpolation takes
  # 4D tensors as input.
  image = tf.squeeze(tf.image.resize_bilinear(
      tf.expand_dims(image, 0),
      new_dim,
      align_corners=True), [0])
  if label is not None:
    label = tf.squeeze(tf.image.resize_nearest_neighbor(
        tf.expand_dims(label, 0),
        new_dim,
        align_corners=True), [0])

  return image, label

2 个答案:

答案 0 :(得分:2)

有一个很好的图书馆,叫做装饰品

您可以在这里查看:https://github.com/albumentations-team/albumentations/blob/master/notebooks/example.ipynb

我相信它将很有用;它包含针对不同用例(对象检测,图像分割)的各种扩充。

答案 1 :(得分:0)

我在张量流中找不到运动模糊的直接实现。您必须使用tf.nn.depthwise_conv2d来实现它。从白蛋白剥离观察运动模糊的实现,您需要创建一个随机大小的滤镜,例如nxn,然后在滤镜上画一条随机线。然后使用该滤镜对图像进行深度卷积。

例如,尺寸为5的180/0度运动模糊滤镜看起来像

>>> kernel = np.zeros([5,5])                                                                                                                                          
>>> kernel[2] = 0.2                                                                                                                                                   
>>> kernel                                                                                                                                                            
array([[0. , 0. , 0. , 0. , 0. ],
       [0. , 0. , 0. , 0. , 0. ],
       [0.2, 0.2, 0.2, 0.2, 0.2],
       [0. , 0. , 0. , 0. , 0. ],
       [0. , 0. , 0. , 0. , 0. ]])

现在将过滤器应用于image([高度,宽度,3]的过滤器)

>>> kernel_motion_blur = tf.convert_to_tensor(kernel, tf.float32)
>>> kernel_motion_blur = tf.tile(kernel_motion_blur[..., None, None], [1,1,3,1])
>>> blurred_image = tf.nn.depthwise_conv2d(image[None], kernel_motion_blur, strides=(1,1,1,1), padding='VALID')

注意:要生成运动模糊内核,可以使用cv2.line在numpy数组上绘制随机线