Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсова Стиснення зображення.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
7.16 Mб
Скачать

1.4. Стиснення без втрат

У багатьох додатках стиснення без втрат є єдино допустимим методом скорочення обсягу даних. Одним з таких додатків є архівація медичних або ділових документів, стиснення з втратами яких зазвичай заборонено за законом. Іншим є обробка супутникових зображень, де як застосування, так і вартість отримання вихідних даних роблять стиск небажаним. Ще одним напрямком є ​​цифрова рентгенологія, в якій втрата інформації може погіршити точність діагностики. У цих та інших областях потреба в стисненні зображень без втрат пояснюється конкретним використанням розглянутих зображень.

У цьому розділі увагу буде сконцентровано на використовуваних в даний час методах стиснення без втрат. Такі методи звичайно забезпечують ступінь стиснення в 2-10 разів. Більш того, вони однаково застосовні і до напівтоновим і до двійковим зображенням. Як відзначалося в Розділі 1.2, алгоритми стиснення без втрат зазвичай складаються з двох досить незалежних операцій: (1) розробка альтернативного уявлення зображення, в якому зменшена міжелементна надмірність, і (2) кодування отриманих даних для усунення кодової надмірності. Ці кроки відповідають операціям відображення і символьного кодування моделі джерела, яка розглядалася при обговоренні Рис. 1.6.

1.4.1. Нерівномірне кодування

Найбільш простим підходом до стиснення зображень без втрат є скорочення тільки кодової надмірності. Як правило, кодова надмірність присутня при будь-якому звичайному двійковому кодуванні значень елементів зображення. Як вже зазначалося в Розділі 1.1.1, вона може бути усунута кодуванням рівнів яскравості за умови мінімізації середнього числа біт, необхідного для подання значення одного елемента (1.1 -4). Щоб досягти цього, потрібна розробка нерівномірного коду, який найбільш імовірно рівнем яскравості присвоює самі короткі кодові комбінації. Нижче досліджуються кілька оптимальних і майже оптимальних методів побудови таких кодів, які формулюються на теоретико-інформаційному рівні. Зауважимо, що на практиці символами джерела можуть бути як значення яскравості зображення, так і виходи операцій їх відображення (різниці значень елементів, довжини серій і т.д.).

Кодування Хаффмана

Найвідоміший метод скорочення кодової надмірності був запропонований Хаффманом. При незалежному кодуванні символів джерела інформації, коди Хаффмана забезпечують найменше число кодових символів (бітів) на символ джерела. У термінах теореми кодування без шуму (Розділ 1.3.3), результат є оптимальним для фіксованого значення n, при умові, що символи джерела кодуються окремо.

Першим кроком у підході Хаффмана є побудова серії (безлічі рівнів) зредукованих джерел шляхом послідовності ймовірностей розглянутих символів і «склеювання» символів з найменшими ймовірностями в один символ, який буде заміщати їх у редукованому джерелі наступного рівня.

Рис.1.11. Модифікації джерела по Хаффману.

Цей процес ілюструється на Рис. 8.11 для двійкового кодування (аналогічно можуть бути побудовані К-символьні коди Хаффмана). У двох лівих колонках гіпотетичний набір символів джерела та їх ймовірності впорядковані зверху вниз у порядку знищення ймовірностей. Для формування першої редукції джерела, символи з найменшими ймовірностями - в даному випадку 0,06 і ​​0,04 - об'єднуються в деякий «складовий символ» з сумарною ймовірністю 0,1. Цей складовий символ і пов'язана з ним ймовірність поміщаютьються в список символів редукованого джерела, який знову упорядковується в порядку знищення значень отриманих ймовірностей. Цей процес повторюється до тих пір, поки не утвориться модифіковане джерело всього лише з двома, що залишилися символами (сама права колонка на малюнку).

Другий крок в процедурі кодування по Хаффману полягає в кодуванні кожного з модифікованих джерел, починаючи з джерела з найменшим числом символів (тобто правого на Рис. 1.11), і повертаючись назад до вихідного джерела. Для джерела з двома символами найменшим двійковим кодом є, звичайно, символи 0 і 1. Як показано на Рис. 1.12, ці символи приписуються символам джерела праворуч (вибір символів довільний - змінні 0 на 1 і навпаки дасть абсолютно той же результат). Оскільки символ поточного модифікованого джерела, що має ймовірність 0,6, був отриманий об'єднанням двох символів попереднього модифікованого джерела, то кодовий біт 0, вибраний для даного варіанта, приписується кожному з двох відповідних символів попереднього джерела, потім ці коди довільним чином доповнюються символами 0 і 1, для відмінності їх один від одного. Ця операція потім повторюється для модифікованих джерел всіх інших рівнів, поки не буде досягнутий рівень вихідного джерела. Результуючий код приведений в самій лівій колонці (Код) на Рис. 1.12. Середня довжина цього коду складе:

Рис. 1.12. Процедура побудови коду Хаффмана.

біта/символ.

Оскільки ентропія джерела дорівнює 2,14 біта/символ, то, згідно (1.3-21), ефективність коду Хаффмана складе 0,973.

