Зміна роздільної здатності шляхом інтерполяції зображення. Чи потрібна вам інтерполяція? Приклад обертання зображення

Порівняння програми RAISR з іншими передовими методами підвищення роздільної здатності зображень. Більше прикладів див. у супровідних матеріалах до наукової статті

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

На практиці можливості подібних програмнабагато скромніше. Наприклад, 29 жовтня 2016 року на GitHub виклали програму Neural Enhance, яка підвищує дозвіл фотографій за допомогою нейромережі. Програма одразу увійшла до списку найпопулярніших репозиторіїв за тиждень.


Приклад роботи Neural Enhance


Ще один приклад роботи програми Neural Enhance, яка опублікована в відкритому доступіна GitHub

Співробітники Google Research також працюють у цьому напрямку - в офіційному блозі компанії вчора розповіли про метод підвищення дозволу, який назвали RAISR (Rapid and Accurate Image Super-Resolution).

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

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

Співробітники Google використовували метод машинного навчанняна зовнішніх зразках. Цей метод отримав велику популярність у Останніми рокамита описаний у багатьох наукових працях. Основний принцип полягає в тому, щоб «передбачати» зміст зображення в високому дозволіщодо його зменшеної копії. Для такого навчання використовують стандартний метод навчання за зразками.

У ході навчання RAISR застосовувалася база одночасно згенерованих пар зображень у високій та низькій якості. Використовувалися пари маленьких фрагментів зображення стандартної 2х інтерполяції, тобто фрагменти 3×3 і 6×6 пікселів. Алгоритм навчання та роботи RAISR показаний на схемі.

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

Кожен тип фільтра діє для свого типу пікселів: від Р1 до Р4 відповідно до типів пікселів, які використовуються алгоритмом білінійної інтерполяції.

У чомусь метод машинного навчання RAISR схожий на навчання нейромереж. Але фактично він є адаптацією різних фільтрів стандартної інтерполяції для кожного окремого маленького фрагмента вихідного зображення. Тобто це та сама стара «лінійна інтерполяція», але як би на стероїдах – без властивих їй артефактів та з адаптацією до змісту зображення.

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

До того ж, такий метод на основі хешування набагато менш ресурсоємний і більш прийнятний на практиці, ніж навчання та використання нейромережі. Різниця у продуктивності настільки велика (10-100 разів), що цю програму можна спокійно запускати навіть на звичайних мобільних пристроях, і вона працюватиме в реальному часі. Ніщо не заважає впровадити цей фільтр у сучасні програмиінтерполяції зображень на смартфонах, у тому числі додаток камери на Android, яка виконує інтерполяцію під час цифрового масштабування. Цілком можливо, що Google саме це збирається зробити насамперед. за Крайній міріЦе приклад найбільш масового повсюдного застосування інтерполяції на мільйонах пристроїв.


Зліва: оригінал низької роздільної здатності. По центру результат роботи стандартного бікубічного інтерполятора. Справа: результат роботи RAISR

Фотографії стануть кращими відразу у всіх користувачів Android.

До речі, ще одна цікава та важлива перевага RAISR – у процесі навчання цю програму можна навчити усувати характерні артефакти стиснення, у тому числі JPEG. Наприклад, на мобільному пристроїфотографії можуть зберігатися у стислому вигляді з артефактами, а на екрані відображатиметься без артефактів. Або алгоритм можна застосувати на фотохостингу Google для автоматичного покращення фотографій користувачів з усуненням артефактів JPEG, які присутні практично повсюдно.


Зліва: оригінал низької роздільної здатності з характерними для JPEG артефактами аліасингу. Праворуч - видача RAISR

Співробітників Google Research скоро буде опубліковано в журналі IEEE Transactions on Computational Imaging. (Примітка: провідний автор наукової роботибув стажером Google Research під час підготовки статті, але працює в ізраїльському дослідному технологічному інституті Technion).

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

Для початку підемо у головне меню Зображення - Розмір зображення (Image - Image Size)або Alt+Ctrl+I.

