矢量化迭代过程



我用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

对视频做这样的事情对我来说似乎很少见。如果你想做一些像特征提取这样的事情,请注意还有其他技术,比如霍夫变换。

相关内容

  • 没有找到相关文章

最新更新