Процедура Хаффмана будує оптимальний код для набору символів і їх ймовірностей за умови, що символи кодуються по одному. Після того, як код побудований, процес кодування/декодування здійснюється простим табличним перетворенням. Код Хаффмана є миттєвим однозначно декодіруемий блоковою кодом. Він називається блоковим кодом, оскільки кожен символ джерела відображається в фіксовану послідовність кодових символів. Він є миттєвим, тому що кожне кодове слово в рядку кодових символів може бути декодовано незалежно від подальших символів. Він є відповідно декодованим, тому будь-який рядок з кодових символів може бути декодована єдиним чином. Таким чином, будь-який рядок кодованих по Хаффману символів може декодувати аналізом окремих символів в рядку зліва направо. Для двійкового коду, представленого на Рис. 1.12, аналіз зліва направо показує, що в закодованому рядку 010100111100 першим правильно кодовим словом є 01010, яке є код для символу . Наступним правильним кодовим словом є 011, що відповідає символу . Продовжуючи ці дії, отримаємо декодоване повідомлення у вигляді .

Майже оптимальні нерівномірні коди

Побудова двійкового оптимального коду Хаффмана є незвичайним завданням, коли потрібно кодувати велику кількість символів. Для загального випадку J вихідних символів необхідно побудувати J - 2 редукцій джерела (див. Рис. 1.11) і виконати J - 2 привласнення коду (див. Рис. 1.12). Так, побудова оптимального коду Хаффмана для зображення з 256 рівнями яркостей, вимагає 254 редукції джерела і 254 присвоєння коду. Зважаючи на обчислювальну складність цього завдання, іноді доводиться жертвувати кодовою ефективністю для спрощення кодової комбінації.

У Таблиці 1.5 наведено чотири нерівномірних коди, які забезпечують такий компроміс. Зауважимо, що середня довжина коду Хаффана (див. останній рядок таблиці) менше, ніж у інших приведених кодів. Простий двійковий код має максимальну середню довжину. До того ж, швидкість коду в 4,05 біта/символ, що досягається методом Хаффмана, наближається до межі ентропії, рівної 4,0 біта/символ, підрахованої за формулою (1.3-3) і наведеної внизу таблиці. Хоча жоден з решти кодів, наведених у таблиці 1.5, не досягає ефективності коду Хаффмана, всі вони являються більш простими для побудови. Подібно коду Хаффмана, вони привласнюють самі короткі кодові слова найбільш імовірним символам джерела.

Таблиця 1.5. Нерівномірні коди.

  Стовпчик 5 Таблиці 1.5 відповідає простій модифікації основного методу кодування Хаффмана, назвається урізане кодування Хаффмана. Урізаний код Хаффмана будується тільки для найбільш ймовірних символів джерела, де . Для представлення інших (щодо рідкісних) символів джерела використовується код префікса, супроводжуваний кодом постійної довжини. У таблиці 1.5 значення було вибрано рівним 12, а префіксом було тринадцятого кодове слово коду Хаффмана. Тим самим «символ префікс-коду» був включений як 13-й (і останній) символ модифікованого кодового джерела з імовірністю, яка дорівнює сумі ймовірностей, що залишилися символів з до . Ці 9 символів потім кодировались при користуванні коду префікса, який виявився рівним , і 4-бітового двійкового коду, рівного індексу символу мінус 13.

У стовпці 6 Таблиці 1.5 наведено друга близька до оптимального нерівномірного коду, відомий як В-код. Він близький до оптимального, коли ймовірності символів джерела підкоряються степеневому закону виду з деякою позитивною константою .

Наприклад, розподілення довжин серій в двійковому поданні типового машинописного текстового документа близько експоненціальним. Як видно з Таблиці 1.5, кодове слово складене з бітів продовження, позначених С, і інформаційних бітів, які є двійковими числами. Єдиним завданням бітів продовження є поділ окремих кодових слів; для цього значення бітів продовження змінюються з 0 на 1 і навпаки для кожного кодового слова в рядку. В-код, представлений в Таблиці 1.5, називається -кодом тому, що за кожним бітом продовження йдуть два інформаційних біта. Послідовність -кодів, відповідних вихідній рядку символів буде виглядати наступним чином: 001 010 101 000 010 або 101 110 001 100 110, залежно від того, вибране чи значення першого біта продовження дорівнює 0 або 1.

Два нерівномірних коди, що залишилися в Таблиці 1.5 відносяться до зсувних кодів. Зсувний код формується послідовністю наступних операцій: (1) упорядкуванням вихідних символів в порядку убування їх ймовірностей, (2) поділом загального числасимволів на блоки рівних розмірів, (3) кодуванням символів всередині одного блоку і повторенням набору отриманих кодів для всіх решту блоків, (4) додавання спеціальних символів зсуву вгору і/або зсуву вниз для ідентифікації кожного з блоків. Всякий раз, коли декодер розпізнає символи зсуву, він переміщається на відовідне число блоків вгору або вниз по відношенню до основного блоку.

