24/11/11 算法笔记 泊松融合

泊松融合的原理

泊松融合(Poisson Blending)是一种图像融合技术,它基于泊松方程来实现图像的无缝融合。这种方法的核心思想是将前景图像中的某个区域(例如人脸)融合到背景图像中,使得融合后的图像看起来自然无缝。

泊松融合的主要步骤包括:

  1. 梯度计算:计算前景和背景图像的梯度(或拉普拉斯算子)。
  2. 泊松方程求解:利用泊松方程求解融合区域的像素值,使得融合区域的梯度与前景和背景的梯度相匹配。
  3. 融合:将求解得到的像素值应用到背景图像上,完成融合。

泊松融合的优势在于它能够保持边缘的清晰度,并且在融合区域的边缘处不会出现明显的过渡痕迹,从而实现更加自然的图像融合效果。

我们来看一下简化的源代码

import cv2 as cv
import numpy as npdef getLaplacian():laplacian = np.zeros((3, 3), dtype=np.float64)laplacian[1, 0] = 1.0laplacian[0, 1] = 1.0laplacian[1, 2] = 1.0laplacian[2, 1] = 1.0laplacian[1, 1] = -4.0return laplaciandef getB(img1, img2, posX, posY, ROI):Lap = cv.filter2D(img1, -1, getLaplacian())roiheight = ROI.heightroiwidth = ROI.widthB = np.zeros((roiheight * roiwidth, 1), dtype=np.float64)for i in range(roiheight):for j in range(roiwidth):temp = Lap[i + ROI.y, j + ROI.x]if i == 0: temp -= img2[i - 1 + posY, j + posX]if i == roiheight - 1: temp -= img2[i + 1 + posY, j + posX]if j == 0: temp -= img2[i + posY, j - 1 + posX]if j == roiwidth - 1: temp -= img2[i + posY, j + 1 + posX]B[i * roiwidth + j] = tempreturn Bdef getResult(A, B, ROI):result = np.linalg.solve(A, B)return result.reshape((ROI.height, ROI.width))def poisson_blending(img1, img2, ROI, posX, posY):roiheight = ROI.heightroiwidth = ROI.widthA = np.zeros((roiheight * roiwidth, roiheight * roiwidth), dtype=np.float64)# Fill A matrix with Laplacian values# We must do the poisson blending to each channel.rgb1 = cv.split(img1)rgb2 = cv.split(img2)for c in range(3):B = getB(rgb1[c], rgb2[c], posX, posY, ROI)result = getResult(A, B, ROI)# Apply the result to the corresponding channelimg2[posY:posY+roiheight, posX:posX+roiwidth, c] = resultreturn img2# Example usage
img1 = cv.imread("foreground.jpg")
img2 = cv.imread("background.jpg")
ROI = (100, 100, 200, 200)  # (x, y, width, height)
posX, posY = (150, 150)  # Position in the background image
blended_img = poisson_blending(img1, img2, ROI, posX, posY)
cv.imshow("Blended Image", blended_img)
cv.waitKey(0)
cv.destroyAllWindows()

1.定义 Laplacian 算子

def getLaplacian():laplacian = np.zeros((3, 3), dtype=np.float64)laplacian[1, 0] = 1.0laplacian[0, 1] = 1.0laplacian[1, 2] = 1.0laplacian[2, 1] = 1.0laplacian[1, 1] = -4.0return laplacian

定义了一个 3x3 的 Laplacian 算子,用于计算

def getResult(A, B, ROI):result = np.linalg.solve(A, B)return result.reshape((ROI.height, ROI.width))

图像的梯度。Laplacian 算子用于检测图像中的边缘,其核心思想是计算图像亮度的二阶导数。

2.计算 B 矩阵

