我想将Python 2d数组/图像转换为极性,然后进行处理,然后将它们转换回笛卡尔坐标。以下是ImajeJ Polar Transformer插件的结果(用于示例代码的同心圆):
图像的数量和颜色非常大,所以我正在检查openCV是否有一种快速而简单的方法来执行此操作。
我读过cv。 CartToPolar
和PolarToCart
,但我没有使用它。我更了解输入和输出是数组的LogPolar
,以及设置中心,插值和反转的位置(即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()
这适用于层析成像(CT)工作流程,如果环形工件显示为线条,则可以更容易地将其过滤掉。
答案 0 :(得分:4)
最新版本的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
答案 1 :(得分:2)
CV源代码提到LinearPolar
。它似乎没有记录,但似乎与LogPolar
类似。你试过吗?
答案 2 :(得分:2)
以下是使用SciPy实现的对数极坐标变换的示例:
https://github.com/stefanv/supreme/blob/master/supreme/transform/transform.py#L51
鉴于这只是一个坐标转换,它应该比OpenCV版本更容易适应您的问题。