Russian Qt Forum
Ноябрь 23, 2024, 06:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Отрисовка усреднённых значений  (Прочитано 11056 раз)
V1KT0P
Гость
« Ответ #15 : Апрель 27, 2012, 12:11 »

Я тут додумался до вычисления текущего СА (ср. арифметич) из предыдущего: An = [(n-1)*An-1 + an] / n
Кстати, здесь я так же могу хранить одно значение n - усреднений для всех пикселей и массив предыдущих СА. И мне кажется эта шутка чуть чуть быстрее чем весовая формула...
Это та же самая весовая формула. А если нужна скорость, то можно распараллелить (здесь без проблем) или (здесь еще лучше) задействовать SSE

Если Вы планируете осредненные значения больше 1.0 то надо подумать как их отображать
Где я ошибся в ваших формулах?:
Код
C++ (Qt)
   float accum = 1.0;
   int count = 1;
   float An = 1.0;
   float pixelred;
   for (int k=1; k<100; k++) {
       count++;
       float newValue = 1;
 
       accum += newValue;
 
       An = ((static_cast<float>(count)-1)*An-1+newValue)/static_cast<float>(count);
 
       float temp = (pixelred * static_cast<float>(count) + newValue) / (static_cast<float>(count+1));
       pixelred = temp + 0.5;
   }
   float out = accum/static_cast<float>(count);
   qDebug() << "V1KT0P:" << out << "once_again_abc:" << An << "Igors:" << pixelred;
Выводит:
Цитировать
V1KT0P: 1 once_again_abc: 0.01 Igors: 26.4653
Вроде же правильно сделал...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Апрель 27, 2012, 12:56 »

Вроде же правильно сделал...
1) Добавление 0.5 было предложено для работы с байтами (значения 0..255). Это не к месту если Вы делаете все в float и используете диапазон 1 

2) A(n) и A(n - 1) совсем не значит что нужно отнимать какую-то единицу - это значения на предыдущем (n - 1) и текущем (n) шаге.

3) если один из операндов float то второй операнд int автоматически приведется к float (старшему) и результат будет float. Поэтому сорить static_cast не нужно
Записан
V1KT0P
Гость
« Ответ #17 : Апрель 27, 2012, 14:16 »

Вроде же правильно сделал...
1) Добавление 0.5 было предложено для работы с байтами (значения 0..255). Это не к месту если Вы делаете все в float и используете диапазон 1 

2) A(n) и A(n - 1) совсем не значит что нужно отнимать какую-то единицу - это значения на предыдущем (n - 1) и текущем (n) шаге.

3) если один из операндов float то второй операнд int автоматически приведется к float (старшему) и результат будет float. Поэтому сорить static_cast не нужно
1) Действительно =). Кстати погрешность накапливается поистине мизерная, через 10млн итераций всего несколько сотых процента =). Остается только измерить скорость относительно тупого метода.

3) Не могу не ставить, обычно если статиков много завожу новую переменную(все-равно компилятор оптимизирует). Если не поставлю у меня в голову постоянно лезет мысль "поставь статик" =).
Записан
once_again_abc
Гость
« Ответ #18 : Апрель 27, 2012, 14:51 »

огромное вам всем спасибо за участие и помощь!
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 22.