VPF::Изменение яркотсти цвета - Форум программистов
Загрузка. Пожалуйста,подождите...
Занимаешься фрилансом? Заполни свой профиль на Винграде!
Здравствуйте, Гость (
Вход |
Регистрация |
Что даёт регистрация на форуме?
)
Восстановить пароль |
Выслать повторно письмо для активации
Новости для программистов подгружаются..
Форум программистов Vingrad
Новости ·
Запросы ·
Wiki ·
FAQ
Правила ·
Помощь ·
Рейтинг ·
Избранное ·
Поиск ·
Участники
Обновленные блоги:veitmen, booker, wowa, ida, archeg, javstic, veitmen11, kemiisto, Retro, nitrexin, AntonSaburov, platon, skynin, dragoonfighter, Vex, vulzscht, seo, heckfy, italiya, freecode
Создай свой блог!
Форум -> Технологии и алгоритмы -> Алгоритмы
Модераторы: maxim1000
Поиск:
Изменение яркотсти цвета, Как изменить яркость цвета в RGB или HLS
Опции темы
Теги:
нет
masterik
Дата 22.1.2008, 17:15 (ссылка)
| (нет голосов)
Загрузка ...
Новичок
Профиль
Группа: Участник
Сообщений: 27
Друзей: 0; Групп: 0
Регистрация: 28.8.2006
Где: Остенд, Бельгия
Репутация: нет Всего: нет
Доброго времени суток,Очень срочно нужен алгоритм изменения яркости цвета в RGB пространстве... или на крайний случай в HSL/HSB пространстве.Например имеется цвет RGB (255, 255, 128) - отсюда мне нужно получить два цвета: немного темнее и светлее имеюшегося...Был бы рад увидеть не только формулу или кусок кода, но и парочку комментариев или ссылочку для прочтения...Заранее очень благодарен за любую помощь
--------------------
Я думаю, что я думаю, что я всегда думаю, когда я думаю....
Earnest
Дата 24.1.2008, 13:24 (ссылка)
| (нет голосов)
Загрузка ...
Эксперт
Профиль
Группа: Комодератор
Сообщений: 3477
Друзей: 7; Групп: 0
Регистрация: 17.6.2005
Где: Рязань
Репутация: 3 Всего: 109
Цитата(masterik @ 22.1.2008, 18:15 )отсюда мне нужно получить два цвета: немного темнее и светлее имеюшегосяТогда тебе нужно не яркость менять, а интенсивность вроде. Пересчитываешь в HSL (или другое пространство, где оттенок в отдельную компоненту выделен), увеличиваешь или уменьшаешь компоненту, отвечающую зи интенсивность (или за светлоту), пересчитываешь обратно.Для "немного светлее\темнее" у меня формул нет, есть именно для яркости\контрастности\интесивности (через YUV). Надо?Вот еще здесь посмотри: http://www.easyrgb.com/math.php
--------------------
...
_Y_
Дата 25.1.2008, 16:55 (ссылка)
| (нет голосов)
Загрузка ...
Опытный
Профиль
Группа: Участник
Сообщений: 520
Друзей: 0; Групп: 0
Регистрация: 27.11.2006
Репутация: 1 Всего: 15
Earnest, а мне тоже интересны формулы для яркости\контрастности\интесивности
dereyly
Дата 26.1.2008, 04:10 (ссылка)
| (нет голосов)
Загрузка ...
Шустрый
Профиль
Группа: Участник
Сообщений: 132
Друзей: 0; Групп: 0
Регистрация: 16.6.2006
Репутация: 1 Всего: 4
можно возвести в степень или умножить =)вроде степень увеличивает яркость, а умножение осветляетНу если неравномерная освещенность то нужно гистограмму(ы) анализировать выделять пики и растягивать (как то так)
masterik
Дата 31.1.2008, 13:43 (ссылка)
| (нет голосов)
Загрузка ...
Новичок
Профиль
Группа: Участник
Сообщений: 27
Друзей: 0; Групп: 0
Регистрация: 28.8.2006
Где: Остенд, Бельгия
Репутация: нет Всего: нет
Цитата(Earnest @ 24.1.2008, 13:24)Для "немного светлее\темнее" у меня формул нет, есть именно для яркости\контрастности\интесивности (через YUV). Надо?Было бы интересно!Нашел неплохие примеры конвертации между пространствами:http://www.codeproject.com/KB/recipes/colorspace1.aspxhttp://www.codeproject.com/KB/miscctrl/colorwheelv1.aspxА нет формулы, чтобы прямо в RGB выполнить эту задачу, чтобы не терять время на переходы между пространствами?
--------------------
Я думаю, что я думаю, что я всегда думаю, когда я думаю....
Sardar
Дата 31.1.2008, 16:18 (ссылка)
| (нет голосов)
Загрузка ...
Бегун
Профиль
Группа: Модератор
Сообщений: 6959
Друзей: 12; Групп: 1
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen
Репутация: 1 Всего: 312
Если для человеческого глаза, то по идее (r, g, b) +- ([0.30, 0.59, 0.11] * (сколько нужно отнять/добавить)), отнимет именно от якрости, коэффициенты задают чувствительность человеческого глаза к исходной компоненте.
--------------------
Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут.
TeAnton
Дата 2.2.2008, 19:06 (ссылка)
| (нет голосов)
Загрузка ...
Новичок
Профиль
Группа: Участник
Сообщений: 40
Друзей: 0; Групп: 0
Регистрация: 5.7.2007
Репутация: нет Всего: нет
Если нужно быстро, и не нужен особо точный результат, можно просто каждый компонент RGB умножить на коэффициент. Коэффициент больше 1 осветляет, коэффициент меньше 1 затемняет. Дешево и сердито. Не забудь потом обработать переполнение через 255.
--------------------
Антон.
masterik
Дата 4.2.2008, 15:41 (ссылка)
| (нет голосов)
Загрузка ...
Новичок
Профиль
Группа: Участник
Сообщений: 27
Друзей: 0; Групп: 0
Регистрация: 28.8.2006
Где: Остенд, Бельгия
Репутация: нет Всего: нет
Цитата(Sardar @ 31.1.2008, 16:18)Если для человеческого глаза, то по идее (r, g, b) +- ([0.30, 0.59, 0.11] * (сколько нужно отнять/добавить)), отнимет именно от якрости, коэффициенты задают чувствительность человеческого глаза к исходной компоненте.Спасибо, вот что у меня вышло:Кодprivate Color SomeFunc(Color cc, double delta){ int R = (int)System.Math.Min(System.Math.Max((double)cc.R + 0.30 * delta, 0.0), 255.0); int G = (int)System.Math.Min(System.Math.Max((double)cc.G + 0.59 * delta, 0.0), 255.0); int B = (int)System.Math.Min(System.Math.Max((double)cc.B + 0.11 * delta, 0.0), 255.0); return Color.FromArgb(R, G, B);}Правильно ли я понял, то что вы предложили?Я получаю немного странные результаты... в каком диапозоне должен лежать коэффициент?RGB компоненты должны быть в диапозоне [0,1] или [0,255]?
--------------------
Я думаю, что я думаю, что я всегда думаю, когда я думаю....
Earnest
Дата 5.2.2008, 10:46 (ссылка)
| (нет голосов)
Загрузка ...
Эксперт
Профиль
Группа: Комодератор
Сообщений: 3477
Друзей: 7; Групп: 0
Регистрация: 17.6.2005
Где: Рязань
Репутация: 3 Всего: 109
Цитата(_Y_ @ 25.1.2008, 17:55 )Earnest, а мне тоже интересны формулы для яркости\контрастности\интесивности Извините, давно не заглядывала. Вот формулы пересчета и коррекции яркости\контраста.Все весьма несложно и работает вполне быстро.Код// Телевизионные пространства YUV, YIQ(NTSC)// При построении модели пространства YIQ учитывалась особенность человеческого зрения:// глаз человека в большей степени реагирует на яркостную составляющую и в меньшей степени// на цветовые характеристики. При этом человеческий глаз по-разному воспринимает разные// части спектра. На основании этого была предложена следующая схема пересчета из RGB в// YIQ:// Y 0.299 0.587 0.114 R// I = 0.596 -0.274 -0.322 * G// Q 0.211 -0.522 0.311 B// Обратный пересчет из YIQ в RGB осуществляется по формулам:// R 1 0.956 0.623 Y// G = 1 -0.272 -0.648 * I// B 1 -1.105 0.705 Q// YUV:// Y = 0.299R + 0.587G + 0.114B;// U = (B - Y)/2.03;// V = (R – Y)/1.44.// Обратный пересчет из YUV в RGB осуществляется по формулам:// R = Y + 1,44V;// G = Y – 0,37 – 0,73V;// B = Y + 2,03U. // изменения яркости, контраста, интенсивности struct CDelta { CDelta (int B = 0, int C = 0, int I = 0): m_B (B), m_C (C), m_I (I) {} int m_B, m_C, m_I; }; struct CYuv { CYuv (CRgb rgb); operator CRgb() const; void Correct (const CDelta&); int m_Y, m_U, m_V; }; // используются те же самые формулы (только коэффициенты приведены к целому виду) inline CYuv::CYuv (CRgb clr) { // Y = 0.299R + 0.587G + 0.114B; m_Y = (30*clr.m_r + 59*clr.m_g + 11*clr.m_b)/100; // U = (B - Y)/2.03; m_U = (clr.m_b - m_Y) >> 1; // V = (R – Y)/1.44. m_V = (clr.m_r - m_Y)*25/36; } inline BYTE _Byte (int c) { return c < 0 ? 0 : c > 255 ? 255 : BYTE(c); } inline CYuv::operator CRgb () const { // R = Y + 1,44V; int R = (36*m_V/25 + m_Y); // B = Y + 2,03U. int B = (m_U << 1) + m_Y; // G = Y – 0,37 – 0,73V; ??? int G = (100*m_Y - 11*B - 30*R)/59; return CRgb (_Byte(R), _Byte(G), _Byte(B)); } inline void CYuv::Correct (const CDelta& delta) { static const int BaseY = 127; // BRIGHTNESS m_Y += delta.m_B; // CONTRAST m_Y = (m_Y - BaseY) * delta.m_C/100 + BaseY; m_U = m_U * delta.m_C/100; m_V = m_V * delta.m_C/100; // INTENSITY m_U = m_U * delta.m_I/100; m_V = m_V * delta.m_I/100; }
--------------------
...
masterik
Дата 5.2.2008, 12:41 (ссылка)
| (нет голосов)
Загрузка ...
Новичок
Профиль
Группа: Участник
Сообщений: 27
Друзей: 0; Групп: 0
Регистрация: 28.8.2006
Где: Остенд, Бельгия
Репутация: нет Всего: нет
Sardar, Earnest, Большое вам спасибо за помощь!Объеденив два ваших решения, которые очень схожи, получил нужный мне результат!Так как пишу для PocketPC, где нет FPU, поэтому все вычисления с целыми числами!Кодprivate Color _CorrectLightness(Color cc, int delta){ int R = System.Math.Min(System.Math.Max(cc.R + delta * 30 / 100, 0), 255); int G = System.Math.Min(System.Math.Max(cc.G + delta * 59 / 100, 0), 255); int B = System.Math.Min(System.Math.Max(cc.B + delta * 11 / 100, 0), 255); return Color.FromArgb(R, G, B);}private void CalculateColors(Color orig_color){ // Методом тыка получил то что мне нужно :) // Все же если цвет слишком светлый или темный // получаюься странные результаты... Color shadow = _CorrectLightness(orig_color, -80); Color dark = _CorrectLightness(orig_color, -40); Color normal = orig_color; Color light = _CorrectLightness(orig_color, 40); Color highlight = _CorrectLightness(orig_color, 80); // ......}
--------------------
Я думаю, что я думаю, что я всегда думаю, когда я думаю....
Google
Дата 25.4.2008, 06:51 (ссылка)
Правила форума "Алгоритмы"
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Для решения контрольных, курсовых, дипломов и т.п. обращайтесь в Центр помощи
Похвалиться своими достижениями можно в разделе Интересные и занимательные задачи
Для поиска нужной литературы есть специальный раздел
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, podval, maxim1000.
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »
Подписаться на тему |
Подписка на этот форум |
Скачать/Распечатать тему
Главная страница форума
Поиск
Помощь
Программирование
- C++
- Delphi, Kylix and Pascal
- Java
- .NET
- Visual Basic
- ASM
- Python
- Базы данных
- Красная книга
Разработка систем для Web
- PHP
- Perl (+2 подфорумы)
- Ruby
- Flash platform
- ASP
- JavaScript
- Теория веб-дизайна
- Вёрстка веб-сайтов
- Хостинг и доменные имена
- Администрирование Web серверов и Web служб (+1 подфорумы)
- XML, XSL
- Интернет-бизнес и продвижение сайтов
- Работа с готовыми скриптами и поиск движков
Технологии и алгоритмы
- Алгоритмы
- Технологии
- Репортинговые системы
- Программирование контроллеров
- Программирование мобильных устройств
- Программирование игр, графики и искусственного интеллекта
Компьютерные системы
- 3D
- MS Windows
- Linux/Unix
- 1C: Предприятие, SAP, ERP и учётные системы
- Сетевые технологии
- Программное обеспечение
- Компьютерное железо
- MS Office
- Звук, графика и видео
Разное
- Работа в офисе
- Совместные проекты/поиск партнёров
- Готовые и разрабатываемые проекты
- Управление проектами
- Наши тесты (+1 подфорумы)
- Игры
- Компьютерная литература (+1 подфорумы)
- Флейм
- Разные вопросы
Vingrad
- Vingrad - Колледж
- Vingrad
- Наши встречи (+1 подфорумы)
- Наши проекты
- Форум для админов и модераторов
[ Время генерации скрипта: 0.4341 ] [ Использовано запросов: 30 ] [ GZIP выключен ]
Реклама на сайте
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Хостинг: Vingrad Hosting
Отказ от ответственности
Powered by Invision Power Board(R) 1.3 2003 IPS, Inc.
qtek
knauf
r-600
hp
ielts
mobil pegasus