Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: JPEG - Таблица квантования
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
DpInRock
Кто вдруг сталкивался.
Цитата
5.2.2.3.1 Quantization. Quantization is accomplished by dividing each DCT coefficient value by the
quantization table value for that coefficient and rounding the result. The quantized DCT coefficient values
are signed, two's complement integers with 11-bit precision for 8-bit input precision and 15-bit precision
for 12-bit input precision.


Сие не прибавило знаний.

Иногда в таблице квантизации появляются байты с установленным старшим битом. Вот это все-таки отрицательное число, или нет?

Просто сейчас ловлю мелкие недочеты в отображении JPG. Ищу где может быть потеря точности (считаю все целочисленно).

Пытаюсь понять наличие мелких цветовых артефактов на некоторых файлах. То ли я где-то не достаточно правильно YBR в RGB перевожу (переполнения или наоборот), то ли все умирает на этапе деквантизации.
blackfin
Цитата(DpInRock @ Apr 24 2009, 18:48) *
Вот это все-таки отрицательное число, или нет?


Значения Qvu в таблице кватнования, ессно строго положительные, см. напр. стр.143, Табл. K1,K2.

DCT коэффициенты до и после квантования, ессно могут быть и отрицательными.
DpInRock
Ага. Наверное, да. Спасибо.
Тут просто накопипастил джпег декодер из разных источников. Сложные по виду картинки хорошо воспроизводит, а какие-то простенькие (тиап векторной графики) - иногда с артефактами. Анализировал - у таких картинок большое количество составляющих (обычно зеленый) убегает за границу (0-255). Причем, сильно убегает. До 50-70 единиц. И чаще всего - в меньше нуля.
--
Ага. Если сжато было 1:1 (0x11 - subsampling), то артефактов нет.
А если не 1:1, то артефакты есть. И они представляют собой просто сильно усиленные реальные артефакты. Т.е. если на сжатом изображении присутствуетнекая бледно-красная полосочка (еле заметная), то на моем - эта полосочка - ОГОГО!. Такие артефактывозникают исключительно на границах цветов. Резких границах.
DpInRock
Едрен, поменял IDCT с целочисленного на double - результат идентичный.

Значит дело в конечнм преобразвании из YBR в RGB.
DpInRock
Вот это да. Неужели, если есть субсампплинг, то порядок следования битов в блоке меняется? От краев к центру?

Переделал программу, чтобы проверить. Оставалось нажать build, как сломался компилятор. Только нашел гаечный ключ - кончился интернет. Месяц прошел - не заметил.
DpInRock
Кто теперь соберется декодер джпег писать - отвечу на любые дурацкие вопросы. Заработало как надо наконец.
_4afc_
Цитата(DpInRock @ Apr 25 2009, 19:25) *
Кто теперь соберется декодер джпег писать - отвечу на любые дурацкие вопросы. Заработало как надо наконец.


Декодер в принципе написан и работает, но теперь хотелось бы улучшить помехозащищённость связки кодер-декодер (оба свои).
В частности сейчас если встречается ошибка в huffman, то JPEG декододируется только до этого квадратика и дальше вылетает по ошибке.

Вопрос в том, нельзя ли создать декодер или что-то добавить в кодер, чтоб билась лишь часть изображения?

Сейчас вылетает по sequential_huffman в данном декодере:

Код
for (i=1; i<=vertical_mcus; i++)
    {
        for (j=1; j<=horizontal_mcus;j++)
        {
        last_mcu_row = (i == vertical_mcus) ? 1 : 0;
        last_mcu_column = (j == horizontal_mcus) ? 1 : 0;

        if ((flag == 1) && (successive_approximation_bit_position_high == 0))
                clear_buffer (mcu_buffer, mcu_size);
            else
                copy_data (coefficient_buffer, mcu_buffer, mcu_size);
                
            for (k=0; k<number_of_image_components_in_frame; k ++)
            {
                vertical_sampling_factor = jpeg_decoder_structure->vertical_sampling_factor [k];
                horizontal_sampling_factor = jpeg_decoder_structure->horizontal_sampling_factor [k];

                quantization_table_destination_selector = jpeg_decoder_structure ->
                    quantization_table_destination_selector [k];

                quantization_table = jpeg_decoder_structure ->
                    quantization_table [quantization_table_destination_selector];

                for (l=0; l<vertical_sampling_factor; l++)
                {
                    for (m=0; m<horizontal_sampling_factor; m++)
                    {
                        if (flag)
                        {
                            tmp = sequential_huffman (jpeg_decoder_structure, mcu_buffer, k);
                            if (tmp != SUCCESS)    return tmp;
                            if (sof == SOF2) copy_data (mcu_buffer, coefficient_buffer, 64);
                        }

                        idct_F (temporary_buffer, mcu_buffer, quantization_table);
                        

                    }
                }
            }

            mcu_buffer = jpeg_decoder_structure -> mcu_buffer;
            copy_output400 ((void *)&mcu_buffer[0], external_image_buffer);
            jpeg_decoder_structure -> restarts_to_go --;
            restart_interval = jpeg_decoder_structure -> restart_interval;

            if (!(last_mcu_row & last_mcu_column))
            {
                if (restart_interval)
                {
                    if (jpeg_decoder_structure -> restarts_to_go == 0)
                    {
                        tmp = read_restart_marker (jpeg_decoder_structure);
                        if (tmp != SUCCESS)    return tmp;
                    }
                }
            }
        external_image_buffer += jpeg_decoder_structure -> increment1/2;
        }
    external_image_buffer += jpeg_decoder_structure -> increment2/2;
    }
return SUCCESS;

DpInRock
Дык игнорируйте ошибки. Вот и не будет вылетать по ошибке.
А помехоустойчивость - это из другой оперы. Типа, сначала ошибки исправить, а потом декодировать...
boyko-alexey
Цитата(DpInRock @ Apr 25 2009, 20:25) *
Кто теперь соберется декодер джпег писать - отвечу на любые дурацкие вопросы. Заработало как надо наконец.

Приветствую!
sam7s64 + ls020(дисп. от сотика) - леплю вскую фигню biggrin.gif BMP-шки смотрю с флешки, хочу JPEG.
Дурацкий вопрос: исходниками не поделитесь? а то пока smile3046.gif

вроде нашёл - jpeg.zip - да?
DpInRock
Выкладывал. Поищите тут.
boyko-alexey
Код
PIC=(PIX *)0xA06A0000;//last 4K
Это привязка к какому-то конкретному МК?

Код
xPutPixel
Я должен использовать свою ф-цию вывода на экран? или для начала в буфер?

Код
void JPEGDraw(int addr)
addr - адрес буфера, в котором лежит входной jpeg-файл?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.