Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Выбор основных цветов картинки.


Автор: Shar_nir 15.10.2007, 16:30
Появилась такая проблема:
Необходимо выделить из картинки описанной как TBitmap основные составляющие цвета...
Создать палитру... Причем колличество цветов паллитры может регулироваться пользователем....

Основная проблема в том что если делать банально по числу наибольших повторений цвета пикселя, то получается массив забит оттенками того цвета которого на картинке больше всего...
Таким образом пропадает некотарая часть спектра рисунка...
На фоне синего неба маленький зелёный лист...
Все цвета голубого либо синего оттенков...
зелёный ушёл в нибытие...

Если кто знает как туда программно внести "зелёный" напишите...Плиз... Срочно надо...

Автор: Alexeis 16.10.2007, 10:17
  Предлагаю сделать для каждого цвета свой вес. Вес тем больше чем больше этого цвета в картинке и тем меньше, чем больше рядом цветов близких оттенков. И добавлять в палитру только цвета с наибольшим весом.

Автор: Shar_nir 16.10.2007, 17:22
Задать вес. Такая идея приходила, но когда стал реализовывать получилось так:
Цитата

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

получается вель массив забит к примеру синим цветом....

вот только не делал
Цитата

и тем меньше, чем больше рядом цветов близких оттенков

Вот если честно не представляю как это можно сделать...
Как определить программно принадлежность оттенка к тому или инному цвету...

Если есть стандартный алгоритм, то я его наверное не знаю...

решение задачи в моём представлении выглядит так:
  • определить максимальное число цветов картинки...
  • Определить коэффицент принадлежности оттенка к цвету...
    т.е. необходимо выделить порог в пределах которого все оттенки определённого цвета:=этому цвету; а далее др цвет, зависит от величины массива цветов и от пункта (1)
  • !!! Главное!!! перебор всей картинки, отсеивание оттенков, заполнение массива!!!
  • вывод результата и т.п. и Т.Д.

вот пункт три это и не знаю как сделать отсев!!!

Просто с цветом работаю можно сказать в первый раз...
 smile 

Автор: Alexeis 16.10.2007, 17:33
Цитата(Shar_nir @  16.10.2007,  17:22 Найти цитируемый пост)
Вот если честно не представляю как это можно сделать...
Как определить программно принадлежность оттенка к тому или инному цвету...

  Да просто по степени близости их RGB составляющих например есть распространенный цвет 255 117 35 и 2 мало распространенных 
1й 253 117 35 и 2й 114 12 83. Очевидно что 1й близок к распространенному, так как его красная составляющая отличается всего на 2е единицы потому его вес должен быть малым. у распространенного цвета вес тоже уменьшится, но так как его много то его вес будет достаточным чтобы попасть в палитру. Из мало распространенных у 114 12 83 будет больше все, так как у него нет близкого соседа, вот он и попадет в палитру вместо 253 117 35.

Автор: Shar_nir 16.10.2007, 21:53
ну в принципе да.....
только как только начинаю писать, ничего не получается....
может руки не от туда растут....
Всё поятно, просто, логично, но не получается....
пасибо за наводку....
буду ломать голову(ладно бы себе)

Автор: Alexeis 17.10.2007, 08:51
Цитата(Shar_nir @  16.10.2007,  21:53 Найти цитируемый пост)
только как только начинаю писать, ничего не получается....

  Я бы сделал так. Сначала сделал массив всех цветов. Затем для каждого цвета прошелся по всем цветам палитры и проверил если нашел цвет отличающийся всего на 1 единицу по одной из составляющей то цвету -10 рейтинга если на 2е то -7 на 3 -5 и так например до 10ти если отличается на 10 то -1 рейтинга. За каждые 10 повторений цвета в картинке можно давать например по 1му очку рейтинга. 

  После этого всего сортируем цвета по рейтингу в порядке убывания. Берем только первые 256 цветов с максимальным рейтингом.

Автор: Shar_nir 17.10.2007, 12:40
какого размера делать первоначальный массив? по всей видимости по колличеству цветов картинки????
как узнать это колличество???

Автор: Alexeis 17.10.2007, 12:54
Сначала выделить например на 2000, если не поместиться, то удлинить на 100% и так дальше удлинять. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)