def getB(img1, img2, posX, posY, ROI):Lap = cv.filter2D(img1, -1, getLaplacian())roiheight = ROI.heightroiwidth = ROI.widthB = np.zeros((roiheight * roiwidth, 1), dtype=np.float64)for i in range(roiheight):for j in range(roiwidth):temp = Lap[i + ROI.y, j + ROI.x]if i == 0: temp -= img2[i - 1 + posY, j + posX]if i == roiheight - 1: temp -= img2[i + 1 + posY, j + posX]if j == 0: temp -= img2[j - 0 + posX, i + ROI.y]if j == roiwidth - 1: temp -= img2[j + 1 + posX, i + ROI.y]B[i * roiwidth + j] = tempreturn B

计算 B 矩阵,它包含了泊松融合中的约束条件。Lap 是通过 Laplacian 算子对前景图像 img1 进行卷积得到的结果。然后,对于 ROI(感兴趣区域)中的每个像素,计算其在 Lap 中的值,并减去背景图像 img2 中对应位置的像素值,得到的结果存储在 B 矩阵中。

3.计算结果

使用 NumPy 的 linalg.solve 方法来解线性方程组 Ax = B,其中 A 是一个由 Laplacian 算子构成的大矩阵,B 是前面计算的 B 矩阵。解得的 result 被重新塑形为与 ROI 相同的尺寸。

def getResult(A, B, ROI):result = np.linalg.solve(A, B)return result.reshape((ROI.height, ROI.width))

4.泊松融合主函数

def poisson_blending(img1, img2, ROI, posX, posY):roiheight = ROI.heightroiwidth = ROI.widthA = np.zeros((roiheight * roiwidth, roiheight * roiwidth), dtype=np.float64)# Fill A matrix with Laplacian values# We must do the poisson blending to each channel.rgb1 = cv.split(img1) #分解通道rgb2 = cv.split(img2)for c in range(3):B = getB(rgb1[c], rgb2[c], posX, posY, ROI) #计算B矩阵result = getResult(A, B, ROI)         #得到融合结果# Apply the result to the corresponding channelimg2[posY:posY+roiheight, posX:posX+roiwidth, c] = result #将结果运用到背景图像的对应通道上return img2

这个函数实现了泊松融合的核心逻辑。它首先将前景和背景图像分割成三个颜色通道,并对每个通道分别进行泊松融合。对于每个通道,它计算 B 矩阵,然后解线性方程组得到融合结果,并将结果应用到背景图像的对应通道上。

6.示例使用

img1 = cv.imread("foreground.jpg")
img2 = cv.imread("background.jpg")
ROI = (100, 100, 200, 200)  # (x, y, width, height)
posX, posY = (150, 150)  # Position in the background image
blended_img = poisson_blending(img1, img2, ROI, posX, posY)
cv.imshow("Blended Image", blended_img)
cv.waitKey(0)
cv.destroyAllWindows()

泊松融合技术虽然在图像融合领域有着显著的优势,但也存在一些缺点和局限性:

  1. 计算复杂度

    • 泊松融合涉及到求解大规模线性方程组,这在计算上可能非常昂贵,尤其是在高分辨率图像上。这可能导致处理速度较慢,不适合实时或近实时的应用场景。
  2. 内存消耗

    • 对于大尺寸的图像,泊松融合可能会消耗大量的内存资源,因为需要存储和处理大型矩阵。
  3. 边界伪影

    • 在某些情况下,尤其是在图像边缘附近,泊松融合可能会产生伪影或不自然的过渡效果,尤其是在图像内容复杂或纹理变化剧烈的情况下。
  4. 对噪声敏感

    • 泊松融合对图像噪声较为敏感,噪声可能会影响梯度的计算,从而影响融合质量。
  5. 参数选择

    • 泊松融合的效果可能依赖于一些参数的选择,如融合区域的大小和位置,这些参数的调整可能需要人工干预,增加了操作的复杂性。
  6. 不适用于所有类型的图像

    • 对于某些类型的图像,如具有大量重复纹理或图案的图像,泊松融合可能不会产生最佳效果,因为这些图案可能会在融合区域产生不自然的重复。
  7. 光照变化敏感

    • 如果前景和背景图像之间的光照条件差异较大,泊松融合可能难以产生自然的效果,因为光照变化可能会影响梯度的一致性。
  8. 难以处理透明和半透明区域

    • 泊松融合在处理透明或半透明区域时可能会遇到困难,因为这些区域的梯度信息可能不足以支持有效的融合。
  9. 缺乏灵活性

    • 泊松融合是一种确定性的融合方法,它不提供对融合过程的直观控制,这可能限制了在特定艺术效果或创意表达中的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/469428.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 小技巧之 Shader 实现酷炫的粒子动画

