Python中的快速笛卡尔到极坐标到笛卡尔

Python中的快速笛卡尔到极坐标到笛卡尔,python,image-processing,opencv,numpy,Python,Image Processing,Opencv,Numpy,我想用Python将2d数组/图像转换为polar,然后进行处理,然后再将它们转换回笛卡尔坐标。以下是ImajeJ插件(用于示例代码的同心圆)的结果: 图像的数量和亮度相当大,所以我正在检查openCV是否有一种快速而简单的方法来实现这一点 我读到了有关简历CartToPolar和PolarToCart但我没有使用它。我更了解LogPolar,其中输入和输出是数组,您可以在其中设置中心、插值和反转(即CV\u WARP\u INVERSE\u MAP)。有没有类似的方式使用CartToPola

我想用Python将2d数组/图像转换为polar,然后进行处理,然后再将它们转换回笛卡尔坐标。以下是ImajeJ插件(用于示例代码的同心圆)的结果:

图像的数量和亮度相当大,所以我正在检查openCV是否有一种快速而简单的方法来实现这一点

我读到了有关简历
CartToPolar
PolarToCart
但我没有使用它。我更了解
LogPolar
,其中输入和输出是数组,您可以在其中设置中心、插值和反转(即
CV\u WARP\u INVERSE\u 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)工作流程,如果环伪影显示为线,则可以更容易地过滤掉它们。

CV源代码提到了一个
LinearPolar
。它似乎没有文档记录,但似乎类似于
LogPolar
。您试过了吗?

下面是一个使用SciPy实现对数极坐标变换的示例:


考虑到这只是一个坐标变换,它应该比OpenCV版本更容易适应您的问题。

最新版本的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

非常感谢!事实上,
LinearPolar
言行一致。不幸的是,通过使用
import cv
它不可用,但我尝试了从opencv导入cv到
cv.cvLinearPolar
并成功。接下来的几天,我将在大型数据集中测试它的性能。非常感谢。酷。我想知道为什么它不可见?我将尝试提交一份bug报告。亲爱的Stefan,非常感谢您的反馈。我将在接下来的几天检查并测试您的实现。顺便说一句,我最终浏览了Supreme,看起来很有趣。“你发表过关于它的文章吗?”帕帕多我从来没有看到过你的评论,但是是的——有一篇关于arXiv的论文和一篇论文。顺便说一句,对数极坐标变换现在可以在scikit图像上用大约5行代码实现,使用
skimage.transform.warp
。嗨,Alessandro-我也尝试用这种方法解决这个问题,我写了类似的代码,尽管我使用了循环而不是网格(我以前从未见过这种情况);你知道它的性能有多好吗?我的VGA图像的顺序是1秒-太长了。好的,我已经测试了你的代码,与我的迭代解决方案相比速度非常快-另外我学到了一些新东西-非常感谢!