Подтвердить что ты не робот

Есть ли алгоритм для смешивания цветов, который работает как смешивание реальных цветов?

Общее смешивание цветов RGB сильно отличается от смешивания цветов для картин, это смешивание света вместо смешивания пигментов.

Например:

Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128)

(Это должен быть синий + желтый = зеленый)

Есть ли какой-либо известный алгоритм смешивания цветов, который работает как смешивание реальных цветов?


Мой подход

Я уже пробовал следующее:

Преобразование обоих цветов в HSV и смешивание оттенков (умноженное на коэффициент, вычисленный из насыщения) и простое среднее для каналов насыщения и значений. Затем я вычислил среднюю яркость от обоих цвета и отрегулировал полученный цвет в соответствии с этой яркостью. Это работало довольно хорошо, но смешивание оттенков иногда было неправильным, например. г:.

Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°)

Я выяснил, что иногда мне нужно сдвинуть значение оттенка на 360 ° (когда разница между оттенки больше 180 °).

Red (Hue 360°) + Blue (Hue 240°) = Magenta/fuchsia (Hue 300°)

Но это смещение было не очень хорошим, например:

Cyan (Hue 179°) + Red (Hue 0°) = Hue 89.5°
Cyan (Hue 181°) + Red (Hue 0°) --> shifting is performed (the difference is greater than 180°)
Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5°

(Оттенок 179 + Красный) и (Оттенок 181 + Красный) приводит к двум совершенно другим цветам.


Затем Я попробовал цветовое пространство CIE Lab (как в Photoshop), которое предназначено для того, чтобы быть ближе к тому, как люди воспринимают цвета.

Я использовал простое среднее для каждого соответствующего двух каналов, но результаты не удовлетворяли, например, я получил розовый (64, 26, -9,5) из синего (98, -16, 93) и желтый (30, 68, -112). Эти коэффициенты были взяты из Photoshop.

Возможно, если бы я использовал какую-то другую операцию, чем среднюю, она могла бы работать, но Я не знаю, что.


CMYK не работает тоже, результаты похожи на RGB или LAB.


Кажется, что ни тривиальное добавочное, ни субтрактивное смешивание цветов в любом из этих цветовых пространств не дает естественных результатов.


Рабочие реализации

Krita – Малярный смеситель

Растровый графический редактор В какой-то момент в Krita была реализована более реалистичная цветопередача: http://commit-digest.org/issues/2007-08-12/ (плагин для плавного микшера)

Говорят, что это первое публичное приложение, которое реализует специальную технологию с использованием уравнений Кубельки и Мунк, описывающих поведение пигментов.

Здесь видео с смешиванием цветов Krita: https://www.youtube.com/watch?v=lyLPZDVdQiQ

Бумага FiftyThree

Там также статья о смешении цветов в приложении "Бумага для iOS" , разработанном FiftyThree. Они описывают, как они внедряют инновации и экспериментируют в этом районе, а также предлагают образцы смешивания синего и желтого цветов, что приводит к зеленому. Однако фактический процесс или алгоритм здесь не описаны.

Цитирование:

"В поисках хорошего алгоритма смешивания мы сначала попытались интерполировать различные цветовые пространства: RGB, HSV и HSL, затем CieLAB и CieLUV. Результаты были разочаровывающими", - говорит Чэнь. "Мы знаем, что красный и желтый должны обладать оранжевым или красный и синий должны быть фиолетовыми, но нет никакого способа достичь этих цветов независимо от того, какое цветовое пространство вы используете. Там есть техническая аксиома: сделайте простейшую вещь, которая возможно, сработает. Ну, теперь мы попробовали самые простые подходы, и они не чувствовали себя даже отдаленно".

Кажется, что так же, как Крита, Бумага реализует модель Кубельки-Мунк:

[...] модель Kubelka-Munk имела по меньшей мере шесть значений для каждого цвета, включая значения отражения и поглощения для каждого из цветов RGB. "В то время как появление цвета на экране может быть описано в трех измерениях, смешивание цвета происходит фактически в шестимерном пространстве", - объясняет Георг Петернигг, соучредитель и исполнительный директор FiftyThree. Документ Кубельки-Мунк позволил команде перевести эстетическую проблему в математическую основу. [...]

Из всей этой информации кажется, что реализация , основанная на модели Kubelka-Munk, может быть способом продвижения вперед и предложить результаты, которые намного ближе к реальности.

Несмотря на то, что это выглядит сложным процессом, я еще не видел много хорошей информации о том, как реализовать что-то вроде этого.


Связанные вопросы

Эти вопросы были опубликованы после того, как все было связано с одним и тем же.

Ни один из них не имеет ответа.


Другие связанные ссылки и ресурсы

4b9b3361

Ответ 1

