opencv-python 图像增强十七:泊松图像融合

news2024/9/22 3:40:29

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、概述
  • 二,实现:


前言

在深入探讨图像处理与计算机视觉领域的过程中,我们不禁对图像融合技术的精妙与实用性感到着迷。图像融合不仅是一项融合了美学与科学的技术手段,它还巧妙地将来源各异、特性不同的图像数据整合为一体,从而生成视觉上连贯且富含信息的合成图像。本篇博客文章旨在详尽解析OpenCV库中的一项高级功能cv2.seamlessClone。该功能在图像融合技术中占据着举足轻重的地位,以其独特的算法实现图像间的无缝对接,保证了融合后的图像在视觉上的自然性与一致性

一、概述

图像融合是一种技术过程,它将两个或多个源图像合成为一幅综合图像,旨在整合不同图像中的互补信息,从而创建出一幅在视觉质量和信息内容上都超越单一源图像的新图像。简而言之,图像融合的目标是利用信息的优势互补和视觉效果的优化。泊松图像融合是这一领域的一种先进技术,它能够无缝地结合多个图像,确保融合后的图像在视觉上呈现自然和连续的效果。这种技术在图像编辑、合成、拼接和修复等多个领域都有广泛应用。泊松融合基于数学的泊松方程,采用梯度为基础的融合方法。其显著优势在于能够维持图像的光照和颜色一致性,确保融合区域与周围环境在视觉上和谐一致。尽管如此,泊松融合在面对大幅度光照变化或复杂纹理的场景时,可能存在一定的局限性。

二,实现:

seamlessClone是OpenCV库中提供的一种高级图像融合技术,它可以实现图像的无缝克隆,即使融合区域在颜色、亮度和纹理上与周围环境不同,也能产生自然且难以察觉的融合效果。这种方法特别适用于将一个对象复制到另一个图像中,同时保持目标图像背景的自然性。
seamlessClone使用的是泊松融合技术的一个变种,并结合了多尺度融合策略,以减少融合区域与周围环境的视觉差异。以下是seamlessClone函数的基本使用方法和参数:
result = cv2.seamlessClone(src, dst, mask, p, flags, blend)

参数说明
src: 源图像,通常是要克隆的对象。
dst: 目标图像,即源图像要融合到的背景图像。
mask: 与源图像大小相同的二值掩模图像,其中白色部分表示要克隆的区域。
p: 目标图像中融合区域的中心点坐标,格式为(x, y)。
flags: 控制融合方法的标志。通常使用以下两个值:
cv2.NORMAL_CLONE: 使用正常克隆模式。
cv2.MIXED_CLONE: 使用混合克隆模式,适用于源图像和目标图像具有不同亮度的情况。
或cv 2.MONOCHROME_TRANSFER( 不保留src图像的颜色细节,只有src图像的质地,颜色和目标图像一样,可以用来进行皮肤质地填充)
blend: 可选参数,用于指定混合区域的大小,默认值为None。
返回值
result: 输出图像,包含了源图像和目标图像的无缝融合效果。

使用案例:

import cv2
import numpy as np


def on_mouse(event, x, y, flags, param):
    img = cv2.resize(cv2.imread(r"D:\pythonProject\R-C.jpg"), (400,300))
    cv2.imshow("image", img)
    img2 = img.copy()
    if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击
        param.append(x)
        param.append(y)
        cv2.circle(img2, tuple(param),10,(0,255,0),5)
        cv2.imshow('image', img2)
    elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON):#移动鼠标,左键拖拽
        cv2.rectangle(img2,tuple(param),(x,y),(255,0,0),15)#需要确定的就是矩形的两个点(左上角与右下角),颜色红色,线的类型(不设置就默认)。
        cv2.imshow('image', img2)
    elif event == cv2.EVENT_LBUTTONUP:  # 左键释放
        point2 = (x,y)
        cv2.rectangle(img2, tuple(param), point2, (0, 0, 255), 5)#需要确定的就是矩形的两个点(左上角与右下角),颜色蓝色,线的类型(不设置就默认)。
        back = cv2.resize(cv2.imread("sky.jpg"),(640,480))   # 读取背景图片
        min_x = min(tuple(param)[0],point2[0])
        min_y = min(tuple(param)[1],point2[1])
        width = abs(tuple(param)[0]-point2[0])
        height = abs(tuple(param)[1]-point2[1])
        cut_img = img[min_y:min_y+height, min_x:min_x+width]
        mask = 255 * np.ones(cut_img.shape, cut_img.dtype)
        center = (256, 256)
        CLONE_img = cv2.seamlessClone(cut_img,back,mask,center, cv2.NORMAL_CLONE)   # 图像融合,将前景和背景进行融合
        MIXED_img = cv2.seamlessClone(cut_img, back, mask, center, cv2.MIXED_CLONE)
        TRAN_img = cv2.seamlessClone(cut_img, back, mask, center, cv2.MONOCHROME_TRANSFER)
        cv2.imshow("CLONE_img",CLONE_img)
        cv2.imshow("MIXED_img", MIXED_img)
        cv2.imshow("TRAN_img", TRAN_img)
        # cv2.imwrite('./crop_image.jpg', cut_img)

 
