gpt4 book ai didi

c++ - cv::detail::MultiBandBlender 照片末尾出现奇怪的白色条纹

转载 作者:行者123 更新时间:2023-12-02 17:25:28 26 4
gpt4 key购买 nike

我正在使用带有 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

当我不使用 blender ,而只是使用蒙版来剪切原始图像并添加( cv::add())图像以及额外的 alpha channel (由蒙版制成)时,我得到了非常好的结果,没有任何孔和奇怪的颜色,但我需要更平滑的过渡:/

谁能帮我?当我创建具有较小 num_bands 的 MultiBand Blender 时,白色条纹较小,并且 num_bands = 0 的结果看起来就像只添加图像。
我看了 feed()blend() MultiBandBlender 中的方法,我认为它与高斯或拉普拉斯金字塔以及 blend() 中拉普拉斯金字塔的最终恢复图像有关。方法。

编辑1:
当创建高斯和拉普拉斯金字塔时, copyMakeBorder() ,这可以防止 MultiBandBlender 在图像完全填充数据时产生这种白色条纹。所以在我的情况下,我认为我需要创建与 MultiBandBlender 几乎相同的搅拌器,但是 copyMakeBorder() feed() 中的方法方法更改为将在面具内“扩展”我的图像的东西,就像@AlexanderKondratskiy 建议的那样。
现在我不知道如何实现类似于 BORDER_REFLECT 或 BORDER_REFLECT_101 的正确“扩展”。

最佳答案

我怀疑您的输入图像在这些蒙版之外包含白色像素。白色条纹出现在接缝完全跟随蒙版的区域周围。例如,对于拉普拉斯算子,蒙版之外的像素确实会影响最终结果,因为金字塔的每一层本质上都是图像上的一些模糊核。

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

编辑:

除非有更多 OpenCV 经验的人出现,否则您可以尝试以下两件事。

  • 为了证明/反驳我的假设,只需用掩码内的平均颜色或中间颜色填充黑色区域。这应该会使到外部区域的过渡不那么尖锐,并有望减少伪影。如果这没有发生,我的回答是错误的。
  • 当边缘是任意的时,就“BORDER_REFLECT”的一个很好的概括而言,你可以尝试这样的事情:
  • 找到质心 c掩码多边形的
  • 对于每个像素 p在面具之外,想想它和 c 之间的界限。
  • 计算点p'沿着这条线在 mask 区域内的距离相同,如p是从掩模边缘。 (即你沿着蒙版边缘反射)
  • 线性插值 p' 的邻居的颜色(因为它的位置可能不会正好落在像素的中间)。那是像素的颜色p
  • 关于c++ - cv::detail::MultiBandBlender 照片末尾出现奇怪的白色条纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59670659/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com