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 выполняет обратное действие по отношению к прямой полярной проекции: по полярному изображению строит декартово изображение, полярной проекцией которого оно является. Приложение вызывает прямую форму, чтобы запустить алгоритм в полярных координатах, а затем вызывает обратную форму, чтобы спроецировать результат обратно в декартовы координаты для любого последующего этапа, которому нужно его увидеть.
Чаще всего это используется для модификации полярного изображения с последующим обратным проецированием: фильтр, применённый к полярному изображению – горизонтальное сглаживание, которое в полярных терминах размывает по углам, но сохраняет радиальную структуру – даёт декартов результат, который оказывается размыт по углам, а это то, чего декартов фильтр не может сделать напрямую.