5.24. Полярні перетворення

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

5.24.1. Два методи

linpolar() виконує перепроєкцію з декартових координат у полярні з лінійною віссю відстані. Кожен стовпець вихідного зображення відповідає фіксованому куту навколо центру; кожен рядок – фіксованій відстані від центру.

img.linpolar()

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

img.logpolar()

Обидва методи приймають ключові параметри x= та y=, які задають центр полярної перепроєкції у координатах пікселів джерела; за замовчуванням це половина ширини та половина висоти зображення відповідно. Вибір центру важливий: полярне перетворення навколо неправильної точки призводить до перемішування вмісту, що руйнує властивість інваріантності до обертань/зсувів.

Three panels in a row. The leftmost is a Cartesian source image showing a clock face -- two concentric circles with twelve tick marks around the outer rim at multiples of 30 degrees, and a single hand pointing in one direction. The middle panel shows the linpolar re-projection of that source: a rectangular output image where the twelve tick marks appear as evenly spaced vertical strokes along the top row, the two concentric circles appear as two horizontal lines at different vertical positions, and the clock hand appears as a single vertical line at the position corresponding to its angle in the source. The rightmost panel shows the logpolar re-projection: the same angular distribution along the horizontal axis, but with the gap between the inner and outer circles compressed because the distance axis is logarithmic.

Циферблат годинника, перепроєційований методами linpolar() та logpolar(). Концентричні кола у джерелі стають горизонтальними лініями на виході; кутові позначки – рівномірно розташованими вертикальними лініями вздовж осі кутів. Варіант з логарифмічною полярною проєкцією стискає радіальний розподіл.

5.24.2. Коли використовувати кожен метод

Вибір між linpolar() та logpolar() – це вибір інваріантності, яка потрібна застосунку. Якщо потрібна лише інваріантність до обертань – виявлення того, що та сама сцена присутня у двох кадрах, другий з яких повернутий на невідомий кут – достатньо linpolar(): обертання перетворюється на горизонтальний зсув у полярному зображенні, а алгоритм зіставлення лише зсувів, наприклад find_displacement(), повертає кут як розмір цього зсуву. Коли важлива ще й інваріантність до масштабування – другий кадр повернутий і збільшений – logpolar() зводить обидва параметри до зсувів: горизонтальний для обертання, вертикальний для масштабу.

Це стандартний алгоритм трекера, стійкого до обертань і змін масштабу: перепроєктувати опорний кадр і кожен поточний кадр у лог-полярні координати навколо того самого центру, запустити find_displacement() для пари і зчитати поля rotation та scale з результату.

5.24.3. Розгортання кругових ознак

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

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

5.24.4. Зворотне відображення

reverse=True виконує зворотну операцію відносно прямої полярної проєкції: за полярним зображенням відновлює декартове зображення, полярною проєкцією якого воно є. Застосунок викликає пряму форму для роботи алгоритму в полярних координатах, а потім зворотну – для перетворення результату назад у декартові координати для подальших етапів обробки.

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