8) Конечный шаг - кодирование Хаффмана
Сначала ВАЖНОЕ примечание: Вместо хранения фактической величины, JPEG стандарт определяет, что мы храним минимальный размер в битах, в котором мы можем держать эту величину (это названо категория этой величины) и затем битно кодированное представление этой величины подобно этому:
Величины | Категория | Биты для величины |
0 -1,1 -3,-2,2,3 -7,..,-4,4,..,7 -15,..,-8,8,..,15 -63,..,-32,32,..,63 -31,..,-16,16,..,31 -127,..,-64,64,..,127 -255,..,-128,128,..,255 -511,..,-256,256,..,511 -1023,..,-512,512,..,1023 -2047,..,-1024,1024,..,2047 -4095,..,-2048,2048,..,4095 -8191,..,-4096,4096,..,8191 -32767,..,-16384,16384,..,32767 -16383,..,-8192,8192,..,16383 | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | - 0,1 00,01,10,11 000,001,010,011,100,101,110,111 0000,..,0111,1000,..,1111 00000,..,01111,10000,..,11111 . . . . . . . . . . |
Впоследствии для предшествующего примера:
(0,57); (0,45); (4,23); (1,-30); (0,-8); (2,1); (0,0)
давайте закодируем ТОЛЬКО правую величину этих пар, кроме пар, которые являются специальными маркерами подобно (0,0) или (если мы должны иметь) (15,0)
57 - в категории 6 и это – битно кодированный 111001, так что мы закодируем это как (6,111001)
45, аналогично, будет закодирован как (6,101101)
23 -> (5,10111)
-30 -> (5,00001)
-8 -> (4,0111)
1 -> (1,1)
И теперь, мы напишем снова строку пар:
(0,6), 111001; (0,6), 101101; (4,5), 10111; (1,5), 00001; (0,4), 0111; (2,1), 1; (0,0)
Пары 2 величин, заключенные в скобки, могут быть представлены в байте, так как фактически каждая из 2 величин может быть представлена в 4-битном кусочке (счетчик предшествующих нулей - всегда меньше, чем 15 и также как и категория [числа закодированные в файле JPG - в области -32767..32767]). В этом байте, старший кусочек представляет число предшествующих нулей, а младший кусочек - категорию новой величины, отличной от 0.
КОНЕЧНЫЙ шаг кодировки состоит в кодировании Хаффмана этого байта, и затем записи в файле JPG, как поток из битов, кода Хаффмана этого байта, сопровождающийся битовым представлением этого числа.
Например, для байта 6 (эквивалент (0,6)) у нас есть код Хаффмана = 111000;
для байта 69 = (4,5) (например) у нас есть 1111111110011001
21 = (1,5) — 11111110110
4 = (0,4) — 1011
33 = (2,1) — 11011
0 = EOB= (0,0) — 1010
Конечный поток битов записанных в файле JPG на диск для предшествующего примера 63 коэффициентов (запомните, что мы пропустили первый коэффициент) -
111000 111001 111000 101101 1111111110011001 10111 11111110110 00001
1011 0111 11011 1 1010
Кодирование коэффициента DC
DC является коэффициентом на квантованном векторе соответствующем самой низкой частоте в образе (это - 0 частота), и (перед квантованием) - математически = (сумма 8x8 составляющих)/8. (Это - подобно средней величине для этого блока образцов изображения). Сказано, что он содержит много энергии, присутствующей в исходном изображении блока 8x8. (Обычно, это большие величины). Авторы JPEG стандарта обращали внимание, что есть очень близкое соотношение между коэффициентом DC последовательных блоков, так что они решили кодировать в файле JPG различие между DC последовательными блоками 8x8 (Примечание: последовательные блоки 8x8 одинаковых компонентов изображения, подобно последовательным блокам 8x8 для Y, или последовательные блоки для Cb, или для Cr)
Diff = DCi – DCi-1; Так DC текущего блока (DCi) равен: DCi = DCi-1 + Diff
Декодируя JPG, Вы начнете с 0 - Вы рассмотрите первым коэффициентом DC = 0;
DC0 = 0
А затем Вы добавите к текущей величине величину, декодированную из JPG (Diff величину)
Так, в файле JPG, первый коэффициент = коэффициент DC является действительно отличительным, и это – Хаффман-кодирование отличается от кодирования коэффициентов AC.
Здесь это - как это сделано: (Запомните, что мы теперь кодируем Diff величину)
Diff предшествует, как Вы видели, представлению категории и, это – бит-кодированное представление. В файле JPG будет Хаффманом закодирована только величина категории, подобно этому:
Diff = (Категория, битно кодированное представление)
Затем Diff будет закодирован как (код_Хаффмана (категория), битно кодированное представление)
Например, если Diff равняется -511, тогда Diff соответствует
(9, 000000000)
Допустим, что 9 имеет код Хаффмана = 1111110 (В файле JPG, есть 2 таблицы Хаффмана для каждого компонента изображения: для DC и для AC)
В файле JPG, биты соответствующие коэффициенту DC будут:
1111110 000000000
И, относившийся к этому примеру DC и в предшествующем примере AC, для этого вектора с 64 коэффициентами, КОНЕЧНЫЙ ПОТОК БИТОВ, записанных в файле JPG, будет:
1111110 000000000 111000 111001 111000 101101 1111111110011001 10111
11111110110 00001 1011 0111 11011 1 1010
(В файле JPG, сначала закодировано DC, затем AC)
ДЕШИФРАТОР ХАФФМАНА (краткий итог)
для 64 коэффициентов (Единиц Данных) компонента изображения (Например Y)
Так, когда Вы декодируете поток битов с изображения в файле JPG, Вы сделаете:
Инициализируйте DC = 0.
Сначала декодируйте коэффициент DC:
Выберите правильный код Хаффмана (проверьте, существует ли он в DC таблице Хаффмана).
Посмотрите, какой категории этот код Хаффмана соответствует.
Пусть N равно категории битов, и определите, какая величина представлена (категория, выбранные биты N) = Diff
DC + = Diff
Запишите DC в 64 вектор: "вектор[0]=DC"
Декодируйте 63 коэффициента AC:
- ДЛЯ каждого коэффициента AC ДО ТЕХ ПОР, ПОКА (EOB достигнут ИЛИ AC_счетчик=64)
Выберите правильный код Хаффмана (проверьте существование в таблице Хаффмана)
Декодируйте этот код Хаффмана: Код Хаффмана соответствует (число предшест 0,категория)
[Помните: EOB достигнут = ВЕРНО, если (число предшест 0, категория) = (0,0)]
Пусть N равно категории битов, и определите, какая величина представлена (категория, выбранные биты N) = AC коэффициент
Запишите в 64 векторе, число нулей = число предшест 0
Увеличьте AC счетчик на число предшест 0 (число предшествующих нулей)
Запишите AC коэффициент в векторе: "вектор[AC счетчик]=AC коэффициент"
Следующие Шаги
Так, теперь у нас есть вектор из 64 элементов.
Мы сделаем возобновление шагов представленных в этом док.:
Выполните обратное квантование для 64 вектора:
"для (i=0; i<=63; i++) вектор[i]*=квант[i]"
Перестройте 64 элемента из зигзагообразного вектора в блок 8x8
Примените обратное DCT-преобразование в блок 8x8
Повторите предыдущие операции [дешифратор Хаффмана, шаги 1), 2) и 3)]
для каждого блока 8x8 каждого компонента образа (Y,Cb,Cr).
Обработайте, если требуется
Сдвиньте по уровню величины (добавьте 128 ко всем 8-битовых знаковым величинам в блоках 8x8, полученным IDCT-преобразованием (обратным DCT))
Преобразуйте YCbCr в RGB
- И... JPG изображение
JPEG Маркеры и/или как организована информация изображения в файле JPG
(Байтовый уровень)
ПРИМЕЧАНИЕ: JPEG/JFIF файловый формат использует формат Motorola для целых (двухбайтовых) значений, НЕ формат Intel, то есть: сначала старший байт, затем - младший (например: двухбайтовое целое значение FFA0 будет записано в JPEG файле в порядке: FF в младшем смещении, A0 в старшем смещении)
Стандарт JPG определяет, что JPEG файл сформирован в основном из частей, названных "сегментами". Сегмент является потоком байтов с длиной <= 65535. Сегментное начало определяется маркером. Маркер = 2 байта, начиная с 0xFF (C-шестнадцатеричная запись для 255), и заканчивая байтом, отличным от 0 и 0xFF. Например: 'FFDA', 'FFC4', 'FFC0'. Каждый маркер имеет значение: второй байт (отличный от 0 и 0xFF) определяет функцию этого маркера. Например, есть маркер, который определяет, что Вы должны запускать декодирование процесса, это обозначается (стандартная терминология JPG): SOS = Начало Сканирования = 'FFDA'
Другой маркер, названный DQT = Определение Таблицы Квантования = 0xFFDB, определяет, что в файле JPG, после маркера (и после 3 байтов, дополнительно об этом позже) следуют 64 байта = коэффициенты таблицы квантования.
Если, в течение обработки файла JPG, Вы встречаете 0xFF, затем снова байт, отличный от 0 (Я сообщил Вам, что второй байт маркера - не 0) и этот байт не имеет значение маркера (Вы не можете найти маркер, соответствующий этому байту), тогда байт 0xFF, который Вы встретили, должен игнорироваться и пропускаться. (В некоторых JPG-файлах, последовательности последовательных 0xFF - для некоторого заполнения и должны пропускаться)
Вы видите, что всякий раз, когда Вы встречаете 0xFF, Вы проверяете следующий байт и смотрите, имеет ли значение маркера или должно быть пропущено. Что случается, если нам действительно нужно кодировать байт 0xFF в файле JPG как *обычный* байт (не маркер или заполнение)? (Допустим, что нам нужно писать код Хаффмана, который начинается с 11111111 (8 битов 1) на перестановке байтов) Стандарт сообщает, что мы просто делаем следующий байт 0, и пишем последовательность 'FF00' в файл JPG. Так, когда Ваш дешифратор JPG встречает 2-байтовую последовательность 'FF00', он должен рассмотреть ее как обычный байт 0xFF.
Другая вещь: Вы понимаете, что эти маркеры являются выровненными по байту в файле JPG. Что случается, если в течение вашего кодирования Хаффмана и, включая биты в файловых байтах JPG, Вы не завершили включать биты в байт, но Вам нужно писать маркер, который является выровненным по байту? Для перестановки байтов маркеров, Вы УСТАНАВЛИВАЕТЕ ОСТАЛЬНЫЕ БИТЫ ДО НАЧАЛА СЛЕДУЮЩЕГО БАЙТА НА 1, тогда Вы пишите маркер в следующем байте.
Короткое объяснение некоторых важных маркеров, содержащихся в файле JPG.
SOI = Начало Изображения = 'FFD8'
Этот маркер должен присутствовать в любом файле JPG *однажды* в начале файла. (Любой файл JPG начинается с последовательности FFD8.)
EOI = Конец Изображения = 'FFD9'
Подобно EOI: любой файл JPG заканчивается на FFD9.
RSTi = FFDi (где i - значения 0..7) [RST0 = FFD0, RST7=FFD7]
= Маркеры Перезапуска
Эти маркеры перезапуска используются для синхронизации. В регулярных нтервалах, они появляются в потоке JPG байтов, в течение декодирования процесса (после SOS)
(Они появляются в порядке: RST0 - интервал - RST1 - интервал - RST2 -...
...- RST6 - интервал - RST7 - интервал - RST0 -...)
(Замечание: Большинство JPG-файлов не имеет маркеров перезапуска)
Проблема с этими маркерами – в том, что они прерывают нормальный битовый порядок в Хаффман-кодированном битовом потоке JPG. Запомните, что для байтового выравнивания маркеров остальные биты устанавливаются на 1, так что Ваш дешифратор должен пропустить в регулярные интервалы бесполезные биты заполнения (установленные в 1) и маркеры RST.
Маркеры...
В конце этого документа, я включил очень хорошее письменное техническое объяснение JPEG/JFIF файлового формата, записанное Oliver Fromme, автором QPEG-просмотрщика. Там Вы найдете довольно хорошее и полное определение для маркеров.
Но, во всяком случае, здесь - список маркеров, которые Вы должны проверять:
SOF0 = | Начало Кадра 0 | = FFC0 |
SOS = | Начало Сканирования | = FFDA |
APP0 = | Маркер для идентификации файла JPG, который использует JFIF спецификацию | = FFE0 |
COM = | Комментарий | = FFFE |
DNL = | Определение Количество Строк | = FFDC
|
DRI = | Определение Интервала Перезапуска | = FFDD
|
DQT = | Определение Таблицы Квантования | = FFDB
|
DHT = | Определение Таблицы Хаффмана | = FFC4
|
Таблица Хаффмана, сохраненная в файле JPG
Здесь - как JPEG содержит дерево Хаффмана: вместо дерева, он определяет таблицу в файле JPG после DHT (Определение Таблицы Хаффмана) маркера. ПРИМЕЧАНИЕ: длина кодов Хаффмана ограничивается 16 битами.
В основном есть 2 типа таблиц Хаффмана в файле JPG: одна для DC и одна для AC (действительно есть 4 таблицы Хаффмана: 2 для DC, AC для яркости и 2 для DC, AC цветоразности)
Они сохраняются в файле JPG в том же формате, который состоит из:
16 байтов:
байт i содержит число кодов Хаффмана длины i (длина в битах)
i изменяется от 1 до 16
Таблица с длиной (в байтах) = Si=1 число кодов длины i
которая содержит в позиции [k][j] (k в 1..16, j в 0..(число кодов с длиной k-1)) БАЙТОВУЮ величину, связанную с j-ым кодом Хаффмана длины k. (Для фиксированной длины k, величины сохранены, отсортированными по величине кода Хаффмана).
В этой таблице Вы можете найти фактический код Хаффмана, связанный с конкретным байтом.
Например: (Примечание: количество кодов для данной длины - здесь для этого конкретного примера, чтобы считать это, они могут иметь любые другие величины)
ДОПУСТИМ что,
Для длины 1 мы имеем число_кодов[1]=0, мы пропускаем эту длину
Для длины 2 у нас есть 2 кода 00
01
Для длины 3 у нас есть 3 кода 100
101
110
Для длины 4 у нас есть 1 код 1110
Для длины 5 у нас есть 1 код 11110
Для длины 6 у нас есть 1 код 111110
Для длины 7 у нас есть 0 кодов – пропускаем
(если у нас был 1 код для длины 7, мы должны иметь 1111110)
Для длины 8 у нас есть 1 код 11111100 (Вы видите, что код все еще перемещается на оставленное, хотя мы пропустили кодовую величину для 7)
.....
Для длины 16,... (та же вещь)
Я сообщил Вам, что в таблице Хаффмана в файле JPG загружены БАЙТОВЫЕ величины для данного кода.
Для этого конкретного примера кодов Хаффмана:
Допустим, что в таблице Хаффмана в файле JPG на диске мы имеем (после тех 16 байтов, которые содержат число кодов Хаффмана с данной длиной):
45 57 29 17 23 25 34 28
Эти величины соответствуют конкретным длинам, которые я Вам дал перед этим, в кодах Хаффмана это будет:
нет величины для кода длины 1
для кодов длины 2 : у нас есть 45 57
для кодов длины 3 : 3 величины (например : 29,17,23)
для кодов длины 4 : только 1 величина (например: 25)
для кодов длины 5 : 1 величина (например: 34)
...
для кода длины 7, снова никакая величина, переходим к коду с длиной 8
для кода длины 8 : 1 величина 28
ВАЖНОЕ примечание:
Для кодов длины 2:
величина 45 соответствует коду 00
57 соответствует коду 01
Для кодов длины 3:
величина 29 соответствует коду 100
17 соответствует коду 101
23 соответствует коду 110
И Т.П...
(Я сообщил Вам, что для данной длины байтовые величины хранятся в порядке увеличения величины кода Хаффмана.)
Четыре таблицы Хаффмана соответствуют DC и AC таблицам яркости, и DC и AC таблицам для цветоразности, даются в приложении JPEG стандарта как предложение для шифратора. Стандарт сообщает, что эти таблицы протестированы с хорошими результатами сжатия для многих изображений и рекомендует их, но шифратор может использовать любую другую таблицу Хаффмана. Много шифраторов JPG используют эти таблицы. Некоторые предлагаются на Ваш выбор: оптимизация энтропии - если возможно, используйте таблицы Хаффмана, оптимизированные для этого конкретного изображения.
JFIF (Jpeg Формат Взаимозаменяемого Файла) файл
JPEG стандарт (что в файле itu-1150.ps) как-нибудь очень обобщенный, JFIF реализация является конкретным случаем этого стандарта (и он является, конечно, совместимым со стандартом). JPEG стандарт определяет некоторые маркеры, зарезервированные для приложений (под приложениями я подразумеваю конкретные случаи осуществления стандарта) Эти маркеры названы APPn, где n изменяется от 0 до 0xF; APPn = FFEn. JFIF спецификация использует маркер APP0 (FFE0), чтобы идентифицировать файл JPG, который использует эту спецификацию. Вы увидите в JPEG стандарте, что он имеет отношение к "компонентам образа". Эти компоненты образа могут быть (Y,Cb,Cr) или (YIQ) или все, что угодно. JFIF реализации использует только (Y,Cb,Cr) для цветного JPG, или только Y для монохромного JPG.
Показатели (факторы) дискретизации
Примечание: следующее объяснение раскрывает кодировку цветных (3 компонента) JPG-файлов; для черно-белых JPG-файлов есть один компонент (Y), который - обычно никак необработанный совсем, и не требует любого обратного преобразования подобно инверсии (Y,Cb,Cr) -> (R,G,B). Впоследствии, черно-белые JPG-файлы - самые простейшие для декодирования: для каждого блока 8x8 в изображении Вы делаете декодирование Хаффмана кодированного вектора RLC, который затем Вы преобразовываете из зигзага, деквантуете 64 вектор и, наконец, Вы применяете к нему обратное DCT и прибавляете 128 (сдвиг уровня) к новым величинам 8x8.
Я сообщил Вам, что компоненты изображения обработаны. Обычно Y взято для каждый пикселя, и Cb, Cr взяты для блока пикселей 2x2. Но есть некоторые JPG-файлы, в которых Cb, Cr взяты для каждого пикселя, или некоторые JPG-файлы где Cb, Cr взяты для каждых 2 пикселей (горизонтальная дискретизация на 2 пикселях, и вертикальная дискретизация на каждом пикселе) Показатели дискретизации для компонента образа в файле JPG определяются в отношении (относительном) в самом высшем показателе дискретизации.
Вот показатели дискретизации для наиболее обычного примера: Y взято на каждый пиксель, и Cb, Cr взяты для блока пикселей 2x2 (JFIF спецификация дает формулу для показателей дискретизации, которая я думаю, что работает только когда максимальный показатель дискретизации для каждого измерения X или Y <=2) JPEG стандарт не определяет показатели дискретизации.
Вы видите, что Y будет иметь самую высшую частоту дискретизации:
Горизонтальный показатель дискретизации = 2 = HY
Вертикальный показатель дискретизации = 2 = VY
Для Cb, Горизонтальный показатель дискретизации = 1 = HCb
Вертикальный показатель дискретизации = 1 = VCb
Для Cr, Горизонтальный показатель дискретизации = 1 = HCr
Вертикальный показатель дискретизации = 1 = VCr
Действительно эта форма определения показателей дискретизации вполне полезна. Вектор 64 коэффициентов для компонента изображения, кодированных Хаффманом, назван
DU = Единица Данных (стандартная терминология JPEG)
В файле JPG, порядок кодировки Единиц Данных:
закодируйте Единицу Данных для первого компонента изображения:
для (счетчик_y=1; счетчик_y<=VY; счетчик_y++)
для (счетчик_x=1; счетчик_x<=HY; счетчик_x++)
{ кодировать Единицу Данных для Y }
закодируйте Единицу Данных для второго компонента изображения:
для (счетчик_y=1; счетчик_y<=VCb ; счетчик_y++)
для (счетчик_x=1; счетчик_x<=HCb; счетчик_x++)
{ кодировать Единицу Данных для Cb }
наконец, для третьего компонента, аналогично:
для (счетчик_y=1; счетчик_y<=VCr; счетчик_y++)
для (счетчик_x=1; счетчик_x<=HCr; счетчик_x++)
{ кодировать Единицу Данных для Cr }
Для примера я дал Вам (HY=2, VY=2; HCb=VCb =1, HCr, VCr=1) здесь это – цифра:
YDU YDU CbDU CrDU
YDU YDU
(YDU - Единица Данных (DU) для Y, и аналогично CbDU DU для Cb, CrDU = DU для Cr) Эта обычная комбинация показателей дискретизации обозначается 2:1:1 как для вертикальных, так и для горизонтальных показателей дискретизации.
И, конечно, в файле JPG порядок кодирования будет:
YDU,YDU,YDU,YDU,CbDU,CrDU
Вы знаете, что DU (64 коэффициента) определяют блок величин 8x8, таким образом, здесь мы определили кодирующий порядок для блока пикселей изображения 16x16 (Пиксель изображения (Y,Cb,Cr)): Четыре блока 8x8 величин Y (4 YDUs), один блок 8x8 величин Cb (1 CbDU) и один блок 8x8 величин Cr (1 CrDU)
(Hmax = Максимальный горизонтальный показатель дискретизации, Vmax = максимальный вертикальный показатель дискретизации) Впоследствии для этого примера показателей дискретизации (Hmax = 2, Vmax=2), шифратор должен обрабатывать ОТДЕЛЬНО каждый 16x16 = блок пикселей образа (Hmax*8 x Vmax*8) в упомянутом порядке.
Этот блок пикселей изображения размерами (Hmax*8,Vmax*8) называется, в стандартной терминологии JPG, MCU = Минимальная Кодированная Единица.
Для предшествующего примера: MCU = YDU,YDU,YDU,YDU,CbDU,CrDU
Другой пример показателей дискретизации:
HY =1, VY =1
HCb=1, VCb=1
HCr=1, VCr=1
Цифра/порядок: YDU CbDU CrDU
Вы видите, что здесь определены пиксель образа блока 8x8 (MCU) с 3 8x8 блоками:
один для Y, один для Cb и один для Cr (Совсем нет обработки)
Здесь (Hmax=1, Vmax=1) MCU имеет измерение (8,8), и MCU = YDU,CbDU,CrDU
In the JPG file, the sampling factors for every image component are defined after the marker SOF0 = Start Of Frame 0 = FFC0
Для черно-белых JPG-файлов Вы не должны побеспокоиться о порядке кодировки единиц данных в MCU. Для этих JPG, MCU = 1 Единица Данных (MCU = YDU)
В файле JPG, показатели дискретизации для каждого компонента образа определены после маркера SOF0 = Начало Кадра 0 = FFC0
Краткая схема декодирования файла JPG
Дешифратор читает из файла JPG показатели дискретизации, он обнаруживает размеры MCU (Hmax*8,Vmax*8) => сколько MCU - в целом изображении, затем декодирует каждую MCU, присутствующую в исходном изображении (цикл для всех этих блоков, или пока не обнаружится маркер EOI [это должно обнаружиться, когда кончится цикл, в противном случае Вы получите неполное изображение]) - он декодирует MCU, декодируя каждую Единицу Данных в MCU в порядке упомянутом перед этим, и наконец, пишет расшифрованный цветной блок пикселей (Hmax*8 x Vmax*8) в (R,G,B) буфер изображения.
Видео MPEG-1 и JPEG
Интересная часть спецификации MPEG-1 (и вероятно MPEG-2) - то, что она полагается сильно на JPEG спецификацию. Он использует много понятий, представленных здесь. Причина в том, что каждые 15 кадров, или, когда это нужно, есть независимый кадр названный I-кадр (Интра фрейм), который JPEG закодирован. (Между прочим, блок 16x16 пикселей изображения в примере, который я Вам дал, называется, в стандартной терминологии MPEG, макроблок) За исключением алгоритмов для компенсации движения, видео MPEG-1 положились во многом на спецификацию JPG (DCT-преобразование, квантование, и т.п.)
Техническое объяснение JPEG/JFIF файлового формата,
записанного Oliver Fromme, автором QPEG-просмотрщика
JPEG/JFIF формат файла:
заголовок (2 байта): $ff, $d8 (SOI) (эти два идентифицируют JPEG/JFIF файл)
для JFIF файлов, сегмент APP0 немедленно следует за маркером SOI, смотрите ниже
любое число "сегментов" (подобно IFF (Image File Format) кускам), смотрите ниже
хвостовик (2 байта): $ff, $d9 (EOI)
Формат сегмента:
заголовок (4 байта):
$ff идентифицирует сегмент
n тип сегмента (один байт)
sh, sl размер сегмента, включая эти два байта, но не включая $ff и байт типа. Примечание, не порядок Intel: сначала старший байт, затем младший байт!
содержимое сегмента, максимум 65533 байта.
Примечания:
Есть сегменты без параметров (обозначенные '*'), которые не имеет спецификацию размера (и никакого содержания), просто $ff и байт типа.
Любое число $ff байтов между сегментами легальное и должно быть пропущено.
Типы сегментов:
*TEM = $01 | Обычно вызывает ошибки декодирования, может быть проигнорировано |
SOF0 = $c0 | Начало Кадра (Baseline JPEG), относительно деталей смотрите ниже |
SOF1 = $c1 | dito |
SOF2 = $c2 | Обычно неподдерживаемый |
... |
|
SOF9 = $c9 | Для арифметического кодирования, обычно не поддерживается |
SOF10 = $ca | Обычно неподдерживаемый |
… |
|
DHT = $c4
| Определение Таблицы Хаффмана, относительно деталей смотрите ниже |
JPG = $c8 | Неопределенный/зарезервированный (вызывает ошибки декодирования) |
DAC = $cc | Определение Арифметической Таблицы, обычно не поддерживается |
*RST0 = $d0 | RSTn используются для синхронизации, может быть проигнорировано |
… |
|
*RST7 = $d7 |
|
SOI = $d8 | Начало Изображения |
EOI = $d9 | Конец Изображения |
SOS = $da | Начало Сканирования, относительно деталей смотрите ниже |
DQT = $db | Определение Таблицы Квантования, относительно деталей смотрите ниже |
DNL = $dc | Обычно неподдерживаемый, игнорировать |
DRI = $dd | Определение Интервала Перезапуска, относительно деталей смотрите ниже |
APP0 = $e0 | JFIF маркеры сегментов приложения, относительно деталей смотрите ниже |
APP15 = $ef | Игнорировать |
COM = $fe | Комментарий, относительно деталей смотрите ниже |
Все другие типы сегментов резервируются и должны быть проигнорированы (пропущены).
SOF0: Начало Кадра 0:
$ff, $c0 (SOF0)
длина (старший байт, младший байт), 8+components*3
точность данных (1 байт) в битах/единицу, обычно 8 (12 и 16 не поддерживается большинством программного обеспечения)
высота изображения (2 байта, High-Low), должно быть >0, если DNL не поддерживается
ширина изображения (2 байта, High-Low), должно быть >0, если DNL не поддерживается
количество компонентов (1 байт), обычно 1 = черно-белый, 3 = цвет YCbCr или YIQ, 4 = цвет CMYK)
для каждого компонента: 3 байта
идентификатор компонента (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)
показатели дискретизации (бит 0-3 вертикальной, 4-7 горизонтальной)
номер таблицы квантования
Замечания:
JFIF использует также 1 компонент (Y, черно-белое изображение) или 3 компонента (YCbCr, иногда называемое YUV, цветное).
APP0: JFIF маркер сегмента:
$ff, $e0 (APP0)
длина (старший байт, младший байт), должна быть >= 16
'JFIF'#0 ($4a, $46, $49, $46, $00), идентифицирует JFIF
номер общей версии, должен быть 1 (в противном случае ошибка)
номер подверсии, должен быть 0..2 (в противном случае попытка декодирования по-другому)
единица для x/y разрешения:
0 = нет никаких единиц, x/y-отношение определяет соотношение аспекта
1 = x/y-разрешение в точках/дюйм
2 = x/y-разрешение в точках/сантиметр
x-разрешение (старший байт, младший байт), должно быть <> 0
y-разрешение (старший байт, младший байт), должно быть <> 0
ширина предварительного просмотра (1 байт)
высота предварительного просмотра (1 байт)
n байт для предварительного просмотра (RGB 24 бит) n = ширина*высота*3
Замечания:
Если нет 'JFIF'#0, или длина <16, тогда это - вероятно не JFIF сегмент и должен быть проигнорирован.
Нормально единицы=0, x-разрешение=1, y-разрешение=1, означает, что отношение числа точек - 1:1 (равномерно масштабированное).
JFIF файлы с предварительным просмотром встречаются очень редко, предварительный просмотр может обычно быть проигнорирован. Если нет предварительного просмотра, тогда ширина=0 и высота=0.
Если длина не соответствует размеру предварительного просмотра, можно выдать предупреждение, затем продолжить декодирование.
DRI: Определение Интервала Перезапуска:
$ff, $dd (DRI)
длина (старший байт, младший байт), должна быть = 4
интервал перезапуска (старший байт, младший байт) в единицах блоков MCU, означает, что каждые n блоков MCU может быть найден маркер RSTn.
Первый маркер будет RST0, затем RST1 и т.п., после RST7 повторится с RST0.
DQT: Определение Таблицы Квантования:
$ff, $db (DQT)
длина (старший байт, младший байт)
информация о таблице квантования (1 байт):
биты 0..3: номер таблицы (0..3, в противном случае ошибка)
биты 4..7: точность таблицы, 0 = 8 бит, в противном случае 16 бит
n байт таблицы n = 64*(точность+1)
Замечания:
Единственный сегмент DHT может содержать несколько таблиц, каждая со своим собственным байтом информации.
COM: Комментарий:
$ff, $fe (COM)
длина (старший байт, младший байт) комментария = L+2
Комментарий = байтовый поток длиной L
SOS: Начало Сканирования:
$ff, $da (SOS)
длина (старший байт, младший байт), должна быть 6+2*(количество компонентов сканирования)
количество компонентов сканирования (1 байт), должно быть >=1 и <=4 (в противном случае ошибка), обычно 1 или 3
для каждого компонента: 2 байта
идентификатор компонента (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q), смотри SOF0
использование таблицы Хаффмана:
биты 0..3: таблица AC (0..3)
биты 4..7: таблица DC (0..3)
3 байта, которые должны игнорироваться
Замечания:
Данные об изображении (данные сканирования) следуют сразу за сегментом SOS.
Yandex.RTB R-A-252273-3
- 2.4.3 Ацп с плавающей точкой……………………………………………
- 1 Цифровые фильтры
- 1.1 Явление Гиббса
- 1.1.1 Сущность явления Гиббса
- 1.1.2 Параметры эффекта
- 1.1.3 Последствия для практики
- 1.2 Весовые функции
- 1.2.1 Нейтрализация явления Гиббса в частотной области
- 1.2.2 Основные весовые функции
- 1.3 Типы фильтров
- 1.4 Разностное уравнение
- Нерекурсивные фильтры
- 1.5.1 Методика расчетов нцф
- 1.5.2 Идеальные частотные фильтры
- 1.5.3 Конечные приближения идеальных фильтров
- 1.5.3.1 Применение весовых функций
- 1.5.3.2 Весовая функция Кайзера
- 1.5.4 Дифференцирующие цифровые фильтры
- 1.5.5 Гладкие частотные фильтры
- 1.6 Рекурсивные фильтры
- 6.3 Интегрирующий рекурсивный фильтр.
- 1.6.1 Принципы рекурсивной фильтрации
- 1.6.2 Режекторные и селекторные фильтры
- 1.6.2.1 Комплексная z-плоскость.
- 1.6.2.2 Режекторные фильтры
- 1.6.2.3 Селекторный фильтр
- 1.6.3 Билинейное z-преобразование
- 1.6.4 Типы рекурсивных частотных фильтров
- 1.7 Импульсная характеристика фильтров
- Передаточные функции фильтров
- 1.9 Частотные характеристики фильтров
- 1.10 Частотный анализ цифровых фильтров
- 1.10.1 Сглаживающие фильтры и фильтры аппроксимации
- 1.10.1.1 Фильтры мнк 1-го порядка (мнк-1)
- 1.10.1.2 Фильтры мнк 2-го порядка (мнк-2)
- 1.10.1.3 Фильтры мнк 4-го порядка
- 1.10.2 Разностные операторы
- 1.10.2.1 Разностный оператор
- 1.10.2.2 Восстановление данных
- 1.10.2.3 Аппроксимация производных
- 1.10.3 Интегрирование данных
- 1.10.4 Расчёт фильтров по частотной характеристике
- 1.11 Фильтрация случайных сигналов
- 1.12 Структурные схемы цифровых фильтров
- Обращенные формы.
- 1.13 Фильтры Чебышева
- 1.14 Фильтры Баттерворта
- Свойства фильтров Баттерворта нижних частот:
- 1.15 Фильтры Бесселя
- 2 Аналого-цифровое преобразование
- 2.1 Цифровая обработка звуковых сигналов
- 2.2 Основы аналого-цифрового преобразования
- 2.2.1 Основные понятия и определения
- 2.3 Структура и алгоритм работы цап
- Контрольные вопросы
- 2.4 Структура и алгоритм работы ацп
- 2.4.1 Параллельные ацп
- 2.4.2 Ацп с поразрядным уравновешиванием
- 2.4.3 Ацп с плавающей точкой
- Контрольные вопросы
- Глава 3. Звук.
- 3.1 Аудиосигнал
- 3.1.1 Звуковые волны
- 3.1.2 Звук как электрический сигнал
- 3.1.3 Фаза
- 3.1.4 Сложение синусоидальных волн
- 3.2 Звуковая система
- 3.2.1 Назначение звуковой системы
- 3.2.2 Модель звуковой системы
- 3.2.3 Входные датчики
- 3.2.4 Выходные датчики
- 3.2.5 Простейшая звуковая система
- 3.3 Амплитудно-частотная характеристика
- 3.3.1 Способы записи ачх в спецификации звуковых устройств
- 3.3.2 Октавные соотношения и измерения
- 3.3.3 Ачх реальных устройств воспроизведения звука
- 3.3.4 Диапазон частот голоса и инструментов
- 3.3.5 Влияние акустических факторов
- 3.4 Единицы измерения, параметры звуковых сигналов
- 3.4.1 Децибел
- 3.4.2 Относительная мощность электрических сигналов дБm
- 3.4.3 Децибелы и уровень звука
- 3.4.5 Громкость, уровень сигнала и коэффициент усиления
- 3.4.6 Громкость
- 3.5 Динамический диапазон
- 3.5.1 Запас динамического диапазона
- 3.5.2 Выбор динамического диапазона для реальной звуковой системы
- 3.6 Цифровой звук
- 3.6.1 Частота дискретизации
- 3.6.2 Разрядность
- 3.6.3 Дизеринг
- 3.6.4 Нойс шейпинг
- 3.6.5 Джиттер
- 3.7 Методы и стандарты передачи речи по трактам связи, применяемые в современном оборудовании (7 кГц)
- 3.7.1 Импульсно-кодовая модуляция (pcm — Pulse-Code Modulation)
- 3.7.3 Помехоустойчивость методов икм
- 3.7.4 Методы эффективного кодирования речи
- 3.7.5 Кодирование речи в стандарте cdma
- 3.7.6 Речевые кодеки для ip-телефонии
- 3.7.7 Оценка качества кодирования речи
- 3.8 Общие сведения по мр3
- 3.8.1 Феномен мрз
- 3.8.2 Что такое формат мрз?
- 3.8.3 Качество записи мрз
- 3.8.4 Формат мрз и музыкальные компакт-диски
- 3.8.5 Работа со звукозаписями формата мрз
- 3.9 Основные понятия цифровой звукозаписи
- 3.9.1 Натуральное цифровое представление данных
- 3.9.2 Кодирование рсм
- 3.9.3 Стандартный формат оцифровки звука
- 3.9.4 Параметры дискретизации
- 3.9.5 Качество компакт-диска
- 3.9.6 Объем звукозаписей
- 3.9.7 Формат wav
- 3.10 Формат mp3
- 3.10.1 Сжатие звуковых данных
- 3.10.2 Сжатие с потерей информации
- 3.10.3 Ориентация на человека
- 3.10.4 Кратко об истории и характеристиках стандартов mpeg.
- 3.10.5 Что такое cbr и vbr?
- 3.10.6 Каковы отличия режимов cbr, vbr и abr?
- 3.10.7 Методы оценки сложности сигнала
- 3.10.8 Какие методы кодирования стерео информации используются в алгоритмах mpeg (и других)?
- 3.10.9 Какие параметры предпочтительны при кодировании mp3?
- 3.10.10 Какие альтернативные mpeg-1 Layer III (mp3) алгоритмы компрессии существуют?
- 3.11 OggVorbis
- 3.13 Flac
- 4 Сжатие видео
- 4.1 Общие положения алгоритмов сжатия изображений
- 4.1.1 Классы изображений
- 4.1.2 Классы приложений
- 4.1.3 Требования приложений к алгоритмам компрессии
- 4.1.4 Критерии сравнения алгоритмов
- 4.2 Алгоритмы сжатия
- Gif (CompuServe Graphics Interchange Format)
- 4.3 Вейвлет-преобразования
- 4.3.1 Вейвлеты, вейвлет-преобразования, виды и свойства Вейвлет анализ и прямое вейвлет-преобразование
- Непрерывное прямое и обратное вейвлет-преобразования
- Ортогональные вейвлеты
- Дискретное вейвлет-преобразование непрерывных сигналов
- Кратномасштабный анализ
- Пакетные вейвлеты.
- 4.3.2 Примеры применения вейвлетов Очистка сигнала от шума
- Очистка сигнала от шумов на основе вейвлет-преобразований.
- 4.4 Формат сжатия изображений jpeg
- 2) Дискретизация
- 3) Сдвиг Уровня
- 4) 8X8 Дискретное Косинусоидальное Преобразование (dct)
- 5) Зигзагообразная перестановка 64 dct коэффициентов
- 6) Квантование
- 7) RunLength кодирование нулей (rlc)
- 8) Конечный шаг - кодирование Хаффмана
- 4.5 Jpeg2000
- 4.5.1 Общая характеристика стандарта и основные принципы сжатия
- 4.5.2 Информационные потери в jpeg2000 на разных этапах обработки
- 4.5.3 Практическая реализация
- 4.5.4 Специализированные конверторы и просмотрщики
- 4.5.5 Основные задачи для развития и усовершенствования стандарта jpeg2000
- 4.6 Видеостандарт mpeg
- 4.6.1 Общее описание
- 4.6.2 Предварительная обработка
- 4.6.3 Преобразование макроблоков I-изображений
- 4.6.4 Преобразование макроблоков р-изображений
- 4.6.5 Преобразование макроблоков в-изображений
- 4.6.6 Разделы макроблоков
- 4.7 Mpeg-1
- Параметры mpeg-1
- 4.8 Mpeg-2
- 4.8.1 Стандарт кодирования mpeg-2
- 4.8.2 Компрессия видеоданных
- 4.8.3 Кодируемые кадры
- 4.8.4 Компенсация движения
- 4.8.5 Дискретно-косинусное преобразование
- 4.8.6 Профессиональный профиль стандарта mpeg-2
- 4.9.11 Плюсы и минусы mpeg-4
- 4.10 Стандарт hdtv