使用 opencv 创建线性渐变蒙版或

MrJ*_*ows 4 python opencv numpy

我现在正在尝试将图像拼接在一起以创建全景图。到目前为止我尝试过的方法是扭曲第一个图像并将第二个图像与其对齐,然后重复 n 个图像。这似乎工作正常,但是当我尝试通过使用 numpy 切片创建二进制黑白蒙版将两个图像连接在一起时,存在区分两个图像的明确接缝。我在想,如果我可以在黑色与白色相交的区域有一个带有过渡区域的羽化蒙版,或者甚至只是一个从图像左侧到右侧交叉淡入淡出的线性渐变蒙版,从黑色到白色,它会有助于使接缝更好地融合在一起。我尝试使用高斯模糊来模糊我的二元蒙版的边界,尝试不同的内核大小,但由于蒙版的边界开始出现在图像中,这让情况变得更糟。我似乎无法找到使用 numpy 和 openCV 来创建这样的蒙版并混合图像的方法。如果我可以创建如下所示的蒙版,我什至会很高兴,这样我就可以使用它来混合图像以改善结果。任何建议,将不胜感激

在此输入图像描述 在此输入图像描述

Han*_*rse 6

所以,我和 fmw42 在评论中提到的想法完全相同,但我没有考虑使用 alpha 混合,而是使用适当的“混合蒙版”(即用于 alpha 混合的反转蒙版)进行简单的线性混合。

为了简单起见,我在这里假设两个图像具有相同的图像大小。正如 fmw42 提到的,您应该在这里使用“有趣”的图像部分,例如通过裁剪获得的图像部分。我们看一下代码:

import cv2
import numpy as np

# Some input images
img1 = cv2.resize(cv2.imread('path/to/your/image1.png'), (400, 300))
img2 = cv2.resize(cv2.imread('path/to/your/image2.png'), (400, 300))

# Generate blend masks, here: linear, horizontal fading from 1 to 0 and from 0 to 1
mask1 = np.repeat(np.tile(np.linspace(1, 0, img1.shape[1]), (img1.shape[0], 1))[:, :, np.newaxis], 3, axis=2)
mask2 = np.repeat(np.tile(np.linspace(0, 1, img2.shape[1]), (img2.shape[0], 1))[:, :, np.newaxis], 3, axis=2)

# Generate output by linear blending
final = np.uint8(img1 * mask1 + img2 * mask2)

# Outputs
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('mask1', mask1)
cv2.imshow('mask2', mask2)
cv2.imshow('final', final)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

这些是输入和掩码:

输入和掩码

这将是输出:

输出

线性“混合蒙版”是由 NumPy 的方法创建的,并且由 NumPy 的和方法linspace创建一些向量重复。或许,这部分还可以进一步优化。tilerepeat

警告:至少对于所呈现的线性混合,请确保您生成的每个像素

mask1[y, x] * img1[y, x] + mask2[y, x] * img2[y, x] 
Run Code Online (Sandbox Code Playgroud)

mask1[y, x] + mask2[y, x] <= 1
Run Code Online (Sandbox Code Playgroud)

或者这些像素可能会出现“曝光过度”的情况。

希望有帮助!