Как уменьшить цвета до указанной палитры

Мне нужно решить следующую проблему:

ВХОД: изображение IM, палитра PA

ВЫХОД: IM только с цветами PA

Входное изображение в формате RGB, но я могу преобразовать его в HSV. Указанная в данный момент целевая цветовая палитра содержит: черный, белый, светло-серый, серый, темно-серый, синий, розовый, красный, фиолетовый, зеленый, желтый, коричневый, оранжевый.

Я много искал для этого, но я могу найти только уменьшение изображения до наиболее распространенных цветов или уменьшение его до фиксированной палитры, такой как 16-цветная графика EGA.

Я нашел лучший ответ на это:
Как я могу преобразовать любое изображение в изображение с 4 цветами, используя библиотеку изображений Python?

Он имеет входную палитру и сводит изображение к этому. Есть ли такой же способ сделать в OpenCV с C ++?

1

Решение

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

1

Другие решения

Предположим, что цветовое пространство RGB является трехмерным кубом

цветовое пространство rgb

А также Palette PA несколько точек в этом кубе. Таким образом, наша проблема сводится к поиску ближайшего Palette PA очко за любой данный rgb точка в трехмерном пространстве.

Я думаю, что лучшее решение k-d tree

введите описание изображения здесь

В конце вики-страница Вы можете найти несколько ссылок для реализации C ++

1