5.24. Полярные преобразования#
В полярных координатах каждый пиксель задаётся углом от опорного направления и расстоянием от выбранного центра, вместо горизонтального и вертикального смещения от начала координат в левом верхнем углу. Такое представление оправдывает себя за счёт одного тождества: поворот вокруг выбранного центра превращается в сдвиг вдоль оси углов, что позволяет алгоритму, инвариантному к повороту, искать в гораздо более простом пространстве параметров, чем при работе с поворотами напрямую. Переспроецирование выполняют linpolar() и logpolar().
5.24.1. Два метода#
linpolar() выполняет переспроецирование из декартовых координат в полярные с линейной осью расстояний. Каждый столбец выходного изображения соответствует фиксированному углу вокруг центра; каждая строка соответствует фиксированному расстоянию от центра.
img.linpolar()
logpolar() выполняет то же переспроецирование с логарифмической осью расстояний. Обработка углов идентична; различие в том, что расстояния растут по строкам выходного изображения экспоненциально, а не линейно. Это различие важно из-за второго геометрического тождества, которое раскрывают полярные координаты: масштабирование источника относительно выбранного центра превращается в сдвиг вдоль оси расстояний – но только когда эта ось логарифмическая. При линейной оси расстояний масштабирование растягивает полярное изображение; при логарифмической оси масштабирование сдвигает его на фиксированную величину.
img.logpolar()
Оба метода принимают ключевые аргументы x= и y=, задающие центр полярного переспроецирования в координатах пикселей источника; по умолчанию это половина ширины изображения и половина его высоты соответственно. Выбор центра важен: полярное преобразование вокруг неправильной точки приводит к тому, что содержимое перемешивается так, что разрушается тождество поворота / сдвига.
Циферблат часов, переспроецированный методами linpolar() и logpolar(). Концентрические окружности в источнике становятся горизонтальными линиями в выходном изображении; угловые деления становятся равномерно расположенными вертикальными линиями вдоль оси углов. Логарифмический вариант сжимает радиальные интервалы.#
5.24.2. Когда выбирать каждый из них#
Выбор между linpolar() и logpolar() – это выбор того, какая инвариантность нужна приложению. Для инвариантности только к повороту – обнаружения того, что одна и та же сцена появляется в двух кадрах, где второй повёрнут на неизвестный угол – достаточно linpolar(): поворот становится горизонтальным сдвигом в полярном изображении, и сопоставитель, работающий только со сдвигами, такой как find_displacement(), восстанавливает угол как величину сдвига. Когда важна также инвариантность к масштабу – второй кадр повёрнут и увеличен – logpolar() сводит обе неизвестные к сдвигам: горизонтальному для поворота и вертикальному для масштаба.
Это стандартный рецепт для трекера, устойчивого к изменениям поворота и масштаба: переспроецируйте опорный кадр и каждый текущий кадр в логарифмически-полярные координаты вокруг одного и того же центра, запустите find_displacement() для этой пары и считайте поля rotation и scale из результата.
5.24.3. Развёртка круговых признаков#
Отдельное применение полярных преобразований – развёртка признаков, которые по своей природе являются круговыми на изображении. Циферблат часов, шкала прибора, объект контроля, круговой по конструкции – все они становятся линейными в полярной проекции, то есть приобретают форму, с которой большинству алгоритмов работать проще.
Рисунок выше показывает это напрямую: двенадцать делений на циферблате часов, равномерно расположенных по окружности в декартовых координатах, становятся двенадцатью равномерно расположенными вертикальными линиями в полярном изображении. Прямоугольник вокруг любого одного деления в полярном изображении определяет позицию этого деления независимо от того, как был повёрнут циферблат при захвате. Сопоставитель шаблонов, запущенный по полярному изображению, находит каждое деление за один проход.
5.24.4. Обратное отображение#
reverse=True выполняет обратное действие по отношению к прямой полярной проекции: по полярному изображению строит декартово изображение, полярной проекцией которого оно является. Приложение вызывает прямую форму, чтобы запустить алгоритм в полярных координатах, а затем вызывает обратную форму, чтобы спроецировать результат обратно в декартовы координаты для любого последующего этапа, которому нужно его увидеть.
Чаще всего это используется для модификации полярного изображения с последующим обратным проецированием: фильтр, применённый к полярному изображению – горизонтальное сглаживание, которое в полярных терминах размывает по углам, но сохраняет радиальную структуру – даёт декартов результат, который оказывается размыт по углам, а это то, чего декартов фильтр не может сделать напрямую.