8. Обробка та формування графічних файлів

 8.3. Стиснення графічних зображень

 

Растрові файли мають дуже великі розміри . Якщо знехтувати заголовками файла й іншими неграфічними даними, те його розмір пропорційний кількості пікселів у зображенні і кількості бітів, необхідних для представлення кожного пiксела. Повнокольорове зображення розміром 1024х768 пікселів займає більш двох мегабайт пам'яті, а одна секунда вiдеофільма телевізійної якості в растровому виді вимагає біля тридцятьох мегабайт. Тому жорсткий диск можна заповнити миттєво. Навіть компакт-диск, що вміщає біля 700 мегабайт даних, не настільки великий, щоб помістити такий об'єм інформації.  

Використовуючи метод, який називається стисненням зображень, можна різко зменшити в розмірі графічні файли. При стисненні графічної інформації використовуються спеціальні прийоми, що зменшують кількість байтів, необхідних для представлення зображення. Степінь стиснення залежить від методу стиснення і вмісту графічного файла . Як правило графічний файл стискується в п'ять і більш разів. Існують методи, що стискують ще сильніше, але з втратами якості . При відновленні зображення втрачається деяка частина колірної інформації. У підсумку, розпаковане зображення може стати злегка розмитим або знебарвленим.  

Методи стиснення растрової інформації діляться на дві великі групи: стиснення з втратами і стиснення без втрат. Методи стиснення без втрат дають більш низький коефіцієнт стиснення, але зате зберігають точне значення пікселів вихідного зображення. Методи з втратами дають більш високі коефіцієнти стиснення, але не дозволяють відтворити початкове зображення з точністю до піксела. Для файлів, які формуються програмами автоматизованого проектування, дуже важливо зберегти всю інформацію, тому що втрата хоча б одного біта може змінити зміст усього файла. Зовсім інша справа з растровими даними. Людське око не сприймає всі відтінки кольору в звичайному растровому зображенні. Таким чином, деякі деталі можуть бути опущені без видимого порушення інформаційного змісту зображення.  

Розглянемо два найбільш розповсюджені методи стиснення зображень. Спочатку познайомимося з одним із варіантів групового кодування (run-lenght encoding - RLE). Ідея методу полягає в тому, що послідовність значень, що повторюються, заміняється парою чисел: одне з них вказує на довжину групи (число повторень даного значення), а інше - на власне це значення. Це дуже загальний і дуже простий метод без втрат. Він використовується в багатьох популярних сьогодні форматах графічних файлів і, зокрема, у PCX і BMP. У його основі лежить той факт, що багато зображень надлишкові, оскільки містять велику кількість суміжних пікселів одного кольору. Розглянемо, наприклад, як за допомогою групового кодування стискається зображення, у якому зустрічається підряд 100 пікселів із нульовим значенням. Ця послідовність із 100 нулів кодується парою чисел (100,0). Отже такий фрагмент картинки скоротиться в п'ятдесят разів.  

Іншій методом, яким користуються досить часто, - JPEG ( метод, що стискує з утратами) одержав свою назву від абревіатури об'єднаної групи експертів в області фотографії (Joint Photographic Expert Group - JPEG), що його і розробила. JPEG широко використовується при стиснення статичних зображень . Цей метод істотно складніший, чим RLE. Основна ідея методу перебуває в поділі інформації в зображенні за рівнем важливості, і потім відкиданні менше важливої її частини, зменшуючи тим самим загальний об'єм збережених даних. Це досягається перетворенням матриці колірних значень у матрицю амплітуд, що відповідають визначеним частотам розкладання зображення. (Звукові коливання, наприклад, можна розкласти математичними методами на прості синусоїдальні гармоніки різних амплітуд і частот, що при додаванні відтворюють вихідний сигнал). Рядок або стовпець пікселів зображення теж можна представити амплітудами і частотами. Мова в даному випадку йде не про спектральний склад світла, а про форму представлення кривих, що утворять графіки, якщо значення пікселів служать ординатами. Відзначимо, що формула перетворення матриці пікселів у матрицю амплітуд не проста. JPEG-стиснення відкидає частину високочастотних компонент зображення, залишаючи компоненти з низькими частотами. Людське око менше критичне до високочастотних варіацій кольору, оскільки загальний вид зображення визначається низькими частотами. Значення піксела, отримане при відновленні зображення, дещо відрізняється від вихідного значення, тому що частина інформації була загублена, хоча звичайно вони дуже близькі.  

