Лучшая логика/алгоритм раскрашивания изображений

Я разрабатываю приложение для iOS, в котором пользователь может изменить цвет части изображения, скажем, чайной чашки, прикоснувшись к ней. Я использую алгоритм Floodfill для заливки цветов так, чтобы пользователю нужно было коснуться чайной чашки, чтобы изменить ее цвет. Это работает нормально. Но конечный цвет выглядит немного иначе, чем цвет замены. У меня возникла проблема с поиском лучшей логики для преобразования цвета объекта (чайной чашки) в выбранный цвет с учетом его насыщенности и светлоты.

Я использую следующую логику для получения цвета результата. Я представляю цвет как (оттенок, насыщенность, значение).

touchedColor = (tchd_h, tchd_s, tchd_v); // I am not using this now 

pixelColor = (old_h, old_s, old_v); 
replacementColor = (new_h, new_s, new_v);
resultColor = (new_h, new_s, old_v);
pixelColor = resultColor;

Чашка перед покраской (обведена красным цветом).

enter image description here

Выбранный цвет замены (replacementColor).

enter image description here

Чашка после закрашивания цвета замены (обведена красным цветом).

enter image description here

Смотрите окончательное изображение выше. Поскольку я изменяю только оттенок и насыщенность, а не значение pixelColor, примененный цвет не похож на выбранный replacementColor. светлота изображения остается неизменной.

Если я изменю значение вместе с оттенком и насыщенностью вот так,

resultColor = (new_h, new_s, new_v);
pixelColor = resultColor;

то чашка станет плоской, без света и оттенков, как здесь,

enter image description here

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

8
задан EmptyStack 31 January 2012 в 06:34
поделиться