分享

Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

 taotao_2016 2020-05-18

✒️ 图像融合是图像处理中一个非常重要且有意思的技术,传统图像融合操作复杂,而且有时候效果不是很好,本文介绍的泊松融合是一种新型的图像融合方法,其操作简单而且融合的结果也非常好,大家可以参考本文一起尝试下~


目录

  • 泊松融合
  • 无缝融合
  • 示例代码
  • 对比cv2.MIXED_CLONE 和 cv2.NORMAL_CLONE
  • 其他示例图:Sample-1,Sample-2

泊松融合

无缝融合

✔️ 图像融合:

  • 背景:图像融合是图像处理的一个基本问题,目的是将原图像中一个物体或者一个区域嵌入到目标图像生成一个新的图像。在对图像进行合成的过程中,为了使合成后的图像更自然,合成边界应当保持无缝。但如果源图像和目标图像有着明显不同的纹理特征,则直接合成后的图像会存在明显的边界。
  • 引入:基于泊松方程而引入的泊松融合求解像素最优值的方法,在保留了源图像梯度信息的同时,融合源图像与目标图像。该方法根据用户指定的边界条件求解一个泊松方程,实现了梯度域上的连续,从而达到边界处的无缝融合。

✔️ 对比传统图像融合和泊松融合:

  • 传统的图像融合:
    • 精确地选择融合区域:过程单调乏味且工作量大,常常无法得到好的结果。
    • Alpha-Matting:功能强大,但是实现复杂。
  • 基于Poisson方程的无缝融合:
    • 选择融合区域的过程简单且方便。
    • 最终可以得到无缝融合的结果。

    ✔️ 变分法的解释泊松图像编辑:

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    • ∇IA​表示融合图像块的梯度

    ✔️ 变分方程的意义表明我们的无缝融合是以源图像块内梯度场为指导,将融合边界上目标场景和源图像的差异平滑地扩散到融合图像块 I 中,这样的话,融合后的图像块能够无缝地融合到目标场景中,并且其色调和光照可以与目标场景相一致。

    示例代码

    • 读取需要融合的两张图:
    import cv2import numpy as np src = cv2.imread('images/airplane.jpg')dst = cv2.imread('images/sky.jpg')

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    src

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    dst

    • 创建飞机的mask:
    src_mask = np.zeros(src.shape, src.dtype)# 绘制多边形poly = np.array([ [4,80], [30,54], [151,63], [254,37], [298,90], [272,134], [43,122] ], np.int32)cv2.fillPoly(src_mask, [poly], (255, 255, 255))

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    src_mask

    • 融合操作使用 cv2.eamlessClone() :参数1:融合图(飞机)参数2:目标图(天空)参数3:融合图的mask参数4:融合图位置中心参数5:融合方式,常用 cv2.MIXED_CLONE 和 cv2.NORMAL_CLONE
    # 飞机中心位置在dst的坐标center = (500,100)# 泊松融合.output1 = cv2.seamlessClone(src, dst, src_mask, center, cv2.MIXED_CLONE)

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    泊松融合

    对比cv2.MIXED_CLONE 和 cv2.NORMAL_CLONE

    import cv2import numpy as np# Read images : obj image will be cloned into imobj = cv2.imread('images/animations.jpg')im= cv2.imread('images/wooden.png')H,W = obj.shape[:2]obj = cv2.resize(obj, (W, H-150), cv2.INTER_CUBIC)# Create an all white maskmask = 255 * np.ones(obj.shape, obj.dtype)# The location of the center of the obj in the imwidth, height, channels = im.shapecenter = (int(height/2), int(width/2)-120)# Seamlessly clone obj into im and put the results in outputnormal_clone = cv2.seamlessClone(obj, im, mask, center, cv2.NORMAL_CLONE)mixed_clone = cv2.seamlessClone(obj, im, mask, center, cv2.MIXED_CLONE)
    • 输入图片:

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    src

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    dst

    • 输出对比 Normal VS Mixed: ⛳️

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    Normal

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    Mixed

    其他示例图

    Sample-1

    • 图片输入:

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    src_1

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    src_2

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    src_3

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    dst

    • 图片输出: ⛳️

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    result

    Sample-2

    • 图片输入:

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    src

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    dst

    • 图片输出: ⛳️

    Opencv从零开始 - 「进阶篇」- 图像融合之泊松融合

    result

    未完待续~

    更多Opencv教程将持续发布!

      本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
      转藏 分享 献花(0

      0条评论

      发表

      请遵守用户 评论公约

      类似文章 更多