首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从BGR转换到HSV并再次返回时,图像颜色看起来会中断。

当从BGR转换到HSV并再次返回时,图像颜色看起来会中断。
EN

Stack Overflow用户
提问于 2019-12-11 15:00:43
回答 1查看 472关注 0票数 1

我一直在尝试用深度学习框架来进行图像检测的数据增强。

我在Python中使用Opencv3.3。

我的框架是:

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

最初的图像是第一个,结果是下面的结果。

从下面看,红色瓶子上有一些污渍。

我随机抽取了- 10,10的色氨酸,在- 80,80的饱和范围内,在- 40,40的范围内。

此外,在这个链接之后,我设置了如下代码。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2019-12-11 16:03:39

看起来,openCV RGB到HSV没有我们期望的值。我把你的图像转换成HSV,看看每个通道的范围。在每个通道上使用np.max(imageHSV[:,:,c])np.min(imageHSV[:,:,c]),我看到色调在0到360之间,而饱和度和值都在0到1之间。

代码语言:javascript
复制
img = np.clip(img, 0, 255)
img[:,:,0] = np.clip(img[:,:,0],0, 179)

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

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

代码语言:javascript
复制
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输出取决于输入转换器的数据类型,参见文档。我的图像对于(H,S和V)的范围是(0-360,0-1,0-1),因为我是如何把它传递给cv2.cvtColor的。检查要传递到RGB2HSV转换函数中的数据,并检查输出,看看是否有要剪辑的范围。我仍然认为这可能是一个数据类型或数据裁剪问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59288606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档