| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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![]() |
| Автор: bsa 16.6.2007, 00:30 | ||||
Все просто. Для начала вычисляешь отличие текущего цвета от базового:
Затем перебором находишь базовый цвет, отличие (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 (когда мышкой указываешь нужный цвет) как её создавать? |
| Автор: bsa 16.6.2007, 09:35 |
| база красок - это и есть палитра. Например, в ней может быть 256 цветов, а может и 16. Алгоритм перевода RGB - RGB из палитры [базы красок] есть в программе, которую я тебе дал. В принципе, никто не мешает использовать формулу, которую я написал (ее я придумал, поэтому ссылку дать не могу). Но алгоритм в neuquant 100% работает. |