cv :: detail :: MultiBandBlender照片末尾奇怪的白色条纹

问题描述 投票:0回答:1

我正在使用带有C ++ 11的OpenCV 3.4.8,并且正在尝试将图像混合在一起。在此示例中,我有2张图像(下面的屏幕中显示了这些蒙版)。我具有地理配准,因此可以轻松计算最终图像中该图像的角。掩码外的数据为黑色。

Masks of the images before blending

我的代码看起来像这样:

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);

Seam line of the images

SeamFinder给我的结果就像上面的屏幕一样。找到的接缝线看起来不错,而我对此非常满意。但是另一个问题在下一步发生。当接缝线出现在数据末尾时,MultiBandBlender正在产生奇怪的白色条纹。这是一个例子:

Images after blending

[当我不使用混合器,而只是使用蒙版剪切原始图像时,只需将(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的正确“扩展”。

c++ opencv c++11 blending
1个回答
1
投票

我怀疑您输入的图像在这些蒙版之外包含白色像素。白色条带出现在接缝恰好紧贴面罩的区域附近。以拉普拉斯算子为例,遮罩外部的像素确实会影响最终结果,因为金字塔的每一层本质上都是图像上的一些模糊核。

如果您在掩膜之外有某种好的数据,请保留它。如果您不这样做,我建议您将图像“扩展”到遮罩之外,以保持平滑的过渡。

编辑:

您可以尝试两件事,除非有更多使用OpenCV的经验。

  1. 为了证明/反驳我的假设,仅在蒙版中用平均或中间颜色填充黑色区域。这将使向外部区域的过渡不那么尖锐,并有望减少伪影。如果那没有发生,我的回答是错误的。

  2. 关于当边缘是任意的时,“ BORDER_REFLECT”可能是一个很好的概括,您可以尝试这样的事情:

    • 查找蒙版多边形的质心[C0​​]
    • 对于蒙版外部的每个像素c,请考虑它与p之间的线
    • 沿着这条线计算点c,该点与遮罩区域内的距离相同,因为p'距遮罩边缘。 (即您是沿着遮罩边缘反射)
    • 线性插入p的邻居的颜色(因为它的位置可能不完全落在像素的中间)。那是像素p'
    • 的颜色
© www.soinside.com 2019 - 2024. All rights reserved.