【发布时间】:2011-09-06 17:30:06
【问题描述】:
我有一个 RGB 三元组列表,我想将它们绘制成类似光谱的图。
我已将它们转换为人们似乎推荐的 HSV。
from PIL import Image, ImageDraw
import colorsys
def make_rainbow_rgb(colors, width, height):
"""colors is an array of RGB tuples, with values between 0 and 255"""
img = Image.new("RGBA", (width, height))
canvas = ImageDraw.Draw(img)
def hsl(x):
to_float = lambda x : x / 255.0
(r, g, b) = map(to_float, x)
h, s, l = colorsys.rgb_to_hsv(r,g,b)
h = h if 0 < h else 1 # 0 -> 1
return h, s, l
rainbow = sorted(colors, key=hsl)
dx = width / float(len(colors))
x = 0
y = height / 2.0
for rgb in rainbow:
canvas.line((x, y, x + dx, y), width=height, fill=rgb)
x += dx
img.show()
但是,结果看起来不太像一个漂亮的彩虹-y 光谱。我怀疑我需要转换为不同的色彩空间或以不同的方式处理 HSL 三元组。
有谁知道我需要做什么才能使这些数据看起来大致像彩虹?
更新:
我在玩希尔伯特曲线并重新审视了这个问题。将 RGB 值(两幅图像中的颜色相同)按希尔伯特曲线上的位置排序会产生一个有趣的(如果仍然不完全令人满意)的结果:
【问题讨论】:
-
请阅读此内容,然后重新考虑您正在做的事情:brucelindbloom.com/index.html?Equations.html。光谱是一个单一的波长值,而不是 HSL 三倍或类似的东西。这个等式并不简单,所有 RGB 颜色在光谱中都没有位置。此外,这可能会有所帮助:pfk.ff.vu.lt/cie/1931CIE_explanation.htm。你真的需要重新考虑你在做什么。
-
@S.Lott -- 是的,我知道从技术上讲,这是一个傻瓜的差事。我真的不需要任何与物理光相关的东西,只需要表现出最大程度令人愉悦的渐变(即最小化感知不连续性)。
-
更新——我决定在两个轴上绘制颜色,色调和饱和度,让亮度自然变化。结果看起来不错(但占用更多空间)
-
如果您正在寻找real spectral colors,请特别注意 R、G、B 图表,并尝试以类似的方式对颜色进行排序。然后按强度重新排列“相同”的颜色,这样你就不会有太多的颠簸......
标签: python python-imaging-library color-space spectrum hsv