Якщо ви клацніть по стрілочці біля параметра Ресамплінг (Resample Image), то у вікні з'явиться кілька варіантів інтерполяції:

  • Автоматично (Automatic). Програма Photoshopвибирає спосіб ресамплінгу з урахуванням типу документа і збільшення чи зменшення його масштабу.
  • Зберегти деталі (зі збільшенням) (Preserve details (enlargement)). Якщо вибрано цей метод, стає доступним повзунок Зниження шуму для згладжування шуму під час масштабування зображення.
  • Збереження деталей 2.0 (Preserve Details 2.0). Цей алгоритм дає дуже цікавий результат збільшення картинки. Звичайно, деталізація докладніше не стає, але та, що є, збільшується досить сильно не втрачаючи чіткості.
  • . Хороший методдля збільшення зображень на основі бікубічної інтерполяції, розроблений спеціально для отримання більш гладких результатів.
  • Бікубічна (зі зменшенням) (Bicubic Sharper (reduction)). Хороший метод зменшення розміру зображення на основі бікубічної інтерполяції з підвищеною різкістю. Цей метод дозволяє зберегти деталі зображення, підданого ресамплінгу. Якщо інтерполяція «Бикубічна, із зменшенням» робить надто різкими деякі області зображення, спробуйте скористатися бікубічною інтерполяцією.
  • Бікубічна (плавні градієнти) (Bicubic (smooth gradients)). Більш повільний, але й точніший метод, заснований на аналізі значень кольору навколишніх пікселів. За рахунок використання більш складних обчислень бікубічна інтерполяція дає більш плавні колірні переходи, ніж інтерполяція по сусідніх пікселів або бі лінійна інтерполяція.
  • По сусідніх пікселів (чіткі краї) (Nearest Neighbor (hard edges)). Швидкий, але менш точний метод, який повторює пікселі зображення. Цей метод зберігає чіткі краї і дозволяє створити файл зменшеного розміру в ілюстраціях, що містять краї, що не згладжують. Однак цей метод може створити зубчасті краї, які стануть помітними при спотворенні або масштабуванні зображення, або проведенні безлічі операцій із виділенням.
  • Білінійна (Bilinear). Цей метод додає нові пікселі, розраховуючи середнє значення кольору навколишніх пікселів. Він дає результат середньої якості.

Приклад використання Бікубічна (зі збільшенням) (Bicubic Smoother (enlargement)):

Є фото, розміри 600 х 450 пікселів роздільна здатність 72 dpi

Нам треба його збільшити. Відчиняє вікно Розмір зображення (Image Size)і вибираємо Бікубічна (зі збільшенням) (Bicubic Smoother (enlargement)), одиниці вимірювання - відсотки.

Розміри документа одразу встановляться на значення 100%. Далі поступово будемо збільшувати зображення. Змініть значення 100% на 110%. Коли ви зміните ширину, висота автоматично підганяється сама.

Тепер його розміри вже 660 х 495 пікселів. Повторюючи дані дії, можна досягти хороших результатів. Звичайно, ідеальної чіткості нам досягти буде досить складно, тому що фото було невелике і низького дозволу. Але подивіться, які зміни відбулися у пікселях.

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

До зустрічі у наступному уроці!

Функція зміни розміру зображення, надана Emgu (оболонка.net для OpenCV), може використовувати будь-який з чотирьох методів інтерполяції:

  • CV_INTER_NN (за замовчуванням)
  • CV_INTER_LINEAR
  • CV_INTER_CUBIC
  • CV_INTER_AREA

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

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

Моє питання, які переваги та недоліки кожного методу інтерполяції? Як вони відрізняються і який з них я маю використовувати?

4 відповідей

Найближчий сусід буде якнайшвидше, але при зміні розміру ви втратите суттєву інформацію.

Лінійна інтерполяція менш швидка, але не призведе до втрати інформації, якщо ви не зменшуєте зображення (яке ви є).

Кубічна інтерполяція (ймовірно, фактично "Бікубічна") використовує одну з багатьох можливих формул, які включають кілька сусідніх пікселів. Це набагато краще для скорочення зображень, але ви, як і раніше, обмежені щодо того, скільки ви можете зменшити без втрати інформації. Залежно від алгоритму, ви можете зменшити свої зображення на 50% або 75%. Основний підхід цього підходу полягає в тому, що він набагато повільніший.

Не впевнений, що така "area" - насправді це може бути "Bicubic". Ймовірно, цей параметр дасть кращий результат(з точки зору втрати/появи інформації), але за рахунок найтривалішого часу обробки.

