быстро декартовой к Полярной к декартовой в Python
Я хочу преобразовать в Python 2d-массивы / изображения в полярные, обработать, а затем преобразовать их обратно в декартовые. Ниже приведен результат от ImajeJ Полярный Трансформатор плагин (используется на концентрических окружностях образца кода):
количество и тусклости изображений довольно велики, поэтому я проверял, есть ли у openCV быстрый и простой способ сделать это.
Я читал о cv. CartToPolar
и PolarToCart
но я не удалось его использовать. Я лучше понимаю LogPolar
где вход и выход являются массивами, и где вы можете установить центр, интерполяцию и инверсию (i.e CV_WARP_INVERSE_MAP
). Есть ли способ использовать CartToPolar/PolarToCart аналогичным образом?
import numpy as np
import cv
#sample 2D array that featues concentric circles
circlesArr = np.ndarray((512,512),dtype=np.float32)
for i in range(10,600,10): cv.Circle(circlesArr,(256,256),i-10,np.random.randint(60,500),thickness=4)
#logpolar
lp = np.ndarray((512,512),dtype=np.float32)
cv.LogPolar(circlesArr,lp,(256,256),100,cv.CV_WARP_FILL_OUTLIERS)
#logpolar Inverse
lpinv = np.ndarray((512,512),dtype=np.float32)
cv.LogPolar(lp,lpinv,(256,256),100, cv.CV_WARP_INVERSE_MAP + cv.CV_WARP_FILL_OUTLIERS)
#display images
from scipy.misc import toimage
toimage(lp, mode="L").show()
toimage(lpinv, mode="L").show()
Это для рабочего процесса томографии (КТ), где кольца артефакты могут быть отфильтрованы легче, если они появляются в виде строк.
3 ответов
исходный код CV упоминает LinearPolar
. это, похоже, не документировано, но похоже на LogPolar
. ты пробовал?
последние версии opencv поддерживает функцию cv2.linearPolar. Это может быть другое решение, которое не связано с использованием opencv:
def polar2cart(r, theta, center):
x = r * np.cos(theta) + center[0]
y = r * np.sin(theta) + center[1]
return x, y
def img2polar(img, center, final_radius, initial_radius = None, phase_width = 3000):
if initial_radius is None:
initial_radius = 0
theta , R = np.meshgrid(np.linspace(0, 2*np.pi, phase_width),
np.arange(initial_radius, final_radius))
Xcart, Ycart = polar2cart(R, theta, center)
Xcart = Xcart.astype(int)
Ycart = Ycart.astype(int)
if img.ndim ==3:
polar_img = img[Ycart,Xcart,:]
polar_img = np.reshape(polar_img,(final_radius-initial_radius,phase_width,3))
else:
polar_img = img[Ycart,Xcart]
polar_img = np.reshape(polar_img,(final_radius-initial_radius,phase_width))
return polar_img
вот пример преобразования log-polar, реализованного с помощью SciPy:
https://github.com/stefanv/supreme/blob/master/supreme/transform/transform.py#L51
учитывая, что это только преобразование координат, должно быть проще адаптироваться к вашей проблеме, чем версия OpenCV.