Google






20:07 28.10.2014
О бедных зеркалках замолвите слово...
 Подробности ...
 
03:22 20.10.2014
Жёсткий диск в компьютере, SSD - в голове?
 Подробности ...
 
20:50 31.12.2013
С наступающим Новым Годом!
 Подробности ...
 
14:39 24.12.2013
Свежий драйвер AMD Catalyst для видеокарт на базе чипов AMD Radeon
 Подробности ...
 
23:30 23.12.2013
FBReader 1.9.4 для Android
 Подробности ...
 
Rambler's Top100 liveinternet.ru

Объяснение параметра DC precision при кодировании в MPEG: математика курса Средней Школы помогает разобраться?
 
 
Обсудить на форуме Обсудить на форуме         Автор: VicoNT  
   страницы : << 1 >>  



На данное мини-исследование меня толкнула ветка в Форуме и собственное любопытство. Вопросы не праздные: каков реальный смысл параметра DC precision при кодировании в MPEG, и какие значения этого параметра оптимальны (ну, и в качестве довеска: при каких условиях).
Сразу предупрежу, что понадобится вспомнить курс математики средней школы (данного уровня должно хватить). Именно поэтому я не буду углубляться в дебри мат. анализа и линейной алгебры и некоторые определения дам без доказательств, в виде аксиом.

Для начала - небольшой экскурс в математику

Дискретное косинусное преобразование (DCT) применяется при работе с изображениями в различных целях, не только с целью сжатия. Переход к частотному представлению величин значений пикселей позволяет по-другому взглянуть на изображение, обработать его, ну, и, что интересно для нас, сжать. Более того, зная коэффициенты преобразования, мы всегда может произвести обратное действие - вернуть исходную картинку. Преобразование позволяет затем применить квантование, отбросив большие, менее заметные для человеческого глаза, частоты - таким образом понизить детализацию, но значительно уменьшить размер изображения. Впрочем, о квантовании - в другой раз.
DCT непосредственно применяемый к блоку (для простоты возьмем 8х8 пикселей) изображения будет выглядеть так:


Формула DCT

Формула DCT



где х, y - пространственные координаты пикселя (0..7) ,
f(x,y) - значения пикселей исходного макроблока (допустим, яркость)
u,v - координаты пикселя в частотном представлении (0..7)
w(u) =1/SQRT(2) при u=0, в остальных случаях w(u)=1 (SQRT - квадратный корень)
w(v) =1/SQRT(2) при v=0, в остальных случаях w(v)=1

Или в матричной форме:


Формула DCT: матричный вид

Формула DCT: матричный вид



где [X]- начальная матрица 8x8
[Y]- конечная матрица 8x8 - результат дискретного косинусного преобразования
[С], [CT]- матрицы 8x8 с коэффициентами преобразования DCT.
напоминаю, что CT означает транспонированную матрицу

Как Вы понимаете из формулы, нет нужды каждый раз заново считать коэффициенты DCT - они могут быть заранее вычислены и использоваться в виде констант. Диапазон значений для коэффициентов лежит на отрезке [-0.491, 0.491]. Человек, знакомый с азами программирования, уже задумался: неужели каждый раз проводятся вычисления с плавающей точкой, которые по скорости в разы медленнее, чем вычисления для целочисленной арифметики. Нет, этого не происходит, вычисления ведут в целочисленном виде, для хранения же и использования коэффициентов DCT используют следующую форму:

Cцел = округл (Спл. т.*M)
где M = 2m

Т.е. для хранения и вычислений используются целочисленные варианты коэффициентов. Естественно, в процессе вычисления используются 32-битные integer и после всех коммутативных перемножений и сумм, производится сдвиг вправо на 2*m позиций.
Собственно, m - параметр, связанный с величинами коэффициентов DC и его значение можно рассматривать как величину, явно кореллирующую с "DC precision" (при условии, что изменение точности AC не сильно скажется на общей точности - это показано в статье китайского автора Seehyun Kim), и мы можем перейти к непосредственному изучению влияния ее размера (в битах) на качество кодируемой картинки.

Сравнение погрешности преобразования

Первое, что пришло мне в голову, это сравнить результат преобразования с использованием целочисленных коэффициентов (с разной точностью, от 8 до 11 бит) с результатом, полученным с использованием коэффициентов с плавающей точкой. Для этого было взято 5 разных реальных изображений (фотографий), для простоты дальнейших исследований их ширина и высота были кратны 8. Над изображениями было произведено DCT: с коэффициентами в формате числа с плавающей точкой и с использованием коэффициентов в целочисленной форме с точностью 8, 9, 10 и 11 бит. Сравнение проводилось с использованием стандартного функционала:


Вид функционала сравнения

Вид функционала сравнения



где N - число сравниваемых значений (высота*ширину)
yпл.т - результат преобразования при использовании коэффициентов в формате чисел с плавающей точкой DCT
yцел - результат преобразования при использовании целочисленных коэффициентов DCT

В итоге получилась вот такая таблица:

DC
8
9
10
11
F
9.44
0.47
0.42
0.38