Метод інтерполяції, що використовується, залежить від того, чого ви намагаєтеся досягти:

CV_INTER_LINEARабо CV_INTER_CUBICзастосовує фільтр нижніх частот (середній) для досягнення компромісу між візуальною якістю та видаленням краю (фільтри нижніх частот мають тенденцію видаляти краї по порядку для зменшення накладання зображень). Між цими двома, я рекомендував би вам CV_INTER_CUBIC.

Метод CV_INTER_NNнасправді є найближчим сусідом, це самий базовий метод, і ви отримаєте більш різкі краї (жоден фільтр нижніх частот не буде застосовуватись). Однак цей метод просто нагадує "масштабування" зображення, відсутність візуального покращення.

Алгоритми: (описи з документації OpenCV)

  • INTER_NEAREST – інтерполяція найближчого сусіда
  • INTER_LINEAR – білінійна інтерполяція (використовується за умовчанням)
  • INTER_AREA – повторна вибірка з використанням відношення області пікселів. Це може бути кращим методом для проріджування зображення, оскільки він дає результати без муару. Але коли зображення масштабується, воно схоже метод INTER_NEAREST.
  • INTER_CUBIC - бікубічна інтерполяція на околиці 4x4 пікселів.
  • INTER_LANCZOS4 - інтерполяція Lanczos на околиці 8x8 пікселів

Якщо ви хочете збільшити швидкість, використовуйте метод Nearest Neighbor.

Встановлення властивостей відображення

В додатку Image Processing Toolbox існує можливість налаштування установок, які контролюють деякі властивості функцій відображення зображень imshow та imtool. Наприклад, використання установок програми дозволяє описати коефіцієнт збільшення, який застосовується при виведенні зображень за допомогою функцій imtool та imshow.

У рамках даного питаннярозглянемо

  • Список установок, які підтримуються програмою.
  • Опис процесу отримання поточних значень установок за допомогою функції iptgetpref.
  • Опис процесу встановлення поточних значень установок за допомогою функції iptsetpref.

Налаштування програми

Image Processing Toolbox підтримує кілька установок, які впливають на спосіб відображення зображень за допомогою функцій imshow та imtool. У таблиці наведено список установок та їх короткий опис. Для отримання більш детальної інформаціїщодо установок програми та їх значень див. опис функції iptsetpref.

Налаштування програми Опис
ImshowBorder Цей параметр може приймати два значення - "loose" та "tight". Якщо параметр ImshowBorder приймає значення "loose", зображення буде відображатися функцією imshow з відступом від краю вікна figure. Таким чином у вікні залишається місце для додаткових написів. Використовується за промовчанням. Якщо параметр ImshowBorder приймає значення "tight", зображення буде відображатися функцією imshow так, щоб воно займало все вікно figure.
ImshowAxesVisible Цей параметр може набувати двох значень - "on" і "off". Якщо параметр ImshowAxesVisible приймає значення "on", при виведенні зображення функцією imshow у вікні figure будуть додатково виведені осі координат. Якщо ж параметр ImshowAxesVisible набуває значення "off", осі координат виводитися не будуть. Значення "off" встановлюється за замовчуванням.
ImshowInitialMagnification Керує коефіцієнтом збільшення, який використовується функцією imshow при виведенні зображення.
ImtoolInitialMagnification Контролює коефіцієнт збільшення у додатку Image Tool, що використовується для масштабування зображень.

Отримання значень установок програми

Для визначення поточних значень використовується функція iptgetpref. Розглянемо приклад використання функції iptgetpref для визначення значення властивості imtoolInitialMagnification.

Iptgetpref("ImtoolInitialMagnification") ans = 100

Для отримання детальнішої інформації див. опис функції iptgetpref.

Встановлення значень властивостей програми

Для встановлення значень властивостей програми використовується функція iptsetpref. Розглянемо приклад використання функції iptsetpref для встановлення властивостей відображення, які призводять до того, що при виклику функції imshow буде змінюватися розмір вікна відображення відповідно до розмірів зображення і значення властивості "ImshowBorder".

Iptsetpref("ImshowBorder", "tight");

Для отримання детальнішої інформації див. опис функції iptsetpref.

Просторові перетворення

Розглянемо основні функції просторових перетворень, які реалізовані у програмі Image Processing Toolbox.

