Несмотря на то, что фильтр достаточно простой и эффективный, найти примеры кода с его использованием удалось чисто случайно уже после того, как все заработало :-)
Куб предназначен для замены множества цветов. R, G, B компоненты исходного цвета являются трехмерными координатами нового цвета, который задается в виде 4 float’ов (RGBA).
В приведенном примере происходит хитрая замена цвета со всеми оттенками. Для удобства используется работа с цветом в формате HSV, т.к. в этом случае гораздо легче выцеплять схожие цвета - они будут попадать в сектор.
Представление цвета в HSV:
Итак, на формочке есть 2 слайдера, с помощью которых меняется диапазон заменяемых оттенков. Для удобства считается, что основной цвет для замены находится посередине этого диапазона и именно он меняется на зеленый.
Для этого пробегаем по всем цветам, смотрим попадает ли HSV аналог этого цвета в нужный сектор и если да - запоминаем его смещение относительно центрального. После этого конструируем новый HSV цвет с таким же смещением относительно зеленого и конвертируем обратно в RGB. Подобный код можно было бы использовать, например, для вырезания фона определенного цвета (chroma key). В этом случае все цвета в нужном секторе меняют прозрачность (alpha) на 0.0
Пример заполнения куба:
В действии
Исходное изображение:
Результат замены:
Разница возникает из-за того, что в разных диапазонах берется разный центральный цвет для замены.
Полный код проекта доступен на гитхабе