【问题标题】:Trying to "manually" convert to hsv a bgr image in opencv-python尝试在opencv-python中“手动”将bgr图像转换为hsv
【发布时间】:2018-05-30 19:04:13
【问题描述】:

我使用的算法是:

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,原图颜色显示错误,让我觉得不可能完全错。

【问题讨论】:

  • 我要出去了,所以没时间检查,但我相信 OpenCV 存储的色调值 减半,即 0 到 180 之间(不是 0 到 260 之间)以便它们适合无符号字节,因此当您转换回来时可能会咬你。
  • 您的 HSV 输出是 0..359 范围内的浮点数。然后将其视为uint8 的数组,即字节数组。我想这种治疗的结果充其量是奇怪的。如果您想将这样的图像存储在磁盘上,consider using Pillow,或者至少找出图像所需的格式。

标签: python-3.x numpy opencv


【解决方案1】:

您的色调值在 0 到 359 的范围内缩放,这不适合无符号 8 位数字,并且您的饱和度和值在 0 到 1 的范围内缩放,这与您的色调不匹配并且当您将其转换为无符号 8 位数字时,所有内容都会四舍五入为零(黑色)。

我建议您将饱和度和值乘以 255,然后将色相除以 2。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多