Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/37: Рейтинг темы: голосов - 37, средняя оценка - 4.92
83 / 75 / 13
Регистрация: 03.09.2009
Сообщений: 346
1

Как смешать 4 RGB цвета?

30.01.2011, 00:58. Просмотров 7022. Ответов 10
Метки нет (Все метки)


Если нарисовать сетку из чередующихся линий 4-х цветов и посмотреть на нее с некоторого удаления - она сливается в один цвет. Кто знает по какой формуле?

Вот этот метод дает неправильный результат, а других не нашел:
C#
1
2
3
4
5
6
7
 public static Color MixColors(Color c1, Color c2, Color c3, Color c4)
        {
            int _r = Convert.ToInt32((float)(c1.R + c2.R + c3.R + c4.R) / 4f);
            int _g = Convert.ToInt32((float)(c1.G + c2.G + c3.G + c4.G) / 4f);
            int _b = Convert.ToInt32((float)(c1.B + c2.B + c3.B + c4.B) / 4f);
            return Color.FromArgb(_r,_g,_b);
        }
Цифры для проверки:
с1 - (0, 255, 0)
с2 - (255, 91, 15)
с3 - (174, 15, 255)
с4 - (255, 240, 242)

при смешивании должен получится результат - (213,183,191)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2011, 00:58
Ответы с готовыми решениями:

Смешать цвета
У меня есть ячейка таблица, скажем, красного цвета. Есть еще одна группы ячеек, выделенных желтым....

Смешать два цвета RGBA, путем наложения одной на другую
Приветствую. Подскажите, пожалуйста, формулу альфа-смешивания цветов

Как записать RGB цвета в массив?
Здравствуйте, вот собственно код, нашел на форуме, выводит цвета нормально, но хочу записать эти...

