1

我一直在尝试使用深度学习框架对图像检测进行数据增强。
我在 Python 中使用 Opencv3.3。

我的框架是:

  1. 将 BGR 转换为 HSV
  2. 图像转换,如(旋转、缩放、剪切、平移)
  3. 将 HSV 转换为 BGR

原始图像是第一个图像,结果如下。
看到下面,红色瓶子上有一些污渍。

我确实在 [-10, 10] 内随机采样色调,在 [-80, 80] 内进行饱和度,在 [-40, 40] 内进行值。
此外,在这个链接之后,我将我的代码设置为这样。


class RandomHSV(object):
   def __init__(self, hue = None, saturation = None, brightness = None):
        if hue:
            self.hue = hue 
        else:
            self.hue = 0

        if saturation:
            self.saturation = saturation 
        else:
            self.saturation = 0

        if brightness:
            self.brightness = brightness
        else:
            self.brightness = 0



        if type(self.hue) != tuple:
            self.hue = (-self.hue, self.hue)

        if type(self.saturation) != tuple:
            self.saturation = (-self.saturation, self.saturation)

        if type(brightness) != tuple:
            self.brightness = (-self.brightness, self.brightness)

    def __call__(self, img, bboxes):

        hue = random.randint(*self.hue)
        saturation = random.randint(*self.saturation)
        brightness = random.randint(*self.brightness)

        img = img.astype(int)

        a = np.array([hue, saturation, brightness]).astype(int)
        img += np.reshape(a, (1,1,3))

        img = np.clip(img, 0, 255)
        img[:,:,0] = np.clip(img[:,:,0],0, 179)

        img = img.astype(np.uint8)



        return img, bboxes



在此处输入图像描述 在此处输入图像描述

4

1 回答 1

1

看起来 openCV RGB 到 HSV 没有我们期望的值。我拍摄了您的图像并将其转换为 HSV 并查看了每个通道的范围。在每个通道上使用np.max(imageHSV[:,:,c])np.min(imageHSV[:,:,c]),我看到色调似乎介于 0 和 360 之间,而饱和度和值都在 0 和 1 之间缩放。在图像上使用您的剪辑方法:

img = np.clip(img, 0, 255)
img[:,:,0] = np.clip(img[:,:,0],0, 179)

然后转换回 RGB,我得到了这个结果: 坏的 HSV 转换

我尝试在 0 和 360(色调)以及 0 和 1(饱和度和值)之间进行裁剪,如下所示:

imageHSV = cv2.cvtColor(image,cv2.COLOR_RGB2HSV)

imageHSV[:,:,1] = np.clip(imageHSV[:,:,1], 0.0, 1.0)
imageHSV[:,:,2] = np.clip(imageHSV[:,:,2], 0.0, 1.0)
imageHSV[:,:,0] = np.clip(imageHSV[:,:,0],0.0, 360.0)

然后我转换回 RGB,这就是结果。 良好的 HSV 转换

编辑- HSV 输出取决于您输入转换器的数据类型,请参阅文档。由于我将图像传递给 cv2.cvtColor 的方式,我的图像对于(H、S 和 V)的范围为(0-360、0-1、0-1)。检查您传递给 RGB2HSV 转换函数的数据并检查输出以查看是否有要剪辑到的范围。我仍然认为这可能是数据类型或数据裁剪问题。

于 2019-12-11T16:03:39.993 回答