У методу JPEG є дуже цікава особливість: користувач може задавати коефіцієнт якості. Високий коефіцієнт якості дозволяє зберегти більше деталей, але при цьому зменшується ступінь стиснення. При низькому коефіцієнті якості степінь стиснення збільшується, але зображення стає менше чітким.  

Чим нижче коефіцієнт якості, тим більша кількість інформації відкидається.  

Коли любий із методів (RLE або JPEG) застосовується до повнокольорового зображення, то червона, зелена і синя компоненти стискуються незалежно. Якщо в растровому зображені використовується палітра або просто відтінки сірого, то значення пікселів можливо закодувати в один прохід.  

Розглянемо більш детально методи RLE і JPEG.

Алгоритм групового кодування  

Починаючи з першого рядка, програма групового кодування переглядає значення пікселів зліва праворуч і шукає відрізки пікселів, що повторюються. Всякий раз, коли зустрічаються три або більше пікселів, що йдуть підряд, з однаковим значенням, програма заміняє їх парою чисел: перше число вказує на довжину відрізка, друге - на значення пікселів. Число, що визначає довжину відрізка, називають міткою відрізка.  

Щоб ідентифікувати серії значень пікселів, що не повторюються, програма також уставляє мітки , що вказують на кількість таких значень у серії. Зарезервований біт необхідний для того, щоб можна було відрізнити мітку відрізка від мітки серії значень, що не повторюються. Наприклад, у 8-ми бітах можна задати послідовності довжиною до 127 пікселів; восьмий біт у кожній мітці може відрізняти відрізок від серії пікселів, що не повторюються . Точно так само обробляється кожний рядок пікселів і відрізки однакових значень пікселів стискуються у всьому зображенні.  

Графічна програма декодує зображення, зчитуюючи стиснутий файл і відновлює відрізки повторюваних значень пікселів. Зауважимо, що відновлене зображення цілком збігається з оригіналом.  

Алгоритм JPEG  

Насамперед програма поділяє зображення на блоки - матриці розміром 8х8 пікселів. При використанні методу JPEG час, що затрачається на стиснення зображення, пропорційний квадрату числа пікселів у блоці. Обробка декількох блоків меншого розміру робиться значно швидше, чим обробка всього зображення цілком.  

До значень пікселів застосовується формула, названа дискретним косинусоїдальним перетворенням (Discrete Cosine Transform - DCT). DCT переводить матрицю значень пікселів 8х8 у матрицю значень амплітуд тієї ж розмірності, що відповідає визначеним частотам синусоїдальних коливань. Лівий верхній кут матриці відповідає низьким частотам, а правий нижній - високим.  

Коефіцієнт якості, введений користувачем, використовується в простій формулі, що генерує значення елементів іншої матриці 8х8, яка називається матрицею квантування. Чим нижче коефіцієнт якості, тим більші значення будуть мати елементи матриці.  

Кожне значення в матриці, яка була сформована після DCT-перетворення, ділиться на відповідне значення з матриці квантування, потім округляється до найближчого цілого числа. Оскільки великі числа знаходяться в правій нижній половині матриці квантування, то основна частина високочастотної інформації зображення буде відкинута. Тому нижня права частина матриці пікселів буде перебувати в основному з нулів.  

Далі програма зчитує елементи матриці і кодує їх послідовно методами без втрат. Зауважимо, що стиснення істотно залежить від нулів у правій нижній половині матриці. Чим нижче коефіцієнт якості, тим більше нулів у матриці і, відповідно, тим вище ступінь стиснення.  

Декодування JPEG-зображення починається з кроку зворотного кодуванню без втрат, у результаті чого відновлюється матриця квантування пікселів.  

Значення з матриці пікселів перемножується на значення з матриці квантування, щоб відновити, наскільки це можливо, матрицю, що була обчислена на кроку застосування DCT. На етапі квантування була загублена деяка частина інформації, тому числа в матриці будуть близькі до початкових, але не буде абсолютного збігу.  

