У меня есть немного странная проблема, пытающаяся квантовать и сглаживать изображение RGB. В идеале я должен иметь возможность реализовать подходящий алгоритм в Java или использовать библиотеку Java, но ссылки на реализации на других языках также могут быть полезны.
В качестве входных данных указано следующее:
-
image
: 24-битное растровое изображение RGB -
palette
: список цветов, определенных с их значениями RGB -
max_cols
: максимальное количество цветов, которые будут использоваться в выходном изображении
Возможно, важно, что и размер палитры, и максимальное количество разрешенных цветов не обязательно имеют мощность 2 и могут быть больше 255.
Итак, цель состоит в том, чтобы взять image
, выбрать до max_cols
цвета из предоставленного palette
и выводить изображение, используя только выбранные цвета и отображаемые с использованием какого-то диффузного сглаживания ошибок. Какой алгоритм сглаживания не так важен, но он должен быть вариантом распространения ошибок (например, Floyd-Steinberg), а не простым полутоновым или упорядоченным сглаживанием.
Производительность не особенно важна, а размер ожидаемого ввода данных относительно невелик. Изображения редко будут размером более 500x500 пикселей, при этом палитра может содержать около 3-400 цветов, а количество цветов обычно будет меньше 100. Также можно с уверенностью предположить, что палитра содержит широкий набор цветов, охватывая изменения как оттенка, насыщенности и яркости.
Выбор палитры и сглаживание, используемые scolorq, были бы идеальными, но, похоже, нелегко адаптировать алгоритм для выбора цветов из уже определенной палитры произвольных цветов.
Чтобы быть более точным, проблема, в которой я застреваю, - это выбор подходящих цветов из предоставленной палитры. Предположим, что я, например. используйте scolorq для создания палитры с N цветами, а затем замените цвета, определенные scolorq, ближайшими цветами из предоставленной палитры, а затем используйте эти цвета в сочетании с диффузным диффузированием. Это даст результат, по крайней мере, похожий на входное изображение, но из-за непредсказуемых оттенков выбранных цветов выходное изображение может получить сильную, нежелательную окраску. Например. при использовании входного изображения с серой шкалой и палитры с несколькими нейтральными серыми тонами, но с большим количеством коричневых тонов (или, в более общем плане, с несколькими цветами с одинаковым оттенком, низкой насыщенностью и большим изменением яркости), мой цвет алгоритм выбора, похоже, предпочитает эти цвета выше нейтральных серо, поскольку коричневые тона, по крайней мере, математически ближе к желаемому цвету, чем серые. Такая же проблема сохраняется даже при преобразовании значений RGB в HSB и использовании разных весов для каналов H, S и B при поиске ближайшего доступного цвета.
Любые предложения по правильному внедрению или даже лучшая библиотека, которую я могу использовать для выполнения задачи?
Поскольку Xabster спросил, я также могу объяснить цель этим упражнением, хотя это не имеет никакого отношения к тому, как можно решить реальную проблему. Целью для выходного изображения является вышивка или рисунок гобелена. В самом простом случае каждый пиксель на выходном изображении соответствует стежке, выполненному на какой-либо несущей ткани. Палитра соответствует доступной нити, которая обычно имеет несколько сотен цветов. По практическим соображениям, однако, необходимо ограничить количество цветов, используемых в реальной работе. Гуглинг для вышивок гобелена даст несколько примеров.
И чтобы выяснить, где именно проблема... Решение действительно может быть разделено на два отдельных этапа:
- выбор оптимального подмножества исходной палитры
- с помощью подмножества для вывода выходного изображения
Здесь первым шагом является фактическая проблема. Если выбор палитры работает правильно, я мог бы просто использовать выбранные цвета и, например, Floyd-Steinberg сглаживает, чтобы получить разумный результат (что довольно сложно реализовать).
Если я правильно понимаю реализацию scolorq, scolorq, однако, объединяет эти два шага, используя знание алгоритма сглаживания в выборе палитры, чтобы создать еще лучший результат. Это было бы, конечно, предпочтительным решением, но алгоритмы, используемые в scolorq, немного превосходят мои математические знания.