Методы сжатия данных
Годовой спецкурс ВМиК МГУ, 2005-2006
     

Задание №3. Компрессор текстур

Начало: 30 ноября 2005 года.
Конец: 14 декабря 2005 года

Цель задания

Необходимо написать программу, которая умеет сжимать изображение и распаковывать его, используя алгоритмы сжатия текстур, разбиравшиеся на лекции (S3TC, FXT1, CD, STF-8, STF-12), и ваши собственные алгоритмы.

Описание задания

Введение

Задача - достичь как можно большего качества при реализации S3TC и как можно лучшего соотношения качества к размеру при реализации своего алгоритма сжатия текстур. При этом основное требования - распаковка любой части изображения - должна соблюдаться.

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

Замер будет проводиться в двух номинациях:

  • Реализация базового S3TC.
  • Сжатие с использованием своего алгоритма.

Все результаты (с фамилиями авторов) будут сведены на двумерные графики - сжатие/качество.

Размер изображения - задается декомпрессору извне (т.е. сжатое изображение сохраняется БЕЗ заголовка). Все тестовые картинки будут с изображениями, кратными 8 по обоим измерениям и 24 бита на компоненту.

Реализовывать Альфа-канал не надо.

Формат файла для S3TC был задан на лекции. Его надо выдержать. (Т.е. программа одного человека должна распаковывать сжатый файл другого).

Программа должна работать с блоками размером 4х4 или 8х8, причем для своего алгоритма сжатые блоки также ОБЯЗАНЫ БЫТЬ ВЫРОВНЕНЫ ПО ГРАНИЦЕ БАЙТА.

Пример: разделение файла со сжатым изображением на 4 равные части, распаковка каждой части, а потом склеивание полученных 4 изображений по вертикали должно давать ту же картинку, что и распаковка исходного файла. (Естественно размер изображения при таком тесте будет кратен 16 или 32, а при распаковке даваться правильные размеры).

Т.е. вырезанная из сжатого изображения его произвольная часть должна распаковываться корректно. (Например из изображения 512х512 можно вырезать байты соответствующие любому квадрату 128х128 - и все должно декомпрессироваться правильно).

Желательна оптимизация по скорости.

За первое место в любой номинации (после собеседования по алгоритму) - большие дополнительные баллы.

За второе и третье место - дополнительные баллы.

Если файл распаковывается с артефактами (картинку невозможно узнать), компрессор падает или работает более 3 минут - результат дисквалифицируется.

