繁体   English   中英

从 BGR 转换为 HSV 并再次转换时,图像颜色看起来很糟糕

[英]Image color looks broken when being converted from BGR to HSV and back again

我一直在尝试使用深度学习框架对图像检测进行数据增强。
我在 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



在此处输入图片说明 在此处输入图片说明

看起来 openCV RGB to 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 转换函数的数据并检查输出以查看您是否有要剪辑到的范围。 我仍然认为这可能是数据类型或数据剪辑问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM