【问题标题】:Obtain a new hex color value from "alpha blending" the originial color in matplotlib从 matplotlib 中的“alpha blending”原始颜色获取新的十六进制颜色值
【发布时间】:2012-05-18 05:03:13
【问题描述】:

简单地说,给定一个初始颜色“#1010CA”和一个 alpha 因子 0.5,我怎样才能得到以color="#1010CA", alpha=0.5 形式显示在绘图上的最终颜色?

或者更直接地说,我应该填写什么

plot(x, y, color=__)

所以它相当于(至少在视觉上)

plot(x, y, color="#1010CA", alpha=0.5)

?我想这不应该是一个 python 问题,而是如何通过某种因素操纵 rgb 颜色来抑制它,但请原谅我对调色板的无知......

编辑

这是我在接受@Blender 的回答后选择的当前解决方案

import matplotlib
import numpy as np
def alpha_blending(hex_color, alpha) :
    """ alpha blending as if on the white background.
    """
    foreground_tuple  = matplotlib.colors.hex2color(hex_color)
    foreground_arr = np.array(foreground_tuple)
    final = tuple( (1. -  alpha) + foreground_arr*alpha )
    return(final)

【问题讨论】:

  • 你只是让颜色变深了两倍。添加(0.5, 0.5, 0.5)
  • @Blender 你说得对,我删除了那些代码,但是“0.5 + foregroud/2”是准确的还是近似的?
  • 大声笑,我实际上在第一次尝试时就猜对了 (en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending)。是的,这是白色背景颜色和 0.5 透明度的精确解决方案。使用 numpy,您只需执行 tuple(0.5 + numpy.array(foreground_tuple) / 2.0) 并将其插入 Matplotlib 颜色参数。
  • @Blender 赞!你确实很好地“混合”了颜色!

标签: python matplotlib python-imaging-library


【解决方案1】:

如果没有背景颜色,您也无法获得“最终颜色”。

但是为了渲染 alpha 透明度,我会猜测加权和会起作用:

final = (1 - alpha) * background + alpha * foreground

所以如果你的颜色是白色并且你的alpha = 0.5,你可以这样做:

final = rgb(0.5, 0.5, 0.5) + foreground / 2

Matplotlib 接受 RGB 元组,因此您可以非常轻松地制作不透明度扁平化函数。但是,我无法回答您为什么需要这样做。

【讨论】:

  • 是的,我觉得你说得对,我还没有考虑背景,现在只假设它是白色的......
【解决方案2】:

问题在于它是影响最终像素颜色的两种颜色(前景和背景)的混合。如果您从白色作为背景开始,将前景色转换为 HSI 色彩空间 (http://en.wikipedia.org/wiki/HSL_and_HSV) 并使用 I 作为 Alpha 通道可以让您接近。为了更紧密的匹配,您可以使用 L*a*b 颜色空间 (http://en.wikipedia.org/wiki/CIELAB) 并更改 L 以匹配您的透明度。

【讨论】:

  • 那么基于这种颜色空间转换的python中是否有一个快速而肮脏的解决方案?看来我需要 20 多分钟来解析材料并在 python 中完成。
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 2012-11-04
  • 2020-03-05
  • 2012-12-06
  • 2011-07-12
  • 2011-10-25
  • 2019-06-16
  • 2021-03-08
相关资源
最近更新 更多