Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/154: Рейтинг темы: голосов - 154, средняя оценка - 4.75
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696

Яркость пикселя

24.09.2011, 15:58. Показов 33323. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть объект типа Color. Как определить яркость цвета?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2011, 15:58
Ответы с готовыми решениями:

Яркость монитора
Здравсвуйте. У меня есть старый самсунговский монитор, с дровами, которые ставяться толко под xp. В интернете новых дров не наблюдается....

поиск пикселя
добрый день столкнулся с проблемой: нужно искать определенный пиксель и наводить на него курсор вот нашел такой код: using System; ...

цвет пикселя
Здравствуйте. Я на pictureBox рисую квадраты разного цвета. Как определить цвет под курсором. Спасибо.

16
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.09.2011, 16:04
C#
1
2
Color c = new Color();
Console.WriteLine(c.GetBrightness());
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
24.09.2011, 16:33  [ТС]
А как именно из R, G, B составляющих получить яркость?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.09.2011, 17:03
Ну это смотря какая яркость интересует (Brightness, Perceived Brightness, Luminance).
Можно расчитать по среднему арифметическому: (R + G + B)/3
В более серьезных местах (телевещание, например), расчитывается так: R * Rw + G * Gw + B * Bw, где Rw, Gw и Bw - коэффициент для каждого цвета от 0 до 1, который может меняться в зависимости от сферы применения.
Есть еще формула с расчетом корня.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
24.09.2011, 17:12  [ТС]
У меня есть предмет "Распознавание изображений" и мне нужно сделать гистограмму яркостей. Гистограмму не проблема сделать, но преподаватель попросил высчитывать яркости именно из RGB-составляющих. И я вот думаю как.

Добавлено через 1 минуту
Цитата Сообщение от kolorotur Посмотреть сообщение
Можно расчитать по среднему арифметическому: (R + G + B)/3
Это же получится в промежутке [0; 255], а GetBrightness() возвращает в промежутке [0; 1]. Как правильнее?
0
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
24.09.2011, 18:04
Подели результат на 255 и получишь в промежутке от 0 до 1.
1
9 / 9 / 4
Регистрация: 25.09.2011
Сообщений: 23
25.09.2011, 10:03
Для определения яркости пикселя можно воспользовать формулой Y=0.3*R+0.59*G+0.11*B, правда это больше для изображений в оттенках серого.
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
26.09.2011, 07:45
Цитата Сообщение от Corshun Посмотреть сообщение
можно воспользовать формулой Y=0.3*R+0.59*G+0.11*B, правда это больше для изображений в оттенках серого
Все правильно, для построения гистограммы используется именно это формула (по крайней мере нам так препод по ЦОС говорил)
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.02.2021, 11:20
Заинтересовала меня эта формула, почему именно такие коэффициенты, решил копнуть чуть глубже (пара ссылок: 1, 2).

Если в трех словах, то сама формула это перевод RGB пикселя в оттенки серого, а коэффициенты формулы это показатель той или иной системы представления/кодирования цвета (изначально PAL/SECAM и все вот это вот). В разных системах цвет, закодированный одним и тем же значением, будет выглядеть по разному. И наоборот - выглядящий одинаково в разных системах цвет, будет по разному кодироваться. В общем виде: [R±dr, G±dg, B±db], где dr, dg, db - некоторое отклонение свойственное той или иной системе.
Как происходит запись цвета в какой-то конкретной системе: берется двухмерное математически составленное бесконечно точное представление цвета (палитра на плоскости) и выбирается на ней точка, чьи координаты и будут означать запись цвета. Выбираются три основных (связанных с данной технологией производства) цвета, например, красный, зеленый и синий, и сопоставляются с цветовой палитрой. Таким образом получается, что какой-нибудь зеленый цвет располагается по таким-то координатам, а смежный цвет, находящийся в бесконечно близком приближении к нему уже не зеленый. Почему выбираются те или иные координаты? А вот не почему, на глаз. Ну по крайней мере раньше так было при аналоговом вещании.
Возвращаясь же к самой формуле, то высчитанное по ней значение является некой яркостью пикселя. Некой - потому что понятий яркостей существует несколько. И хрен его знает что мы получили за число, но оно точно как-то характеризует исследуемый пиксель.
Резюмируя можно сказать, что в прикладных целях совершенно наплевать как рассчитывать яркость пикселя, хоть просто брать среднее арифметическое по RGB, потому что неизвестно с помощью какого оборудования получены данные пиксели, какие там были кодеки, какой они стандарт поддерживали, будут ли они куда-то выводиться вообще потом и через сколько десятков лет какие изменения в этой всей сфере произойдут.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
19.02.2021, 12:05
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Резюмируя можно сказать, что в прикладных целях совершенно наплевать как рассчитывать яркость пикселя, хоть просто брать среднее арифметическое по RGB, потому что неизвестно с помощью какого оборудования получены данные пиксели
Нет.
Яркость пикселя рассчитывается исходя из чувствительности глаза к разным длинам волн.
Y=0.3*R+0.59*G+0.11*B
Глаз лучше всего распознает зеленый цвет, поэтому коэффициент при G - самый большой. Красный цвет глаз видит хуже, и синий - еще хуже. Поэтому синий цвет мало влияет на субъективное восприятие яркости, и его коэффициент самый маленький.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.02.2021, 14:35
Цитата Сообщение от Storm23 Посмотреть сообщение
Глаз лучше всего распознает зеленый цвет
Вот об этом я и говорю - распознает зеленый цвет с какого устройства? Есть, например, жидкокристаллический монитор и второй с лучевой трубкой - на котором из них зеленый более зеленый? А потом придумают через десять лет технологию, в которой лучшей единицей для вывода одного пикселя изображения будет бычий глаз, там тоже будет тот самый зеленый?
Ну а если чуть более серьезно, то в представленной вами формуле коэффициенты рассчитываются исходя из технологий семидесятых годов, тех технологий, которые сейчас уже не используются (можно почитать по приведенным мной ссылкам в предыдущем сообщении). С девяносто шестого года стал рулить стандарт sRGB, коэффициенты которого 0.212, 0.715 и 0.072 соответственно.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
19.02.2021, 17:49
SatanaXIII, Storm23, если брать вопрос топика: Есть объект типа Color. Как определить яркость цвета?
То яркость определятся как одна 512 от суммы самого тусклого и самого яркого цвета.