def main():
    point=[]
    cv2.namedWindow('image')   # 创建图像窗口窗口名字为image
    cv2.setMouseCallback('image', on_mouse,point)
    cv2.waitKey(0)

    
if __name__=='__main__':
    main()

效果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物联网之云平台架构

一,一个典型的物联网云平台 一个典型的物联网(IoT)云平台需要实现多个功能,以支持物联网设备的接入、数据处理、设备管理、实时控制等需求。 (一)核心功能 1,设备接入与管理: - 设…

【达梦数据库】DBeaver连接达梦数据库

打开 DBeaver&#xff0c;新建驱动管理器 新建驱动管理器&#xff0c;配置信息如下 添加库文件&#xff0c;jar包使用项目上使用的jdbc驱动包即可&#xff0c;找到本地maven仓库jar位置进行添加。 <dependency><groupId>com.dameng</groupId><artifact…

打开配置好的gee的jupyter Lab环境

目录 打开anconda 打开箭头下的cmd环境&#xff0c;输入jupyter lab

Spring MVC 八股文

目录 重点 SpringMVC的工作原理 Spring MVC 拦截器 Spring MVC 的拦截器和 Filter 过滤器有什么差别&#xff1f; 基础 什么是SpringMVC SpringMVC的优点 Spring MVC的核心组件 Spring MVC的常用注解由有哪些 Controller 注解有什么用 重点 SpringMVC的工作原理 1、客…

人脸静态活体检测(高精度版) API 对接说明

人脸静态活体检测&#xff08;高精度版&#xff09; API 对接说明 本文将介绍人脸静态活体检测&#xff08;高精度版&#xff09;API 对接说明&#xff0c;它可用于对用户上传的静态图片进行防翻拍活体检测&#xff0c;以判断是否是翻拍图片。 接下来介绍下 人脸静态活体检测…

浅谈sizeof() 函数在Arduino中的使用

下面浅谈 sizeof() 函数在Arduino中的使用 注意&#xff1a;这里用sizeof(str[2])&#xff0c;sizeof(str[0])&#xff0c;sizeof(str[1])都是一样的 String str[6]{"abc","defg","hijk","lm","n"}; int num; void setup…

C++项目详细分析_WebServer

前言 项目地址 项目介绍 源码详细分析 项目路径如下&#xff1a; 1.webserver.cpp 头文件和构造函数 #include "webserver.h"WebServer::WebServer() {// http_conn类对象users new http_conn[MAX_FD];// root文件夹路径char server_path[200];getcwd(server…

【C++】N卡无法录制,如何下载C++

N卡无法录制&#xff0c;如何下载C C 官方下载路径&#xff1a; https://www.microsoft.com/zh-cn/download/details.aspx?id48145&134b2bb0-86c1-fe9f-d523-281faef416951&751be11f-ede8-5a0c-058c-2ee190a24fa6True 第一步 检查N卡驱动是不是最新版本 第二步 下载…

拓扑结构_替代SN6505推挽式低噪声隔离变压驱动器输出功率1-3W

PC6505 是一款专门为小体积、低待机功耗微功率隔离电源而设计的推挽式变压器驱动器&#xff0c;其外围只需匹配简单的输入输出滤波电容、隔离变压器和整流电路&#xff0c;即可实现 3.3V 或 5V 输入、3.3V~24V 输出、输出功率 1~3W 的隔离电源。 PC6505 芯片内部集成振荡器&am…

