Не пытайтесь изо всех сил найти совершенно точный ответ на этот вопрос. В конце концов, нет такой вещи, как идеально определенная линия между red-i sh и не red-i sh.
. Способ, которым я хотел бы подойти к этому: во-первых, проверьте, что цвет не слишком серый / черный. Это может быть сделано с использованием суммы трех компонентов (имейте в виду, что полный черный цвет равен 0; 0; 0 для RGB, оттенки серого обычно равны 55; 55; 55). Например, вы можете считать слишком темным любой цвет, составляющие которого составляют менее 300. Поиграйте немного с любым инструментом выбора RGB, чтобы найти порог, который вам нравится больше всего.
РЕДАКТИРОВАТЬ: из комментария ниже я вижу сумма трех компонентов не будет работать, например, 255; 0; 0 будет считаться слишком серым. Таким образом, вы должны использовать максимальное значение из трех компонентов. Например, 20; 0; 0 все равно будет довольно темным, но 100; 0; 0 не так уж много. Спасибо @rafalon за указание на это.
Затем вам нужно проверить, что этот цвет близок к «чистому» цвету, то есть красному, зеленому или синему. Чтобы сделать это, вам нужно сравнить наиболее заметный компонент с двумя другими. Вы должны сравнить этот самый высокий компонент с двумя другими, индивидуально. Это связано с тем, что цвет, такой как 255; 0; 255, вообще не равен sh, тогда как 255; 128; 128 можно считать таковым. Таким образом, комбинация двух менее заметных компонентов не сработает.
Вы можете считать цвет красным-i sh, если зеленый и синий имеют значение ниже некоторого процента красного. Возьмем для примера этот процент 50%. Затем вам нужно убедиться, что зеленый меньше 0,5 * красного, а синий меньше 0,5 * красного. Опять же, вам следует немного поиграть с цветами RGB, чтобы найти процент, который, по вашему мнению, подходит.
TL; DR: для цвета с компонентами r, g и b этот цвет будет "чистым" цветом если:
Макс. (r, g, b)> tooDarkValue
r> somePercentage * Макс. (r, g, b) И g > somePercentage * Max (r, g, b) И b> somePercentage * Max (r, g, b)
Обратите внимание, что второе условие всегда будет истинным для Max (r, g , б), (любое число больше, чем процент от самого себя), поэтому нет необходимости оценивать, какой компонент является самым высоким, а затем иметь 3 различных условия