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

Я занимаюсь разработкой приложения для 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

Выбранная заменаЦвета.

enter image description here

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

enter image description here

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

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

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

Тогда чашка становится плоской, теряя свет и оттенки, как это,

enter image description here

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

1 Ответ

3 голосов
/ 31 января 2012

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

В качестве примера, если текущий исходный пиксель темнее, чем цвет для замены на 5 "v" единиц, тогда установите выходной пиксель на заменяющий цвет, сделанный темнее на 5 "v" единиц. (И вы бы хотели внести те же корректировки в оттенок и насыщенность, а также.)

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

...