Как избежать полос яркого цвета в градиентах?

Так что это больше научная визуализация, чем графический дизайн, но я думаю, что теория та же. В картах цветов, используемых для визуализации данных, часто есть цветные полосы, которые выделяются там, где их быть не должно. Я полагаю, что они являются формой полос Маха ?

Например, я использовал эту биполярную цветовую карту , и она создает такие изображения:

введите описание изображения здесь

Это почти как кольцо неонового оранжевого около 0,2 и похожее кольцо для синего около -0,2. Вот график компонентов RGB и расчет относительной яркости черного цвета:

введите описание изображения здесь

Я вручную настроил его, чтобы попытаться избавиться от полос, и в чем-то преуспел, но я не очень понимаю теорию, стоящую за этим:

введите описание изображения здесь

введите описание изображения здесь

Стало лучше, но я все еще вижу в нем полосы.

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

введите описание изображения здесь введите описание изображения здесь

Желтые и оранжевые полосы все еще там, они просто сдвинуты и немного размазаны. Таким образом, разрывы в графике яркости не являются причиной проблемы.

Как плавно переходить между цветами без полос? Существуют ли правила создания плавных кривых в цветовом пространстве Lab или что-то в этом роде? ( Редактировать: О, я нашел пример для этого : «Цветовая шкала вычисляется с использованием цветового пространства L a b *. Она следует равномерному наклону вдоль направления L * и следует полукруговой траектории в a *-b * самолет.")

Обновление: вот график этой цветовой карты в кубе RGB, показывающий острые углы, о которых говорит пользователь 568458:

введите описание изображения здесь

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

Ответы (2)

Не забывайте, что даже если вы работаете со значениями цвета LAB, значения RGB должны быть выведены, чтобы отобразить их на экране. В какой-то момент он должен сказать красным, зеленым и синим пикселям экрана, что делать.

Посмотрите на это с точки зрения RGB, и причина появления полос на самом деле довольно проста.

Возьмите палитру цветов и посмотрите на градиенты, и вы заметите, что полосы находятся вокруг точек, где меняется характер градиента:

  • В красном цвете это примерно то место, где плавное увеличение R в RGB превращается в добавление G, чтобы стать желтым — от #FF0000 до #FF2500.
  • В синем цвете он плавно переходит от плавного увеличения B в RGB к добавлению G, чтобы стать голубым — от #0000FF до #0025FF.

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

  • это от #000000 до #FF0000 (увеличение яркости в терминах HSB, увеличение красного канала в RGB)
  • затем от #FF0000 до #FFFF00 (изменение оттенка в терминах HSB, увеличение зеленого канала в RGB)
  • затем от #FFFF00 до #FFFFFF (изменение насыщенности в терминах HSB, увеличение синего канала в RGB)

введите описание изображения здесь

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


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

Итак, вместо:

  • От 000000 до #FF0000, от 100 % черного до 100 % красного

  • От FF0000 до #FFFF00, от 100 % красного до 100 % желтого

  • От FFFF00 до #FFFFFF, от 100 % желтого до 100 % белого

... это может быть (просто догадываюсь с головы, потребуется настройка):

  • От 000000 до #E90000, от 100% черного до ярко-красного

  • От E90000 до #FF2500, (КОРОТКИЙ МОСТ) от ярко-красного (темного) до ярко-красного (слегка оранжевого)

  • от FF2500 до #FFE900, от ярко-красного (слегка оранжевого) до ярко-желтого (слегка оранжевого)

  • от FFE900 до #FFFF25, (КОРОТКИЙ МОСТ) от ярко-желтого (слегка оранжевого) до ярко-желтого (светлого)

  • От FFFF25 до #FFFFFF, от ярко-желтого (светлого) до 100% белого

... затем отрегулируйте изгибы каждой секции по своему вкусу :-)


Изменить: вот демонстрация предложения «срезать углы». Это не идеально - это довольно неочищено, просто то, что я собрал на глаз за несколько минут, используя инструмент смешивания Illustrator (несмешанные объекты внизу, чтобы показать цветовые точки). Каждый сегмент градиента между каждой цветовой точкой на 100% линейный, тогда как вам, вероятно, нужно что-то более округлое, и в результате, если вы внимательно посмотрите, вы сможете обнаружить полосы.

Результаты естественно различаются между мониторами: на моем «хорошем» мониторе все гладко; на «плохом» мониторе, который я использую для проверки устойчивости веб-изображений (где исходные полосы отображаются не очень четко), оранжевые всегда кажутся приглушенными, из-за чего красные и желтые области кажутся ярче, чем сливающиеся оранжевые, чрезмерно подчеркивая красный цвет. и желтые области, но вы все еще можете видеть, что «край» исходных полос в значительной степени исчез.

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

введите описание изображения здесь

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


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

введите описание изображения здесь

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

так тлдр; избегайте значений 255 для каналов R, G, B (?)
@horatio не совсем нет, скорее tldr; избегайте острых углов между участками градиента
Все зависит от цветового пространства, используемого для вывода — вы бы увидели те же полосы в печатном дизайне, если бы у вас был градиент, который шел, например, от чисто белого к чистому пурпурному, к чистому фиолетовому (100% пурпурный и голубой) к чисто черному ( из 100% C,m,k)
Больше похоже на «избегайте острых углов при перемещении по пространству HSB»? Но если я попытаюсь выполнить кубическую интерполяцию или что-то в этом роде, я в конечном итоге выйду за пределы пространства HSB, которое затем обрезает значения и в любом случае вызывает плохие вещи. В моем втором примере я как бы делаю то, что вы рекомендуете добавлять разделы-перемычки, но это не работает идеально. Он по-прежнему выглядит как желтое пятно внутри красновато-оранжевого пятна с ореолом вокруг него, а не плавное изменение цвета.
Это определенно выглядит лучше. Вот код для создания изображения кривой: gist.github.com/endolith/2879736#file-colormap_curve-py .
Я все еще вижу полосы в ваших углах, но они менее выражены, поэтому кажется, что главное просто избегать углов вообще и использовать плавные кривые, будь то в RGB или Lab или любом другом пространстве. Я предполагаю, что угол в одном будет углом в другом независимо. Вот набор различных тепловых цветовых карт, построенных таким же образом: flic.kr/p/dYGXUr flic.kr/p/c7YGZo
Вот попытка использовать вместо этого кривую Безье: flic.kr/p/e1bcFf flic.kr/p/e15wik
также см. эту версию, в hotкоторой используются закругленные углы: gist.github.com/endolith/74275dc8fa2bb9a78266 лучше, но не отлично. Я думаю, лучше всего делать плавные кривые (с плавными функциями длины дуги?) в цветовом пространстве L a b.

Может быть, это могло бы помочь вам, это работает для меня, но я не знаю, как это сделать вручную.

http://nomorebanding.com/

Это не тот же вид полос, и дизеринг в этом контексте в любом случае невозможен. Думаю, я больше говорю о полосах восприятия, которые должны быть плавными, а ваша ссылка касается полос из-за квантования цветов?
полосы восприятия получены из цветового квантования. Это проблема с 8-битным представлением на пиксель. Я ничего не знаю о плагине, но использование 16-битного RGB при создании градиентов, а затем понижение дискретизации до 8-битного разрешения даст гораздо лучшие результаты с гораздо меньшим количеством полос, чем создание их в 8-битном.
@horatio: Нет, полосы взяты из кривой, имеющей острые углы при движении в воспринимаемом цветовом пространстве. В частности, в моем примере цветность достигает пика в этих углах.