crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Построить гистограмму яркости. Как?
smartchecker
  опции профиля:
сообщение 10.3.2013, 23:24
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть 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
  опции профиля:
сообщение 11.3.2013, 7:33
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


смотря что считать "яркостью". сначала найди формулу, по которой будешь считать яркость, а потом уже считай. формулы существуют разные, в зависимости от того, какую "яркость" хочешь считать - ту и выбирай.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 11.3.2013, 13:29
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

А как тогда достать яркость?
Так?
    pixelColor.value();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 11.3.2013, 14:33
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


QRgb pix = originalImg.pixel (x,y)
int lum = 0.3*qRed (pix) + 0.59*qGreen (pix) + 0.11*qBlue (pix)

?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 11.3.2013, 16:31
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
  опции профиля:
сообщение 11.3.2013, 16:57
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


А в чем разница? :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 12.3.2013, 11:40
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

Судя по результирующей картинке, разница есть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 12.3.2013, 12:19
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Конечно, чтобы гистограмма сохранялась, перевод в ЧБ нужно делать по той же формуле (с теми же коэффициентами).
Например фуксия (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 коэффициенты.

Сообщение отредактировал lanz - 12.3.2013, 12:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 12.3.2013, 17:34
Сообщение #9


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


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

скорее всего, адаптация для пикселей современных экранов. вообще, все эти коэффициенты существуют только ради того, чтобы адаптировать машинное изображение под человеческий глаз. мы видим не линейные спектры по яркости и по цветовой гамме. исходя из этих кривых, рассчитываются некоторые средние значения.
например, мы работаем с очень качественной полиграфией. и оказалось, что цвета, снятые в трёх цветовых плоскостях, при сведении в одно изображение дают картинку, которую юзер вообще не способен распознать. картинка правильная. просто наш глаз воспринимает её не так, как CCD-шка. поэтому приходится применять адаптированные к человеческому восприятию цвета, чтобы воссоздать отсканированный образ для пользователя на экране так, чтобы он воспринимался как нормальное изображение. есть много разных подходов к описанию кривизны восприятия цвета и яркости. каждый используется в разных областях. а исследуют и выводят эти коэффициенты обычно научно-медициские институты по исследованию вопросов зрения.


Сообщение отредактировал Iron Bug - 12.3.2013, 17:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 12.3.2013, 17:45
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(smartchecker @ 11.3.2013, 0:24) *
Как вытащить яркость pixel'а?

Попробуй использовать int QColor::lightness () const.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 22:34