返回

文章详情

展示 HN:简单算法和色彩空间生成多样的肤色

Hacker News2026年8月4日 15:16

如果你只是想找结果,下面是一个基于该色彩空间的自定义颜色选择器,使用Javascript编写,以及一个用Python编写的示例程序生成算法(Javascript等效代码在页面源代码中)——请随意使用这个数学算法,并尽情展现我们多样化的世界!该项目的目标是定义一个色彩空间,使在各种背景下构建包容性颜色工具变得更加容易,比如角色创建器或数字艺术。如果你在这里看到激发你好奇心的内容,我会非常高兴你能留在这里,继续阅读下面的内容以了解更多!选择器上的每个方向调整了什么?在这里跳转到该解释。 # 将某个select_point实现的输出插入到to_rgb(t, u, v)中 def select_point(r_square: float = 2.) -> tuple[float, float, float]: """均匀地从球体中确定性地采样""" radius = r_square ** (1. / 2) phi = uniform(0, 2 * math.pi) costheta = uniform(-1, 1) n = uniform(0, 1) theta = math.acos(costheta) r = radius * (n ** (1.0 / 3)) t = r * math.sin(theta) * math.cos(phi) u = r * math.sin(theta) * math.sin(phi) v = r * math.cos(theta) return (t, u, v) def select_point(r_square: float = 2.) -> tuple[float, float, float]: """使用拒绝采样均匀地从球体中采样""" radius = r_square ** (1. / 2) R = radius + 1 while R > radius: t = uniform(-radius, radius) u = uniform(-radius, radius) v = uniform(-radius, radius) R = (t**2 + u**2 + v**2) ** (1.0 / 2) return (t, u, v) def to_rgb(t, u, v) -> tuple[int, int, int]: x = (t - 0.15) / 0.45 y = (v - 1.2 * t ** 2 + 0.2 * t + 0.655) / 1.84 z = u / 3.6 r = 28.77438370854 * x + 36.78307445559 * y - 19.69766918644 * z + 187.1436241611 g = 35.38327306318 * x - 2.009931981182 * y + 47.93462563172 * z + 137.1073825503 b = 36.14733717939 * x - 43.54346996173 * y - 28.50821294135 * z + 108.2241610738 return int(r), int(g), int(b) # 概述 我们是什么颜色?简短的回答可能是“棕色”,而较长的回答则非常非常长。数字上呈现人类肤色的广泛范围是一个难题。通常,一个有限的颜色集被认为足以覆盖多样性的整个光谱。然而,在使用特定的颜色集时,大群体的人无法被准确表示,或者可能被无意间排除。此工作的目标是识别与可信但简化的肤色相对应的RGB色彩空间中最广泛的包容性颜色范围。特别是,旨在识别简单的“足够好”的方程式,定义该区域,使该范围在各种背景下都可以使用。称这些方程为“足够好”的目的是将此工作的局限性放在首位——结果是一个有用的起点,但不应被视为权威。 # 介绍 尽管在被认为代表我们的颜色集合上有所改进,但仍然存在一个亟待弥补的差距。表情符号说我们有5种色调(或卡通黄色);化妆品牌可能会说50种;角色创建者可能会耸耸肩告诉你从所有16,777,216个选项中挑选。如果你向外看——或者只是看自己——你会很快注意到,没有哪个能与现实的多样性相提并论;一个人不仅仅是单一颜色。尽管如此,试着将事情简化为更少的值也是有用的。Unicode联盟和化妆公司可以找出自己的范围,但我相信我们可以找到一个更好的解决方案,在“几个”和“几百万”之间。以数字艺术世界为例,下面的图像经常被传播,以帮助其他艺术家识别可信的颜色。 "肉色云",由Tumblr用户shiroxix创作 在视频游戏世界中,现在预设颜色范围通常很广,并辅以一个通用的颜色选择器,但如果最初的体验提供更好的选择,那就更好了。 早期访问游戏Paralives的角色创建器截图 # 限制 回到现实,这项工作有许多固有的局限性。如前所述,肤色比单一颜色要复杂得多。它们在身体的不同区域之间大相径庭,并受到复杂生物过程的影响。皮肤的感知颜色受到血流、黑色素浓度、光通过皮肤层的复杂散射的影响,以及白癜风、雀斑、色素过多、疤痕和其他常见变异等因素的影响。其次,各种健康状况可能导致人们具有超出通常被认为可信的肤色的肤色。银色皮肤病通常会导致皮肤呈蓝灰色;高胆红素可能导致皮肤呈黄色或绿色。此外,重要的是要注意,我只是一个人,不是研究人员,并且在我自己的观察和偏见之外,还受到我的一般偏见的影响。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