使用OpenCV和python在结果金字塔混合中的错误颜色

2024-09-28 20:50:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试混合两个图像,给定一个遮罩,使用以下脚本:

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)

我所做的:

  • 找到图像的高斯金字塔。在
  • 从高斯金字塔,找到它们的拉普拉斯金字塔
  • 使用蒙版将拉普拉斯金字塔的左半部分和右半部分图像连接起来。在
  • 从这个关节图像金字塔,重建原始图像。在

使用的图像是-

https://i.stack.imgur.com/nbY7B.jpg

https://i.stack.imgur.com/i2rj7.jpg

https://i.stack.imgur.com/v6QGM.jpg

我得到的结果是-

https://i.stack.imgur.com/AgcOh.jpg

因为某些原因,我不明白为什么,结果图像的颜色是完全关闭的。在


Tags: 图像sizenpcv2lsnumlevelsgpa
1条回答
网友
1楼 · 发布于 2024-09-28 20:50:31

我可以发现两个问题:

  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个)奇怪的颜色出现时,就会出现瑕疵(同样有上面提到的修复)。可能颜色需要饱和也许减法的时候?在

相关问题 更多 >