Термінологія Опис основних термінів, які використовуються для обробки зображень
Інтерполяція Просторовий (або тимчасовий) прогноз значень невідомих значень пікселів між дійсними значеннями пікселів.
Зміна розмірів зображення за допомогою функції imresize.
Обертання зображень Використовуйте функцію imrotate для повороту зображень.
Вирізання зображення Використовуйте функцію imcrop для вирізання прямокутної частини зображення.
Опис основних властивостей просторових перетворень у додатку.

Інтерполяція

Як зазначалося вище, інтерполяція - це просторовий (чи тимчасової) прогноз значень невідомих значень пікселів між істинними значеннями пікселів. Наприклад, для зміни розмірів зображень використовується один із методів інтерполяції. Методи двовимірної інтерполяції використовуються також при повороті зображень (функція imrotate) та при аналізі зображень за допомогою функції improfile.

Методи інтерполяції

Image Processing Toolbox використовує три вбудовані алгоритми інтерполяції:

  • Інтерполяція за найближчим сусідом – використовується значення найближчого пікселя.
  • Білінійна інтерполяція – використовується інтерполяція по білінійній поверхні.
  • Бікубічна інтерполяція – використовується інтерполяція з бікубічної поверхні.

Типи зображень

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

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

Для бінарних зображень інтерполяція дасть ефект, якщо її усвідомлено. При використанні білінійної або бікубічної інтерполяції обчислені значення пікселів на результуючому зображенні не завжди дорівнюватимуть 0 або 1. Результат обробки також залежить від формату вихідного зображення:

  • Якщо дані вихідного зображення представлені у форматі double, то результуюче зображення буде напівтоновим та представленим у форматі double. Таким чином, результуюче зображення не буде бінарним, оскільки містить значення діапазону між 0 і 1.
  • Якщо вихідне зображення представлене у форматі uint8, результуюче зображення буде бінарним і представленим у форматі uint8. Значення інтерполюючих пікселів будуть округлені до 0 і 1, а результуюче зображення буде представлене у форматі uint8.

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

Зміна розмірів зображення

Для зміни розмірів зображення використовується функція imresize. При використанні функції imresize необхідно

При використанні функції imresize розмір результуючого зображення можна вказати двома шляхами:

  • через опис коефіцієнта збільшення.
  • через опис розмірів результуючого зображення.

Використання коефіцієнта збільшення

Для збільшення зображення необхідно, щоб коефіцієнт збільшення був більшим за 1. Для зменшення зображення необхідно, щоб коефіцієнт збільшення знаходився в діапазоні між 0 і 1. Наприклад, за допомогою команди, яка написана нижче, реалізується збільшення зображення I в 1.25 разів.

I = imread("circuit.tif"); J = imresize(I,1.25); imshow(I) figure, imshow(J)

Опис розміру результуючого зображення

Існує можливість описати розмір результуючого зображення у вигляді вектора, що містить два числа - кількість рядків та стовпців результуючого зображення. Розглянемо приклад створення результуючого зображення Y, яке складається зі 100 рядків та 150 стовпців.

Y = imresize(X,)

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

Опис методу інтерполяції

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

Розглянемо приклад, коли функція imresize використовує білінійну інтерполяцію.

Y = imresize(X,,"bilinear")

Використання фільтрів препарування зображень

Зміна розмірів зображення може призвести до виникнення артефактів на зображенні, що відбивається на його якості.

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

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

Також можна створити фільтр для проведення низькочастотної фільтрації. Для отримання більш детальної інформації див. опис функції imresize.

Поворот зображень

Для повороту зображень використовується функція imrotate. При використанні функції imrotate потрібно вказати два основні аргументи:

  1. зображення, яке потрібно повернути;
  2. кут повороту.

Кут повороту можна описати у градусах. Якщо встановити позитивне значення, то функція imrotate буде обертати зображення проти годинникової стрілки, якщо задати негативне значення, то функція imrotate буде обертати зображення за годинниковою стрілкою. Розглянемо приклад повороту зображення I на 35 градусів проти годинникової стрілки.

J = imrotate(I,35);

Як необов'язкові аргументи у функції imrotate також можна описати

  1. метод інтерполяції;
  2. розмір результуючого зображення.

Опис методу інтерполяції

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

