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

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

24.09.2011, 15:58. Показов 33467. Ответов 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
10427 / 5157 / 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
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
19.02.2021, 17:49
SatanaXIII, Storm23, если брать вопрос топика: Есть объект типа Color. Как определить яркость цвета?
То яркость определятся как одна 512 от суммы самого тусклого и самого яркого цвета.

Формула Y=0.3*R+0.59*G+0.11*B имеет отношение только к физическому устройству имеющему абсолютно одинаковую чувствительность ко всем цветам.
Так светочувствительные ячейки обычно изготавливаются на одной пластине и одного размера, то нелинейность определяется в основном светофильтрами.
То к физическим величинам это формула может применяться.
Но в форматах хранения по любому будет производиться какая-то оптимизация, так как выделять одинаковое количество бит под хранение величин разных диапазонов не эффективно.
Поэтому для хранимых форматов изображений я не думаю, что эта формула применима.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
19.02.2021, 18:03
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поэтому для хранимых форматов изображений я не думаю, что эта формула применима
Снова нет.
RGB - не имеет отношения к типу устройства. Это абсолютный стандарт представления цвета. Например #FF0000 - это вполне конретный цвет (красный). И это значение не зависит от того, как было получено изображение и как оно будет отображаться. Поэтому именно к RGB и должна применяться эта формула.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но в форматах хранения по любому будет производиться какая-то оптимизация, так как выделять одинаковое количество бит под хранение величин разных диапазонов не эффективно.
Формат хранения не имеет отношения к RGB. Камера не передает значения в RGB, она передает пикселы в RAW формате. И там действительно под зеленый цвет выделяется больше бит, чем под синий. Да и зеленых субпикселов в камере тоже в два раза больше чем красных и синих (см Фильтр Байера).
НО когда RAW от камеры получен, сырые пикселы по спец формулам преобразуется в RGB. И этот RGB уже является девайсо-независимым.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16125 / 11249 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 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
10427 / 5157 / 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
10427 / 5157 / 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru