Вопрос или проблема
Я разрабатываю приложение на C++, и я хочу квантизировать цвета в импортированном изображении, используя фиксированную палитру с необязательной дотеризацией. В идеале – с множеством алгоритмов дотеризации на выбор пользователя. Это квантизированное изображение будет передано на более поздний этап программы.
Проблема в том, что я не могу найти библиотеку, которая удовлетворяет этим условиям. Вот библиотеки, которые я рассматривал (обратите внимание, это мои собственные наблюдения, и я мог что-то упустить):
- OpenCV
- Я решил, что это чрезмерно для того, что я делаю
- Leptonica
- http://www.leptonica.org/color-quantization.html
- Поддерживает квантизацию (
colorquant1.c
&colorquant2.c
)- Поддерживает дотеризацию, не уверен, какой алгоритм
- Не похоже, что поддерживает задаваемую пользователем палитру (может быть, статический хелпер
pixQuantizeWithColormap()
??) - Не похоже, что поддерживает уменьшение утечки цвета (умножение значений ошибок на постоянное значение <=1, чтобы сделать алгоритм менее “смелым” при выборе цвета для пикселя)
- Magick++ (ImageMagick)
- https://www.imagemagick.org/Usage/quantize/
- https://www.imagemagick.org/Magick++/Image++.html#Image%20Manipulation%20Methods
- Легкие для понимания высокоуровневые функции
- Поддерживает квантизацию
- Поддерживает дотеризацию Флойда-Стейнберга (
Image.quantize()
сquantize-Dither == true
)- Также поддерживает дотеризацию Бера (
Image.randomThreshold("2x2")
), но только в Ч/Б (я знаю, что Бера или какой-то другой алгоритм упорядоченной дотеризации определенно имеет цветовую версию. Один из них есть в GIMP.) - Сам ImageMagick также поддерживает Реймерсму, но похоже, что это не реализовано в Magick++
- Также поддерживает дотеризацию Бера (
- ImageMagick поддерживает задаваемые пользователем палитры, но это также похоже на то, что не реализовано в Magick++
- Не похоже, что поддерживает уменьшение утечки цвета
- Поддерживает дотеризацию Флойда-Стейнберга (
Так есть ли библиотека, которая подходит для моей цели? Я что-то упустил, читая документацию? Пожалуйста, имейте в виду, что я буду использовать библиотеку и для других задач обработки изображений, таких как обрезка и чтение отдельных пикселей.
nQuantCpp включает 6 лучших алгоритмов квантизации цветов для Visual C++, производя высококачественные оптимизированные изображения.
Как вы упомянули о Реймерсме, обобщенная кривую заполнения пространства Хилберта (“Gilbert”) для прямоугольных областей произвольных (не степени двойки) размеров, которые могут дотеризовать лучше, чем кривая Хилберта, посещает каждую точку на квадратной решетке с размером любой другой степени 2.
Ответ или решение
При выборе подходящей библиотеки C++ для квантизации цветов изображений с использованием заранее заданной палитры и алгоритмов дотирования, важно учитывать несколько аспектов, включая поддержку пользовательской палитры, наличие различных алгоритмов дотирования, а также дополнительные функции, такие как снижение цветового затекания. В ответ на ваш запрос мы изучим несколько библиотек и обратим внимание на их соответствие вашим требованиям.
1. nQuantCpp
nQuantCpp – это отличный вариант для ваших нужд. Она предоставляет шесть основных алгоритмов квантизации цвета и ориентирована на создание высококачественных оптимизированных изображений. Эта библиотека легковесная и не перегружена функциями, что делает её отличным выбором для вашей задачи.
- Пользовательская палитра: nQuantCpp поддерживает работу с произвольными палитрами, что позволяет вам экспериментировать с различными наборами цветов для достижения наилучшего результата.
- Алгоритмы дотирования: Библиотека поддерживает несколько алгоритмов дотирования, включая Floyd-Steinberg и Riemersma, что дает пользователю выбирать подходящий метод в зависимости от нужд проекта.
- Снижение цветового затекания: Хотя эта функция не всегда явно упоминается в документации, общая реализация библиотек такого типа обычно позволяет применять собственные алгоритмы, позволяя вам контролировать влияние цветов на соседние пиксели.
2. ImageMagick (Magick++)
ImageMagick, а в частности его C++ интерфейс Magick++, также является хорошим выбором, несмотря на то, что вы отметили его как "избыточный".
- Поддержка дотирования: Magick++ поддерживает алгоритмы дотирования, такие как Floyd-Steinberg. Однако, как вы правильно заметили, пользовательская палитра заявлена, но может быть не полностью реализована в Magick++. Несмотря на это, вы можете использовать голый ImageMagick через системные вызовы или даже обернуть библиотеку C++ для достижения необходимого функционала.
- Дополнительно: ImageMagick предоставляет обширные возможности для обработки изображений, включая обрезку и доступ к отдельным пикселям.
3. Leptonica
Leptonica имеет некоторые возможности квантизации, однако её функциональность ограничена в сравнении с nQuantCpp и ImageMagick.
- Поддержка дотирования: Как вы упомянули, библиотека поддерживает дотирование, но нет ясной информации о доступных алгоритмах, что ставит под сомнение её возможности.
- Проблемы с пользовательской палитрой: Ограниченная поддержка пользовательских палитр делает её выбор менее предпочтительным в вашем случае.
Заключение
На основании вышеизложенного, nQuantCpp представляется наиболее подходящим решением для ваших задач по квантизации цветов с использованием заранее определенной палитры и поддержкой различных алгоритмов дотирования. Эта библиотека идеальна для приложений, где критически важны как качество изображения, так и производительность.
Если вы ищете более универсальное решение с дополнительными функциями, такими как обрезка изображений и работа с пикселями, возможно, стоит рассмотреть использование ImageMagick в сочетании с nQuantCpp как вспомогательным инструментом для квантизации, чтобы обеспечить вас всей необходимой функциональностью для дальнейшей обработки изображений.
Эти библиотеки обеспечат необходимые инструменты для достижения ваших целей в разработке приложения.