Переназначение цвета — соответствие целевой палитре с использованием 3D-сетки?

Допустим, у меня есть цвет «FOO», и он хранится в формате RGB. Мне нужно перекрасить «FOO», чтобы он соответствовал ближайшему цвету в списке цветов. Делая это на лету, не мог бы я просмотреть значения RGB для каждого цвета в виде точек на трехмерной сетке (r = x, g = y, b = z) и вычислить расстояние между точкой «FOO» и точками из каждого цвет в списке?

Ближайшей точкой к «FOO» будет цвет замены?


person Jeffrey Kern    schedule 29.06.2010    source источник
comment
Это интересная идея (евклидово расстояние как цветовое расстояние), но единственный способ узнать, можно ли интерпретировать цвета как геометрию, — это попробовать. Я не слышал об этом раньше, но я хотел бы услышать, как это получается. Что делать, если у вас есть две точки, равноудаленные от исходной точки? Два равноудаленных цвета могут сильно отличаться друг от друга. Как вы выбираете, на что переназначить?   -  person FrustratedWithFormsDesigner    schedule 29.06.2010
comment
Я хотел бы попробовать это, я на работе, и мое вычислительное устройство — блокнот и бумага, мой мобильный телефон, калькулятор и кассовый аппарат. Я записываю теории и пытаюсь реализовать их дома.   -  person Jeffrey Kern    schedule 29.06.2010
comment
@Джеффри Керн: Хех, я был там. Я предполагаю, что вы занимаетесь серфингом ТАК на мобильном телефоне? Что ж, основная проблема, которую я вижу в этой теории, — это проблема равноудаленных точек. Если бы я знал больше о теории цвета, мне, вероятно, было бы, что сказать, но вместо этого я просто буду смотреть... ;)   -  person FrustratedWithFormsDesigner    schedule 29.06.2010
comment
Если есть ничья между несколькими точками, я бы выбрал первую. Но я предполагаю, что это суждение для программиста или подсказка, чтобы спросить конечного пользователя, что делать.   -  person Jeffrey Kern    schedule 29.06.2010
comment
@frustrased Ага. Печатать вопросы на мобильном телефоне для SO - это боль, лол :)   -  person Jeffrey Kern    schedule 29.06.2010
comment
@Джеффри Керн: Как вы определяете первый в 3D-пространстве? :П   -  person FrustratedWithFormsDesigner    schedule 29.06.2010
comment
R=x координата точки, где G=y и B=z. Вместе эти значения должны составлять точку в трехмерном пространстве.   -  person Jeffrey Kern    schedule 29.06.2010
comment
Да, но если точки B и C находятся на одном и том же евклидовом расстоянии от точки A, как определить, какая из точек B и C первая?   -  person FrustratedWithFormsDesigner    schedule 29.06.2010
comment
Оооо, я неправильно тебя понял, ха-ха. Первый будет первым, проверенным в цикле for/each. Например, если thisDist ‹ curDist, curDist=thisDist и curColor = colorIterator. Если бы я изменил оператор равенства на ‹=, был бы выбран последний.   -  person Jeffrey Kern    schedule 29.06.2010


Ответы (1)


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

По крайней мере, если вы не возражаете против дополнительных вычислений, вы можете использовать один из стандартных "дельта E" (в вашем случае вам нужно минимизировать дельту E). Обратите внимание, что все они (все, с чем я работал в любом случае) работают в цветовом пространстве CIE Lab*. В типичном случае вы начнете с RGB, который вам нужно будет преобразовать в Сначала Lab*.

person Jerry Coffin    schedule 29.06.2010
comment
Будет ли это работать, если я ориентируюсь на пользовательскую палитру? Например, исходное изображение содержит 8 разных цветов (красный, зеленый, желтый, персиковый и т. д.), тогда как целевая палитра содержит черный, белый и 4 оттенка синего? - person Jeffrey Kern; 29.06.2010
comment
@Jeffrey: Да, с той оговоркой, что сомнительно, что что-то будет работать очень хорошо в такой ситуации - до такой степени, что это может быть пустой тратой времени. OTOH, с палитрой всего из 8 цветов, вы можете предварительно вычислить вывод для каждого из 8 возможных входных данных и преобразовать каждый пиксель в виде тривиального поиска в таблице. - person Jerry Coffin; 29.06.2010
comment
@Jeffrey: кроме того, вместо того, чтобы просто выбирать первое совпадение, как вы упомянули в своем комментарии, вы можете отслеживать накопленную ошибку и выбирать ту, которая минимизирует общую ошибку (см. Сглаживание Флойда-Стейнберга: en.wikipedia.org/wiki/Floyd%E2%80 %93Steinberg_dithering). - person Jerry Coffin; 29.06.2010
comment
цвета в исходном изображении будут меняться при загрузке изображения, но по большей части целевая палитра не изменится. Я просто ищу решение, которое позволит мне перекрашивать изображения на лету, когда они визуализируются с помощью GDI+. Это пустая трата времени — делать 6 изображений для 1 объекта, когда можно перекрасить, ха-ха. И если у меня есть 100 объектов, я бы предпочел не обрабатывать 600 изображений (6 различных целевых палитр, включая исходную окраску). - person Jeffrey Kern; 29.06.2010