[英]OpenCv inversion: BGR to HSV then back to BGR - shouldn't I get the same image?
[英]Image color looks broken when being converted from BGR to HSV and back again
我一直在尝试使用深度学习框架对图像检测进行数据增强。
我在 Python 中使用 Opencv3.3。
我的框架是:
原始图像是第一个,结果如下。
看下面,红色瓶子上有一些污渍。
我在 [-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)
我尝试在 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)
编辑- HSV 输出取决于您输入转换器的数据类型,请参阅此文档。 由于我将其传递到 cv2.cvtColor 的方式,我的图像的(H、S 和 V)范围为(0-360、0-1、0-1)。 检查您传递给 RGB2HSV 转换函数的数据并检查输出以查看您是否有要剪辑到的范围。 我仍然认为这可能是数据类型或数据剪辑问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.