#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)
или что-то в этом роде. Затем выполняется выборка из этой позиции в позиции полярных координат с интерполяцией.
Среди вариантов интерполяции есть:
- Ближайший сосед — вы просто округляете до ближайшего
r
иtheta
и выбираете его значение. - Билинейный —
- Двухкубический
- …
Конечно, вы должны позаботиться о граничных условиях и о том, что произойдет, если ваши r
и theta
выйдут из вашего изображения.
Эта процедура также аналогична (зацикливание на целевом изображении и выборка из исходного изображения, а также выполнение поиска на основе обратного преобразования) для всех видов преобразований координат. Приятно то, что вы не оставляете пробелов там, где, по вашему мнению, исходный код имеет отношение к делу.
Надеюсь, это поможет с частью изображения.
Что касается части mex, вот несколько ссылок: Учебное пособие по Mex
Учебное пособие по Mex
Можете ли вы более конкретно рассказать о том, что вам нужно в части mex?