【问题标题】:Set opencv images/numpy array values using an array of pixels使用像素数组设置 opencv 图像/numpy 数组值
【发布时间】:2017-09-28 15:46:42
【问题描述】:

尝试在 OpenCV 中对单应矩阵进行前向扭曲。不过,您不必知道这意味着什么就能理解这个问题。

假设有 2 个图像(一个图像是像素值的 2D Numpy 数组),A 和 B,以及一个数组 match,看起来像

[[  6.96122642e+01  -1.06556338e+03   1.02251944e+00] 
 [  6.92265938e+01  -1.06334423e+03   1.02246589e+00]
 [  6.88409234e+01  -1.06112508e+03   1.02241234e+00]
 ... ]

第一列为 X,第二列为 Y,第三列为标量。这些 XY 值是图像 A 的像素索引,对应于图像 B 的索引

[[0,0], 
 [0,1], 
 [0,2]
 ... ]

我想使用此信息从 imageA 快速设置 imageB 值。我有这个工作,但它没有我想要的那么快

yAs = np.int32(np.round( match[:, 0] / match[:, 2] )
xAs = np.int32(np.round( match[:, 1] / match[:, 2] )
it = np.nditer(pixelsImageB[0], flags=['f_index'])
while not it.finished:
    i = it.index    
    xA = xAs[i]
    yA = yAs[i] 
    if in_bounds(xA, yA, imageA):
        yB = pixB[0][i]
        xB = pixB[1][i] 
        imageB[xB,yB] = imageA[xA,yA]

    it.iternext()

但我不确定如何在 Numpy 中快速实现这一点,天真地执行此循环非常慢。我是高级索引、广播等方面的专家。有什么想法吗?

【问题讨论】:

  • xy 看起来像是退出循环的第一批候选人。例如x = np.int32(np.round(match[:,0] / match[:,2]))
  • in_bounds 是什么?
  • x 或 y >0 并且
  • in_bounds 看起来像一个函数。愿意分享源代码吗?
  • in_bounds = x >= 0 and y >=0 and x < imageA.width and y < imageA.height

标签: python arrays opencv numpy array-broadcasting


【解决方案1】:

最快的方法是不重新发明轮子并使用cv.WarpPerspective函数。

或者,您可以使用 Pillow Image.transform 方法,根据文档,它比 OpenCV 稍有优势,因为它还支持双三次插值,这应该会产生更好质量的输出。

【讨论】:

  • 如果您真的想完成工作,这绝对是最佳选择。我正在实施它只是为了了解它是如何工作的,并希望在这里也能了解一些关于 Numpy 的知识
  • 好的,然后 1) 通过创建掩码将条件 (in_bounds) 移出循环:只需将您编写的表达式中的 x/y 替换为 xAs 和 yAs,将其保存到掩码变量中; 2)然后像这样简单地进行广播: imageB[pixB[1, mask], pixB[0, mask]] = imageA[xAs[mask], yAs[mask]]
猜你喜欢
  • 2018-12-07
  • 1970-01-01
  • 2019-08-11
  • 2017-04-25
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2013-09-17
相关资源
最近更新 更多