向量化迭代过程
问题描述:
我已经在python中编写了下面的代码;它需要一个图像,并基本上将其从极坐标转换为笛卡尔坐标;效果是关于某一点的图像是“展开”的。向量化迭代过程
def unravel(img, origin):
max_radius = min(origin)
out = np.zeros((max_radius,720,3), np.uint8)
for phi in range(0,720):
for r in range(0, max_radius):
target = cmath.rect(r,math.radians(phi/2))
out[(r,phi)] = img[(max_radius + target.real, max_radius+target.imag)]
return out
这个算法真的很慢;我真的需要这个来操作实况视频。理想情况下,我希望能够对此进行“矩阵化”,以便使用C而不是Python循环执行底层计算。我这样做并不是特别有经验。最好的方法是什么?
答
一个可能的方法是事先创建一个组适当的索引,并使用numpy的形象魔法转换:
import numpy as np
img = np.random.rand(140,100) # my sample image
img_n,img_m = img.shape # dimensions of image
p_n, p_m = int(np.ceil(np.linalg.norm(img.shape))), 360*2 # dimensions for out array
cc = [img_n/2, img_m/2] # origin for polar coordinates
# Generate sets of indexes of the polar array (do this only once):
X,Y = np.meshgrid(np.arange(img_m), np.arange(img_n))
Z = (X - cc[0]) + 1j*(Y-cc[1]) # create complex array of image coordinates
r,phi = np.abs(Z), np.angle(Z) + np.pi
rc = np.array(np.rint(r), dtype=int) # radial indexes
phic = np.array(np.rint(phi*(p_m-1)/(2*np.pi)), dtype=int) # angular indexes
# Do the the conversion:
out = np.zeros((p_n, p_m))
out[rc, phic] = img # utilize numpy's index magic
对于视频来说做这样的事情似乎对我来说并不常见。如果您想要做特征提取等操作,请注意,还有其他技术,例如Hough transform。
答
这是一个很高的级别,但如果你想能够通过矩阵转换来流式传输视频,你将不得不弄脏手。这不是你现在采取的合理做法。
可能最方便的方法是使用GStreamer自定义插件。有python bindings和一些useful tutorials开始使用管道衬里。您可能想要从geometrictransform插件中大量借用(或者它们可能已经按照您的要求做了什么)。
您也可以尝试扩大你的问题,并添加标签的GStreamer等
这可能有用:http://en.wikipedia.org/wiki/List_of_common_coordinate_transformations#To_Cartesian_coordinates_from_polar_coordinates – Hamish