Как в TChart добавить цвета RGB
Как в TChart добавить цвета RGB? Например: with Series1 do begin Add(R1, 'Раздел...

10
(Yellow_Duck)
1261 / 130 / 15
Регистрация: 16.10.2008
Сообщений: 733
30.01.2011, 23:39 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
TColor __fastcall MiddleColor( const TColor BegColor, const TColor EndColor, const int CurIndex = 50, const int TotIndex = 100 );
 {int C0 = ColorToRGB( BegColor );
  int C1 = ColorToRGB( EndColor );
  Byte R, G, B;
  R =       ( ( C0 >> 0x00 ) & 0x000000FF );
  R = R + ( ( ( C1 >> 0x00 ) & 0x000000FF ) - R ) * CurIndex / TotIndex;
  G =       ( ( C0 >> 0x08 ) & 0x000000FF );
  G = G + ( ( ( C1 >> 0x08 ) & 0x000000FF ) - G ) * CurIndex / TotIndex;
  B =       ( ( C0 >> 0x10 ) & 0x000000FF );
  B = B + ( ( ( C1 >> 0x10 ) & 0x000000FF ) - B ) * CurIndex / TotIndex;
  return( TColor( ( R << 0x00 ) | ( G << 0x08 ) | ( B << 0x10 ) ) );
 }
Ну, как бе без комментариев.

Добавлено через 12 минут
Я проверил, в данном примере, что вы написали, получается более темный цвет, согласно этой функции.
Видимо цвета нельзя так смешивать последовательно.
Получается (202, 167, 186).
0
6 / 6 / 0
Регистрация: 24.11.2010
Сообщений: 25
31.01.2011, 10:29 3
Доброго времени суток

Цвета можно складывать по закону Грассмана.
Например:
Та=wa1*P1+wa2P2+wa3P3
Тв=wв1*P1+wв2P2+wв3P3

Та + Тв = (wa1 + wb1) * P1 + (wa2 + wb2) * P2 + (wa3 + wb3) * P3

но есть фишка, цветовое пространство RGB, наложено на длинны волн излучения с перекрытием (см. картинку1)
Если зафиксировать значение яркости для четырех цветов, предполагая. что источник один, а смешивается отражательная способность предмета, то можно получить:

rR + gG + bB = Const

rr = rA(r1 + r2 + r3 + r4)
gg = gA(g1 + g2 + g3 + g4)
bb = bA(b1 + b2 + b3 + b4)

rR + gG + bB = rrR + ggG + bbB

Множитель можно вынести за цвета, получив универсальную константу rgbC, которая уравновесит все:
rR + gG + bB = rgbC (R(r1 + r2 + r3 + r4) + G(g1 + g2 + g3 + g4) + B(b1 + b2 + b3 + b4))

В приведенном выше посте от MadMag, при сложении 2-х цветов
пример:
возьмем 4 числа 1, 2, 1, 2
если 1 + 2 + 1 + 2 = 6, и 6/4= 1,5
, то
(1 + 2 = 3) 3/2 = 1,5
(1,5 + 1 = 2,5) 2,5/2 = 1,25
(1,25 + 2 = 3,25) 3,25/2= 1,625

Как же сложить последовательно цвета, и сохранить яркость?
Если мы знаем, что значение цвета в RGB системе цветов, меняется от 0 до 255
то предполагаем минимальную яркость 0, а максимальную 3 * 255 = 765
мы можем нормировать значения, и использовать взвешенные коэффициенты:
берем последовательность 1, 2, 1, 2 допустим это R

(1/255)R1 + (2/255)R2 = (x/255)R12
-не получается чего-то
х = 3 и та-же фигня. , или нет...
(3/255)R12 + (1/255)R3 = (x/255)R123
x = 4
(4/255)R123 + (2/255)R4 = (x/255)R1234
x = 5
просто складывать тоже не дело, яркость суммируется

попробуем перемножить:
1/255*2/255= (3,0757400999615532487504805843906e-5)
* 1/255 = 1,2061725882202169602943061115257e-7
* 2/255 = 9,460177162511505570935734208045e-10
тоже фигня какая то

попробуем приводить к единице
R1 + R2 +... =1
тогда
(1 + 2)x = 1
x = 1/3
(1+2)x/2= 0.5

(0.5 + 1)x = 1
x = 0,66666666666666666666666666666667
(0.5+1)x/2 = 0.5

(0.5+2)x = 1
x = 0.4
(0.5+2)x/2 = 0.5

Мы получили три числа, о чем они непонятно:
1/3
0,66666666666666666666666666666667
0.4

если использовать как коэффициент, то получим:
(1+2)*1/3=1
(1+1)*2/3=4/3 = 1(1/3)
(4/3+2)*0,4= 1(1/3)

их сумма 1,4
среднее 0,46666666666666666666666666666667

а если
(1 + 2)x = 1
x = 1/3
(1+2)x/2= 0.5
2 * (1/3) + 1 = 5/3 = 1,6666666666666666666666666666667

(5/3 + 1)х = 1
х = 3/8
(5/3 +1)х/2 = 1(1/3)
1 * (3/8) + 5/3 = 9/24 + 40/24 = 49/24 = 2 (1/24)

Если посмотреть для последовательности 1,2,1,2 описательную статистику, то получим:

Mean 1,5
Standard Error 0,288675135
Median 1,5
Mode 1
Standard Deviation 0,577350269
Sample Variance 0,333333333
Kurtosis -6
Skewness 0
Range 1
Minimum 1
Maximum 2
Sum 6
Count 4
Largest(1) 2
Smallest(1) 1
Confidence Level(95,0%) 0,918693116

и сравним ее с последовательностью 1,2,1
Mean 1,333333333
Standard Error 0,333333333
Median 1
Mode 1
Standard Deviation 0,577350269
Sample Variance 0,333333333
Kurtosis #DIV/0!
Skewness 1,732050808
Range 1
Minimum 1
Maximum 2
Sum 4
Count 3
Largest(1) 2
Smallest(1) 1
Confidence Level(95,0%) 1,434217577

то ничегошеньки непонятно. Короче я загнался, может, чтото из рассуждений пригодится
0
83 / 75 / 13
Регистрация: 03.09.2009
Сообщений: 346
02.02.2011, 01:57  [ТС] 4
Вроде бы в первых двух постах сложение как раз по закону Грассмана, но результат темнее.

В то же время я взял в фотошопе нарисовал многократную последовательность тонких линий 4-х цветов. Взял, уменьшил масштаб так, чтобы картинка слилась в однотонный цвет, сделал скриншот и посмотрел полученный RGB-цвет (см. пост 1). На глаз соответствие хорошее, но как было получено это значение не совсем понятно.

Подозреваю, что при смешении как-то нужно учитывать различное ощущение яркости между R, G и B.
Т.е. (0,0,255) кажется темнее, чем (0,255,0), хотя по правилам они одинаковы по яркости.
0
227 / 207 / 44
Регистрация: 17.04.2010
Сообщений: 480
02.02.2011, 11:35 5
Ключевой момент
взял в фотошопе нарисовал
и
уменьшил масштаб
, тут очень важно как было нарисовано, если линии были одинаковой толщины и имели "чистый" цвет, то результат получится вполне предсказуемый: линии Название: test1.png
Просмотров: 1401

Размер: 113 байт и уменьшенный вариант Название: test2.png
Просмотров: 1409

Размер: 79 байт, как видно, в результате получился цвет (171, 150, 128), что полностью соответствует формуле расчета из первого поста.

Подозреваю, что при смешении как-то нужно учитывать различное ощущение яркости между R, G и B.
Т.е. (0,0,255) кажется темнее, чем (0,255,0), хотя по правилам они одинаковы по яркости.
Яркость у них не одинаковая, только интенсивность, а ощущения правильные. Наши глаза чувствительнее всего к зеленому.
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
03.02.2011, 07:44 6
Кто объяснит такую загадку: цвет 0000FF на глаз темнее, чем 00FF00, но FFFFFF на глаз белый?
0
6 / 6 / 0
Регистрация: 24.11.2010
Сообщений: 25
03.02.2011, 08:49 7
Зачем смешивать восприятие и физические величины. Ощущение света. вообще субъективно, колбочки палочки, и прочие биологические вещи. Инфракрасное, и ультрафиолетовое излучение, вообще не видно, однако и интенсивность, и яркость у них есть.
0
227 / 207 / 44
Регистрация: 17.04.2010
Сообщений: 480
03.02.2011, 10:10 8
taras atavin, это не загадка, а аддитивная цветовая модель.
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
04.02.2011, 08:39 9
Про аддитивность я знаю. Мне не ясно, почему при при смешении основных цветов, воспринимаемых, как цвета различной яркости результирующий цвет не имеет зеленоватого оттенка.
0
I ♥ C#
468 / 259 / 25
Регистрация: 07.05.2010
Сообщений: 567
04.02.2011, 11:40 10
Шестнадцатеричная RGB-запись цвета не имеет ничего общего с длинами волн и их интенсивностью воздействия на определенные колбочки глаза человека. Ну то есть, связь-то конечно есть, но она не такая линейная и очевидная, как FF0000 + 00FF00 + 0000FF = FFFFFF.

Ссылки по теме:
http://ru.wikipedia.org/wiki/Зрение_человека
http://ru.wikipedia.org/wiki/Колбочки
http://ru.wikipedia.org/wiki/Метамерия_(цвет)
http://ru.wikipedia.org/wiki/LAB
0
227 / 207 / 44
Регистрация: 17.04.2010
Сообщений: 480
04.02.2011, 12:02 11
Еще стоит глянуть:
http://ru.wikipedia.org/wiki/Цвет
http://ru.wikipedia.org/wiki/П... ятия_цвета
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2011, 12:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как в DBChart добавить цвета RGB?
Как в DBChart добавить цвета RGB? Делаю так: with Series1 do begin Add(R1, 'Раздел...

Как отсканировать Picturebox и получить цвета по RGB?
Помогите пожалуйста. Через API умею, но занимает неприемлимое время.Заранее спасибо.

Как выделить определенный диапазон цвета RGB на картинке bmp?
всем доброго времени суток!помогите,пожалуйста, в написании кода.есть картинка bmp. Надо разложить...

Как переделать код чтоб использовать RGB цвета, а не стандартные?
Как переделать код чтоб использовать RGB цвета, а не стандартные? Dim mygraphics As Graphics =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.