Get palette of image

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

А вот рассчитать произвольное количество цветов задача не тривиальная. Долго искал информацию по этому вопросу, наконец, нашел Формулу цветового отличия, в частности CIEDE2000. Готовые реализации этого алгоритма можно найти на просторах Интернета.
Но результат, который он выдавал меня не вполне устроил.

Потом наткнулся на другой алгоритм - Квантования цвета (Color quantization). Нашел JavaScript-версию вот здесь.

Но JS меня совсем не устраивал, потому как ставить Node.JS для одной задачи не хотелось. Поэтому я переписал скрипт на PHP, исходники которого выложу позже. Но PHP не самый лучший вариант из-за организации памяти:

Ubuntu x86:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
$ uname -a
Linux jonel 2.6.32-48-generic #110-Ubuntu SMP Fri May 31 19:05:31 UTC 2013 i686 GNU/Linux

$ php palette.php
Amount of memory (empty array): 0.5 Mb
Amount of memory (full array): 1069 Mb
Size of Image: 1920 x 1080
Count pixels: 2073600
Start Script: 0.5 Mb
Peak of memory: 1198 Mb


Debian x86-64:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
$ uname -a
Linux jonel 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux

$ php palette.php
Amount of memory (empty array): 11 Mb
Amount of memory (full array): 2068.75 Mb
Size of Image: 1920 x 1080
Count pixels: 2073600
Start Script: 1 Mb
Peak of memory: 2326.75 Mb

Как видно, это всего лишь Full HD изображения.

Для расчета создается немаленький массив, размер которого зависит от разрешения изображения. На каждый пиксель по 3 значения, если не учитывать alpha-канал, т.е. width * height * 3.

Можно было бы разделить на несколько блоков и т.п., тем самым уменьшить потребление памяти. Но чем переписывать все на этом же PHP, лучше написать на C. Что гораздо интереснее и намного быстрее будет работать. На сайте Leptonica есть исходники, конечно, но они там настолько общие и громадные... Так что решил переписать самостоятельно под одну задачу.


06 июля 2013 | Рубрика: Программирование

Календарь

  • Сегодня
    17 Марта 2026, Вторник
    ПНВТСРЧТПТСБВС
    1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031

Авторизация