泊松融合原理浅析

2024-04-21 04:18
文章标签 原理 浅析 融合 泊松

本文主要是介绍泊松融合原理浅析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

图像融合是图像处理领域的一个子领域,主要目的是将不同图像的一部分放在一起,融合得到一张新的图像。结果越自然,说明该融合算法就越好。常见的融合算法有Alpha blending、Laplacian Pyramid blending(拉普拉斯金字塔融合/多频带融合)和Poisson Blending。
在这里插入图片描述

泊松融合(Poisson Blending)是图像处理领域著名的图像融合算法,自从2003年发表以来,有很多基于此算法的应用和改进研究出现。泊松融合无需像Alpha blending一样的精确抠图就可以得到很自然的结果。

数学知识预备

梯度,拉普拉斯,散度:
在这里插入图片描述
拉普拉斯方程,又名调和方程、位势方程,是一种偏微分方程。因为由法国数学家皮埃尔-西蒙·拉普拉斯首先提出而得名。求解拉普拉斯方程是电磁学、天文学、热力学和流体力学等领域经常遇到的一类重要的数学问题,因为这种方程以势函数的形式描写电场、引力场和流场等物理对象(一般统称为“保守场”或“有势场”)的性质。

二维拉普拉斯方程如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
拉普拉斯方程是泊松方程的一个特例。

论文内容解析

泊松融合的核心思想不是让需要融合的两张图像直接叠加,而是让目标图像(dst)在融合部分根据源图像(src)的引导场(实际是梯度场 gradient field )“生长”出新的图像。

也就是说,只需要提供源图像的梯度场,让目标图像根据自身特点,按照源图像对应的梯度场生成融合部分。由于目标图像是按照自身特点出发生成融合区域,所以融合结果会显得更加自然。

在这里插入图片描述
在论文中,作者将这种梯度场引导插值操作统一称为“泊松编辑(Poisson Image Editing)”。根据梯度场的处理不同,泊松融合可以分为NORMAL CLONE、MIXED CLONE、MONOCHROME TRANSFER三大类。泊松编辑除了泊松融合外还有Texture flattening、Local illumination changes、Local color changes等应用场景。

在示意图图一中, S S S是二维实数集 R 2 \Bbb{R}^2 R2的闭合子集, Ω \Omega Ω S S S的边界为 ∂ Ω \partial\Omega Ω闭合子集。 f ∗ f^* f是集合 S − Ω S-\Omega SΩ 部分的函数(如果是图像的话就是指所有像素的像素值), f f f是集合 Ω \Omega Ω 的函数(也就是需要靠解泊松方程来求的函数)。 v \bold v v是集合 Ω \Omega Ω的向量场(构建泊松方程所需)。

最简单的插值结果是如下最小化问题的解:
在这里插入图片描述
在这里插入图片描述
该问题的解必须满足其Euler-Lagrange等式:
在这里插入图片描述
在这里插入图片描述
等式(2)是带有狄利克雷边界条件的拉普拉斯方程。

在图像融合中,这种简单的插值方法会产生不连续、模糊的插值效果。这时候可以通过引入集合 Ω \Omega Ω的向量场 v \bold v v来改善。以此方式构建的最小化问题如下:
在这里插入图片描述
该问题的解是如下带有狄利克雷边界条件的泊松方程。
在这里插入图片描述
在这里插入图片描述
也就是说,拉普拉斯方程是泊松方程的一种特例(divv=0)。

需要注意的是上述过程的求解是针对图像单个通道的,如果是RGB通道则需要构建三个泊松方程求解。

对于图像而言,像素点是离散点,因此上述连续空间的偏微分方程可以改写为离散空间的偏微分方程:
在这里插入图片描述
其中,p是S中的像素点, N p N_p Np是像素p的四邻域,<p, q>是像素对。此时 Ω \Omega Ω的边界变为 ∂ Ω = { p ∈ S ∖ Ω : N p ∩ Ω ≠ ∅ } \partial\Omega=\{p\in S \setminus \Omega:N_p\cap\Omega \not = \emptyset\} Ω={pSΩ:NpΩ=} f p f_p fp f f f在p点的值。
在这里插入图片描述

等式(6)的解满足如下联立线性方程:
在这里插入图片描述
当方程中的像素p的四邻域不包含边界点( ∂ Ω \partial\Omega Ω)时:
在这里插入图片描述
在这里插入图片描述

关于泊松方程的求解,原论文中有如下描述:
在这里插入图片描述
方程(7)形式构成一个经典的、稀疏带状、对称、正定系统。可以通过带successive overrelaxation(逐次超松弛)的Gauss-Seidel iteration(高斯-赛德尔迭代)或者V-cycle multigrid方法求解。
在这里插入图片描述
根据泊松方程构建形式的不同可以选择上述两种不同的方法进行求解。

另外梯度场V不仅可以是源图像的梯度场,还可以是其他。对引导场进行设计可以将泊松编辑应用到各种场景中:

NORMAL CLONE
在这里插入图片描述

MIXED CLONE
在这里插入图片描述

MONOCHROME TRANSFER
在这里插入图片描述Texture flattening
在这里插入图片描述

Local illumination changes
在这里插入图片描述
Local color changes
在这里插入图片描述

方法原理