Для повышения соотношения степени сжатия в своем алгоритме рекомендуется использовать следующие методы:

  1. Использование более сложного алгоритма интерполяции цвета в палитре. Можно использовать:
    • Интерполяцию между несколькими точками (3,4 и т.д.)
    • Интерполяцию вдоль яркости
    • Большее количество интерполированных точек и т.д.
  2. Использование большего размера блока (4х8, 8х8) и более сложных разбиений блока.
    • Использование своей палитры и своего алгоритма заполнения в каждой части блока или разбиения. (Как это сделано в FXT1 или STF-8, STF-12).
      • Использование "сохранения битов между строк" для определения типа блока.
        • Использование "дожатия палитры" и "дожатия индексов".

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

          Выполнение данного задания позволяет получить баллы, необходимые для получения высокой оценки за курс.

          ВНИМАНИЕ! Баллов, набираемых на экзамене (письменном) по курсу будет недостаточно для положительной оценки. Т.е. необходимо выполнить УСПЕШНО хотя бы одно задание.

          Обязательная часть задания

          Реализация базового варианта S3TC.

          Программа должна уметь получать на вход BMP файл и по опции -с - сжимать его, по опции -d распаковывать.

          Те, кто не реализовывал работу с BMP, подсказки по работе с ним смотрите в материалах задания по фрактальному сжатию.

          Программа должна быть консольным приложением и запускаться для изображения 512х512 так:

               tex_compress -c -s3 image.bmp out_file.s3tc
               tex_compress -d -s3 out_file.s3tc out_image.bmp 512 512
            

          При декомпрессии сначала задается ширина, потом - высота. Обратите внимание - минус перед параметром означает, что это опция.

          Т.е. тестовый файл test.bat вида:

               tex_compress -c -s3 image1.bmp out_file1.s3tc
               tex_compress -d -s3 out_file1.s3tc out_image1.bmp 512 512
               tex_compress -c -s3 image2.bmp out_file2.s3tc
               tex_compress -d -s3 out_file2.s3tc out_image2.bmp 640 480
               tex_compress -c -s3 image3.bmp out_file3.s3tc
               tex_compress -d -s3 out_file3.s3tc out_image3.bmp 320 240
               tex_compress -c -s3 image4.bmp out_file4.s3tc
               tex_compress -d -s3 out_file4.s3tc out_image4.bmp 256 256
               tex_compress -c -s3 image5.bmp out_file5.s3tc
               tex_compress -d -s3 out_file5.s3tc out_image5.bmp 128 128
            

          должен сжимать 5 тестовых изображений (image1.bmp, ... image5.bmp) с размерами 512х512, 640х480 и т.д.

          Для оценки качества будет использоваться разница между исходным и распакованным изображениями.

          Дополнительная часть задания

          Реализация своего алгоритма сжатия текстур.

          С ним ваша программа должна уметь выполнять тестовый файл test_.bat вида:

               tex_compress -c -my image1.bmp out_file1.tex
               tex_compress -d -my out_file1.tex out_image1.bmp 512 512
               tex_compress -c -my image2.bmp out_file2.tex
               tex_compress -d -my out_file2.tex out_image2.bmp 640 480
               tex_compress -c -my image3.bmp out_file3.tex
               tex_compress -d -my out_file3.tex out_image3.bmp 320 240
               tex_compress -c -my image4.bmp out_file4.tex
               tex_compress -d -my out_file4.tex out_image4.bmp 256 256
               tex_compress -c -my image5.bmp out_file5.tex
               tex_compress -d -my out_file5.tex out_image5.bmp 128 128
            

          Если вы реализуете 2 своих алгоритма (под разную степень сжатия), то второй должен включаться опцией -m2

               tex_compress -c -m2 image1.bmp out_file1.tex
               tex_compress -d -m2 out_file1.tex out_image1.bmp 512 512
            

          Степень сжатия в своем варианте рекомендуется выдержать в тех же пределах, что у S3TC (т.е. 6 раз, либо 8 у второй реализации) для того, чтобы было проще оценить прогресс в качестве.

          Литература

          1. Описание можно найти в материалах лекций.
          2. http://www.fit.com.ru/Surveys/TextureCompression/index.htm

          Требования к программе

          Главное требование - выполнить обязательную часть задания.

          Язык реализации – С или С++

          Программа обязательно должна быть консольной (НИКАКОГО ИНТЕРФЕЙСА - обычный компрессор). Писать интерфейс вам потребуется позднее при обработке видео, всему свое время.

          За использование чужих исходных текстов или совместное написание - программы всех участников будут сниматься с замеров, и будет выставляться 0 баллов. В качестве альтернативы желающим все-таки получить нормальную оценку будет предложено реализовать более сложный алгоритм.

          Программа должна устойчиво работать с изображениями с размерами, кратными 8, в формате BMP и режиме RGB 24 бита на точку.

          Программа должна быть оптимизирована по скорости, т.е. если на вход ей дать изображение 512х512, то на Pentium4-1700 она должна гарантированно обработать его за 5 минут.

          Не укладываетесь - уменьшайте перебор. Если 6 прогонов с разным качеством на 5 изображениях будут работать больше 2.5 часов - то ваши работы будет достаточно сложно проверять.

          Внимательно изучите требования к сдаваемым работам на сайте. В частности 0 баллов ставится, если вы забудете исходные тексты.

          Оформление работы

          ZIP-архив с исходными текстами и исполняемыми файлами, названный по схеме GGG_Z_V_nnnnnnnn.zip (где G - трехзначный номер группы, Z - номер задания, V - номер версии задания, nnnnnnnn - номер студенческого билета) присылайте на

          Например, студент 306 группы с номером студенческого билета 05015042, сдающий обновленную (вторую) версию программы по третьему заданию, должен прислать архив с именем 306_3_2_05015042.zip.

          Также смотрите здесь, какие файлы нам присылать и как их оформить

          НЕ ЗАБУДЬТЕ ПОЛОЖИТЬ В АРХИВ файл readme.txt.

          Главная | О курсе | Лекции | Библиотека | Задания | Оценки | FAQS
            (с) Лаборатория компьютерной графики, 1997-2005
          Дизайн: Алексей Игнатенко