Генерация элементов AC из файла JPEG - PullRequest
2 голосов
/ 19 декабря 2011

Я декодирую файл JPEG.Я сгенерировал таблицы Хаффмана и таблицы квантования, и я дошел до того, что мне нужно декодировать элементы постоянного и переменного тока.Например, допустим, у меня есть следующие данные

FFDA 00 0C 03 01 00 02 11 03 11 00 3F 00 F2 A6 2A FD 54 C5 5F FFD9

Если мы игнорируем несколько байтов маркера SOS, мои реальные данные начинаются с F2 байта.Итак, давайте запишем его в двоичном виде (начиная с байта F2):

1111 0010 1010 0110 0010 1010 1111 1101 0101 0100 1100 0101 0101 1111
  F    2    A    6   2     A    F    D    5    4    C    5    5   F

При декодировании первым элементом является элемент DC яркости, поэтому давайте расшифруем его.

[1111 0]010 1010 0110 0010 1010 1111 1101 0101 0100 1100 0101 0101 1111
  F    2    A    6   2     A    F    D    5    4    C    5    5   F

Итак, 11110 - это код Хаффмана (в моем случае) для элемента 08.Это означает, что следующие 8 бит являются моим значением постоянного тока.Когда я беру следующие 8 битов, значение равно:

1111 0[010 1010 0]110 0010 1010 1111 1101 0101 0100 1100 0101 0101 1111
  F    2    A    6   2     A    F    D    5    4    C    5    5   F

Значение элемента постоянного тока равно -171.

Вот моя проблема: следующее - значение переменного тока яркости, но я не совсем понимаюстандарт в случае, когда переменный ток не равен нулю?Tnx!

1 Ответ

4 голосов
/ 22 декабря 2011

Значения постоянного тока, как вы видели, определяются как количество «дополнительных» битов, которые указывают положительное или отрицательное значение постоянного тока.Коэффициенты переменного тока кодируются по-разному, поскольку большинство из них равны 0. Таблица Хаффмана определяет каждую запись для коэффициентов переменного тока со значением «пропуск» и длиной «дополнительных битов».Значение пропуска - это количество коэффициентов переменного тока, которые необходимо пропустить до сохранения значения, а дополнительные биты обрабатываются так же, как значения постоянного тока.При декодировании коэффициентов переменного тока вы декодируете значения от 1 до 63, но способ завершения кодирования MCU может отличаться.Фактическое значение может храниться в индексе 63 или при индексе> 48 вы можете получить ZRL (нулевая длина цикла = 16 нулей) или любую комбинацию, которая приведет вас к концу.Упрощенный цикл декодирования:

void DecodeMCU(signed short *MCU)
{
int index;
unsigned short code, skip, extra;

   MCU[0] = decodeDC();
   index = 1;
   while (index < 64)
   {
      code = decodeAC();
      skip = code >> 4; // skip value
      extra = code & 0xf; // extra bits
      index += skip;
      MCU[index++] = calcACValue(extra);
   }
}

Компоненты цвета могут чередоваться (типично) или храниться в отдельных сканированных изображениях.Элементы кодируются в зигзагообразном порядке в каждом MCU (сначала низкочастотные элементы).Количество блоков коэффициентов 8x8, которые определяют MCU, варьируется в зависимости от цветовой подвыборки.Для 1: 1 будет 1 Y, затем 1 Cr и 1 Cb.Для типичных изображений с цифровых камер горизонтальная ось является субдискретизированной, поэтому вы получите 2 блока Y, за которыми следуют 1 Cr и 1 Cb.Настройка качества сжатого изображения определяет используемую таблицу квантования и количество кодированных нулевых коэффициентов переменного тока.Чем ниже качество, тем больше у каждого MCU будет нулей.Когда вы выполняете обратный DCT на вашем MCU, количество нулей будет определять, сколько деталей сохраняется в вашем блоке пикселей 8x8, 16x8, 8x16 или 16x16.Вот основные этапы:

1) Энтропийное декодирование блоков коэффициентов 8x8, каждый компонент цвета сохраняется отдельно
2) Разглаживание и деквантование коэффициентов
3) Выполнение обратного DCT прикоэффициенты (может быть 6 блоков 8x8 для подвыборки 4: 2: 0)
4) Преобразовать цветовое пространство из YCrCb в RGB или что вам нужно

...