Как я могу определить, является ли цвет серым

Я пытаюсь программно определить, является ли цвет «серым» или нет.

Лучшей мерой «серости», которую я смог найти, была насыщенность. Проблема, с которой я сталкиваюсь, заключается в том, что разные оттенки выглядят более или менее серыми в зависимости от их оттенка и яркости. На картинке ниже один выглядит отчетливо серым, а другой красно-коричневым, хотя оба имеют одинаковую насыщенность и яркость.

Существует ли цветовое пространство, которое более точно отражает «серость» цвета?

Существует ли официальный термин для понятия «серость»?

два серых тона

Вы не можете, потому что «серый» не является количественной мерой. То, что я считаю серым, может не совпадать с тем, что вы считаете серым, и то, что я считаю серым отдельно, может не быть тем, что я считаю серым в контексте. Учитывая два поля, которые вы включаете, я бы сказал, что правый серый, а левый - нет. Взгляните на них по отдельности, и я бы, наверное, сказал, что левый — бежево-коричневый, а правый — коричневато-бирюзовый — ни один из них не серый. Поместите любой из них в яркое пятнистое изображение, и я, вероятно, назову их обоих серыми. Как бы вы программно определили это?
Ответ на этот вопрос сильно зависит от того, как вы определяете цвет и насколько точно вы определяете серый цвет. Возможно, вы могли бы обработать необработанные данные опроса цветов xkcd.
Обратите внимание, что два цвета кажутся более одинаково не серыми, если вы добавите между ними нейтральный серый .
Меня также интересует лингвистический / культурный эффект: «серо-голубой» - это общий термин в английском языке (который можно применить к правому образцу). Наиболее близким общим описанием для левого образца будет «красно - серый». «Красноватый» модифицирует «серый», а «сине-серый» - это одноцветное прилагательное. Культурная лингвистика восприятия цвета - один из многих интересных факторов. H = 120 °, сохраняя остальные одинаковыми, для меня зеленовато-серый или даже серовато-зеленый; «зелено-серый» также встречается редко (хотя «серо-зеленый» встречается чаще, за что мы, возможно, должны поблагодарить Киплинга)
@ChrisH это было известно продавцам бумаги на протяжении веков. Культуры более высоких широт считают, что голубоватые цвета более нейтральны. В то время как страны ближе к экватору предрасположены к желтому и красному. Это частично связано с тем, что небо и почва влияют на наш баланс белого, а частично — с культурой.

Ответы (5)

С полной благодарностью @Wolff за эти изображения. Как уже говорилось, серый на 100 % соответствует освещению, окружающим цветам, восприятию и методу измерения. Возьмем, к примеру, эти изображения. На основном изображении на самом деле вообще нет «красного». Если вы возьмете пипетку и измерите любую область, которая выглядит красной, все они на самом деле будут оттенками серого.

Не красный, красные образы

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

Обрезка крыльев попугая

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

Комбинированный

Но, как говорится, LCH или LAB будут лучшим выбором для измерения нейтрального серого.

Рекомендация @Luciano к этой статье: Теория цвета: существует ли измерение «красочности»? Имеет хорошую информацию о том, что вы пытаетесь сделать.

Да, удивительно, как человеческий мозг обрабатывает цвета. Вот еще пример: оба глаза одинакового оттенка серого 7f7f7f
Печально известное платье также является довольно ярким примером, когда разные люди на самом деле видят одни и те же пиксели как совершенно несвязанные цвета, потому что они по-разному интерпретируют неоднозначные сигналы освещения.
«Здесь нет красного». Почему, ну почему я тебе не верю!?
Мобильная игра I Love Hue (и, предположительно, ее продолжение, хотя я все еще работаю над первым изданием) отлично использует это явление. Предпосылка проста: расположите набор цветных плиток в виде плавного градиента, чтобы каждая плитка примыкала к своим ближайшим соседям. Но до сих пор я потратил... 72 часа, говорит мой телефон, делая именно это, отчасти из-за того, как чудесно может быть разочарование, когда плитка из прозрачной по всем направлениям, которая ВОЗМОЖНО не может быть подходящей, кажется, волшебным образом меняет цвет, когда вы перемещаете его.
Я обещаю, что нет. Откройте его в фотошопе и выберите любой пиксель, на изображении нет "красных" тонов.
@ Alith7, пришлось изменить изображения из-за проблем с лицензией. Я был небрежен с первым. Извини. 😀
ой... вообще не проблема! они были вашими изображениями в первую очередь. ;)
@ Alith7, это просто изображения из сети. Теперь все они являются общественным достоянием.