简单的棒棒图绘制教程

原文教程链接&#xff1a;R 语言绘图 | GO、KEGG等富集棒棒图 往期部分文章 1. 最全WGCNA教程&#xff08;替换数据即可出全部结果与图形&#xff09; WGCNA分析 | 全流程分析代码 | 代码一 WGCNA分析 | 全流程分析代码 | 代码二 WGCNA分析 | 全流程代码分享 | 代码三 WGC…

stun和trun

在 WebRTC 中&#xff0c;STUN&#xff08;Session Traversal Utilities for NAT&#xff09;和 TURN&#xff08;Traversal Using Relays around NAT&#xff09;是用于NAT穿透的两种不同的技术&#xff0c;它们解决的问题不同&#xff0c;因此在某些情况下需要同时使用。 ST…

VM虚拟机:虚拟机能ping通主机,主机ping不通虚拟机,永久解决办法。

最近在安装VM虚拟机的时候,出现了虚拟机能ping通主机,主机ping不通虚拟机。着实令人恶心,尤其是虚拟机在设置网络的时候,网上五花八门,修改什么配置的都有,最多的就是修改宿主机的ipv4,这种我个人感觉不可取。宿主机不要乱改配置,需要修改尽量在虚拟机中修改即可。 还需…

el-time-select 动态增加时间

<template><div><div v-for"(item, index) in timeSlots" :key"index"><el-time-select placeholder"起始时间" v-model"item.startTime" :picker-options"{start: 00:00,step: 00:15,end: 23:59,}"&g…

VMware安装windows虚拟机详细过程

目录 准备工作配置虚拟机为虚拟机设置操作系统镜像安装windows10 准备工作 安装好VMware软件并激活&#xff0c;激活码自行查找 准备好系统镜像文件&#xff0c;可以在MSDN中下载&#xff0c;地址&#xff1a;https://next.itellyou.cn/ 配置虚拟机 选择自定义 默认 选择稍后…

C语言操作符详解1(含进制转换,原反补码)

文章目录 一、操作符的分类二、二进制和进制转换1.二进制与十进制的相互转换2,二进制与八进制的相互转换3.二进制与十六进制的相互转换 三、原码、反码和补码四、移位操作符1.左移操作符&#xff08;1&#xff09;左移操作符移位方法&#xff08;2&#xff09;左移操作符规律总…

编程要由 “手动挡” 变 “自动挡” 了?Cursor+Claude-3.5-Sonnet,Karpathy 点赞的 AI 代码神器。如何使用详细教程

Cursor 情况简介 AI 大神 Andrej Karpathy 都被震惊了&#xff01;他最近在试用 VS Code Cursor Claude Sonnet 3.5&#xff0c;结果发现这玩意儿比 GitHub Copilot 还好用&#xff01; Cursor 在短短时间内迅速成为程序员群体的顶流神器&#xff0c;其背后的原因在于其默认使…

代码随想录 刷题记录-24 图论 (1)理论基础 、深搜与广搜

一、理论基础 参考&#xff1a; 图论理论基础 深度优先搜索理论基础 广度优先搜索理论基础 dfs dfs搜索可一个方向&#xff0c;并需要回溯&#xff0c;所以用递归的方式来实现是最方便的。 有递归的地方就有回溯&#xff0c;例如如下代码&#xff1a; void dfs(参数) {…

一份高质量的测试用例如何养成?

测试一个新功能时&#xff0c;最重要的一个步骤就是编写测试用例&#xff0c;测试用例写好了&#xff0c;那么后面的测试工作基本就非常顺利了&#xff0c;那么怎样提高测试用例的质量呢&#xff1f; 充分理解需求 拿到测试需求后&#xff0c;不应该拿到什么就是什么&#xf…

【esp32】VScode添加库

以添加PubSubClient库为例 如图操作&#xff0c;在搜索框输入PubSubClient&#xff0c;点击下载 给你的某一个工程添加该库 编译成功

建模杂谈系列254 GMM的拟合

说明 首先假设数据由多个正态分布叠加而成&#xff0c;这个场景应该也是比较有普遍意义的。 内容 数据还是之前产生的三波 import numpy as np import matplotlib.pyplot as plt from sklearn.mixture import GaussianMixture# 生成示例数据 np.random.seed(0) data1 np.r…