Neca & QuantumFang
QuantumFang QuantumFang
Заметила, как один и тот же оттенок #4E4E4E может выглядеть совершенно по-разному на фоне чистого белого #FFFFFF и приглушенного #777777? Пытаюсь понять, как это изменение точно описать – как будто парадокс восприятия цвета. А ты что думаешь об этом?
Neca Neca
Слушай, это как будто тот же самый угольно-серый выглядит призраком в белой комнате, а рядом со средне-серым – становится тёмным кирпичом. Глаз воспринимает пространство вокруг цвета как часть самого цвета, и чем больше это пространство, тем легче кажется серый. Если хочешь проверить, попробуй сделать проверку контрастности или просто посмотри, сколько оттенков тебе понадобится, чтобы #4E4E4E выглядел одинаково "тяжело" на разных фонах. На практике я просто немного подкручиваю насыщенность, пока глаз не перестанет с этим бороться.
QuantumFang QuantumFang
Вот именно этот парадокс меня и занимает – как контекст меняет восприятие насыщенности. Если построить график люминанса для #4E4E4E на фоне белого и средне-серого, то увидишь, как одно и то же RGB-значение даёт разную относительную яркость. Я сейчас пишу небольшой скрипт, который подбирает насыщенность, пока кривая воспринятой интенсивности не совпадёт на разных фонах. В теории это должно быть линейная корректировка, но глаз человека – штука непредсказуемая, поэтому даже математика получается настоящей головоломкой. Поможешь собрать код?
Neca Neca
Конечно, вот небольшая зарисовка на Python, которая сохраняет RGB, но немного меняет насыщенность, чтобы добиться одинаковой воспринимаемой яркости на обоих фонах. Я предполагаю, что ты будешь подавать целевую люминанс для каждого фона. Попробуй запустить, если нужно – подкорректируй количество итераций бинарного поиска для большей точности, и получишь два шестнадцатеричных кода, которые будут выглядеть одинаково на обоих фонах. Скажи, как результат – нормально ли выглядит, или глаз все равно замечает микроскопическое отклонение.
QuantumFang QuantumFang
Скрипт неплохой, но логику цели немного нужно подправить — сейчас ты просто выравниваешь относительную яркость, что игнорирует кривую чувствительности человеческого глаза к контрасту. Если нужна большая точность, используй психофизическую модель, например CIELAB ΔE или шкалу HSP. И поисковый алгоритм завершается на 20 итерациях; 30 или 40 дадут еще пару знаков после запятой в шестнадцатеричном коде, что важно при работе с одним тоном. Попробуй с этими изменениями и посмотри, все ли еще кажется, что призрачный серый светлее в белой комнате. Если да, мы решили эту загадку. Если нет, возможно, проблема не в насыщенности, а в том, как наши глаза интегрируют окружающую яркость во времени. Давай попробуем еще раз.
Neca Neca
Я подкручу цикл до 40 итераций и поменяю целевой параметр на ΔE относительно белого эталона на обоих фонах. Ещё добавлю шкалу HSP для яркости, чтобы действительно соответствовать кривой восприятия глаза. После первого прогона призрак-серый всё равно кажется чуть светлее в белой комнате, значит, дело не только в насыщенности. Возможно, нужно подстроить фактор интеграции окружающей яркости или даже ввести небольшой сдвиг оттенка. Попробуем это дальше.
QuantumFang QuantumFang
Круто. То, что призрачно-серый остаётся светлее, говорит о том, что контраст по яркости – не всё. Видимо, твой глаз со временем учитывает фон. Попробуй добавить небольшой цветовой сдвиг: немного смести тон в более холодную или тёплую сторону и посмотри, нормализует ли это ощущение "веса". Потом попробуй простой фильтр интеграции фона: имитируй сглаживание по окружающему освещению перед тем, как передавать это в функцию HSP. Эти два изменения дадут следующий набор данных. Сообщи мне о результатах.