Ого! Неужели пробил час истины?! :) Но задумавшись над тем фактом, что, например, Canopus Procoder при DC precision=8 выдает вполне пристойную картинку, я начал искать, в чем же ошибся. Оказалось, что непосредственно моей ошибки нет, есть систематическая ошибка округления. Так как стандартная процедура ROUND делает округление до ближайшего целого, то использование ее может дать достаточно большую систематическую ошибку. Помня, что очень давно когда-то, создавая свой "доморощенный" модуль для JPEG, я использовал в нем генератор случайных чисел, я применил эту же методу и здесь. Выбор округления - в большую или меньшую сторону - стал случайным. Результат не заставил себя ждать.

DC
8
9
10
11
F
0.51
0.36
0.34
0.31


Неплохо? Но все равно точность 8 бит еще сильно проигрывает 9 и выше. Насколько я знаю, в коммерческих пакетах используется еще и сдвиг значений пикселей в исходной матрице на фиксированную величину. Тем самым достигается более равномерное распределение ошибки при DCT и 8 бит вполне имеет право на существование. Однако, отмечу, что выставление DC precision в 9 или 10 практически не влечет за собой увеличение размера кодирующегося потока, лишь увеличивает требования к системным ресурсам компьютера при кодировании. Поэтому, если хотите быть уверенными в качестве создаваемых MPEG-2/DVD - ставьте максимум! :)

Сравнение погрешности преобразования при разных битрейтах

Ну и теперь нам будет интересно взглянуть, при каких же битрейтах наиболее сильно влияние уменьшенной или увеличенной точности DCT: на высоких или на низких. Мы не будем специально кодировать несколько видеопотоков с разными битрейтами, мы просто проделаем достаточно простую вещь:
Над исходными изображениями (все те же пять фотографий) было проделаны в приведенном порядке следующие преобразования:
1. DCT (с использованием вероятностного округления. Увы, я не нашел точного алгоритма вычисления коэффицентов DCT, который применялся бы в одном из коммерческих алгоритмов)
2. Квантование с фиксированным квантизатором (от 2 до 32)
3. Деквантование
4. iDCT (обратное дискретное косинусное преобразование)
Фактически мы с помощью данной методики эмулируем кодирование/декодирование I-кадра в MPEG с использованием нескольких вариантов точности DC целочисленных коэффициентов, а также с использованием коэффициентов DC в формате с плавающей точкой.
Все, что нам осталось, это подобрать методику сравнения первоначальной картинки с кодированной/декодированной. Чтобы не надеяться на визуальное сравнение, используем стандартную формулу PSNR (peak signal to noise ratio):


Формула PSNR

Формула PSNR



где xперв - значение пикселя в первоначальном изображении
xобр - значение соответствующего пикселя в обработанном изображении

Значения PSNR для целочисленных коэффициентов DCT 8,9, 10 и 11 и для коэффициентов в формате плавающей точки приведены в следующей таблице:

DC 8 9 10 11 float
Q
2
45.94
48.07
48.62
49.01
49.53
4
44.57
45.22
45.69
45.97
46.24
8
41.25
41.73
41.91
42.08
42.31
16
37.31
37.65
37.79
37.91
37.98
32
33.57
33.73
33.80
33.85
33.91


Ну, что ж, какие выводы можно сделать из этой таблицы? Вывод напрашивается сразу: кодирование с DC precision = 8 (даже при условии продвинутых алгоритмов работы с коэффициентами) достаточно сильно снижает качество исходной картинки по сравнению с DC precision =9 или 10, причем на больших битрейтах это будет заметнее больше всего! Что в общем-то вполне согласуется с выводами исследования выше по тексту.
Впрочем отмечу, что теория хороша, а на практике может все быть по-иному, и PSNR не является мерилом определения визуального качества. Поэтому, как в военной поговорке "Что русскому счастье, то немцу - смерть". Поэтому, вкусы и взгляды отдельно взятого индивидуума могут не совпадать с результатами математических выкладок: Однако я надеюсь, что этот материал достигнет своей цели, а именно: объяснит "на пальцах", что такое DC precision, и добавит в Ваш активный багаж еще немного полезной информации, которая, быть может, наведет Вас на дальнейшие раздумья.

Резюмирую: качество Вашего видео всегда в Ваших руках. И не забывайте сами экспериментировать!

Использованная литература:

1. Фихтенгольц Г.М. "Основы математического анализа" - Учеб.для вузов - СПб.: Лань, 2001

2. Описание стандарта ITU-T H.262

3. Seehyun Kim "Fixed-Point Error Analysis and Word Length Optimization of 8x8 IDCT Architectures"

Автор благодарит:
Алексея Данилова (aka Drunkard) - за идеи и наводки
Станислава Чижика (aka che), Михаила Розова (aka RMM) и Ивана Королева (aka smallwolf) - за онлайн-обсуждение материала
 
Обсудить на форуме Обсудить на форуме      страницы : << 1 >>  




codecs.mediatory.ru

drivers.mediatory.ru

hardware.mediatory.ru

mobile.mediatory.ru

photo.mediatory.ru

software.mediatory.ru

sound.mediatory.ru

video.mediatory.ru

Видео Гид

kanst.mediatory.ru

Новости фотомира, секреты фотографии и фотографов

Фотоновости от PhotoGenius.Ru


G+ © 1999-2014   Цитирование и перепечатка материалов - только со ссылкой на сайт и уведомлением авторов.