在之前的《不一样的思路实现炫酷 3D 翻页折叠动画》我们其实介绍过:如何使用 Shader 去实现一个 3D 的翻页效果,具体就是使用 Flutter 在 3.7 开始提供 Fragment Shader API ,因为每个像素都会过 Fragment Shader ,所以我们可以通…

SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)

目录 六、Consul服务注册和发现 1.基本介绍 2.下载运行 3.服务注册与发现 (1)支付服务provider8001注册进consul (2)修改订单服务cloud-consumer-order80 4.CAP (1)CAP理论 (2&#x…

大数据学习12之HBase

1.基本概念 1.1简介 Apache HBase(Hadoop DataBase)是一个开源的、高可靠性、高性能、面向列(这里指列族,非列式存储)、可伸缩、实时读写的分布式数据库,其设计思想来源于 Google 的 BigTable 论文。利用 …

el-input 正则表达式校验输入框不能输入汉字

<el-form :model"data1" :rules"rules" ref"ruleForm" label-width"210px" class"demo-ruleForm"><el-form-item label"锯路&#xff1a;" prop"sawKref"><el-input class"inptWid…

linux rocky 9.4部署和管理docker harbor私有源

文章目录 Harbor简介安装Harbor技术细节1.安装系统(略),设置主机名和IP2.安装docker3.安装docker-compose4.安装Harbor私有源仓库5 测试登录1.本机登录2.客户端登录Harbor服务器配置docker源1. 下载镜像2.把镜像上传到Harbor私有仓库源3.客户端下载镜像,并且启动容器linux …

03WIFI与蓝牙1——基于全志V3S的Linux开发板教程笔记

1. Kernel支持 1&#xff09;配置 终端输入&#xff1a; make menuconfig使能如下部分&#xff1a; 2&#xff09;编译 保存并退出后编译内核&#xff1a; make licheepi_zero_defconfig make menuconfig #配置内核&#xff0c;有需要的话配置 make -j16 make -j16 modu…

iOS 18.2 重磅更新:6个大动作

根据外媒报道&#xff0c;iOS 18.2迎来重磅更新&#xff0c;将带来6个大动作&#xff0c;这是一次非常实用的更新。不过要注意的是&#xff0c;其中涉及到AI的功能&#xff0c;国行iPhone 暂时还不可用&#xff0c;只能等审核通过了。 1&#xff0c;Safari下载进度 过去通过S…

【单例模式】饿汉式与懒汉式以及线程安全

1. 单例模式介绍 饿汉式单例模式&#xff1a;还没有获取实例对象&#xff0c;实例对象就已经产生了。一定是线程安全的。 懒汉式单例模式&#xff1a;需要用的时候再构造实例。 应用场景&#xff1a;比如日志模块&#xff0c;数据库模块&#xff0c;开发的解析器模块。 2.饿…

一文了解 Tableau 2024.3 如何展现已发布数据源的数据模型

通过减少数据源的重复建设&#xff0c;提高数据透明度&#xff0c;可组合数据源将为企业带来更高的数据利用效率 在 TC24 用户大会上&#xff0c;Tableau 产品团队提出了一个非常重要的功能概念——可组合的数据源。这意味着你将很快能够对 Tableau 已发布的数据源进行连接、关…

Unity 网格模型及优化

一个模型中可以包含很多网格&#xff0c;一个模型可以由多个网格组成。在Unity3D中一个网格可以由多个子网格&#xff08;Sub-Mesh)组成。 在渲染引擎的时候&#xff0c;每个子网格都要匹配一个材质球来做渲染&#xff0c;实际上一个子网格本身就是一个个普通的模型&#xff0…

第四十三章 Vue之mapMutations简化mutations操作

目录 一、引言 二、完整代码 2.1. App.vue 2.2. main.js 2.3. Son1.vue 2.4. Son2.vue 2.5. index.js 一、引言 本章节我们通过掌握辅助函数mapMutations&#xff0c;来简化前面章节中调用mutations函数的繁琐方式。mapMutations 和 mapState很像&#xff0c;它是把位于…

【论文复现】ChatGPT多模态命名实体识别

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ChatGPT ChatGPT辅助细化知识增强&#xff01;1. 研究背景2. 模型结构和代码3. 任务流程第一阶段&#xff1a;辅助精炼知识启发式生成第二阶段…

echarts-gl 3D柱状图配置

1. 源码 此demo可以直接在echarts的编辑器中运行 option {title: {text: 产量图,textStyle: {color: rgba(255, 255, 255, 1),fontSize: 17},left: center},tooltip: {},legend: {show: false,orient: vertical,x: left,top: 0,right: 20,textStyle: {fontSize: 12}},visualM…

c语言数据结构与算法--简单实现栈和队列的出栈与入栈

&#xff08;一&#xff09;栈的基本概念 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表&#xff0c;如铁路调度。如下 图&#xff1a; &#xff08;二&#xff09;栈的的表现形式 栈有两种表示形式&#xff1a;栈的表示和实现、栈的 链式表示。 1&#xff0e;栈的表示…

人工智能(AI)和机器学习(ML)技术学习流程

目录 人工智能(AI)和机器学习(ML)技术 自然语言处理(NLP): Word2Vec: Seq2Seq(Sequence-to-Sequence): Transformer: 范式、架构和自注意力: 多头注意力: 预训练、微调、提示工程和模型压缩: 上下文学习、思维链、全量微调、量化、剪枝: 思维树、思维…

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器&#xff0c;就像数组一样&#xff0c;vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效&#xff0c;但是它的大小是动态可变的&#xff0c;并且它的大小会被容器自动处理。 二、vector的构造 常用的构…

移远通信亮相骁龙AI PC生态科技日,以领先的5G及Wi-Fi产品革新PC用户体验

PC作为人们学习、办公、娱乐的重要工具&#xff0c;已经深度融入我们的工作和生活。随着物联网技术的快速发展&#xff0c;以及人们对PC性能要求的逐步提高&#xff0c;AI PC成为了行业发展的重要趋势。 11月7-8日&#xff0c;骁龙AI PC生态科技日在深圳举办。作为高通骁龙的重…

AIGC专栏17——EasyAnimate V5版本详解 应用MMDIT结构,拓展模型规模到12B 支持不同控制输入的控制模型

AIGC专栏17——EasyAnimate V5版本详解 应用MMDIT结构&#xff0c;拓展模型规模到12B 支持不同控制输入的控制模型 学习前言相关地址汇总源码下载地址HF测试链接 测试效果Image to VideoText to Video EasyAnimate详解技术储备Diffusion Transformer (DiT)Stable Diffusion 3Co…

Android Studio | 最新版本配置要求高,JDK运行环境不适配,导致无法启动App

Android Studio 的最新版本配置要求比较高&#xff0c;这时候需要降低插件的版本&#xff0c;才能正常启动项目 build.gradle 文件的 dependencies 部分中&#xff0c;使用 libs 作为一些常用库的别名。这些别名在项目的 gradle.properties 文件或者某个特定的 versions.prope…

ssm093基于Java Web的毕业生就业状况管理系统设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;毕业生就业状况管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业生就业…