使用python将RGB值转换为等效的HSV值

Sre*_*ran 5 python image-processing

我想使用python将RGB值转换为HSV.我得到了一些代码示例,结果是S和V值大于100.(例如:http://code.activestate.com/recipes/576554-covert-color-space-from-hsv-to-rgb -and-rgb-to-hsv /).任何人都有一个更好的代码,将RGB转换为HSV,反之亦然

谢谢

Eli*_*sky 14

你尝试过使用colorsys库吗?

colorsys模块定义在计算机监视器中使用的RGB(红绿蓝)颜色空间中表示的颜色之间的颜色值的双向转换和其他三个坐标系:YIQ,HLS(色调亮度饱和度)和HSV(色调饱和度值)

示例(取自上面的链接):

>>> import colorsys
>>> colorsys.rgb_to_hsv(.3, .4, .2)
(0.25, 0.5, 0.4)
>>> colorsys.hsv_to_rgb(0.25, 0.5, 0.4)
(0.3, 0.4, 0.2)
Run Code Online (Sandbox Code Playgroud)

  • 除数应为 255,因为“colorsys”函数的范围是“[0.0…1.0]”。 (7认同)
  • 如何将 (220, 20, 60) 等整数值转换为浮点数以与 colorsys 一起使用? (4认同)

hah*_*nec 9

基于 numpy 中的数组索引和切片,这是我的前进方法:

import numpy as np

def rgb2hsv(rgb):
    """ convert RGB to HSV color space

    :param rgb: np.ndarray
    :return: np.ndarray
    """

    rgb = rgb.astype('float')
    maxv = np.amax(rgb, axis=2)
    maxc = np.argmax(rgb, axis=2)
    minv = np.amin(rgb, axis=2)
    minc = np.argmin(rgb, axis=2)

    hsv = np.zeros(rgb.shape, dtype='float')
    hsv[maxc == minc, 0] = np.zeros(hsv[maxc == minc, 0].shape)
    hsv[maxc == 0, 0] = (((rgb[..., 1] - rgb[..., 2]) * 60.0 / (maxv - minv + np.spacing(1))) % 360.0)[maxc == 0]
    hsv[maxc == 1, 0] = (((rgb[..., 2] - rgb[..., 0]) * 60.0 / (maxv - minv + np.spacing(1))) + 120.0)[maxc == 1]
    hsv[maxc == 2, 0] = (((rgb[..., 0] - rgb[..., 1]) * 60.0 / (maxv - minv + np.spacing(1))) + 240.0)[maxc == 2]
    hsv[maxv == 0, 1] = np.zeros(hsv[maxv == 0, 1].shape)
    hsv[maxv != 0, 1] = (1 - minv / (maxv + np.spacing(1)))[maxv != 0]
    hsv[..., 2] = maxv

    return hsv
Run Code Online (Sandbox Code Playgroud)

和向后的色彩空间转换:

def hsv2rgb(hsv):
    """ convert HSV to RGB color space

    :param hsv: np.ndarray
    :return: np.ndarray
    """

    hi = np.floor(hsv[..., 0] / 60.0) % 6
    hi = hi.astype('uint8')
    v = hsv[..., 2].astype('float')
    f = (hsv[..., 0] / 60.0) - np.floor(hsv[..., 0] / 60.0)
    p = v * (1.0 - hsv[..., 1])
    q = v * (1.0 - (f * hsv[..., 1]))
    t = v * (1.0 - ((1.0 - f) * hsv[..., 1]))

    rgb = np.zeros(hsv.shape)
    rgb[hi == 0, :] = np.dstack((v, t, p))[hi == 0, :]
    rgb[hi == 1, :] = np.dstack((q, v, p))[hi == 1, :]
    rgb[hi == 2, :] = np.dstack((p, v, t))[hi == 2, :]
    rgb[hi == 3, :] = np.dstack((p, q, v))[hi == 3, :]
    rgb[hi == 4, :] = np.dstack((t, p, v))[hi == 4, :]
    rgb[hi == 5, :] = np.dstack((v, p, q))[hi == 5, :]

    return rgb
Run Code Online (Sandbox Code Playgroud)

我之所以写这些行,是因为由于计算过载,我不相信逐像素转换,而且也不想依赖其他库,例如 OpenCV。

请随意提出修改建议,以使该解决方案更加优雅和通用。


K3-*_*rnc 7

如果使用 PIL,以及最近的 Pillow 副本,则可能应该使用

def rgb2hsv(image):
    return image.convert('HSV')
Run Code Online (Sandbox Code Playgroud)


Geo*_*pis 7

我建议使用 OpenCV

import cv2

# Read the image - Notice that OpenCV reads the images as BRG instead of RGB
img = cv2.imread('myimage.jpg')

# Convert the BRG image to RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# Convert the RGB image to HSV
img = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
Run Code Online (Sandbox Code Playgroud)