2013-07-09 91 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