【问题标题】:how to create an interlaced rows images with python and openCv如何使用 python 和 openCv 创建交错行图像
【发布时间】:2013-07-06 21:45:00
【问题描述】:

我有两张大小相同的图片。我想创建一个新的隔行扫描图像,其中奇数行属于一个图像,偶数行属于另一个图像。 就像一个 3d 图像。 我正在尝试使用 python、openCv 和 numpy 来做到这一点! 读取这两个图像并循环我尝试将值写入奇数行和偶数行。

我不知道这是否是最好的方法。你有什么建议吗?

代码如下:

import numpy as np
import cv2

def main():
    print 'loading images...'
    imgL= cv2.imread('sx2.jpg')
    imgR= cv2.imread('dx2.jpg')
    h, w = imgL.shape[:2]
    print h, w
    cv2.imshow(interlace(imgL, imgR, h, w))
    cv2.waitKey()
    cv2.destroyAllWindows()


def interlace(imgL, imgR, h, w):
    inter= np.empty((h, w, 3),int)
    for z in range (0,3):
        for i in range(h-1):
            for j in range(w-1):
                if j % 2 == 0:
                    inter[i][j][z]= imgL[i][j][z]
                else:
                    inter[i][j][z]= imgR[i][j][z]


    b=np.float32(inter) / 255.0
    return b


if __name__ == "__main__":
    main()

【问题讨论】:

  • 你想知道更快的方法吗?还是更优雅的方式?或者只是想知道这是否是您这样做的正确方式?您的问题是问这是否是“最佳”方式,您能否更具体地了解“最佳”一词?

标签: image opencv python-2.7 numpy


【解决方案1】:

这应该比你的方法快得多:

def interlace(imgL, imgR, h, w):
    inter = np.empty((h, w, 3), imgL.dtype)
    inter[:h:2, :w, :] = imgL[:h:2, :w, :]
    inter[1:h:2, :w, :] = imgL[1:h:2, :w, :]
    return inter.astype(np.float32) / 255

作为一般规则,尽量避免显式 for 循环遍历 numpy 数组,执行矢量化方法几乎总是更快。并且不要将numpy数组索引为a[i][j][k],而是使用a[i, j, k],它更快更强大。

【讨论】:

  • 感谢您的建议!您的代码似乎可以工作,而且速度更快!我必须更好地理解这种矢量化方法是如何工作的。就像你为什么写 '[:h:2, :w, :]' 和 '[1:h:2, :w, :]' :)
  • numpy reference 对索引的工作原理进行了非常详细的解释。我上面使用的start:stop:step 表示法在基本切片部分进行了说明。
猜你喜欢
  • 2018-04-24
  • 2017-08-20
  • 2018-11-15
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 2019-06-25
  • 2010-12-11
  • 2017-10-06
相关资源
最近更新 更多