我用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循环执行底层计算。我在这方面没有特别的经验;最好的方法是什么?
这有点高级,但是如果您希望能够使用矩阵变换流式传输视频,那么您将不得不亲自动手。这不是你目前可以合理地做到的。
可能最方便的方法是使用GStreamer与自定义插件。这里有一些python绑定和一些有用的教程,可以帮助您开始使用管道内衬。你可能想借用大量的几何变换插件(或者他们可能已经做了你想要的)。
您也可以尝试扩展您的问题并添加gstreamer等标签
一种可能的方法是事先创建一组适当的索引,并使用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
对视频做这样的事情对我来说似乎很少见。如果你想做一些像特征提取这样的事情,请注意还有其他技术,比如霍夫变换。