泊松融合的目的是将源图像的一部分无缝融合到目标图像上。其本质是在保持目标图在融合边界的像素的同时以源图像的该部分的梯度场作为指导来生成融合区域内的像素。整体原则是保持融合区域内的生成像素的梯度场与源图像融合部分的像素的梯度场尽可能一致,反映到方程求解中则是梯度差异尽可能小。也就是让生成区域的拉普拉斯结果和源图像的拉普拉斯结果一致,且生成区域边界的的值和目标图像在融合区域的边界值一致。
在这里插入图片描述
以一维场景为例说明,如下图,需要将左侧直方图中红色的部分融合到右侧直方图中的空缺处,红色柱子上方的数值是其梯度。
在这里插入图片描述
根据方程:
在这里插入图片描述

可以列出:
在这里插入图片描述
f 1 f_1 f1 f 6 f_6 f6的值代入并展开:
在这里插入图片描述
对所有min(*)进行求和:
在这里插入图片描述
求偏导:
在这里插入图片描述
写成矩阵形式:
在这里插入图片描述
在这里插入图片描述

矩阵求解:
在这里插入图片描述

融合结果如下:
在这里插入图片描述
对于二维图像而言:
在这里插入图片描述
X方向和Y方向的梯度可以求得:
在这里插入图片描述
可以通过得到的梯度场和边界像素重建回原始图像:
在这里插入图片描述
将图像G融合到图像I上:
在这里插入图片描述
改写成矩阵形式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于 N ∗ N N*N NN大小的图像,矩阵A的大小 N 2 ∗ N 2 N^2*N^2 N2N2,存储A是不现实的,由于A在形式上是稀疏、对称、正定的,可以选用如下方法进行求解:
在这里插入图片描述
维基百科中列出的解法:
在这里插入图片描述

OpenCV实现

OpenCV已经有泊松融合(编辑)的实现代码,接口如下:
在这里插入图片描述
最基本的泊松融合函数如下:
在这里插入图片描述
OpenCV GitHub源码:
在这里插入图片描述
关于泊松融合OpenCV实现代码将在后续博客中进行详解,值得一提的是OpenCV中的泊松方程求解采用了离散傅里叶变换方法,有兴趣可以详读该部分源码。

代码示例

import cv2src_bgr = cv2.imread('xingye.jpg', 1)
dst_bgr = cv2.imread('xiangrikui.jpg', 1)resize = (70, 120)
src_bgr_resize = cv2.resize(src_bgr, (resize[1], resize[0]))
mask = np.ones((src_bgr_resize.shape[0], src_bgr_resize.shape[1]))mask_inner = mask[1:-1, 1:-1]
mask = cv2.copyMakeBorder(mask_inner, 1, 1, 1, 1, cv2.BORDER_ISOLATED | cv2.BORDER_CONSTANT, value=0)mask = mask*255p = (290, 610)out_img = cv2.seamlessClone(src_bgr_resize.astype(np.uint8), dst_bgr.astype(np.uint8), mask.astype(np.uint8), p, cv2.NORMAL_CLONE)cv2.imwrite('out_img.png', out_img)

xingye.jpg:
在这里插入图片描述
xiangrikui.jpg:
在这里插入图片描述
out_img.png:
在这里插入图片描述

在这里插入图片描述

参考资料

[1] OpenCV Docs - Seamless Cloning
[2] OpenCV GitHub - opencv/modules/photo/src/seamless_cloning.cpp
[3] OpenCV GitHub - opencv/modules/photo/src/seamless_cloning_impl.cpp
[4] csdn - 图像处理(十二)图像融合(1)Seamless cloning泊松克隆-Siggraph 2004
[5] 知乎 - 12. 泊松图像编辑
[6] 图像融合之泊松融合(Possion Matting) - 一度逍遥 - 博客园
[7] 盲解卷积和泊松图像融合 - 哔哩哔哩
[8] OpenCV Docs - Image Filtering
[9] OpenCV Docs - cv::dft
[10] OpenCV Docs - cv::cuda::createLaplacianFilter
[11] OpenCV Docs - cv::cuda::DFT
[12] OpenCV GitHub - opencv_contrib/modules/cudaarithm/src/arithm.cpp
[13] Poisson equation, solving with DFT - Algowiki
[14] Numerical Analysis of Boundary-Value Problems (AMATH 585)
[15] 矩阵计算
[16] Opencv中使用cuda进行 dft 与 idft滤波运算 | YangYouji’s WebSite
[17] OpenCV Docs - cv::filter2D
[18] OpenCV Docs - Discrete Fourier Transform
[19] 快速傅里叶变换 - 维基百科,自由的百科全书
[20] opencv之Mat数据类型 - feifanren - 博客园
[21] python - OpenCV cv2.seamlessClone中的错误 - 堆栈内存溢出
[22] python - bug on bounds in OpenCV cv2.seamlessClone - Stack Overflow
[23] seamlessClone bug · Issue #15294 · opencv/opencv
[24] epock / epock / issues / #48 - terminate called after throwing an instance of ‘std::length_error’ — Bitbucket
[25] opencv/pyopencv_cuda.hpp at master · opencv/opencv
[26] 计算机视觉:泊松融合
[27] 松弛法求解给定边界条件的泊松方程
[28] 泊松融合笔记
[29] FFT解泊松方程
[30] 拉普拉斯方程 - 维基百科,自由的百科全书
[31] 泊松方程 - 维基百科,自由的百科全书
[32] Discrete Poisson equation - Wikipedia
[33] OpenCV: samples/cpp/tutorial_code/photo/seamless_cloning/cloning_demo.cpp
[34] 图像融合之多波段融合(Multiband Blending)/拉普拉斯金字塔融合(Laplacian Pyramid Blending)
[35] An Intuitive Explanation of using Poisson Blending for Seamless Copy-and-Paste of Images

这篇关于泊松融合原理浅析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922137

相关文章

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和