RGB или фактически насыщенность в его эквивалентах в полярных координатах очень нелинейны, когда кто-то пытается использовать его в качестве меры того, «насколько близок к серому этот цвет RGB, если смотреть на экран». Он вообще не принимает во внимание человеческий фактор. цветовое зрение, это чисто для управления электроникой экрана. Вы ударились головой об этот факт.

Вместо этого вы должны преобразовать свои значения RGB в систему LCH и извлечь C (= цветность) или в систему CIELAB (= Lab в Photoshop) и вычислить sqrt (a ^ 2 + b ^ 2). Эти системы разработаны, чтобы быть более линейными в предсказании увиденного. Для серого C=0 и a=b=0. Это, конечно, ложь, если экран не откалиброван по цвету.

ДОБАВЬТЕ необходимые комментарии: Спрашивающий, скорее всего, считает, что его программа не обманута ничем другим из того, что она видела, она может сконцентрироваться на одной комбинации RGB за раз. Я предполагаю, что спрашивающий ожидает чего-то, что могло бы помочь его программе принять такое же решение, как идеальный колориметр, когда он считывает тот же самый RGB, выдаваемый безупречным экраном sRGB без мешающих дополнительных источников света.

Есть и другие проблемы, связанные с человеческим зрением, такие как баланс белого человеческого глаза. У меня есть катушка для 3д принтера переработанного "серого" цвета. Но я клянусь, что в моей мастерской он зеленый, потому что мои нейтральные цвета очень заметно нейтральны. Но если я отнесу его в мастерскую по дереву, там намного теплее, он действительно выглядит серым. Черт, даже иногда в моей мастерской бывает серо. Так что на самом деле, что такое gfray, является своего рода ограниченным вопросом.
@Wolff и некоторые из нас отлично поговорили о том, как создать красное изображение, в котором на самом деле НЕТ красного, в чате на прошлой неделе.

Я согласен с уже упомянутым восприятием цвета. Есть теплые серые и холодные серые, но самым серым из всех будет нейтральный серый.

Глядя на значения RGB, если все 3 числа одинаковы, это нейтральный серый цвет, например R109 G109 B109 или R228 G228 B228. Если одно число немного отличается, оно будет либо холодным, либо теплым оттенком серого.

Глядя на значения HSB, мне кажется, что не имеет значения, что такое HUE, пока насыщенность равна 0, он будет 100% серым. Если вы увеличите НАСЫЩЕННОСТЬ на любой процент, вы получите тон любого оттенка.

Итак, как графический дизайнер, я бы сказал, что любое значение НАСЫЩЕННОСТИ ниже 4% будет считаться серым, но это может быть холодный серый или теплый серый в зависимости от значения ОТТЕНКА (даже если оно равно 0).

Программист все еще должен сделать окончательный выбор в отношении того, что считается серым, если только вы не хотите, чтобы он обнаруживал только 100% серый цвет, тогда это легко.

Это была и моя первоначальная мысль. Но не является ли «сходство значений RGB» просто другим словом для «насыщенности»? OP показывает пример двух цветов с одинаковой насыщенностью, которые, по их мнению, не выглядят одинаково серыми. Это усложняет вопрос.
Насыщенность — это интенсивность цвета (не яркость, не оттенок). ОП показывает два цвета с одинаковой насыщенностью 12%, но разными оттенками, поэтому они выглядят по-разному. По мере уменьшения насыщенности эти два прямоугольника будут выглядеть более похожими друг на друга.
Я думаю, вы абсолютно правы - насыщенность 12% - это слишком много, но при 4% вы могли бы быть намного увереннее.
«Программист все еще должен принять окончательное решение о том, что считать серым» — разве это не только часть проблемы? Этот предел будет разным не только для каждого программиста , но и для разных мониторов , а в случае дисплеев с управляемым цветом он также зависит от программного обеспечения!

