2013-07-09 51 views
1

我有两个尺寸相同的图像。我想创建一个新的交错图像,其中奇数行属于一个图像,偶数行属于一个图像。 像3D图像。 我想用Python和openCv和numpy做到这一点! 读取两个图像和一个循环,我尝试写入奇数和偶数行的值。如何使用python和openCv创建隔行扫描图像

我不知道这是否是最好的方法。你有一些提示吗?

下面的代码:

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() 
+1

你想知道更快的方法吗?还是更优雅的方式?或者只是想知道这是否是正确的方式?你的问题是问这是否是“最好”的做法,你能更专注于“最好”这个词吗? – usethedeathstar

回答

2

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

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]来代替,它更快更强大。

+0

感谢您的建议!你的代码似乎工作,它更快! 我必须更好地了解这种矢量化方法的工作原理。就像你为什么写'[:h:2,:w,:]'和'[1:h:2,:w,:]':) – Gianfra

+0

[numpy reference](http://docs.scipy.org /doc/numpy/reference/arrays.indexing.html)对于索引如何工作有非常详细的解释。我在上面使用的'start:stop:step'符号在基本切片部分进行了说明。 – Jaime