Преобразование полярного изображения в декартово изображение

#c #matlab #mex #cartesian

#c #matlab #mex #Декартово

Вопрос:

Я пытаюсь преобразовать изображение в полярных координатах (оси — угол x радиус) в изображение в декартовых координатах (оси — x и y).

В matlab это достаточно просто с помощью pcolor (), но проблема в том, что я должен сделать это в mex-файле (интерфейс c к Matlab). Это кажется достаточно простым, за исключением того, что Matlab использует ТОЛЬКО контейнеры-массивы, поэтому я не могу придумать умный или красноречивый способ сделать это.

У меня есть доступ к размерам изображения, и я могу представить себе очень беспорядочный способ переупаковки массива входных изображений в виде матрицы на C и завершения преобразования, но это было бы беспорядочно и проблематично.

Кроме того, мне нужно иметь возможность интерполировать промежутки между точками на равнине xy.

Есть идеи?

Комментарии:

1. Я думаю, что на данный момент я попробую взять входной массив и выполнить цикл по нему, генерируя интенсивность для каждого (угол, радиус) и сохранить это на карте с ключом ciel (rcos (theta)) и ciel (rsin (theta))). Могу ли я сгенерировать 2D-ключ для карты? Я забыл… Я буду сохранять каждое значение угла, радиуса в каждой клавише x, y.

2. Если вы имеете в виду, что хотите преобразовать пары (r, phi) в пары (x, y), я не вижу, что является беспорядочным и проблематичным в предоставлении входного массива пар в mex-файл и получении выходного массива пар в качестве выходных данных. Или я неправильно понял ваш вопрос? Некоторый код поможет.

Ответ №1:

Это достаточно стандартно при обработке изображений, особенно при регистрации. Однако это требует некоторого обдумывания и не является «очевидным». Для меня это тоже не было очевидно в первый раз.

Я предполагаю, что у вас есть два изображения в разных «доменах», в вашем случае исходное изображение в полярных координатах и целевое изображение в декартовых координатах. Я предполагаю, что вы знаете область на целевом изображении, которую хотите заполнить.

Общеизвестно, что лучшее, что можно сделать при обработке изображений, — это перебирать координаты в известной области целевого изображения, которую вы хотите заполнить. Для каждой из этих позиций (x, y) у вас будет некоторое преобразование в полярное. Вероятно, это r = sqrt(x*x y*y) и theta = atan2(y,x) или что-то в этом роде. Затем выполняется выборка из этой позиции в позиции полярных координат с интерполяцией.

Среди вариантов интерполяции есть:

  1. Ближайший сосед — вы просто округляете до ближайшего r и theta и выбираете его значение.
  2. Билинейный —
  3. Двухкубический

Конечно, вы должны позаботиться о граничных условиях и о том, что произойдет, если ваши r и theta выйдут из вашего изображения.

Эта процедура также аналогична (зацикливание на целевом изображении и выборка из исходного изображения, а также выполнение поиска на основе обратного преобразования) для всех видов преобразований координат. Приятно то, что вы не оставляете пробелов там, где, по вашему мнению, исходный код имеет отношение к делу.

Надеюсь, это поможет с частью изображения.

Что касается части mex, вот несколько ссылок: Учебное пособие по Mex
Учебное пособие по Mex

Можете ли вы более конкретно рассказать о том, что вам нужно в части mex?