Зворотна до DCT формула (IDCT) застосовується до матриці для відновлення значень пікселів вихідного зображення. Ще разом відзначимо, що отримані кольори не будуть цілком відповідати початковим через втрату інформації на кроку квантування. Відновлене зображення, при порівнянні з оригіналом, буде виглядати декілька розмитим і знебарвленим.  

Алгоритм Хаффмана

Один з класичних алгоритмів. Використовує тільки частоту появи однакових байт в зображенні. Порівнює символів вхідного потоку, які зустрічаються більше число разів, ланцюжок біт меншої довжини. І навпаки - зустрічаються рідко - ланцюжок більшої довжини. Для збору статистики вимагає двох проходів по зображенню. Коефіцієнти стиснення: 1 / 8, 2 / 3, 1. Вимагає запису у файл таблиці відповідності кодуються символів і кодують ланцюжків. На практиці використовуються його різновиди. Так, в деяких випадках резонно або використовувати постійну таблицю, або будувати її "адаптивно", тобто в процесі архівації / розархівації. Ці прийоми позбавляють від двох проходів по зображенню і необхідності зберігання таблиці разом з файлом. Кодування з фіксованою таблицею застосовується як до останнього етапу архівації в JPEG.  

Близька модифікація алгоритму використовується при стисненні чорно-білих зображень. Послідовності поспіль йдуть чорних і білих крапок замінюються числом, рівним їх кількості з ознакою кольору. А цей ряд вже, у свою чергу, стискується по Хаффману з фіксованою таблицею. Алгоритм реалізований у форматі TIFF  

JBIG  

Алгоритм розроблений групою експертів ISO (-Joint Bi level Experts Group) спеціально для стиснення однобітних чорно-білих зображень. Наприклад, факсів або відсканованих документів. У принципі може застосовуватися і до 2-х, і до 4-х двійкового картинок. При цьому алгоритм розбиває їх на окремі бітові площині. JBIG дозволяє управляти такими параметрами, як порядок розбиття зображення на бітові площині, ширина смуг в зображенні, рівні масштабування. Остання можливість дозволяє легко орієнтуватися в базі великих за розмірами зображень, переглядаючи спочатку їх зменшені копії. Настроюючи ці параметри, можна використовувати цікавий ефект при отриманні зображення по мережі або з будь-якого іншому каналу, пропускна здатність якого мала в порівнянні з можливостями процесора. Розпаковуватися зображення на екрані буде поступово, як би повільно "проявляючись". При цьому людина починає аналізувати зображення задовго до кінця процесу розархівації.  

Алгоритм побудований на базі Q-кодувальника, патент на який володіє IBM. Q-кодер також, як і алгоритм Хаффмана, використовує для частіше з'являються символів короткі ланцюжки, а для рідше з'являються довгі. Однак, на відміну від нього, в алгоритмі використовуються і послідовності символів. Характерною особливістю JBIG є різке зниження ступеня стиснення при підвищенні рівня шумів вхідний картинки.  

Фрактальний стиск

Ця група алгоритмів, мабуть, є найбільш перспективною і розвивається зараз найбільш бурхливо. Перші практичні результати були отримані зовсім недавно - у 1992 році - і виробили приголомшливе враження. Коефіцієнт стискування у фрактальних алгоритмів варіюється в межах 2-2000. Причому великі коефіцієнти досягаються на реальних зображеннях, що, взагалі кажучи, нетипово для попередніх алгоритмів. Крім того, при розархівації зображення можна масштабувати. Унікальна особливість цього алгоритму полягає в тому, що збільшене зображення не дробиться на квадрати. Під фрактального стиснення використовується принципово нова ідея - не близькість квітів у локальній області, а подібність різних за розміром областей зображення. Це, безумовно, найбільш прогресивний підхід на сьогоднішній день. Алгоритм орієнтований на повнокольорові зображення і зображення в градаціях сірого кольору.  

Його особливістю є потреба в колосальних обчислювальних потужностях за архівації. При цьому розпаковування вимагає менше обчислень, ніж у JPEG.

Контрольні  Запитання.

1.  Для чого виконують стиск графічних файлів?  

2.  Які основні підходи до стиску вам відомі?  

3.  Дайте характеристику обчислювальному процксу при стиску методом JPEG.

     Зміст