我在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循环执行基础计算。我这样做并不是特别有经验;什么是最好的方法?
答案 0 :(得分:1)
这是一个很高的级别,但如果您希望能够通过矩阵转换流式传输视频,那么您将不得不亲自动手。对于您当前的方法,这不是合理的。
可能最容易使用的方法是将GStreamer与自定义插件一起使用。有python bindings和一些useful tutorials用于开始使用管道衬里。您可能希望从geometrictransform插件中大量借用(或者他们可能已经按照您的意愿行事)。
您还可以尝试扩展您的问题并为gstreamer等添加标签
答案 1 :(得分:0)
一种可能的方法是预先创建一组适当的索引并使用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。