首页 > 解决方案 > 使用 opencv 或创建线性渐变蒙版

问题描述

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

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

标签: pythonnumpyopencv

解决方案


所以,我有/有与评论中提到的 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()

这些是输入和掩码:

输入和掩码

这将是输出:

输出

线性“混合掩码”是由 NumPy 的linspace方法创建的,而向量的一些重复是由 NumPy 的tilerepeat方法创建的。也许,那部分可以进一步优化。

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

mask1[y, x] * img1[y, x] + mask2[y, x] * img2[y, x] 

mask1[y, x] + mask2[y, x] <= 1

或者你可能会得到这些像素的“过度曝光”。

希望有帮助!


推荐阅读