在RGB模型中,有多少种不同的色调可用?

12
在RGB模型中,每个像素由3个字节定义,分别为R、G和B。这总共可以得到224种颜色,其中包括256个灰度色调。
通常使用浮点数(而不是字节)来表示HSV / HSB / HSL模型。大多数描述将色相描述为圆锥体中的“角度”,因此将其视为实数是有意义的。
但是,这与224总颜色的现实限制有何关系?有多少个不同的色相可用?此外,我认为该数字应取决于其他参数-例如饱和度..

有趣的阅读材料:https://web.archive.org/web/20170622125306/http://www.dig.cs.gc.cuny.edu/manuals/Gimp2/Grokking-the-GIMP-v1.0/node52.html


2
HSV/HSB模型在用于表示颜色的相同空间中比RGB模型拥有更少的颜色,因为存在将多个值映射到相同颜色的情况。 - nhahtdh
我相信RGB中有大约60,000种不同的色调。你需要精确的值吗? - John Dvorak
是的,也许有一个公式可以计算这个吗?我会非常感激每一个对这个主题有更深入了解的答案:重叠颜色、位效率等。此外 - 256种灰度对于人眼来说是相当可分辨的(在标准液晶显示器上)。那么能否区分60k种色调呢? - emesx
@elmes:你可以尝试暴力破解吗?试着找一个这样的转换库,然后尝试所有2^24个值并计数? - nhahtdh
只有3072种完全饱和和亮度不同的色调。 - John Dvorak
显示剩余8条评论
4个回答

10

在HSV中,色调被定义为

H = atan2( sqrt(3)*(G-B), 2R-G-B )

(链接)。在六个扇区(R-Y,Y-G...)中,每个扇区有相同数量的色调。此外,在区域之间有六种颜色。因此,6 + 6 * huesRY

在红黄色扇区中,R > G > B,因此atan2的两个参数都是正数。

 count sqrt(3) * (G-B) / (2R-G-B)
=count (G-B) / (2R-G-B)
=count (G-B) / ((G-B) + (2R-2G))

由于我们可以对 [x,y] 的集合应用任何线性变换而不改变其比率的计数,因此 x /(x + 2y)== x / y

=count (G-B) / (R-G)

如果我们从所有的R、G、B中减去相同的值,比率不会改变,因此假设B=0

=count G / (R-G)
=count G / R

因此,假设每个通道有8位(即8个比特),则色调的数量是两个小于2^8的正整数之间的比率的六倍,再加上六个。与互质的正整数对一样多的比率。小于n且与n互质的正整数的数量称为欧拉函数。OEIS lists its partial sums。在256以下的正整数中,恰好有19948对互质的正整数。

6 * 19948 + 6 = 119 694

在HSV模型中,恰好有119694种不同的色调与8位RGB模型中的颜色相对应。请注意,它们的间距不均匀。

如果在HSV模型中每个通道使用8位,那么与每个通道使用8位的RGB模型相比,颜色数量会更少,因为一些HSV三元组映射到相同的颜色,而每个RGB三元组定义了不同的颜色。

我认为 sqrt(3)(x) 不是一个合理的符号表示。如果你的意思是立方根,请写成 root(3)(x) 或者 x<sup>1/3</sup> - PointedEars
@PointedEars 三的平方根乘以x。现在好了吗? - John Dvorak

0

在RGB颜色中,色调可以从(2 ^ 3 * 深度 - 2 ^ 深度 / 亮度)/ 3计算得出,因此15位颜色具有341个不同的色调

24位颜色共有21845种不同的色调

如果有119000个色调,则其余所有色调-红色色调的红色色调将为256,X,Y约为2 ^ 16,这意味着绿色和蓝色的色调比红色少?


0

RGB<0,128,255> 是一种命名颜色,Azure,色相为210度。

对于 RGB<0,n,128>,n 只能是 0 或 255 才能成为独特的色调, 这将是海军蓝或春绿色之一。

RGB<0,64,128> 是 Azure 的一种色调,仍然是 210 度。它不是一个独特的色调。

对于 RGB<0,n,245>,同样地,n 只能是 0 或 255, 这将是 240 度的蓝色或 177.65 度的青色。

浮点数被引入作为 HSL 和 RGB 之间的区别(RGB 必须是字节值整数)。 我对原帖的回答是独特 RGB 色调的计数,非常专注,没有未经证实的内容。

我的循环顺序并不是随意的;它会加载一个包含1530个全光谱独特色调的数组。 用C++或C#编写代码,然后循环,从屏幕顶部到底部绘制一条线,你将看到所有独特色调的完整光谱。 我本想上传一张位图,但由于权限问题一直被拒绝,而且它可能需要作为分形化的jpg格式,这会破坏这个想法。

-1

RGB(256,256,256)中有1,530种色调,这很简单。 这有效地展示了RGB的“分辨率”,因为要成为不同的色调之一,rgb中的一个必须是255,另一个必须是0,第三个必须通过256个值递增,极端情况下减少重复。其他所有颜色都是色调、色调或阴影。因此,让我们在0和255的六种组合中将它们加起来,并在进行计数时将它们标记为I:

Dim I As Integer
Dim R, G, B As Byte
Dim Spectrum(0 to 1529) as Long
I = -1       'Incremented before each use
R = 255: B = 0   'G inc  RED
For G = 0 To 255         '256
    I = I + 1: Spectrum(I) = RGB(R, G, B)
Next
G = 255: B = 0   'R dec  YELLOW
For R = 254 To 0 Step -1 '255
    I = I + 1: Spectrum(I) = RGB(R, G, B)
Next
R = 0: G = 255   'B inc  GREEN
For B = 1 To 255         '255
    I = I + 1: Spectrum(I) = RGB(R, G, B)
Next
R = 0: B = 255   'G dec  CYAN
For G = 254 To 0 Step -1 '255
    I = I + 1: Spectrum(I) = RGB(R, G, B)
Next
G = 0: B = 255   'R inc  BLUE
For R = 1 To 255         '255
    I = I + 1: Spectrum(I) = RGB(R, G, B)
Next
R = 255: G = 0   'B dec  MAGENTA
For B = 254 To 1 Step -1 '254
    I = I + 1: Spectrum(I) = RGB(R, G, B)
Next
'I = 1,529 = 256+255+255+255+255+254 No duplicates
'Hue = I * 0.23529411764705882353°
'0° is Red at I = 0, so I=0 counts as 1 so, 1 + 1,529 = 1530

2
你的回答可以通过添加更多支持信息来改进。请[编辑]以添加进一步细节,例如引用或文档,以便他人可以确认您的答案正确无误。您可以在帮助中心中找到有关如何撰写好的答案的更多信息。 - Community
这个答案中的陈述不是真实的。在使用整数数学时,0、n、255并不能定义三角形中 0、0、00、0、2550、255、255 的最大色调数量。考虑 0、128、255。在 0、n、128 这个色度上,n 是 64.5。因此,在集合 0、n、255 中的色调与集合 0、n、245 及以下的色调是不同的——请注意,我甚至没有涉及到一些关于颜色感知的心理物理方面。另外,OP明确指出要使用FLOAT,这种情况下,本答案的论点进一步无效。 - Myndex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接