Розглянемо приклад повороту зображення на 35° проти годинникової стрілки з використанням білінійної інтерполяції.

I = imread("circuit.tif"); J = imrotate(I,35,"bilinear"); imshow(I) figure, imshow(J)

Опис розміру результуючого зображення

За умовчанням, функція imrotate створює результуюче більше, щоб помістити вихідне зображення, яке розміщено під зазначеним кутом. Пікселям, які знаходяться за межами зображення, встановлюється значення 0 і є фоном результуючого зображення. Якщо функції imrotate в якості аргументу вказати опцію "crop", то результуюче зображення буде обрізано до розмірів вихідного зображення. Для більш детальної інформації див. опис функції imrotate.

Вирізання зображень

Для виділення прямокутної частини зображення використовується функція imcrop. При використанні функції imcrop необхідно вказати два основні аргументи:

  1. вихідне зображення;
  2. координати прямокутника, яким визначається площа вирізування.

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

Imshow circuit.tif I = imcrop; imshow(I);

Виконання основних просторових перетворень

Для виконання основних двовимірних просторових перетворень використовується функція imtransform.

При використанні функції imtransform необхідно вказати два основні аргументи:

  • вихідне зображення;
  • структуру просторових перетворень (TFORM), що визначає тип необхідних перетворень.

Опис типу перетворень

При описі типу змін необхідно використовувати структуру TFORM. Існує два шляхи використання TFORM:

  • використання функції maketform;
  • Використання функції cp2tform.

Використання maketform

При використанні функції maketform необхідно описати тип потрібних перетворень. У таблиці наведено список типів перетворень у алфавітному порядку, який підтримується функцією maketform.

Тип перетворення Опис
"affine" Перетворення, які включають зсув, поворот, масштабування та інші подібні функції перетворення зображення. При цьому прямі лінії залишаються прямими, паралельні залишаються паралельними, а прямокутник може перетворитися на паралелограм.
"box" Окремий випадок афінних перетворень коли кожна розмірність масштабується незалежно.
"composite" Структура двох чи більше перетворень.
"custom" Перетворення, визначене користувачем і викликається за допомогою функції imtransform.
"projective" У цьому типі перетворень прямі лінії залишаються прямими, а паралельні сходяться на одній точці. Ця точка може бути як в межах зображення, так і за його межами.

Використання cp2tform

При використанні функції cp2tform створюється TFORM, коли необхідно виконувати такі перетворення, як припасування даних, наприклад, при поліноміальних перетвореннях.

Примітка.При використанні функції imtransform структура TFORM виконує двовимірні просторові перетворення. Якщо зображення містить більше двох розмірів, наприклад, RGB зображення, то двовимірні перетворення автоматично застосовуються до всіх двовимірних складових. Для визначення n-вимірних перетворень використовується функція tformarray.

Виконання перетворень

Після визначення типу перетворень у структурі TFORM існує можливість їх виконання шляхом виклику функції imtransform.

Розглянемо приклад використання функції imtransform для виконання проективних перетворень із зображенням шахівниці.

I = checkerboard(20,1,1); figure; imshow(I) T = maketform("projective",,...); R = makeresampler("cubic", "circular"); K = imtransform(I,T,R,"Size",,"XYScale",1); figure, imshow(K)

Різні опції функції imtransform контролюють різні аспекти перетворень. Наприклад, як видно з попереднього перетворення, окремі установкиповинні контролювати кількість та розміщення копій вихідного зображення на результуючому зображенні. Також контролюється розмір результуючого зображення. У програмі Image Processing Toolbox є досить багато прикладів з використанням функції imtransform та інших схожих функцій, які виконують різні типипросторових перетворень.

Лінійна фільтрація та проектування фільтрів

Image Processing Toolbox містить кілька функцій, які проектують і реалізують двовимірну лінійну фільтрацію даних зображення. Розглянь ці питання у такому порядку:

Розглянемо ще деякі терміни, які також надалі застосовуватимуться при розгляді матеріалу.

