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)
基于 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。
请随意提出修改建议,以使该解决方案更加优雅和通用。
如果使用 PIL,以及最近的 Pillow 副本,则可能应该使用
def rgb2hsv(image):
return image.convert('HSV')
Run Code Online (Sandbox Code Playgroud)
我建议使用 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)
| 归档时间: |
|
| 查看次数: |
6145 次 |
| 最近记录: |