реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> JPEG - Таблица квантования, Число со знаком?
DpInRock
сообщение Apr 24 2009, 14:48
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Кто вдруг сталкивался.
Цитата
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 перевожу (переполнения или наоборот), то ли все умирает на этапе деквантизации.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
blackfin
сообщение Apr 24 2009, 15:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(DpInRock @ Apr 24 2009, 18:48) *
Вот это все-таки отрицательное число, или нет?


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

DCT коэффициенты до и после квантования, ессно могут быть и отрицательными.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Apr 24 2009, 16:00
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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

Сообщение отредактировал DpInRock - Apr 24 2009, 16:29


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Apr 24 2009, 18:24
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Едрен, поменял IDCT с целочисленного на double - результат идентичный.

Значит дело в конечнм преобразвании из YBR в RGB.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Apr 24 2009, 23:51
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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

Переделал программу, чтобы проверить. Оставалось нажать build, как сломался компилятор. Только нашел гаечный ключ - кончился интернет. Месяц прошел - не заметил.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Apr 25 2009, 16:25
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Кто теперь соберется декодер джпег писать - отвечу на любые дурацкие вопросы. Заработало как надо наконец.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Dec 14 2010, 07:19
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(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;

Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 14 2010, 07:47
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Дык игнорируйте ошибки. Вот и не будет вылетать по ошибке.
А помехоустойчивость - это из другой оперы. Типа, сначала ошибки исправить, а потом декодировать...


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
boyko-alexey
сообщение May 9 2011, 21:09
Сообщение #9





Группа: Участник
Сообщений: 10
Регистрация: 28-02-09
Пользователь №: 45 475



Цитата(DpInRock @ Apr 25 2009, 20:25) *
Кто теперь соберется декодер джпег писать - отвечу на любые дурацкие вопросы. Заработало как надо наконец.

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

вроде нашёл - jpeg.zip - да?

Сообщение отредактировал boyko-alexey - May 10 2011, 06:58
Go to the top of the page
 
+Quote Post
DpInRock
сообщение May 10 2011, 05:32
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Выкладывал. Поищите тут.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
boyko-alexey
сообщение May 10 2011, 08:14
Сообщение #11





Группа: Участник
Сообщений: 10
Регистрация: 28-02-09
Пользователь №: 45 475



Код
PIC=(PIX *)0xA06A0000;//last 4K
Это привязка к какому-то конкретному МК?

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

Код
void JPEGDraw(int addr)
addr - адрес буфера, в котором лежит входной jpeg-файл?

Сообщение отредактировал boyko-alexey - May 10 2011, 08:33
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 16:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01454 секунд с 7
ELECTRONIX ©2004-2016