Что делать с отрицательными значениями в HSV?

в моем приложении С# я использую преобразователь RGB в HSV (и обратно) для изменения указанного цветового спектра на другой. В реальном случае:

от rgb1=5 122 255 до rgb2=22 165 220

цвета, похожие на rgb1, будут изменены на родственный цвет путем сохранения HSV-разницы между hsv1 и hsv2 и применения их к каждому похожему цвету.

делать это в HSV было очень полезно, так как в RGB я не смог это заархивировать, но теперь я получаю ошибки, потому что иногда значение HSV становится отрицательным.

Итак, мой вопрос, если H (0> n> 360) S, V (0> n> 1) становится ниже или выше своей области значений, как мне нужно изменить его (и мне также нужно изменить другой два значения) для получения правильного значения?

Пример расчета:

//Value Definition
hsvMainColor = 250/0.5/0.2
hsvSimilarColor = 260/0.6/0.4
hsvDestinationColor = 280/0.8/0.1
hsvMemory = null
hsvOutput = null

//Memorizing Differences
hsvMemory.H = hsvSimilarColor.H - hsvMainColor.H
            = 260 - 250
            = 10
hsvMemory.S = hsvSimilarColor.S - hsvMainColor.S
            = 0.5 - 0.6
            = -0.1
hsvMemory.V = hsvSimilarColor.V - hsvMainColor.V
            = 0.2 - 0.4
            = -0.2

//Creating hsvOutput by applying Differences to hsvDestination
hsvOutput.H = hsvDestination.H + thsvMemory.H
            = 280 + 10
            = 290
hsvOutput.S = hsvDestination.S + hsvMemory.S
            = 0.8 + (-0.1)
            = 0.7
hsvOutput.V = hsvDestination.V + hsvMemory.V
            = 0.1 + (-0.2)
            = (-0.1)

//Now I have a negative Value!
hsvOutput == 30/0.7/(-0.1)

Ответы (1)

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

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

H обозначает оттенок. Его значение находится в диапазоне от 0 до 360 градусов (содержащее 0, исключая 360, поскольку 360 градусов можно понимать как «снова 0 градусов»). Значения H цикличны (подобно значениям функций sin или cos). Что означает, если значение H меньше 0? Это означает, что мы «повернули наш оттенок дальше 0 градусов». Итак, если у нас есть, скажем, значение «-25», то это то же самое, как если бы у нас было H , равное «360-25», то есть «335». Как правило, добавляйте по модулю 360 перед сохранением выходного значения и забудьте об этом ;}.

S означает «насыщенность» заданным значением V . Что, если бы у нас была насыщенность меньше 0? «0» означает самую низкую воспринимаемую насыщенность — по сути, цвет — это один из оттенков серого (независимо от оттенка). Итак, если наш цвет не может быть менее насыщенным, то значения меньше 0 не имеют смысла — мы достигли дна с 0, и точка. Другими словами, я бы предложил обрезать все отрицательные значения до 0.

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

Теперь для В. Значение описывает «яркость цвета при данном S ». Для S , равного 1, и V , равного 1, это дает максимально насыщенные и яркие цвета. Значение V , равное 0, дает максимально темные цвета (фактически один цвет — черный). Давайте еще раз подумаем об отрицательных значениях и значениях больше 1. У нас не может быть цвета темнее, чем для V , равного 0, поэтому любое отрицательное значение V не даст более темного цвета. И снова отсечение значения до 0 кажется разумным. Аналогично, V больше 1 не может давать цвета ярче, чем V.равно 1. Это приводит нас к выводу, что отсечение снова является правильным путем.

Имейте в виду, отсечение означает, что наше отображение не является биективным в общем случае, следовательно, оно не всегда обратимо!

Очень рад это слышать :}