Термін Опис
Convolution (згортка) Операція над локальною околицею, де кожен результуючий піксель є зваженою сумою вихідних пікселів. Вага визначається ядром згортки. За допомогою операції згортки можна реалізувати такі методи обробки зображень як згладжування, підвищення різкості та посилення меж об'єктів зображення.
convolution kernel (ядро згортки) Матриця терезів, яка використовується при виконанні згортки.
Correlation (кореляція) Операція над локальною околицею, де кожен результуючий піксель є зваженою сумою пікселів локальної околиці. Терези визначаються ядром кореляції. Поняття кореляції дуже тісно пов'язане з поняттям пакунка.
correlation kernel (ядро кореляції) Для реалізації функції кореляції використовується вагова функція. Ядра кореляції можна отримати за допомогою функції проектування фільтрів у Image Processing Toolbox. Ядра кореляції є ядро ​​згортки, яке повернуто на 180 градусів.
FIR filter (фільтр з кінцевою імпульсною характеристикою, КІХ-фільтр) У додатку існує ряд функцій для розрахунку коефіцієнтів цифрового КІХ фільтра, зокрема методом Ремеза. Особливістю їх використання є те, що вихідні дані задаються як бажана АЧХ довільної складності.
frequency response ( частотна характеристикаабо частотний відгук) Математична функція, з допомогою якої можна оцінювати роботу фільтра різних частотах.
neighborhood operation (операція з використанням значень сусідніх елементів) Операція, у результаті якої значення кожного пікселя обчислюється з урахуванням значень навколишніх пікселів. Згортка, методи морфологічної обробки та медіанна фільтраціяє прикладами операцій із використанням сусідніх пікселів.
window method ( локальні методиобробки) Методи обробки, за яких враховуються локальні особливостізображення.

Лінійна фільтрація

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

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

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

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

  • Фільтрування з використанням convolution та correlation.
  • Виконання фільтрації з використанням функції imfilter та ін.

Згортка

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

Розглянемо приклад. Нехай зображення є набір пікселів зі значеннями, представленими у вигляді матриці

A =

а ядро ​​згортки представлене таким чином

H =

Розглянемо приклад обчислення результуючого пікселя з координатами (2,4). Для цього необхідно виконати такі кроки:

  1. Розгорнути ядро ​​згортки на 180 градусів щодо центрального елемента.
  2. Помножити кожне значення ваги в матриці згортки відповідне значення пікселя в матриці A.
  3. Підсумувати результат множення.


Кореляція

Операція кореляції дуже схожа на операцію згортки щодо реалізації. При обчисленні кореляції значення результуючого пікселя є зваженою сумою навколишніх пікселів. Різниця полягає в тому, що матриця ваги перед обчисленнями не повертається. Розглянемо аналогічний приклад обчислення значення результуючого пікселя (2,4). Вихідна матриця зображення та ядро ​​кореляції взяті з попереднього прикладу. Для цього необхідно реалізувати такі кроки:

  1. Перемножуємо кожне значення ваги і відповідне значення елемента матриці вихідного зображення.
  2. Підсумовуємо всі результати множення, отримані в п.1.

В результаті значення пікселя (2,4) буде рівним


Обчислення значення результуючого пікселя (2,4)

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

Взагалі, це був вступ до іншої статті, але він затягнувся і вилився в окремий матеріал.

Ця людина сидить серед ромашок, щоб привернути вашу увагу до статті.

Для наочного порівняння я використовуватиму зображення однакового дозволу 1920×1280 (одне, друге), які призводитиму до розмірів 330×220, 1067×667 і 4800×3200. Під ілюстраціями буде написано, скільки мілісекунд зайняв ресайз у той чи інший дозвіл. Цифри наведені лише розуміння складності алгоритму, тому конкретне залізо чи ПО, у якому вони отримані, негаразд важливо.

Найближчий сусід (Nearest neighbor)

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

Взагалі, якість і продуктивність будь-якого методу зменшення можна оцінити по відношенню кількості пікселів, що брали участь у формуванні кінцевого зображення, до пікселів у вихідному зображенні. Чим більше це ставлення, тим швидше алгоритм якісніший і повільніший. Ставлення, рівне одному, означає що мінімум кожен піксель вихідного зображення зробив свій внесок у кінцеве. Але для просунутих методів воно може бути і більше одного. Так ось, якщо ми зменшуємо зображення методом найближчого сусіда в 3 рази по кожній стороні, то це співвідношення дорівнює 1/9. Тобто. Більшість вихідних пікселів не враховується.




