Какую библиотеку C++ использовать для квантования цветов изображений с пользовательской палитрой и дотошностью?

Вопрос или проблема

Я разрабатываю приложение на 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 как вспомогательным инструментом для квантизации, чтобы обеспечить вас всей необходимой функциональностью для дальнейшей обработки изображений.

Эти библиотеки обеспечат необходимые инструменты для достижения ваших целей в разработке приложения.

Оцените материал
Добавить комментарий

Капча загружается...