преобразование цвета изображения - PullRequest
0 голосов
/ 08 февраля 2011

Мне нужно преобразовать 24bppRGB в 16bppRGB, 8bppRGB, 4bppRGB, 8bpp в градациях серого и 4bpp в градациях серого. Любая хорошая ссылка или другие предложения?

предпочтительно с использованием Windows / GDI +

Скорость [ПРАВКА] важнее качества. исходные изображения являются скриншотами [EDIT1] преобразование цвета требуется, чтобы минимизировать пространство

Ответы [ 4 ]

3 голосов
/ 08 февраля 2011

Вам лучше взять себе библиотеку, как предлагали другие.Помимо ImageMagick, есть и другие, такие как OpenCV .Преимущества передачи этого в библиотеку:

  • Экономьте время, сокращая время разработки и тестирования алгоритма
  • Скорость .Большинство библиотек там оптимизированы до уровня, намного превышающего тот, который стандартный разработчик (такой как мы) может достичь
  • Соответствие стандартам.Существует множество форматов изображений, и использование библиотеки устраняет проблему соответствия стандартам из уравнения.

Если вы делаете это самостоятельно, то вашу проблему можно разделить на следующую подпункт-проблемы:

  1. Простой Квантование цвета .Как отметил @Alf P. Steinbach, это всего лишь «уменьшение» количества цветов.RGB24 имеет 8 бит на каналы R, G, B, каждый.Для RGB16 вы можете сделать количество преобразований :
    • Равное количество бит для каждого из R, G, B. Обычно это означает 4 или 5 битов для каждого.
    • Подарите зеленый канал (человеческие глаза более чувствительны к зеленому) и дайте ему 6 бит.R и B получают 5 бит.
    • Вы можете сделать то же самое для RGB24 до RGB8, но результаты будут не такими красивыми, как изображение на паллетах:
    • 4 бита зеленого цвета, 2красный, 2 синих.
    • 3 бита, зеленый, 5 битов между красным и синим
  2. Укладка на поддоны ( индексированный цвет ).Это для перехода от RGB24 к RGB8 и RGB4.Это сложная проблема , которую нужно решить самостоятельно.
  3. Преобразование цвета в оттенки серого. Очень просто .Преобразуйте RGB24 в цветовое пространство YUV и сохраните канал Y.Это даст вам 8bpp оттенков серого.Если вы хотите использовать оттенки серого 4bpp, то вы можете либо квантовать, либо выполнять паллетизацию.
  4. Также обязательно проверьте субсэмплирование цветности .Часто вы можете уменьшить битрейт на треть без видимых потерь в качестве изображения.

При таком разборе вы можете разделить и победить .Задачи 1 и 2 вы можете решить довольно быстро.Это позволит вам увидеть качество, которое вы можете получить, просто выполнив более грубое цветовое квантование.

Если вы хотите решить проблему 2, будет зависеть от результата, приведенного выше.Вы сказали, что скорость важнее , поэтому, если качество цветового квантования достаточно хорошее, не беспокойтесь о паллетизации.

Наконец, вы никогда не упоминали WHY вы делаете это.Если это для уменьшения места на диске, то вы должны смотреть на сжатие изображения .Даже сжатие без потерь даст вам лучшие результаты, чем уменьшение только глубины цвета.

EDIT

Если вы настроили использование PNG в качестве окончательного формата, тогда ваши параметры весьма ограничены , потому что и RGB16, и RGB8 не являются допустимыми комбинациями в PNG-заголовке .

Так что это означает: независимо от разрядности, вы будете имеют для переключения на индексный цвет, если вы хотите, чтобы цветные изображения RGB были ниже 24 бит / с (8 бит на канал).Это означает, что вы NOT сможете воспользоваться преимуществами цветового квантования и прореживания цветности, о которых я упоминал выше - это не поддерживается в PNG.Таким образом, это означает, что у вас будет для решения задачи 2 - паллетизация.

Но прежде чем подумать об этом, еще несколько вопросов:

  • Какие размерываших изображений?
  • Какой идеальный размер файла вам нужен?
  • Насколько близок этот идеальный размер файла к прямому сжатию RBG24 + PNG?
  • Каков источник ваших изображений?Вы упомянули скриншоты, но, поскольку вы так обеспокоены пространством на диске, я начинаю подозревать, что вы можете иметь дело с последовательностями изображений (видео).Если это так, то вы могли бы сделать лучше, чем сжатие PNG.

    О, и если вы серьезно относитесь к работе с PNG, то обязательно посмотрите эту библиотеку .

1 голос
/ 08 февраля 2011

См .: ImageMagick , который имеет очень практическую лицензию.

1 голос
/ 08 февраля 2011

Найдите себе копию библиотеки ImageMagick [sic].Он очень настраиваемый, поэтому вы можете научить его деталям некоторого двоичного формата, который вам нужно обработать ...

0 голосов
/ 08 февраля 2011

Я получил приемлемые (предварительные) результаты от GDI +, v.1.1, который поставляется с Vista и Win7. позволяет преобразовывать в 16bpp (я использовал PixelFormat16bppRGB565) и в 8bpp и 4bpp с использованием стандартных палитр. Лучшее качество может быть получено с помощью «оптимальной палитры» - GDI + рассчитает оптимальную палитру для каждого скриншота, но конвертация будет в два раза медленнее. Оттенки серого были получены путем указания простой пользовательской палитры, например, как показано здесь , за исключением того, что мне не нужно было изменять пиксели вручную, Bitmap::ConvertFormat() сделал это для меня.

[EDIT] результаты были действительно приемлемыми, пока я не решил проверить решение на WinXP. Удивительно, но Microsoft решила не поставлять GDI + v.1.1 (требуется для Bitmap::ConvertFormat) в WinXP. Хороший ход! Поэтому я продолжаю исследовать ...

[ПРАВКА] пришлось переопределить это на чистых палитрах жесткого кодирования GDI из GDI +

...