Щоб сформувати 3-бітовий двійковий зсувне код, використаний в колонці 7 Таблиці 1.5, вихідні символи (в кількості 21) спочатку були розташовані в порядку спадання їх ймовірностей і розділені на три блоки по 7 символів. Потім символи верхнього блоку - він розглядається як опорний блок - кодуються двійковим кодом із значеннями від 000 до 110. Восьмий двійковий код (111), не входяшіе в опорний блок, використовується як один символ зсуву вгору і ідентифікує блоки, що залишилися (в даному випадку символ зсуву вниз не використовується). Символи в останніх двох блоках кодуються за допомогою одного або двох символів зсуву в комбінації з двійковим кодом, побудованим для опорного блоку і поширеним на інші блоки. Наприклад, символ джерела буде закодовано як 111 111 100.

Зсувний код Хаффмана в колонці 8 Таблиці 1.5 формується схожим чином. Принципова різниця полягає в присвоєнні ймовірності зсувного символу ще до кодування основного блоку по Хаффману. Як правило, значення ймовірності зсувного символу підраховується як сума ймовірностей всіх символів поза основним блоком, а код зсувного символу визначається на основі тих же концепцій, що і префікс-код в урізаному коді Хаффмана. В даному випадку сума підраховується по вихідним символам і становить 0,39. Таким чином символ зсуву виявляється найбільщ імовірним символом і йому приписується одна з найкоротших кодових слів коду Хаффмана (0).

Арифметичне кодування

На відміну від розглянутих раніше нерівномірних кодів, арифметичне кодування створює неблоковие коди. В арифметичному кодуванні, історія якого може бути простежена аж до робот Елайеса, не існує однозначної відповідності між символами джерела і кодовими словами. Замість цього, вся послідовність символів джерела (тобто всі повідомлення) співвіднесена з одним арифметичним кодовим словом. Саме по собі кодове слово задає інтервал дійсних чисел між 0 і 1. Зі збільшенням числа символів в повідомленні, інтервал, необхідний для їх подання, зменшується, а число одиниць інформації (скажімо, бітів), необхідних для представлення інтервалу, збільшується. Кожен символ в повідомленні зменшує розмір інтервалу в відності з ймовірністю своєї появи. Оскільки метод не вимагає, як, наприклад, підхід Хаффмана, щоб кожен вихідний символ відображався в ціле число кодових слів (тобто щоб символи кодировались по одному), він досягає (у теорії) кордону, поставлений теоремою кодування без шуму ( див. Розділ 1.3.3).

На Рис. 8.13 проілюстрований основний процес арифметичного кодування. Тут кодується повідомлення з п'яти символів, утворене чотирьохсимвольним джерелом: . На початку процесу кодування передбачається, що повідомлення займає весь напіввідкритий інтервал [0, 1). Цей інтервал спочатку ділиться на чотири відрізка пропорційно ймовірностям символів джерела, які наведені в Таблиці 1.6. Символу , наприклад, відповідає подінтервал [0, 0,2). Оскільки це перший символ кодованого повідомлення, то значить, інтервал частини повідомлення ( ) буде звужений до [0, 0,2). На Рис. 1.13 отриманий інтервал розтягнутий на повну висоту малюнка, і наведені значення на його кінцях відповідають значенням вузького діапазону. Потім вузький діапазон також ділиться на відрізки, пропорційно ймовірностям символів джерела, і процес повторюється з наступним символом повідомлення. Таким чином, символ звузить подінтервал до [0,04, 0,08), - до [0,056, 0,072) і т.д. Останній символ повідомлення, який повинен бути зарезервований для спеціального індикатора закінчення повідомлення, звужує діапазон до [0,06752, 0,0688). Звичайно, будь-яке число в цьому підінтервалі - наприклад, 0,068 - може бути використано для подання повідомлення. 

Рис. 1.13. Процедура арифметичного кодування 

  

 Таблиця 1.6. Приклад арифметичного кодування. 

Повідомлення з п'яти символів, наведене на Рис. 1.13, після арифметичного кодування вимагає для запису всього трьох десяткових цифр. Це відповідає 3/5 або 0,6 десяткових знаків на символ джерела і вельми близько ентропії джерела, яка, со ¬ гласно (8.3-3), становить 0,58 десяткових знаків (десяткових одиниць) на символ. При збільшенні довжини кодованого послідовності, результуючий арифметичний код наближається до межі, поставленою теоремою кодування без шуму. На практиці два фактора заважають кодовим характеристикам наблизитися до даної границі впритул: (1) необхідність включення деякого символу закінчення, що дозволяє відокремлювати одну кодову послідовнність від іншої, і (2) використання арифметики кінцевої точності. Для подолання останньої проблеми, при практичній реалізації арифметичного кодування застосовуються стратегії масштабування і округлення. Згідно стратегії масштабування, кожен подінтервал перед розбиттям його на відрізки, пропорційні ймовірностям символів, розтягується до діапазону [0, 1). Стратегія округлення гарантує, що обмеження, пов'язані з кінцевою точністю обчислень, не перешкоджають точному поданню кодових підінтервалів.