常见的数据增强以及实现方法:

需要注意的是:

所以在对图像处理之前会进行如下操作:

img = img.astype(np.float) # 新版本numpy是np.float32或者np.float64(图像处理不需要64那么高)

将图像转化到浮点数空间进行操作,操作完成之后再将数值范围调整至[0,255]:

            img = np.maximum(img, 0)
            img = np.minimum(img, 255)
            img = img.astype(np.uint8)

1. 随机亮度

实现方法:对每一个像素值都加上随机的像素偏移值,加上之后要确保像素值的范围保持在[0,255]之间

代码实现:

    def RandomBrightness(self, img, brightness_prob, brightness_delta):
        prob = random.uniform(0, 1.0)
        if (prob < brightness_prob): # 以一定的概率进行随机亮度增广
            img = img.astype(np.float) 
            assert brightness_delta >= 0
            delta = random.uniform(-brightness_delta, brightness_delta)
            img += delta  # 每一个像素值随机加上一个偏移值,导致图像变暗或者变亮
            img = np.maximum(img, 0)
            img = np.minimum(img, 255)
            img = img.astype(np.uint8)
        return img

2. 灰度化

实现方法:先将Img由RGB转化为灰度图,使其丧失颜色信息,仅保留亮度信息。然后再将灰度图转化为RGB。输出的图像还是灰度的(蓝、绿、红三个通道的值相同),这样做保持了图像是RGB 3通道,也实现了灰度化。

代码实现:

            if random.uniform(0, 1.0) < 0.4:  # 20%
                img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 用亮度加权公式把 BGR → 灰度;
                img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) # 把单通道灰度复制为 3 通道,保持网络输入格式。

OpenCV的灰度化cv2.COLOR_BGR2GRAY,不是简单的对像素求平均,而是根据人眼亮度响应计算的。