Существуют ли пакеты Python, которые могут это сделать?
Да! Теперь есть - по крайней мере, один - пакет Python, который имеет функцию для преобразования матрицы из декартовой в полярные координаты: abel.tools.polar.reproject_image_into_polar()
, которая является частью пакета PyAbel .
(Иньиго Эрнаес Коррес прав, scipy.ndimage.interpolation.map_coordinates
- это самый быстрый способ, который мы нашли, пока что перепроецировать с декартовых в полярные координаты.)
PyAbel можно установить из PyPi , введя в командной строке следующее:
pip install pyabel
Затем в python вы можете использовать следующий код для повторного проецирования изображения в полярные координаты:
import abel
abel.tools.polar.reproject_image_into_polar(MyImage)
[В зависимости от приложения, вы можете рассмотреть возможность передачи аргумента jacobian=True
, который повторно масштабирует интенсивность матрицы, чтобы учесть растяжение сетки (изменение «размеров ячеек»), которое происходит, когда вы преобразовать из декартовой в полярные каудинаты.]
Вот полный пример:
import numpy as np
import matplotlib.pyplot as plt
import abel
CartImage = abel.tools.analytical.sample_image(501)[201:-200, 201:-200]
PolarImage, r_grid, theta_grid = abel.tools.polar.reproject_image_into_polar(CartImage)
fig, axs = plt.subplots(1,2, figsize=(7,3.5))
axs[0].imshow(CartImage , aspect='auto', origin='lower')
axs[1].imshow(PolarImage, aspect='auto', origin='lower',
extent=(np.min(theta_grid), np.max(theta_grid), np.min(r_grid), np.max(r_grid)))
axs[0].set_title('Cartesian')
axs[0].set_xlabel('x')
axs[0].set_ylabel('y')
axs[1].set_title('Polar')
axs[1].set_xlabel('Theta')
axs[1].set_ylabel('r')
plt.tight_layout()
plt.show()
Примечание: есть еще одно хорошее обсуждение (о преобразовании цветных изображений в полярные координаты) по SO: информация об изображении вдоль полярной системы координат