1277
Стабілізація цифрового зображення з стаціонарних камер – кореляційний підхід
Я вирішив написати цю статтю після читання статті «Масійна паралельна стабілізація зображень», яка описує алгоритм стабілізації зображення з поворотних камер. Те, що в один раз реалізовано алгоритм стабілізації зображення з стаціонарних камер, який використовується в сервері MagicBox IP-відео та деяких інших продуктах Synesis, де я працюю в цей день. Алгоритм виявився досить успішним у своїх характеристиках швидкості. Зокрема, дуже ефективно реалізує алгоритм пошуку зміщення поточного образу відносно фону. Ця ефективність дозволила використовувати свої основні елементи (звичай з деякими модифікаціями) для супроводжуючих об'єктів, а також перевірити їх на іммобілність.
Алгоритм стабілізації включає в себе наступні основні елементи: виявлення зносу для поточного каркасу, компенсація за цими зносами і періодичне оновлення фону відносно якого відбувається стабілізація. Нижче я описую кожну з них детально.
Рис. 1 стабілізація зображення іноді дуже корисно.
Основний підхід, на якому базується кореляційний підхід до визначення упереджень:
1) Прийнята центральна частина фонового зображення. Кількість відступів визначається максимальною можливою зміщенням, яку ми хочемо визначити. Центральна частина не повинна бути занадто невеликою, інакше функція кореляції (див. нижче) не буде достатньо даних для стабільної роботи.
2) На поточному кадрі обрано частину одного розміру, але зміщений відносно центру картини.
(3) Для кожного офсету деяка метрика обчислюється з описом кореляції між центральною частиною фону та поточного зображення. Для цього, наприклад, сума квадратів різниці для кожної точки цих двох зображень може бути використана, або, наприклад, сума абсолютної різниці для кожної точки.
(4) Зміщення, для якого кореляція є максимальною (меншою сумою квадратичних відмінностей або сумою абсолютних відмінностей) буде бажаним боям.
Рис. 2 Шиф поточного каркасу відносно фону.
Природно, якщо цей підхід застосовується в лобі, швидкість алгоритму буде катастрофічно низькою, хоча швидкість кореляційних функцій може бути дуже високою. Це не дивно, оскільки нам потрібно буде пройти всі можливі вази зображень відносно одного (складність алгоритму можна оцінити як O(n^2), де n - кількість точок зображення).
Перша оптимізація полягає в тому, щоб використовувати не повний пошук всіх можливих варіантів, але градієнтний спосіб спуску: на початку розраховується кореляція в 3 × 3 області для нульового зміщення, потім вибирається зміщення з максимальною кореляцією і процес повторюється до моменту виявлення локального максимуму. Цей метод набагато швидше, але в найгіршому випадку великих зміщень він буде складністю O(n^1.5), що також неприпустимо.
157810
Рисунок 3 Пошук для максимальної функції кореляції. Градієнтний спуск.
Виходом з цієї ситуації є використання багатомасштабних зображень (рівень збільшувача зменшує зображення навпіл). Тепер ми розглянемо локальну максимальну кореляцію для максимальної ваги, а потім на менших масштабах вона буде послідовно рафінована. Таким чином, складність алгоритму знижується до О(n), що цілком прийнятна.
Малюнок 4 Multiscale зображення.
Якщо компенсувати затінення зображення з камери з точністю пікселя, стабілізоване зображення все одно буде помітно. На щастя, що можна виправити. Якщо уважно аналізувати райони кореляційної функції біля максимальної (див. Рис. 3), можна побачити, що значення функції не симетричні відносно максимуму, що свідчить про те, що максимальна не розташована в точці (3, 2), десь між нею, а точка (1, 4). Якщо поведінка кореляційної функції приблизно біля максимуму з параболоїдом А*кс^2 + Б*кс*й + С *y^2 + Д*кс + Е*й + Ф = 0 р.Завдання уточнення координат максимального буде зменшено до вибору таких параметрів параболоїду, в яких його відхилення від фактичних значень на відомих точках мінімальне. Досвід показує, що точність виконання, таким чином, отримана буде в порядку 0.1-0.2. При компенсації для погладжування з такою точністю стабілізоване зображення практично не більше висихає.
Зміщення для цілого зсуву виконується наступним чином: перекласти поточний образ до знайденого зсуву з протилежним знаком. Зручні ділянки біля краю заповнюють фоном. Для підпіксельного зсуву компенсація здійснюється за допомогою дволінійного інтерполяції. Однак можливий невеликий розмиття стабілізованого зображення. Якщо це критичне, може бути використане бікубичне міжполування.
Як фон, ви можете використовувати лише будь-який попередній кадр. Однак якість стабілізації значно покращується, якщо фон використовується в середньому над багатьма кадрами зображення. Бажано періодично оновлювати фон для компенсації можливих змін освітлення на сцені. При оновленні фону необхідно переконатися, що фонове значення досить контрастне і гетерогенне. В іншому випадку функція кореляції не має чіткого максимуму, що значно зменшить точність стабілізатора. Також дуже небажано мати рухомі предмети на фоні.
Якщо стабілізатор працює в тандемі з детектором руху, процес оновлення фону для нього значно спрощений. Як правило, детектор руху вже має фон, в середньому над багатьма кадрами, відносно яких він визначає наявність руху. Те ж саме фон можна використовувати для роботи стабілізатора. Стабілізоване зображення від стабілізатора в свою чергу зменшує кількість помилкових позитивних відгуків детектора руху. Також можна скористатися тим, що детектор руху в процесі його роботи отримує маску зон з наявністю руху. Ця маска, отримана детектором руху в попередньому кадрі, може бути використана для обчислення функції кореляції для виключення зон з руху. Це також позитивно впливає на стабілізатор зображення.
Плюси запропонованого підходу: 1 Висока швидкість алгоритму. Зокрема, для стабілізації зображення з роздільною здатністю 1280x720 у форматі BGRA32 на процесорі Core i7-4470 (1 ядро) алгоритм вимагає 1,5 мілісекунди.
2) Компенсація за шейк камери з точністю підпікселя.
Недоліки запропонованого підходу (1) Стабілізація зображень в поточному виконанні можливе тільки для стаціонарних камер.
2) Виявлено і компенсовано просторовий зсув камери, обертання камери не компенсується.
(3) фон має бути досить чітким і неоднорідним, інакше функція кореляції не буде нічого клацання. Тому в темряві або в тумані стабілізація не буде добре працювати.
(4) фон повинен бути стаціонарним. Також неможливо працювати стабілізатора на фоні мандрівки.
Для початку слід зазначити, що для визначення зсуву достатньо використовувати тільки сірий образ, колірні характеристики практично не впливають на точність, але природно уповільнюють розрахунки.
При реалізації стабілізатора бажано використовувати оптимізовані функції для роботи з зображеннями. Я використовував бібліотеку Simd для цього. Зокрема, можна знайти:
(1) SimdAbsDifferenceSum і SimdAbsDifferenceSumMasked для розрахунку функції кореляції.
(2) SimdReduceGray2x2, SimdReduceGray3x3, SimdReduceGray4x4 і SimdReduceGray5x5 для багаторозмірного зображення.
(3) SimdBgrToGray для сірого зображення.
(4) SimdShiftBilinear, щоб компенсувати зсув.
Перегляд результатів алгоритму Приклад 1:
Приклад 2:
Джерело: habrahabr.ru/post/219815/
Алгоритм стабілізації включає в себе наступні основні елементи: виявлення зносу для поточного каркасу, компенсація за цими зносами і періодичне оновлення фону відносно якого відбувається стабілізація. Нижче я описую кожну з них детально.
Рис. 1 стабілізація зображення іноді дуже корисно.
Основний підхід, на якому базується кореляційний підхід до визначення упереджень:
1) Прийнята центральна частина фонового зображення. Кількість відступів визначається максимальною можливою зміщенням, яку ми хочемо визначити. Центральна частина не повинна бути занадто невеликою, інакше функція кореляції (див. нижче) не буде достатньо даних для стабільної роботи.
2) На поточному кадрі обрано частину одного розміру, але зміщений відносно центру картини.
(3) Для кожного офсету деяка метрика обчислюється з описом кореляції між центральною частиною фону та поточного зображення. Для цього, наприклад, сума квадратів різниці для кожної точки цих двох зображень може бути використана, або, наприклад, сума абсолютної різниці для кожної точки.
(4) Зміщення, для якого кореляція є максимальною (меншою сумою квадратичних відмінностей або сумою абсолютних відмінностей) буде бажаним боям.
Рис. 2 Шиф поточного каркасу відносно фону.
Природно, якщо цей підхід застосовується в лобі, швидкість алгоритму буде катастрофічно низькою, хоча швидкість кореляційних функцій може бути дуже високою. Це не дивно, оскільки нам потрібно буде пройти всі можливі вази зображень відносно одного (складність алгоритму можна оцінити як O(n^2), де n - кількість точок зображення).
Перша оптимізація полягає в тому, щоб використовувати не повний пошук всіх можливих варіантів, але градієнтний спосіб спуску: на початку розраховується кореляція в 3 × 3 області для нульового зміщення, потім вибирається зміщення з максимальною кореляцією і процес повторюється до моменту виявлення локального максимуму. Цей метод набагато швидше, але в найгіршому випадку великих зміщень він буде складністю O(n^1.5), що також неприпустимо.
157810
Рисунок 3 Пошук для максимальної функції кореляції. Градієнтний спуск.
Виходом з цієї ситуації є використання багатомасштабних зображень (рівень збільшувача зменшує зображення навпіл). Тепер ми розглянемо локальну максимальну кореляцію для максимальної ваги, а потім на менших масштабах вона буде послідовно рафінована. Таким чином, складність алгоритму знижується до О(n), що цілком прийнятна.
Малюнок 4 Multiscale зображення.
Якщо компенсувати затінення зображення з камери з точністю пікселя, стабілізоване зображення все одно буде помітно. На щастя, що можна виправити. Якщо уважно аналізувати райони кореляційної функції біля максимальної (див. Рис. 3), можна побачити, що значення функції не симетричні відносно максимуму, що свідчить про те, що максимальна не розташована в точці (3, 2), десь між нею, а точка (1, 4). Якщо поведінка кореляційної функції приблизно біля максимуму з параболоїдом А*кс^2 + Б*кс*й + С *y^2 + Д*кс + Е*й + Ф = 0 р.Завдання уточнення координат максимального буде зменшено до вибору таких параметрів параболоїду, в яких його відхилення від фактичних значень на відомих точках мінімальне. Досвід показує, що точність виконання, таким чином, отримана буде в порядку 0.1-0.2. При компенсації для погладжування з такою точністю стабілізоване зображення практично не більше висихає.
Зміщення для цілого зсуву виконується наступним чином: перекласти поточний образ до знайденого зсуву з протилежним знаком. Зручні ділянки біля краю заповнюють фоном. Для підпіксельного зсуву компенсація здійснюється за допомогою дволінійного інтерполяції. Однак можливий невеликий розмиття стабілізованого зображення. Якщо це критичне, може бути використане бікубичне міжполування.
Як фон, ви можете використовувати лише будь-який попередній кадр. Однак якість стабілізації значно покращується, якщо фон використовується в середньому над багатьма кадрами зображення. Бажано періодично оновлювати фон для компенсації можливих змін освітлення на сцені. При оновленні фону необхідно переконатися, що фонове значення досить контрастне і гетерогенне. В іншому випадку функція кореляції не має чіткого максимуму, що значно зменшить точність стабілізатора. Також дуже небажано мати рухомі предмети на фоні.
Якщо стабілізатор працює в тандемі з детектором руху, процес оновлення фону для нього значно спрощений. Як правило, детектор руху вже має фон, в середньому над багатьма кадрами, відносно яких він визначає наявність руху. Те ж саме фон можна використовувати для роботи стабілізатора. Стабілізоване зображення від стабілізатора в свою чергу зменшує кількість помилкових позитивних відгуків детектора руху. Також можна скористатися тим, що детектор руху в процесі його роботи отримує маску зон з наявністю руху. Ця маска, отримана детектором руху в попередньому кадрі, може бути використана для обчислення функції кореляції для виключення зон з руху. Це також позитивно впливає на стабілізатор зображення.
Плюси запропонованого підходу: 1 Висока швидкість алгоритму. Зокрема, для стабілізації зображення з роздільною здатністю 1280x720 у форматі BGRA32 на процесорі Core i7-4470 (1 ядро) алгоритм вимагає 1,5 мілісекунди.
2) Компенсація за шейк камери з точністю підпікселя.
Недоліки запропонованого підходу (1) Стабілізація зображень в поточному виконанні можливе тільки для стаціонарних камер.
2) Виявлено і компенсовано просторовий зсув камери, обертання камери не компенсується.
(3) фон має бути досить чітким і неоднорідним, інакше функція кореляції не буде нічого клацання. Тому в темряві або в тумані стабілізація не буде добре працювати.
(4) фон повинен бути стаціонарним. Також неможливо працювати стабілізатора на фоні мандрівки.
Для початку слід зазначити, що для визначення зсуву достатньо використовувати тільки сірий образ, колірні характеристики практично не впливають на точність, але природно уповільнюють розрахунки.
При реалізації стабілізатора бажано використовувати оптимізовані функції для роботи з зображеннями. Я використовував бібліотеку Simd для цього. Зокрема, можна знайти:
(1) SimdAbsDifferenceSum і SimdAbsDifferenceSumMasked для розрахунку функції кореляції.
(2) SimdReduceGray2x2, SimdReduceGray3x3, SimdReduceGray4x4 і SimdReduceGray5x5 для багаторозмірного зображення.
(3) SimdBgrToGray для сірого зображення.
(4) SimdShiftBilinear, щоб компенсувати зсув.
Перегляд результатів алгоритму Приклад 1:
Приклад 2:
Джерело: habrahabr.ru/post/219815/