Профессиональные инструменты для хроматизации обычно включают в себя то, что называется подавителем разливов. Подавитель разлива находит пиксели, которые содержат небольшое количество цвета хроматического ключа, и смещает цвет в противоположном направлении. Таким образом, зеленые пиксели будут двигаться в пурпурный цвет. Это уменьшает зеленую окантовку, которую вы часто видите вокруг кадров с кадрами.
Пиксели, которые вы называете поврежденными, - это просто пиксели, у которых есть некоторый уровень цвета насыщенности, и которые выбираются вашей ключевой функцией. Вместо того, чтобы выбирать жесткие 0 или 1, вы можете рассмотреть функцию, которая возвращает значение от 0 до 1 в зависимости от цвета пикселя. Например, вы можете найти угловое расстояние оттенка текущего пикселя до fromHue
и toHue
и, возможно, сделать что-то вроде этого:
// Get the distance from the edges of the range, and convert to be between 0 and 1
var distance: CGFloat
if (fromHue <= hue) && (hue <= toHue) {
distance = min(abs(hue - fromHue), abs(hue - toHue)) / ((toHue - fromHue) / 2.0)
} else {
distance = 0.0
}
distance = 1.0 - distance
let alpha = sin(.pi * distance - .pi / 2.0) * 0.5 + 0.5
Это даст вам плавное изменение от краев диапазона к центру диапазона. (Обратите внимание, что я остановился на том факте, что оттенок оборачивается на 360 °. Это то, с чем вам придется справиться.) График спада выглядит следующим образом:
Еще одна вещь, которую вы можете сделать, это ограничить наложение только теми пикселями, у которых насыщенность выше некоторого порога, а значение выше некоторого порога. Для очень темных и / или ненасыщенных цветов вы, вероятно, не хотите выключать это. Я думаю, что это поможет решить проблемы, которые вы видите, например, с жакетом модели.