В модели RGB сколько различных оттенков доступно?
В модели RGB каждый пиксель определяется 3 байтами для R,G и B соответственно. Это дает в общей сложности 2 24 цвета, включая 256 тонов серого.
Очень часто модели HSV/HSB/HSL представляют float
с (не byte
с). Большинство описаний описывают оттенок как "угол" в конусе, поэтому разумно рассматривать его как действительное число.
Но как это связано с практическим ограничением в 2 24 полных цвета? Сколько разных оттенков доступно? Более того, мне кажется, что число должно зависеть от других параметров - например, от насыщенности.
Интересное чтение: http://www.dig.cs.gc.cuny.edu/manuals/Gimp2/Grokking-the-GIMP-v1.0/node52.html
4 ответа
В HSV оттенок определяется как
H = atan2( sqrt(3)*(G-B), 2R-G-B )
( ссылка). В каждом из шести секторов (RY, YG ...) одинаково много оттенков. Кроме того, на границе между регионами есть шесть оттенков. Так, 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
таким образом, в шесть раз больше оттенков, чем между двумя положительными целыми числами, которые оба меньше 2^8 (при условии 8 бит на канал), и еще шестью. Существует столько же соотношений, сколько пар взаимно положительных целых чисел. Количество натуральных чисел ниже n
которые взаимно просты с n
называется тотальной функцией Эйлера. OEIS перечисляет его частичные суммы. Есть ровно 19948 пар взаимно простых натуральных чисел ниже 256.
6 * 19948 + 6 = 119 694
В модели HSV ровно 119 694 различных оттенка, соответствующих цвету в 8-битной модели RGB. Обратите внимание, что они не расположены равномерно.
Если в модели HSV используется 8 битов на канал, то цветов меньше, чем в модели RGB с 8 битами на канал просто потому, что некоторые тройки HSV отображаются на один и тот же цвет, а каждая тройка RGB определяет свой цвет.
В цвете RGB оттенки можно рассчитать из (2^3* глубина-2^ глубина / яркость)/3=, так что 15-битный цвет имеет 341 различный оттенок
24-битный цвет имеет 21845 различных оттенков
если бы было 119000 оттенков, остальные цвета Все оттенки - красные оттенки красного были бы 256,X,Y около 2^16, что означает, что зеленых и синих оттенков меньше, чем красного?
RGB<0,128,255> — названный цвет, лазурный, оттенок 210 град.
Для RGB<0,n,128> n может быть только 0 или 255, чтобы быть отдельным оттенком, который может быть темно-синим или весенне-зеленым.
RGB<0,64,128> — оттенок лазурного, по-прежнему 210 град. Это не ярко выраженный оттенок.
Для RGB<0,n,245> снова n может быть только 0 или 255, что будет либо синим оттенком при 240 градусах. или голубой оттенок при 177,65 град.
Плавающая точка была введена как различие между HSL и RGB (которые должны быть целыми числами с байтовым значением). Мой ответ на исходный пост - это подсчет различных оттенков RGB, очень сфокусированный и не бездоказательный.
Порядок моих циклов не произвольный; он загружает массив с 1530 уникальными оттенками полного спектра. Напишите его на C++ или C#, затем выполните цикл, рисуя линию сверху вниз на экране, и вы увидите полный спектр уникальных оттенков. Я бы загрузил растровое изображение, но отказы удержали меня от точек, которые мне понадобятся для привилегии, и это, вероятно, должно быть в виде фрактализованного jpg, что в любом случае разрушает идею.
«В RGB 1530 оттенков (256256256). Это действительно просто. «Это эффективно показывает «разрешение» 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