试图"手动"在opencv-python

时间:2018-05-30 19:04:13

标签: python-3.x numpy opencv

我使用的算法是:

def rgb2hsv(r, g, b):
    r, g, b = r/255.0, g/255.0, b/255.0
    mx = max(r, g, b)
    mn = min(r, g, b)
    df = mx-mn
    if mx == mn:
        h = 0
    elif mx == r:
        h = (60 * ((g-b)/df) + 360) % 360
    elif mx == g:
        h = (60 * ((b-r)/df) + 120) % 360
    elif mx == b:
        h = (60 * ((r-g)/df) + 240) % 360
    if mx == 0:
        s = 0
    else:
        s = df/mx
    v = mx
    return h, s, v



def my_bgr_to_hsv(bgr_image):
    height, width, c = bgr_image.shape

    hsv_image = np.zeros(shape = bgr_image.shape)

    #The R,G,B values are divided by 255 to change the range from 0..255 to 0..1:

    for h in range(height):
        for w in range(width):
            b,g,r = bgr_image[h,w]
            hsv_image[h,w] = rgb2hsv(r,g,b)      

    return hsv_image

我遇到的问题是,当我想要显示图像时,我只得到一个黑屏。

这就是我尝试显示图片的方式:

cv.imshow("hello", cv.cvtColor(np.uint8(hsv_image), cv.COLOR_HSV2BGR))

正如你所看到的,我将它转换回bgr以便使用cv.imshow,因为它只使用bgr。

我认为我不太了解opencv或numpy来调试它。

简单地使用imshow,以错误的颜色显示原始图片,这让我觉得它不会完全错误。

1 个答案:

答案 0 :(得分:0)

您的Hue值在0到359的范围内缩放,这不适合无符号的8位数,并且您的饱和度和值在0到1的范围内缩放,这与您的Hues的比例不匹配并且当你将它转换为无符号的8位数时,将导致所有舍入为零(黑色)。

我建议你将饱和度和值乘以255,然后将你的Hue除以2。