python - 结果颜色错误 - 使用 OpenCV 和 python 进行金字塔混合

标签 python opencv image-processing

我正在尝试使用以下脚本混合两个图像,给定一个蒙版:

import cv2
import numpy as np

def pyramid_blend(A, B, m, num_levels):
    GA = A.copy()
    GB = B.copy()
    GM = m.copy()

    gpA = [GA]
    gpB = [GB]
    gpM = [GM]

    for i in xrange(num_levels):
        GA = cv2.pyrDown(GA)
        GB = cv2.pyrDown(GB)
        GM = cv2.pyrDown(GM)

        gpA.append(np.float32(GA))
        gpB.append(np.float32(GB))
        gpM.append(np.float32(GM))

    lpA = [gpA[num_levels - 1]]
    lpB = [gpB[num_levels - 1]]
    gpMr = [gpM[num_levels - 1]]

    for i in xrange(num_levels - 1, 0, -1):
        size = (gpA[i - 1].shape[1], gpA[i - 1].shape[0])

        LA = np.subtract(gpA[i - 1], cv2.pyrUp(gpA[i], dstsize=size))
        LB = np.subtract(gpB[i - 1], cv2.pyrUp(gpB[i], dstsize=size))

        lpA.append(LA)
        lpB.append(LB)

        gpMr.append(gpM[i - 1])

    LS = []
    for la, lb, gm in zip(lpA, lpB, gpMr):
        ls = la * gm + lb * (1.0 - gm)
        LS.append(ls)

    ls_ = LS[0]
    for i in xrange(1, num_levels):
        size = (LS[i].shape[1], LS[i].shape[0])
        ls_ = cv2.add(cv2.pyrUp(ls_, dstsize=size), np.float32(LS[i]))

    return ls_

if __name__ == '__main__':

    A = cv2.imread('./black.jpg')
    B = cv2.imread('./white.jpg')
    m = cv2.imread('./mask.jpg')

    lpb = pyramid_blend(A, B, m, 6)

我做了什么:

  • 找到图像的高斯金字塔。
  • 从高斯金字塔,找到他们的拉普拉斯金字塔
  • 使用蒙版将拉普拉斯金字塔的每一层图像的左半部分和右半部分连接起来。
  • 根据这个联合图像金字塔,重建原始图像。

图像被使用-

/image/nbY7B.jpg

/image/i2rj7.jpg

/image/v6QGM.jpg

我得到的结果-

/image/AgcOh.jpg

出于某种原因,我不明白为什么,结果图像的颜色完全不对。

最佳答案

我可以检测到两个问题:

  1. 你假设你的掩码是 0 或 1.0,但它实际上是 0 或 255,当加载你的掩码时你可以执行以下操作:

    m[m==255]=1.0
    
  2. 您可能正在使用 imshow 显示 float32 图像...只需将其转换为 np.uint8 即可显示...

    lpb = np.uint8(lpb)
    

话虽如此,您仍然可能有另一个错误,但我现在没有看到它,因为它仍然有一些带有奇怪颜色的小部分,而且我希望混合在中间更平滑。这是我的结果:

enter image description here


更新

看起来当你做的关卡太多时,伪像就会出现,而当你只有 3 个(而不是 6 个)奇怪的颜色时会出现(也有上面提到的修复)。减法时可能颜色需要饱和?

关于python - 结果颜色错误 - 使用 OpenCV 和 python 进行金字塔混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52495105/

相关文章:

python - OpenCV Python OpenGL 纹理

OpenCV detectMultiScale() minNeighbors 参数

c++ - OpenCV中不同变形方法之间的区别

image-processing - ImageMagick png为svg图像大小

python - PyGTK弃用警告 : What am I missing?

python - 使用预定义列表分解行,同时保留现有行的值

python - 按时间和组划分的 Z 分数

python - 如何使用 boto 在 S3 中设置元数据?

最小化像素拉伸(stretch)效应的算法

android - 从Android中的图像进行数字检测