Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Построить гистограмму яркости. Как?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
smartchecker
Есть view'ха, в которую подгружается картинка.
    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);

    originalImg.load("pic.jpeg");
    originalPix = QPixmap::fromImage(originalImg);
    originalItem = scene->addPixmap(originalPix.scaledToWidth(500, Qt::SmoothTransformation));

Задача:
Построить гистограмму яркости этой картинки.
Как вытащить яркость pixel'а?
Iron Bug
смотря что считать "яркостью". сначала найди формулу, по которой будешь считать яркость, а потом уже считай. формулы существуют разные, в зависимости от того, какую "яркость" хочешь считать - ту и выбирай.
smartchecker
Цитата(Iron Bug @ 11.3.2013, 8:33) *
смотря что считать "яркостью". сначала найди формулу, по которой будешь считать яркость, а потом уже считай. формулы существуют разные, в зависимости от того, какую "яркость" хочешь считать - ту и выбирай.

Думаю так Алгоритм построения
Из этого вопрос - как вытащить яркость pixel'а?
Понятно что можно сделать так
    pixelColor = QRgb(originalImg.pixel(x, y));

А как тогда достать яркость?
Так?
    pixelColor.value();
lanz
QRgb pix = originalImg.pixel (x,y)
int lum = 0.3*qRed (pix) + 0.59*qGreen (pix) + 0.11*qBlue (pix)

?
smartchecker
Цитата(lanz @ 11.3.2013, 15:33) *
QRgb pix = originalImg.pixel (x,y)
int lum = 0.3*qRed (pix) + 0.59*qGreen (pix) + 0.11*qBlue (pix)

?

А, если картинка ЧБ?
lanz
А в чем разница? :lol:
smartchecker
Цитата(lanz @ 11.3.2013, 17:57) *
А в чем разница? :lol:

Судя по результирующей картинке, разница есть.
lanz
Конечно, чтобы гистограмма сохранялась, перевод в ЧБ нужно делать по той же формуле (с теми же коэффициентами).
Например фуксия (255, 0, 255)
Y = 255 * 0.3 + 0 * 0.59 + 255 * 0.11 = 104.55
Записываем полученную интенсивность в каждый канал
(105, 105, 105)
Теперь считаем яркость
I = 105 * 0.3 + 105 * 0.59 + 105 * 0.11 = 105 * (0.3 + 0.59 + 0.11) = 105 -> совпадает

Если же преобразование в ЧБ было например с HDTV коэффициентами, то получим
Y = 255 * 0.2126 + 0 * 0.7152 + 255 * 0.0722 = 72.624
(73,73,73)
I = 73 * 0.3 + 73 * 0.59 + 73 * 0.11 = 73 -> не совпадает, гистограмма будет другой

Вообще непонятно откуда формула, http://en.wikipedia.org/wiki/Luminance_(relative) дает HDTV коэффициенты.
Iron Bug
Цитата(lanz @ 12.3.2013, 15:19) *
Вообще непонятно откуда формула, http://en.wikipedia.org/wiki/Luminance_(relative) дает HDTV коэффициенты.

скорее всего, адаптация для пикселей современных экранов. вообще, все эти коэффициенты существуют только ради того, чтобы адаптировать машинное изображение под человеческий глаз. мы видим не линейные спектры по яркости и по цветовой гамме. исходя из этих кривых, рассчитываются некоторые средние значения.
например, мы работаем с очень качественной полиграфией. и оказалось, что цвета, снятые в трёх цветовых плоскостях, при сведении в одно изображение дают картинку, которую юзер вообще не способен распознать. картинка правильная. просто наш глаз воспринимает её не так, как CCD-шка. поэтому приходится применять адаптированные к человеческому восприятию цвета, чтобы воссоздать отсканированный образ для пользователя на экране так, чтобы он воспринимался как нормальное изображение. есть много разных подходов к описанию кривизны восприятия цвета и яркости. каждый используется в разных областях. а исследуют и выводят эти коэффициенты обычно научно-медициские институты по исследованию вопросов зрения.
wiz29
Цитата(smartchecker @ 11.3.2013, 0:24) *
Как вытащить яркость pixel'а?

Попробуй использовать int QColor::lightness () const.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.