Python 2.7 Python cv2图像金字塔

Python 2.7 Python cv2图像金字塔,python-2.7,opencv,numpy,image-processing,Python 2.7,Opencv,Numpy,Image Processing,尝试实现著名的橙色/苹果金字塔混合() 注:两幅图像的形状均为307x307 但是,由于cv2.subtract和cv2.add(如中所述)中的剪裁值导致结果图像模糊,因此我使用了中建议的numpy算术 我通过在一幅图像上执行金字塔来测试这一点,使用金字塔构建的结果图像具有与使用cv2算法相同的最大、最小、平均像素值 然而,在金字塔级别7上,结果图像得到一个红点的“噪声”,在级别9上,结果图像得到许多绿色像素噪声 你知道为什么会这样吗?金字塔9级的绿色噪音之所以会出现,是因为图像的形状低于1x1

尝试实现著名的橙色/苹果金字塔混合()

注:两幅图像的形状均为307x307

但是,由于
cv2.subtract
cv2.add
(如中所述)中的剪裁值导致结果图像模糊,因此我使用了中建议的
numpy
算术

我通过在一幅图像上执行金字塔来测试这一点,使用金字塔构建的结果图像具有与使用
cv2
算法相同的最大、最小、平均像素值

然而,在金字塔级别7上,结果图像得到一个红点的“噪声”,在级别9上,结果图像得到许多绿色像素噪声

你知道为什么会这样吗?金字塔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()
    
在阅读了关于拉普拉斯金字塔的原始资料后,我发现我误解了这种方法,我们可以完全重建原始图像而不产生模糊,因为我们使用了额外的pix信息。剪裁值确实会导致模糊。现在我们又回到开头:)


因此,您发布的代码仍然是剪切值,我建议您使用int16保存拉普拉斯金字塔,而不要使用cv2.subtract。希望有效。

您使用的阵列的数据类型是什么?(如果
img
是numpy数组,请检查
img.dtype
)@WarrenWeckesser两种图像类型都是
numpy.ndarray
,数据类型是
uint8
。检查数组中的8位值是否溢出。但是,如果没有看到实际的代码(请参阅),我认为我们不能提供更多帮助。@WarrenWeckesser添加了复制结果的代码。您能为我提供一篇这样的文章吗?我找不到任何包含此类信息的文章……好吧,如果您有足够的耐心,您可以阅读原始文章:。关于低分辨率图像重建的话题,你可以在google scholar中搜索“超分辨率”。读完这篇文章后,我发现拉普拉斯金字塔有负值。我们可以使用拉普拉斯金字塔完全重建图像,所以我更新了我的答案。@Elia尝试使用uint16、int16、float32,仅在最后,当显示图像时,将其更改为uint8,仍然得到相同的结果@非常成功