Программно получить количество цветов, используемых в изображении - PullRequest
1 голос
/ 25 октября 2009

Вопрос:

  • Для изображения в формате PNG, какой самый простой способ программно получить количество цветов , используемых в изображении?

Ограничения:

  • Решение будет интегрировано в сценарий оболочки, работающий под Linux, поэтому подойдет любое решение, подходящее для такой среды.
  • Обратите внимание, что «емкость цвета файла изображения» не обязательно соответствует «используемым цветам». Пример: В файле изображения с теоретической цветовой емкостью 256 цветов, скажем, только 7 цветов могут быть в реальном использовании. Я хочу получить количество фактически используемых цветов .

Ответы [ 4 ]

5 голосов
/ 25 октября 2009

Зачем писать собственную программу?

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

count = `pngtoppm png_file | ppmhist -noheader | wc -l`
4 голосов
/ 25 октября 2009

Метод Image.getcolors в библиотеке изображений Python, кажется, делает именно то, что вам нужно.

2 голосов
/ 25 октября 2009

Fun. Кажется, нет никакого гарантированного способа сделать это; в худшем случае вам нужно будет отсканировать изображение и интерпретировать каждый пиксель, в лучшем случае PNG будет использовать палитру, и вы можете просто проверить там.

Однако даже в случае палитры вам не гарантируется использование каждой записи, поэтому вы (в лучшем случае) получаете верхнюю границу.

http://www.libpng.org/pub/png/spec/1.1/PNG-Contents.html

.. и информация о чанке здесь:

http://www.libpng.org/pub/png/spec/1.1/PNG-Chunks.html

1 голос
/ 25 октября 2009

Хорошее решение от Alnitak :) Мне действительно стоит немного узнать о netpbm, imagemagick и т. Д.

Просто FYI, как простое и очень общее решение: переберите каждый пиксель изображения, получая значения цвета r, g, b в виде единого целого числа. Ищите это целое число в списке. Если его там нет, добавьте его. Когда закончите со всеми пикселями, выведите количество цветов в списке.

Если вы хотите сосчитать вхождения, используйте вместо простого списка хэш-карту / словарь, увеличивая значение ключа (счетчик), если оно уже найдено в словаре. Если не найдено, добавьте его со значением начального счетчика 1.

...