1920×1280 → 330×220 = 0,12 ms
1920×1280 → 1067×667 = 1,86 ms

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

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

Афінні перетворення (Affine transformations)

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

Принцип дії полягає в тому, що для кожної точки кінцевого зображення береться фіксований набір точок вихідного та інтерполується відповідно до їх взаємного положення та вибраного фільтра. Кількість точок також залежить від фільтра. Для білінійної інтерполяції береться 2x2 вихідних пікселів, для бікубічної 4x4. Такий метод дає гладке зображення зі збільшенням, але при зменшенні результат дуже схожий на найближчого сусіда. Дивіться самі: теоретично, при бікубічному фільтрі та зменшенні в 3 рази відношення оброблених пікселів до вихідних дорівнює 42 / 32 = 1,78. Насправді результат значно гірше т.к. у існуючих реалізаціях вікно фільтра та функція інтерполяції не масштабуються відповідно до масштабу зображення, і пікселі ближче до краю вікна беруться з негативними коефіцієнтами (відповідно до функції), тобто. не роблять корисний внесок у кінцеве зображення. В результаті зображення, зменшене з бікубічним фільтром, відрізняється від зображення, зменшеного з білінійним, тільки тим, що воно ще чіткіше. Ну а для білінійного фільтра та зменшення втричі відношення оброблених пікселів до вихідних дорівнює 2? / 3? = 0.44, що принципово не відрізняється від найближчого сусіда. Фактично, афінні перетворення не можна використовуватиме зменшення більш ніж 2 разу. І навіть при зменшенні до двох разів вони дають помітні ефекти драбинки для ліній.

Теоретично, повинні бути реалізації саме афінних перетворень, що масштабують вікно фільтра і сам фільтр відповідно до заданих спотворень, але в популярних бібліотеках з відкритим вихідним кодомЯ таких не зустрічав.




1920×1280 → 330×220 = 6.13 ms
1920×1280 → 1067×667 = 17.7 ms
1920×1280 → 4800×3200 = 869 ms

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

Моє скромна думка, що використання цього способу для довільного зменшення зображень просто є багомТому що результат виходить дуже поганий і схожий на найближчого сусіда, а ресурсів на цей метод потрібно значно більше. Тим не менш, цей метод знайшов широке застосування у програмах та бібліотеках. Найдивовижніше, що цей спосіб використовується у всіх браузерах для канву методу drawImage() (наочний приклад), хоча для простого відображення картинок в елементі використовуються більш акуратні методи (крім IE, в ньому для обох випадків використовуються афінні перетворення). Крім цього, такий метод використовується в OpenCV, поточної версіїпітонівської бібліотеки Pillow (про це я сподіваюся написати окремо), у Paint.NET.