HSL — лучшее цветовое пространство для представления серого.

Серость можно рассматривать как расстояние S (насыщенность), которое равно 0,0, если это чисто серый цвет, и 1,0, если он максимально удален от серого.

Измерение и восприятие

В двух предоставленных образцах я измерил (с помощью пипетки Photoshop): 0 10% 49% и 216 12% 51%, что немного отличается от того, что вы заявили, возможно, из-за того, что цветовой профиль был удален в процессе публикации.

С калиброванным Eizo CG303w (120 кд/м2 5000k 2.2) у меня такое ощущение, что тот, что слева, склоняется к красному, а тот, что справа, к синему. Я снижал насыщенность до тех пор, пока у меня не появилось ощущение, что оба цвета серые, я достиг 4% и 5% насыщенности в пространстве HSL.

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

Обсуждение

В RGB цвет серый, когда R = G = B, но оператору необходимо оценить несколько чисел, чтобы ответить на вопрос «серый ли он». Труднее определить расстояние от R=G=B, просто взглянув на числа.

Цветовое пространство HSL является более прямым, так как S (насыщенность в диапазоне [0,1]) сразу дает ответ: 0 — серый или значение ниже порога выбирается как серый.

R' = R/max // normalization from [0-max] to [0.0-1.0]
G' = G/max // where max is 255 if the colors are 8 bits per channel
B' = B/max
Cmax = max(R', G', B') // find the maximum among R,G,B
Cmin = min(R', G', B') // find the minimum among R,G,B
Δ = Cmax - Cmin // gives the maximum difference

И все же, L и S задаются:

L = (Cmax + Cmin) / 2
S = Δ/(1-|2L-1|)

Следовательно, вы можете создать индикаторный фильтр, который будет отображать, скажем, чистый зеленый цвет, когда пиксели чисто серые или достаточно серые; или это будет отображать в ложных цветах все достаточно серые пиксели и дестатировать остальные. Реализация будет зависеть от вашего программного обеспечения и языка; например, вы можете создать фильтр Matlab для Photoshop, который сделает это, или даже автономный плагин.

Рекомендации

  1. RapidTables RGB в HSL
  2. Фотошоп Матлаб
Привет и добро пожаловать в GDSE!. Хороший ответ! Наверное, самое близкое, что у нас есть. Интересная вещь в вопросе заключается в том, что ОП уже сравнил два цвета по их насыщенности и обнаружил, что даже если они имеют одинаковую насыщенность (= «серость»), один из них все равно выглядит в их глазах более серым, чем другой.
На самом деле нет такой вещи, как серость, поэтому ее нельзя эффективно измерить. Если вы не сделаете неестественное определение серого
@joojaa Я объективно определил серость во втором предложении.
@Soleil-MathieuPrévot, нет. Вы определили что-то, что OP определило как неработающее. Я имею в виду наивно, что вы правы, за исключением того, что определение HCL где-то лучше, потому что, по крайней мере, оно более научно мотивировано. Но большая проблема в том, что он не учитывает все эффекты. хорошо, вы, вероятно, не можете. В любом случае, даже если мы отбросим координаты устройства от абсолютных координат, определение светлоты и серого цвета все еще имеет проблему, говорящую, когда чип перестает быть серым...

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

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

Конечно, наука о цвете говорит, что вся такая обработка должна производиться в абсолютном цветовом пространстве, предпочтительно в каком-то производном от CIE Lab, возможно, полярном, таком как Lch. Хотя это оставляет желать лучшего, так как нет никакой гарантии, что полярный Lhc будет даже отдаленно однородным в том смысле, в каком это необходимо. В целом наука о цвете избегает подобных размышлений, избегая интерполяции цвета.

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

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

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

И так далее.... Копать можно сколько угодно глубоко.

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

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