【问题标题】:Can I Convert RGB > HSV the simple way?我可以用简单的方法转换 RGB > HSV 吗?
【发布时间】:2021-03-18 05:36:15
【问题描述】:

好的。我正在创建一个色盲模拟器。我正在开发一个测试版,您只需在 HSV/HSB 中插入颜色属性,而不是整个图像。

h = input('Hue: ');
s = input('Saturation: ');
v = input('Value/Brightness: ');

但是,我需要一个可以将 HSV/HSB 转换为 RGB 的算法或方程。我已经尝试了很多东西,但我大部分时间都花在了查看 Python 无法使用的操作的算法,并尝试将它们转换为 Python 可以理解的内容。所以,我只想要一个简单,很好的算法,如果你不知道它是如何工作的也没关系;但是,求求您。如果我可以转换 RGB > HSV 并且两者都没有任何导入,那也很好。此外,是否必须将 HSV 替换为 HSL 也没关系。

【问题讨论】:

  • 维基百科有它们。您应该只检查您拥有什么类型的数据(全范围或有限范围,如许多视频),以及 e.v.色彩空间。 en.wikipedia.org/wiki/HSL_and_HSV#Color_conversion_formulae
  • 没有。这很简单。 3个公式。无论如何,公式在那里。如果不改变数字的含义,您无法进一步简化它们,因此没有更多用处。
  • @GiacomoCatenazzi,我尝试将这个公式转换为 python,但由于某种原因,当我输入 Hue 为 0,Saturation 为 100,Value 为 100 时,我得到 [1.0,1.0 ,0]。你有任何python解决方案吗?圣诞快乐(如果你庆祝的话)。
  • 哦等等;我应该输入 h=0、s=1 和 v=1。谢谢你。另外,在githubgithub.com/python/cpython/blob/3.9/Lib/colorsys.py上,我找到了python解决方案。

标签: python-3.x colors


【解决方案1】:

Colour 实现 Machado、Oliveira 和 Fernandes (2009) 色觉缺陷 (CVD) 模型:

H = 0 # input('Hue: ')
S = 0.95 # input('Saturation: ')
V = 0.75 # input('Value/Brightness: ')
deficiency = 'Protanomaly' # input('Deficiency (Protanomaly, Deuteranomaly, Tritanomaly)')
severity = 0.75 # input('Severity [0, 1]')

# Assuming linear H, S, V input.
HSV = [H, S, V]

RGB = colour.cctf_decoding(colour.HSV_to_RGB(HSV))
M_a = colour.blindness.matrix_cvd_Machado2009(deficiency, severity)
RGB_a = colour.utilities.vector_dot(M_a, RGB)

colour.plotting.plot_multi_colour_swatches(colour.cctf_encoding([RGB, RGB_a]));

对于色轮:

def colour_wheel(samples=512, clip_circle=True, method='Colour'):
    xx, yy = np.meshgrid(
        np.linspace(-1, 1, samples), np.linspace(-1, 1, samples))

    S = np.sqrt(xx ** 2 + yy ** 2)    
    H = (np.arctan2(xx, yy) + np.pi) / (np.pi * 2)

    HSV = colour.utilities.tstack([H, S, np.ones(H.shape)])
    RGB = colour.HSV_to_RGB(HSV)

    if clip_circle == True:
        RGB[S > 1] = 0

    if method.lower()== 'nuke':
        RGB = colour.utilities.orient(RGB, 'Flip')
        RGB = colour.utilities.orient(RGB, '90 CW')

    return RGB


colour.plotting.plot_image(colour.cctf_encoding(
    colour_wheel()));

colour.plotting.plot_image(colour.cctf_encoding(
    colour.utilities.vector_dot(M_a, colour_wheel())));

【讨论】:

  • 拜托,你能给我一个公式吗?另外,如果没有导入就好了,谢谢。
  • 上述转换需要大量的光谱计算,没有像 Machado、Oliveira 和 Fernandes (2009) CVD 模型这样的公式。
  • 如果 Machado、Oliveira 和 Fernandes (2009) CVD 模型包含一个公式或发布他们的代码,那么我的意思是一个公式将 RGB 转换为 HSV 而无需任何导入。我在色盲部分绝对没问题,谢谢。在已经包含的 github 链接中,我找不到任何带有将 RGB 转换为 HSV 的公式的代码。
猜你喜欢
  • 1970-01-01
  • 2018-10-31
  • 2018-03-10
  • 2011-03-02
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多