Формула Y=0.3*R+0.59*G+0.11*B имеет отношение только к физическому устройству имеющему абсолютно одинаковую чувствительность ко всем цветам.
Так светочувствительные ячейки обычно изготавливаются на одной пластине и одного размера, то нелинейность определяется в основном светофильтрами.
То к физическим величинам это формула может применяться.
Но в форматах хранения по любому будет производиться какая-то оптимизация, так как выделять одинаковое количество бит под хранение величин разных диапазонов не эффективно.
Поэтому для хранимых форматов изображений я не думаю, что эта формула применима.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
19.02.2021, 18:03
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поэтому для хранимых форматов изображений я не думаю, что эта формула применима
Снова нет.
RGB - не имеет отношения к типу устройства. Это абсолютный стандарт представления цвета. Например #FF0000 - это вполне конретный цвет (красный). И это значение не зависит от того, как было получено изображение и как оно будет отображаться. Поэтому именно к RGB и должна применяться эта формула.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но в форматах хранения по любому будет производиться какая-то оптимизация, так как выделять одинаковое количество бит под хранение величин разных диапазонов не эффективно.
Формат хранения не имеет отношения к RGB. Камера не передает значения в RGB, она передает пикселы в RAW формате. И там действительно под зеленый цвет выделяется больше бит, чем под синий. Да и зеленых субпикселов в камере тоже в два раза больше чем красных и синих (см Фильтр Байера).
НО когда RAW от камеры получен, сырые пикселы по спец формулам преобразуется в RGB. И этот RGB уже является девайсо-независимым.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
19.02.2021, 18:27
Цитата Сообщение от Storm23 Посмотреть сообщение
Например #FF0000 - это вполне конретный цвет (красный). И это значение не зависит от того, как было получено изображение и как оно будет отображаться. Поэтому именно к RGB и должна применяться эта формула.
Из исходников:
C#
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
        public float GetBrightness() {
            float r = (float)R / 255.0f;
            float g = (float)G / 255.0f;
            float b = (float)B / 255.0f;
 
            float max, min;
 
            max = r; min = r;
 
            if (g > max) max = g;
            if (b > max) max = b;
 
            if (g < min) min = g;
            if (b < min) min = b;
 
            return(max + min) / 2;
        }
Добавлено через 6 минут
Исходя из этого яркости монохромных цветов принимаются равными.
Без всяких коэффициентов.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
19.02.2021, 18:39
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Исходя из этого яркости монохромных цветов принимаются равными.
Без всяких коэффициентов.
Нет.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
GetBrightness
Метод GetBrightness это НЕ яркость пиксела. Это компонент L из HSL формата:
Gets the hue-saturation-lightness (HSL) lightness value
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.02.2021, 10:46
Storm23, Элд Хасп, спасибо за интересную беседу.

Storm23, последний вопрос:
Почему
Y=0.3*R+0.59*G+0.11*B
а не
Y=0.212*R+0.715*G+0.072*B
?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
20.02.2021, 13:02
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Почему
Y=0.3*R+0.59*G+0.11*B
а не
Y=0.212*R+0.715*G+0.072*B
?
Разница между этими формулами невелика. Можно использовать и ту и ту. Первая формула исторически была найдена первой. Вторая формула содержит скорректированные коэффициенты для пространства sRGB. В этой формуле темные цвета будут давать меньшую яркость.
Зачем нужен sRGB? Дело в том, что разные мониторы имеют разные характеристики матрицы экрана. И для каждого монитора есть разные формулы перевода RGB в яркость субпикселей (т.н. гамма коррекция). Но если использовать стандартный RGB то цвета на разных мониторах будут выглядеть немного по-разному.
Для того, что бы этого избежать, вместо RGB стали использовать sRGB, который уже содержит гамма коррекцию. Это позволяет разным мониторам отображать цвета почти одинаково.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2021, 13:02
Помогаю со студенческими работами здесь

GDI+ изменить насыщенность и яркость разложив RGB в HSL
не совсем понятно, как изменить у картинки насыщенность и яркость я взял пиксель в rgb, получил Color, и вытащил оттуда hue, saturation и...

Определение цвета пикселя
Необходимо определить цвет пикселя в формате RGB. Возможно ли это сделать стандартными средствами или необходимы дополнительные библиотеки?...

Построить гистограмму яркости и пользуясь этой гистограммой редактировать яркость изображения
Построить гистограмму яркости и пользуясь этой гистограммой редактировать яркость изображения.Собственно,есть идеи как можно реализовать? ...

Получить цвет пикселя экрана
Собственно по теме... Возникла потребность считать пиксель екрана(точнее его цвет), на java уже писал такое, там был класс, который...

Получить цвет пикселя монитора
Привет всем, как получить цвет любого пикселя изображенного в ДАННЫЙ момент на мониторе. Bitmap myBitmap = new Bitmap(file.jpg) этот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru