2016-04-26 121 views
4

試圖實現着名的橙色/蘋果金字塔混合(cv2 Image Pyramids)。Python cv2圖片金字塔

注意:兩個圖像的形狀都是307x307。

然而,由於結果圖像在和cv2.add由於模糊限幅的值(如在cv2 vs numpy Matrix Arithmetics說明)中,我使用numpy算術代替如在StackOverflow: Reconstructed Image after Laplacian Pyramid Not the same as original image建議。

我已經通過在一幅圖像上執行金字塔測試了這一點,並且使用金字塔構造的結果圖像具有相同的最大值,最小值和平均值像素值,而不是使用cv2算術。

但是,在金字塔等級7上,結果圖像獲得了紅點的「噪音」,在等級9上,結果圖像獲得了許多綠色像素噪音。 Images of levels 6, 7, 9 - Imgur Album

任何想法爲什麼會發生這種情況?金字塔等級9綠噪聲我會說因爲圖像低於1x1形狀而發生。但是關於7級金字塔的紅點呢?

  • 編輯:代碼添加

    numberOfPyramids = 9 
    
    # generate Gaussian pyramids for A and B Images 
    GA = A.copy() 
    GB = B.copy() 
    gpA = [GA] 
    gpB = [GB] 
    
    for i in xrange(numberOfPyramids): 
        GA = cv2.pyrDown(GA) 
        GB = cv2.pyrDown(GB) 
        gpA.append(GA) 
        gpB.append(GB) 
    
    # generate Laplacian Pyramids for A and B Images 
    lpA = [gpA[numberOfPyramids - 1]] 
    lpB = [gpB[numberOfPyramids - 1]] 
    
    for i in xrange(numberOfPyramids - 1, 0, -1): 
        geA = cv2.pyrUp(gpA[i], dstsize = np.shape(gpA[i-1])[:2]) 
        geB = cv2.pyrUp(gpB[i], dstsize = np.shape(gpB[i-1])[:2]) 
    
        laplacianA = gpA[i - 1] - geA if i != 1 else cv2.subtract(gpA[i-1], geA) 
        laplacianB = gpB[i - 1] - geB if i != 1 else cv2.subtract(gpB[i-1], geB) 
    
        lpA.append(laplacianA) 
        lpB.append(laplacianB) 
    
    # Now add left and right halves of images in each level 
    LS = [] 
    for la, lb in zip(lpA, lpB): 
        _, cols, _ = la.shape 
        ls = np.hstack((la[:, : cols/2], lb[:, cols/2 :])) 
        LS.append(ls) 
    
    # now reconstruct 
    ls_ = LS[0] 
    for i in xrange(1, numberOfPyramids): 
        ls_ = cv2.pyrUp(ls_, dstsize = np.shape(LS[i])[:2]) 
        ls_ = ls_ + LS[i] if i != numberOfPyramids - 1 else cv2.add(ls_, LS[i]) 
    
    cv2.imshow(namedWindowName, ls_) 
    cv2.waitKey() 
    
+0

你正在使用的數組的數據類型是什麼? (如果'img'是numpy數組,請檢查'img.dtype'。) –

+0

@WarrenWeckesser這兩種圖像類型都是'numpy.ndarray',數據類型是'uint8'。 – Elia

+0

檢查陣列中8位值的溢出。但沒有看到實際的代碼(請參閱http://stackoverflow.com/help/mcve),我認爲我們不能提供更多幫助。 –

回答

1

讀取原始article約拉普拉斯金字塔之後,我發現我誤會了這個方法,我們就可以完全重構原始圖像無殘影,因爲我們使用額外的pix信息。削波值導致模糊是確實的。那麼現在我們又回到起點:)

所以你發佈的代碼仍然是限幅值,我建議你用int16來保存拉普拉斯金字塔,而不是使用cv2.subtract。希望它有效。

+0

您是否願意向我提供這些文章中的一篇?我找不到包含那種信息的任何文章... – Elia

+0

那麼,如果你有足夠的耐心,你可以閱讀原文:[link](http://persci.mit.edu/pub_pdfs/RCA84.pdf) 。有關低分辨率圖像重建的主題,您可以在谷歌學者中搜索「超級分辨率」。 –

+0

我讀完文章後,發現拉普拉斯金字塔有負值。並且我們可以使用拉普拉斯金字塔完全重建圖像,所以我更新了我的答案。@ Elia –