使用Numpy

时间:2018-04-06 16:34:23

标签: numpy colors opencv3.0 hsv

我正在尝试转换(移位)HSV图像中每个像素的值(取自视频帧)。

我们的想法是将黄色和红色反转为蓝色(以避免在程序中稍后使用三个阈值,当我只能使用一个时),通过使用以下等式将红色和黄色值反转为蓝色值。

  

(Hue + 90)%180(在OpenCV 3 Hue范围内[0,180])

以下是我提出的建议:

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV);
H = hsv[:,:,0]
mask= [H<75 and H>128]
print("orig",hsv[mask])
hsv[mask] = ((hsv[mask]+90) % 180)

不幸的是,它无法通过这种方法工作。我选择整个色调通道而不是其像素值

2 个答案:

答案 0 :(得分:3)

这里有两种不同的可能性,我不确定你想要哪种,但它们实现起来都很微不足道。你可以反转(反向可能是一个更好的词)色调彩虹,你可以使用180 - hue来做。或者你可以像你提到的那样使用(hue + 90) % 180将颜色移动180度。

扭转颜色:

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
rev_h = 180 - h
rev_hsv = cv2.merge([rev_h, s, v])
rev_img = cv2.cvtColor(rev_hsv, cv2.COLOR_HSV2BGR)

改变颜色:

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
shift_h = (h + 90) % 180
shift_hsv = cv2.merge([shift_h, s, v])
shift_img = cv2.cvtColor(shift_hsv, cv2.COLOR_HSV2BGR)

这些是在OpenCV中执行此操作的惯用方法。

现在你想做与上面相同的事情,但仅限于满足条件的一些蒙版像素子集。这不是很难做到的;如果你想移动一些蒙面像素:

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
h_mask = (h < 75) | (h > 128)
h[h_mask] = (h[h_mask] + 90) % 180
shift_hsv = cv2.merge([h, s, v])
shift_img = cv2.cvtColor(shift_hsv, cv2.COLOR_HSV2BGR)

答案 1 :(得分:0)

色调通道为uint8类型,值范围为[0,179]。因此,当以大数或负数相加时,Python返回一个垃圾数字。这是我基于@alkasm移色代码的解决方案:

img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(img_hsv)
shift_h = random.randint(-50, 50)
h = ((h.astype('int16') + shift_h) % 180).astype('uint8')
shift_hsv = cv2.merge([h, s, v])

用于随机色调,饱和度和值移动。根据{{​​3}}切换频道:

def shift_channel(c, amount):
   if amount > 0:
        lim = 255 - amount
        c[c >= lim] = 255
        c[c < lim] += amount
    elif amount < 0:
        amount = -amount
        lim = amount
        c[c <= lim] = 0
        c[c > lim] -= amount
    return c

rand_h, rand_s, rand_v = 50, 50, 50
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(img_hsv)
# Random shift hue
shift_h = random.randint(-rand_h, rand_h)
h = ((h.astype('int16') + shift_h) % 180).astype('uint8')
# Random shift saturation
shift_s = random.randint(-rand_s, rand_s)
s = shift_channel(s, shift_s)
# Random shift value
shift_v = random.randint(-rand_v, rand_v)
v = shift_channel(v, shift_v)
shift_hsv = cv2.merge([h, s, v])
print(shift_h, shift_s, shift_v)
img_rgb = cv2.cvtColor(shift_hsv, cv2.COLOR_HSV2RGB)