Правильный ответ НЕТ, потому что нет правильной рабочей модели того, как "цветовое смешивание в реальном мире" действительно работает. Он слишком сложный и условный, и на самом деле совсем не похож на простой красный-синий-желтый материал, который мы узнали в школе (на самом деле это требует, чтобы вся Химия и многие физики и биология разрешались).

Однако упрощенный ответ: ДА, используйте субтрактивное смешивание, а не аддитивное перемешивание.

Цветовое смешивание, которое мы изучили в начальной школе, основано на комбинациях пигментов, которые являются формой субтрактивного смешения цветов (очень упрощенно). То есть чем больше цветов мы добавляем вместе, тем темнее становится, потому что каждый пигмент вычитает немного больше света.

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

Схема RGB + несколько, добавочное дополнение к вычитательной схеме, которую мы узнали в большинстве американских начальных школ (это RBY-). Тем не менее, они не совпадают точно, и их может быть сложно преобразовать (исследование теперь...)


ОК, если вы просто хотите переключиться с аддитивных комбинаций в RGB на субтрактивные, вы можете использовать следующую формулу обратного байесовского типа для объединения двух цветов:

NewColor.R = (Color1.R * Color2.R)/255
NewColor.G = (Color1.G * Color2.G)/255
NewColor.B = (Color1.B * Color2.B)/255

Регулировка разницы в хроматических полюсах (от G до Y, затем обратно в G) намного сложнее...


Было указано, что это создает черное для примера проблемы, и технически это правильно для истинной субтрактивной системы, однако, если вы хотите больше разбавляющей/субтрактивной системы, вы можете попробовать это вместо:

NewColor.R = 255 - SQRT(((255-Color1.R)^2 + (255-Color2.R)^2)/2)
NewColor.G = 255 - SQRT(((255-Color1.G)^2 + (255-Color2.G)^2)/2)
NewColor.B = 255 - SQRT(((255-Color1.B)^2 + (255-Color2.B)^2)/2)

Это создает темно-серый, а не черный. Но чтобы получить Желтый или что-то близко, вам все равно придется исправить проблему выравнивания полюсов цветовой схемы.

Ответ 2

есть две разные возможности, сочетающие цвета:

Итак, при субтрактивном смешивании цветов результат - это то, что вы ожидали, но нет синего цвета, вместо этого есть голубой:

Желтый + голубой = зеленый

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

Итак, если вы начинаете с белого экрана с применением фильтров:

min (белый (255 255 255), желтый (255 255,0), голубой (0,255,255)) = зеленый (0,255,0)

Ответ 3

Существует код для реалистичного смешивания цветов в krita: https://projects.kde.org/projects/calligra/repository/revisions/master/show/krita/plugins/extensions/painterlyframework.

Обратите внимание, что код, содержащий файл источников света, - GPLv2+. Он может конвертировать из RGB в длину волны, выполнять композицию и преобразовывать обратно.

Ответ 4

Я думаю, что ваша проблема с сочетанием оттенков заключается в том, что вы делаете это, добавляя два угла и разделяя их на два. Как вы заметили, результат часто не имеет смысла. Я думаю, вам было бы лучше преобразовать углы в декартовы координаты на единичной окружности, усредняя их и найти угол результирующей точки (игнорируя величину).

Ответ 5

Один из способов сделать субтрактивную смесь цветов RGB - сначала преобразовать цвета RGB в кривые спектрального отражения. Преобразование довольно простое, и как только вы это сделаете, вы можете сделать истинную субтрактивную смесь кривых отражения, а затем преобразовать результат обратно в RGB. Существует еще один аналогичный вопрос: fooobar.com/questions/111217/..., где этот процесс обсуждается более подробно.

Ответ 6

Интересно, работает ли вычисление инверсии значения RGB. Поскольку это касается вычитания огней, технически часть вычитания может быть рассчитана простой математикой.

Например, cyan + yellow

cyan = 0x00ffff yellow = 0xffff00

Их инверсии равны 0xff0000 и 0x0000ff, что означает, что они полностью поглотили красные и синие огни. Их смесь 1:1 должна поглощать половину красного и синего света (так как другая половина смеси все еще может отражать красный и синий свет), что согласуется с (0xff0000 + 0x00ffff)/2 = 0x7f007f. Теперь мы вычитаем значение из 0xffffff, имеем 0x80ff80, который является зеленым!

Ответ 7

Отметьте эту реализацию для аддитивных, субстративных и других альгорифмов смешивания.

Полностью функциональный (вызывается в java), поэтому вы можете тестировать все цвета, которые вам нужно смешивать, и посмотреть, соответствует ли он вашим потребностям.

Как указывали другие ответы, Синий + Желтый (ровно Синий + Желтый) Зеленый на субстративном CMYK-альгоритме. Смотрите сами