我正在使用带有 C++11 的 OpenCV 3.4.8,我正在尝试将图像混合在一起。在这个例子中,我有 2 个图像(它们的掩码显示在下面的屏幕中)。我有地理参考,所以我可以在最终图像中轻松计算这些图像的角。掩码外的数据为黑色。
我的代码看起来像这样:
std::vector<cv::UMat> inputImages;
std::vector<cv::UMat> masks;
std::vector<cv::Point> corners;
std::vector<cv::Size> imgSizes;
/*
here is code where I load images, create thier masks
(like in the screen above) and calculate corners.
*/
cv::Ptr<cv::detail::SeamFinder> seamFinder = new cv::detail::DpSeamFinder();
seamFinder->find(inputImages, corners, masks);
cv::Ptr<cv::detail::Blender> blender = new cv::detail:: MultiBandBlender(false);
blender->prepare(corners, imgSizes);
for(size_t i = 0; i < inputImages.size(); i++)
{
blender->feed(inputImages[i], masks[i], corners[i]);
}
cv::UMat blendedImg, outMask;
blender->blend(blendedImg, outMask);
SeamFinder 给了我上面屏幕中的结果。找到的接缝线看起来不错,我对它们非常满意。但另一个问题发生在下一步。当接缝线位于数据末端时,MultiBandBlender 会产生奇怪的白色条纹。这是一个例子:
当我不使用搅拌机,而只是使用蒙版来剪切原始图像并添加(cv::add())图像以及额外的 alpha 通道(由蒙版制成)时,我得到了非常好的结果,没有任何孔和奇怪的颜色,但我需要有更平滑的过渡:/
谁能帮我?当我创建具有较小 num_bands 的 MultiBand Blender 时,白色条纹较小,并且 num_bands = 0 的结果看起来就像只添加图像。我查看了 MultiBandBlender 中feed()的blend()方法,我认为它与高斯或拉普拉斯金字塔以及该blend()方法中从拉普拉斯金字塔的最终恢复图像有关。
EDIT1:当创建高斯和拉普拉斯金字塔copyMakeBorder()时,当图像完全填充数据时,它可以防止 MultiBandBlender 产生这种白色条纹。因此,就我而言,我认为我需要创建与 MultiBandBlender 几乎相同的搅拌机,但copyMakeBorder()方法中的feed()方法更改为将“扩展”我的图像在面具内的东西,就像@AlexanderKondratskiy 建议的那样。现在我不知道如何实现类似于 BORDER_REFLECT 或 BORDER_REFLECT_101 的正确“扩展”。