Крім того, саме цей метод використовується відеокартами для малювання тривимірних сцен. Але різниця в тому, що відеокарти для кожної текстури заздалегідь готують набір зменшених версій (mip-рівнів), і для остаточного відтворення вибирається рівень з таким дозволом, щоб зменшення текстури було не більше двох разів. Крім цього, для усунення різкого стрибка при зміні mip-рівня (коли текстурований об'єкт наближається або віддаляється), використовується лінійна інтерполяція між сусідніми mip-рівнями (це вже трилінійна фільтрація). Таким чином, для відображення кожного пікселя тривимірного об'єктапотрібно інтерполювати між 2³ пікселями. Це дає прийнятний для швидко рухається картинки результат за час, лінійне щодо кінцевого дозволу.

Суперсемплінг (Supersampling)

За допомогою цього методу створюються ті самі mip-рівні, за допомогою нього (якщо сильно спростити) працює повноекранне згладжування в іграх. Його суть у розбиття вихідного зображення по сітці пікселів кінцевого та складання всіх вихідних пікселів, що припадають на кожен піксель кінцевого відповідно до площі, що потрапила під кінцевий піксель. При використанні цього методу для збільшення на кожний піксель кінцевого зображення припадає рівно один піксель вихідного. Тому результат для збільшення дорівнює найближчому сусідові.

Можна виділити два підвиди цього методу: із заокругленням меж пікселів до найближчого цілого числа пікселів і без. У першому випадку алгоритм стає малопридатним для масштабування менше ніж у 3 рази, тому що на якийсь один кінцевий піксель може припадати один вихідний, а на сусідній - чотири (2x2), що призводить до диспропорції на локальному рівні. У той же час алгоритм із округленням очевидно можна використовувати у випадках, коли розмір вихідного зображення кратний розміру кінцевого або масштаб зменшення досить малий (версії роздільною здатністю 330×220 майже не відрізняються). Відношення оброблених пікселів до вихідних при округленні кордонів завжди дорівнює одиниці.




1920×1280 → 330×220 = 7ms
1920×1280 → 1067×667 = 15 ms
1920×1280 → 4800×3200 = 22,5 ms

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




1920×1280 → 330×220 = 19 ms
1920×1280 → 1067×667 = 45 ms
1920×1280 → 4800×3200 = 112 ms

Продуктивність цього методу для зменшення нижче, ніж у афінних перетворень, тому що в розрахунку кінцевого зображення беруть участь усі пікселі вихідного. Версія із округленням до найближчих кордонів зазвичай швидше у кілька разів. Також можна створити окремі версії для масштабування в фіксована кількістьразів (наприклад, зменшення в 2 рази), які будуть ще швидшими.

Даний метод використовується у функції gdImageCopyResampled() бібліотеки GD, що входить до складу PHP, є OpenCV (прапор INTER_AREA), Intel IPP, AMD Framewave. Приблизно за таким же принципом працює libjpeg, коли відкриває зображення у зменшеному у кілька разів вигляді. Останнє дозволяє багатьом програмам відкривати зображення JPEGзаздалегідь зменшеними в кілька разів без особливих накладних витрат (на практиці libjpeg відкриває зменшені зображення навіть трохи швидше за повнорозмірні), а потім застосовувати інші методи для ресайзу до точних розмірів. Наприклад, якщо потрібно відрізати JPEG роздільною здатністю 1920×1280 у роздільну здатність 330×220, можна відкрити оригінальне зображення в роздільній здатності 480×320, а потім зменшити його до потрібних 330×220.

Згортки (Convolution)

Цей метод схожий на афінні перетворення тим, що використовуються фільтри, але має фіксоване вікно, а вікно, пропорційне масштабу. Наприклад, якщо розмір вікна фільтра дорівнює 6, а розмір зображення зменшується в 2,5 рази, то у формуванні кожного пікселя кінцевого зображення бере участь (2,5 * 6) ² = 225 пікселів, що набагато більше, ніж у випадку суперсемплінгу (від 9 до 16). На щастя, згортки можна вважати в 2 проходи, спочатку в одну сторону, потім в іншу, тому алгоритмічна складність розрахунку кожного пікселя дорівнює не 225, а всього (2,5 * 6) * 2 = 30. Вклад кожного вихідного пікселя в кінцевий як раз визначається фільтром. Відношення оброблених пікселів до вихідної повністю визначається розміром вікна фільтра і дорівнює його квадрату. Тобто. для білінійного фільтра це відношення буде 4, для бікубічного 16, для Ланцоша 36. Алгоритм чудово працює як для зменшення, так і для збільшення.




1920×1280 → 330×220 = 76 ms
1920×1280 → 1067×667 = 160 ms
1920×1280 → 4800×3200 = 1540 ms

Швидкість цього методу залежить від усіх параметрів: розмірів вихідного зображення, розміру кінцевого зображення, розміру вікна фільтра.

Саме цей метод реалізований у ImageMagick, GIMP, у поточній версії Pillow із прапором ANTIALIAS.

Одна з переваг цього в тому, що фільтри можуть задаватися окремою функцією, ніяк не прив'язаною до реалізації методу. При цьому функція самого фільтра може бути досить складною без особливої ​​втрати продуктивності, тому що коефіцієнти для всіх пікселів в одному стовпці та для всіх пікселів в одному рядку вважаються лише один раз. Тобто. сама функція фільтра викликається тільки (m + n) * w разів, де m і n – розміри кінцевого зображення, а w – розмір вікна фільтра. І наклепати цих функцій можна багато, було б математичне обґрунтування. У ImageMagick, наприклад, їх 15. Ось як виглядають найпопулярніші:

Білінійний фільтр (bilinear або triangle в ImageMagick)


Бікубічний фільтр (bicubic, catrom в ImageMagick)


Фільтр Ланцоша (Lanczos)

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