矢量化迭代过程

时间:2014-03-27 21:53:47

标签: python opencv numpy

我在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循环执行基础计算。我这样做并不是特别有经验;什么是最好的方法?

2 个答案:

答案 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