【问题标题】:Changing hue of rgba color改变 rgba 颜色的色调
【发布时间】:2015-07-16 10:36:26
【问题描述】:

我正在使用 RGBA 颜色在对数刻度上绘制一堆数据作为 matplotlib 中的散点图(以防介质相关)。我希望能够做的是,一旦我绘制了所有内容,我想挑选出各个散点并将它们的色调更改为某种 RGB 颜色的色调,但保留旧的 alpha 值。我目前的做法是这样的:

oldHSV = rgb_to_hsv(oldRGBA[:3])
newHSV = rgb_to_hsv(newRGB)
oldHSV[0] = newHSV[0]
newRGBA = hsv_to_rgb(oldHSV).tolist() + [oldRGBA[3]]

即我取旧 RGBA 值的 RGB 部分,将其转换为 HSV,对新的预期 RGB 颜色执行相同操作,然后替换色调,将其转回 RGB 并添加旧的 alpha 值。

由于我这样做了数千次,这可能比我想在这里花费的时间要长得多。一种可能的解决方法是深入研究 RGB 和 HSV 之间的转换,并一次性弄清楚如何做到这一点,但我希望知道如何处理颜色(我真的不知道)的人已经想出了简单有效的方法方法。

如何在保留 A 的 alpha 值的同时将给定 RGBA 颜色 A 的色调更改为给定 RGB 颜色 B 的色调?使用不同的颜色模型(例如 HSL)会简化任务吗?如果可以,这会有所帮助吗?

【问题讨论】:

    标签: matplotlib colors


    【解决方案1】:

    这是一次性完成所有更换的解决方案:

    import matplotlib.colors as clr
    import matplotlib.pyplot as plt
    import numpy as np
    
    
    N = 100000
    x = 1.2 + 800.0 * np.random.rand(N)
    y = 1.2 + 800.0 * np.random.rand(N)
    # Generate random colors of the form (r, g, b, a) where r = 0.0
    colors = np.random.rand(4 * N).reshape((N, 4))
    colors[:, 0] = 0.0
    area = np.pi * (5 * np.random.rand(N))**2
    
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    pcol = ax.scatter(x, y, s=area, c=colors)
    ax.set_xscale('log')
    ax.set_yscale('log')
    
    # Save initial figure
    plt.savefig("hue.jpg")
    
    oldRGBA = pcol.get_facecolors().reshape((N, 1, 4))
    oldRGB = oldRGBA[:, :, :3]
    newRGB = oldRGB
    newRGB[:, :, 0] = 1.0 # Set red component to 1.0
    oldHSV = clr.rgb_to_hsv(oldRGB)
    newHSV = clr.rgb_to_hsv(newRGB)
    oldHSV[:, :, 0] = newHSV[:, :, 0]
    newRGBA = np.copy(oldRGBA)
    newRGBA[:, :, :3] = clr.rgb_to_hsv(oldHSV)
    pcol.set_facecolors(newRGBA[:, 0, :])
    
    # Save modified figure
    plt.savefig("hue_bis.jpg")
    
    plt.close()
    

    如您所见,此代码尝试绘制 100000 个点,实际上它设法在大约 2 秒内完成了此操作。以下是制作的数字:

    和:

    关于你最后两个问题:

    如何在保留 A 的 alpha 值的同时将给定 RGBA 颜色 A 的色调更改为给定 RGB 颜色 B 的色调?

    和:

    是否会使用不同的颜色模型(例如 HSL)来简化任务,如果是的话,这会有所帮助

    我认为您进行此类修改的方法是可观的,它避免了手动计算(请参阅HSL and HSV)。使用不同的颜色模型是可能的,HSL 和 HSV 都允许在不影响其他参数的情况下更改色调,但这只是另一种方法,并不是更好的方法。

    希望这会有所帮助。

    【讨论】:

    • 这很有趣;虽然没有导致改进我的代码性能的方法,但它让我看到了其他人的代码会如何处理它(并且我的代码并不慢)。
    • 哦!我期望一口气有更好的表现。我会仔细看看它。您是否有一段工作代码可以实现您的解决方案并让我自己节省时间?
    • 不幸的是我没有;我的代码位于数据可视化工具中,我认为更改色调可能是我应用于可视化的操作之一的瓶颈。我无法真正提取它,它写得不够优雅。但实际上,您的回答基本上回答了我的问题:这实际上是一个瓶颈,我可以更快地处理东西吗?事实证明,显然不是,所以现在我可以转向其他潜在问题。
    • 我明白了。顺便说一句,对于未来的读者来说,有一个比较点可能会很有趣。请您估计一下达到大约 2 秒的性能所需的最少点数?
    【解决方案2】:

    应该可以从oldRGBA中提取alpha并直接应用到newRGB

    newRGBA = colors.to_rgba(newRGB, alpha=oldRGBA[3])
    

    注意:我从未使用过 matplotlib,我假设 alpha 分量是颜色的第 4 个元素

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 2023-03-10
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      相关资源
      最近更新 更多