【OpenCV】Multiband Blender 用于图像拼缝的平滑

Multiband

融合两张图像,最直接的方案是在两张图像的重合区域用一个平滑渐变的权重对二者加权叠加。该方法的效果并不理想,关键原因是我们无法兼顾拼缝附近的局域细节和大尺度上两张图片的宏观特征(如光照)。当我们希望局域细节能够完好拼接时,需要用较小的平滑渐变区;而当我们希望要宏观上平滑过渡时,又想要较大的渐变区域。这二者似乎不可调和。
但事实上并非如此。Multi-Band的成功之处就是在于它同时兼顾两种需求,当融合宏观特征时,采用一个大的平滑渐变区;融合局域细节时,则采用小的平滑渐变区。那如何才能把这两种情况分开处理呢?很简单,把图像分解为不同频带的分量之加和,图像的宏观特征在它的低频分量图里,而局域特征在高频分量图里。
所以,Multi-Band算法的过程大致就是:把图像按照频率高低展开成一个金字塔,然后高低频分量各自按照不同的方式平滑加权并叠加,最后把各频带分量重新加和,得到最终的融合结果。

算法流程

  1. 计算输入图像的高斯金字塔
  2. 计算输入图像的拉普拉斯金字塔
  3. 将处于同一级的拉普拉斯金字塔进行融合。例如在拼接缝两侧使用简单的线性融合
  4. 将高层的拉普拉斯金字塔依次扩展直至和源图像相同分辨率
  5. 将4中得到的图像依次叠加,则得到最终的输出图像。

MATLAB 实现 可参考 1

OpenCV 实例

Mat imgA, imgB;
Mat maskA, maskB, maskFinal;
Mat multibandResult;

Rect roiDst;
...
...
...
detail::MultiBandBlender blender;
blender.prepare(roiDst);

blender.feed(imgA.clone(), maskA, Point(0, 0));
blender.feed(imgB.clone(), maskB, Point(0, 0));

blender.blend(multibandResult, maskFinal);

//otherwise, result is a gray image
multibandResult.convertTo(multibandResult, (multibandResult.type() / 8) * 8);

imwrite("result.jpg", multibandResult);

Ref

  • How to use Multi-band Blender in opencv
  • Multi-band Blending 原理
  • Opencv3.1 MultiBandBlender源码简要分析

  1. 图像拼接——多波段融合(multi blend): 原理解析和MATLAB代码 ↩

你可能感兴趣的:(OpenCV)