我正在尝试使用以下脚本混合两个图像,给定一个蒙版:
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)
我做了什么:
- 找到图像的高斯金字塔。
- 从高斯金字塔,找到他们的拉普拉斯金字塔
- 使用蒙版将拉普拉斯金字塔的每一层图像的左半部分和右半部分连接起来。
- 根据这个联合图像金字塔,重建原始图像。
图像被使用-
我得到的结果-
出于某种原因,我不明白为什么,结果图像的颜色完全不对。
最佳答案
我可以检测到两个问题:
你假设你的掩码是 0 或 1.0,但它实际上是 0 或 255,当加载你的掩码时你可以执行以下操作:
m[m==255]=1.0
您可能正在使用 imshow 显示 float32 图像...只需将其转换为 np.uint8 即可显示...
lpb = np.uint8(lpb)
话虽如此,您仍然可能有另一个错误,但我现在没有看到它,因为它仍然有一些带有奇怪颜色的小部分,而且我希望混合在中间更平滑。这是我的结果:
更新
看起来当你做的关卡太多时,伪像就会出现,而当你只有 3 个(而不是 6 个)奇怪的颜色时会出现(也有上面提到的修复)。减法时可能颜色需要饱和?
关于python - 结果颜色错误 - 使用 OpenCV 和 python 进行金字塔混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52495105/