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

Чаще всего это используется для модификации полярного изображения с последующим обратным проецированием: фильтр, применённый к полярному изображению – горизонтальное сглаживание, которое в полярных терминах размывает по углам, но сохраняет радиальную структуру – даёт декартов результат, который оказывается размыт по углам, а это то, чего декартов фильтр не может сделать напрямую.