Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Работа с изображениями


Автор: adom 15.6.2007, 13:43
Программа по изображению на компе должна подбирать краски для создания этого изображения в реальности из базы красок. База красок ограничена. База занесена в комп, каждому цвету соответствует некоторое значение RGB, на компе цветов больше, чем в базе, мне надо чтобы близкие цвета прога автоматически заменяла цветами из базы. Подскажите есть ли такие проги или какие-нить стандартные средства реализации на каком-либо языке (php, например). И вообще в каком направлении посоветуете искать?
PS если вы считаете, что я написал не в ту тему (форум) буду благодарен если подскажете более подходящий

Автор: bsa 15.6.2007, 14:26
Не очень понятно, тебе готовая программа нужна или сам написать должен?
Если сам, то все очень просто:
Берешь цвет и поочередно сравниваешь его с цветами из базы. В качестве результата сравнения получаешь три модуля разности (deltaR, deltaG, deltaB). Затем, находишь наименьшее отличие (имей в виду, что человеческий глаз лучше всего различает оттенки зеленого, а хуже всего - оттенки синего, поэтому критерий сравнения должен это учитывать). И если это наименьшее отличие меньше какого-то порогового значения, то можешь вместо этого цвета подставлять соответствующий цвет из базы.

Автор: adom 15.6.2007, 14:37
BSA: Спасибо, это наверное подойдёт, хотелось бы поподробней узнать о том какие цвета как воспринимаются, но это, наверное уже не сюда.
Прогу надо делать мне. Но если подобные есть, то хотелось бы их посмотреть

Автор: Pikon 15.6.2007, 14:50
Цитата

хотелось бы поподробней узнать о том какие цвета как воспринимаются, но это, наверное уже не сюда.

Скажем фактор света равен 1 (Y), то зелёного в нём 0,587, красного 0,299, а синего 0,114. Как уже сказали зелёный вопринимается глазом лучше всего, синий хуже всего, соотношения видны их цифр.

Автор: adom 15.6.2007, 14:57
Pikon: Понятно сколько где какого цвета, а вот какой коэффициент при расчёте брать для зелёного, а какой для остальных - не понятно

Автор: Pikon 15.6.2007, 15:11
Это восприятие имеется ввиду. Зелёный в 3 раза светлее синего, если топорно. Я тут картинку нашёл, она наглядна мне кажется. Красный 0 градусов на графике, синий 240 и зелёный 120

user posted image

Автор: bsa 16.6.2007, 00:30
Цитата(adom @ 15.6.2007,  14:57)
Pikon: Понятно сколько где какого цвета, а вот какой коэффициент при расчёте брать для зелёного, а какой для остальных - не понятно

Все просто. Для начала вычисляешь отличие текущего цвета от базового:
Код
colorDiff = 0.587 * fabs(Base.G - Color.G) + 0.299 * fabs(Base.R - Color.R) + 0.114 * fabs(Base.B - Color.B);

Затем перебором находишь базовый цвет, отличие (colorDiff) которого минимально. А затем сравниваешь его с каким-то числом, задающим допустимую погрешность. И если colorDiff меньше этого числа, то можно считать, что исходный цвет можно заменить базовым.

Кстати, "набор красок" называется палитрой.

Ты случаем, не программу палитризации (перевод из true color в indexed color) писать собрался? В этом случае могу посоветовать http://members.ozemail.com.au/~dekker/NEUQUANT.HTML - нейронная сеть для перевода картинок в палитру. Работает лучше Photoshop'а. Она используется в некоторых свободных графических библиотеках, например, FreeImage.
Кстати, в нее встроен оптимизированный алгоритм, позволяющий переводить картинку в палитровую. Рекомендую.

Автор: adom 16.6.2007, 07:05
bsa,  спасибо огромное, то что надо, кстати можно ссылку на источник откуда взята формула? И на другие источники где этот вопрос разобран. Я в программировании новичок, знаю только основы, посоветуйте, пожалуйста, что лучше почитать о работе С\С++ с графикой (цветами).
Pikon, спасибо, ссылку дайте, пожалуйста, откуда катинка.
Ещё мне надо будет использовать палитру дл я выбора цветов, такую как в fotoshop или paint (когда мышкой указываешь нужный цвет) как её создавать?

Автор: adom 16.6.2007, 08:11
Цитата(bsa @  16.6.2007,  00:30 Найти цитируемый пост)
Ты случаем, не программу палитризации (перевод из true color в indexed color) писать собрался? В этом случае могу посоветовать NeuQuant - нейронная сеть для перевода картинок в палитру.

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

Автор: bsa 16.6.2007, 09:35
база красок - это и есть палитра. Например, в ней может быть 256 цветов, а может и 16.
Алгоритм перевода RGB - RGB из палитры [базы красок] есть в программе, которую я тебе дал. В принципе, никто не мешает использовать формулу, которую я написал (ее я придумал, поэтому ссылку дать не могу). Но алгоритм в neuquant 100% работает.

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