Python中的快速笛卡尔到极坐标到笛卡尔
我想用Python将2d数组/图像转换为polar,然后进行处理,然后再将它们转换回笛卡尔坐标。以下是ImajeJ插件(用于示例代码的同心圆)的结果: 图像的数量和亮度相当大,所以我正在检查openCV是否有一种快速而简单的方法来实现这一点 我读到了有关简历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
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秒-太长了。好的,我已经测试了你的代码,与我的迭代解决方案相比速度非常快-另外我学到了一些新东西-非常感谢!