試圖實現着名的橙色/蘋果金字塔混合(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()
你正在使用的數組的數據類型是什麼? (如果'img'是numpy數組,請檢查'img.dtype'。) –
@WarrenWeckesser這兩種圖像類型都是'numpy.ndarray',數據類型是'uint8'。 – Elia
檢查陣列中8位值的溢出。但沒有看到實際的代碼(請參閱http://stackoverflow.com/help/mcve),我認爲我們不能提供更多幫助。 –