(OpenCV)图片拼接

前言

        图片拼接在许多领域都有广泛的应用,包括但不限于以下几个方面:

  1. 全景摄影:在摄影中,通过将多张照片拼接在一起可以实现全景照片的效果。这在旅游景点、房地产展示等领域有着广泛的应用,能够提供更加生动、真实的视觉体验。

  2. 医学影像处理:在医学影像领域,例如 CT、MRI 等影像数据的拼接可以帮助医生获取更加完整的患者信息,进而进行更精确的诊断和治疗计划制定。

  3. 地图制作:地图制作中常常需要将多个局部地图或航拍影像拼接成较大范围的地图,以满足城市规划、导航、军事应用等领域的需求。

  4. 无人机航拍:在无人机航拍领域,通过将无人机航拍获取的多张照片进行拼接,可以生成更加细致和全面的航拍影像,用于农业、环境监测、工程测绘等领域。

  5. 虚拟现实(VR)和增强现实(AR):在虚拟现实和增强现实技术中,图片拼接可以用来创建虚拟环境或增强真实环境,提供更加沉浸式的体验。

  6. 文物修复和数字化:在文物保护领域,通过对文物的多角度拍摄并进行拼接,可以实现对文物的三维重建和数字化保存,以及对文物进行修复和研究。

代码

重叠拼接

将相同位置的图片进行叠加

import cv2
import numpy as np# 加载图片
image1 = cv2.imread('D:\\sucai\\image1.png')
image2 = cv2.imread('D:\\sucai\\image2.png')save_img = 'D:\\sucai\\merge_image_simple.png'
# 确定目标图像大小
height = max(image1.shape[0], image2.shape[0])
width = max(image1.shape[1], image2.shape[1])
target_image = np.zeros((height, width, 3), dtype=np.uint8)
# 叠加图片
target_image[:image1.shape[0], :image1.shape[1]] = image1
target_image[:image2.shape[0], :image2.shape[1]] += image2  # 叠加在同一位置# 显示结果
cv2.imshow('Simple Blend', target_image)
cv2.imwrite(save_img, target_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

重叠拼接(加权)

在OpenCV中,cv2.addWeighted()函数可以用来对两幅图像进行加权相加,产生一幅新的图像

通过调整alphabeta的值,可以控制不同图像在最终混合结果中所占比重,从而实现不同的混合效果。

import cv2# 读取两幅图像
img_path_list = ['D:\\sucai\\image1.png', 'D:\\sucai\\image2.png']
image_obj_list = [cv2.imread(i) for i in img_path_list]
w_list = [i.shape[0] for i in image_obj_list]
h_list = [i.shape[1] for i in image_obj_list]
w_max = max(w_list)
h_max = max(h_list)
image_obj_list = [cv2.resize(i, (w_max, h_max)) for i in image_obj_list]
# 设置权重参数
"""
src1:第一幅输入图像。
alpha:第一幅图像的权重。
src2:第二幅输入图像。
beta:第二幅图像的权重。
gamma:一个可选的参数,用于控制加权和的常数值。
"""
alpha = 0.5
beta = 0.5
gamma = 0
# 对两幅图像进行加权相加
merged_image = cv2.addWeighted(image_obj_list[0], alpha, image_obj_list[1], beta, gamma)# 显示结果
cv2.imshow('Blended Image', merged_image)
cv2.imwrite(save_img, merged_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

水平拼接

import cv2img_path_list = ['D:\\sucai\\image1.png', 'D:\\sucai\\image2.png']
save_img = 'D:\\sucai\\merge_image.png'
image_obj_list = [cv2.imread(i) for i in img_path_list]
# 获取所有图片的尺寸大小
w_list = [i.shape[0] for i in image_obj_list]
h_list = [i.shape[1] for i in image_obj_list]
w_max = max(w_list)
h_max = max(h_list)
# 统一子图的尺寸大小
image_obj_list = [cv2.resize(i, (w_max, h_max)) for i in image_obj_list]
# 水平拼接
merged_image = cv2.hconcat(image_obj_list)# 显示合并后的图片
cv2.imshow('Merged Image', merged_image)
# 保存图片
cv2.imwrite(save_img, merged_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

垂直拼接

import cv2img_path_list = ['D:\\sucai\\image1.png', 'D:\\sucai\\image2.png']
save_img = 'D:\\sucai\\merge_image.png'
image_obj_list = [cv2.imread(i) for i in img_path_list]
# 获取所有图片的尺寸大小
w_list = [i.shape[0] for i in image_obj_list]
h_list = [i.shape[1] for i in image_obj_list]
w_max = max(w_list)
h_max = max(h_list)
# 统一子图的尺寸大小
image_obj_list = [cv2.resize(i, (w_max, h_max)) for i in image_obj_list]
# 垂直拼接
merged_image = cv2.vconcat(image_obj_list)# 显示合并后的图片
cv2.imshow('Merged Image', merged_image)
# 保存图片
cv2.imwrite(save_img, merged_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

全景拼接

拼接器使用这些重叠区域中的特征点来找到图像间的对应关系。如果重叠区域过小或者不存在,拼接器可能无法找到足够的匹配特征点进行拼接。

import sys
import cv2img1 = cv2.imread('D:\\sucai\\2\\image1.png')
img2 = cv2.imread('D:\\sucai\\2\\image2.png')save_img = 'D:\\sucai\\merge_image.png'# 检查图像是否正确加载
if img1 is None or img2 is None:print("其中一个或两个图像加载失败")sys.exit()img_obj = cv2.Stitcher.create(cv2.Stitcher_PANORAMA)
(status, stitched_image) = img_obj.stitch((img1, img2))
if status != cv2.Stitcher_OK:print("不能拼接图片, error code = %d" % status)
else:print("拼接成功.")cv2.imshow('pano', stitched_image)cv2.imwrite(save_img, stitched_image)cv2.waitKey()cv2.destroyAllWindows()
sys.exit()

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

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

相关文章

Bpmn-js 属性控制

我们可以通过bpmn-js来访问对应的BPMN图例的属性信息。对应的流程图中的每个图例元素(如开始、结束、中间/边界事件等都通过businessObject属性存储对基础BPMN元素的引用。业务对象是从BPMN 2.0 XML导入并在导出过程中序列化的实际元素。使用业务对象来读取和写入BP…

如何减少HTTP请求次数

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 如何减少HTTP请求次数? 减少 HTTP 请求次数自然也就提升了 HTTP 性能,可以从这 3 个方面入手: 减少重定向请求次数合并请求延迟发送请求 减少重定向请求次数 我们先来看看什么是重定向请…

美相关 APT 组织分析报告

获取方式: 链接:https://pan.baidu.com/s/1AsysdggUIbvB3PZ41MaJaQ?pwd8euh 提取码:8euh

Debug Monitor中断详细解析

文章目录 0 基本术语1 相关寄存器和指令1.1 Debug Halting Control and Status Register (DHCSR), 0xE000EDF01.2 Debug Exception and Monitor Control Register (DEMCR), 0xE000EDFC1.3 Debug Fault Status Register, DFSR, 0xE000ED301.4 BKPT指令 2 Debug Monitor中断示例2…

DNS域名解析过程、工具、文件配置

目录 DNS介绍 DNS域名层次结构 DNS域名解析过程 递归查询和迭代查询 DNS 查询的命令行工具:host、dig、nslookup host 语法 参数和选项 示例用法 dig 语法 参数和选项 示例用法 nslookup 语法 参数和选项 交互式命令 示例用法 配置 DNS 客户端 DNS介…

解读OpenAI视频生成模型Sora背后的原理:Diffusion Transformer

Diffusion Models视频生成-博客汇总 前言:OpenAI最近推出的视频生成模型Sora在效果上实现了真正的遥遥领先,很多博主都介绍过Sora,但是深入解读背后原理的博客却非常少。Sora的原理最主要的是核心模型主干《Scalable Diffusion Models with T…

Code Composer Studio (CCS) - Breakpoint (断点)

Code Composer Studio [CCS] - Breakpoint [断点] 1. BreakpointReferences 1. Breakpoint 选中断点右键 -> Breakpoint Properties… Skip Count:跳过断点总数,在断点执行之前设置总数 Current Count:当前跳过断电累计值 References […

xtu oj 1215 A+B V

题目描述 小明很喜欢做ab,他但经常忘记进位,所以他算881290,而不是100。 现在你给了小明一些ab的算式,请问他算出来会是什么? 输入 第一行是一个整数K,表示样例的个数。 每个样例占一行,为两个整数a,b&a…

CCF编程能力等级认证GESP—C++7级—20231209

CCF编程能力等级认证GESP—C7级—20231209 单选题(每题 2 分,共 30 分)判断题(每题 2 分,共 20 分)编程题 (每题 25 分,共 50 分)商品交易纸牌游戏 答案及解析单选题判断题编程题1编程题2 单选题…

深度探索Python集合:从基本操作到高级用法

在Python编程中,集合(Set)作为一种高效且功能强大的内置数据结构,常用于处理不包含重复元素的无序数据集合。本文将详述Python集合的基本操作、进阶技巧以及在实际场景中的应用。 一、集合基础 Python集合初始化可通过大括号 {} 或者 set() 函数实现&a…

Vue实现多个input输入,光标自动聚焦到下一个input

遇到一个需求&#xff0c;需要实现和移动端短信输入一样&#xff0c;输入内容后&#xff0c;光标会进入下一个输入框 需要用到2个事件 keydown事件发生在键盘的键被按下的时候 keyup 事件在按键被释放的时候触发 <template><div class"box"><el-fo…

(ruoyi-vue3.8.6版本基础上)升级Spring Boot 3.x时遇到的问题与解决办法

升级Spring Boot 3.x时遇到的问题与解决办法 在升级Spring Boot应用到3.x版本的过程中,可能会遇到一系列的依赖、配置及JDK版本相关问题。本文将列出几个常见问题及其对应的解决方案。 问题一:javax.xml.bind.JAXBException异常 问题描述 在更新Spring Boot依赖后,如果缺…

OpenAI重磅发布Sora——首个视频生成模型:利用文本-视频人工智能将想象变为现实

想象一下&#xff0c;现在你有一段文本话描述的故事&#xff0c;通过输入这段文本&#xff0c;就可以立刻展开一个生动详细的视频。这就是 OpenAI 神奇的 Sora&#xff0c;一个革命性的文本到视频的 AI 模型。Sora于2024年2月推出&#xff0c;凭借其仅凭文字提示就能生成现实和…

CSS 不同颜色的小圆角方块组成的旋转加载动画

<template><!-- 创建一个装载自定义旋转加载动画的容器 --><view class="spinner"><!-- 定义外部包裹容器,用于实现整体旋转动画 --><view class="outer"><!-- 定义四个内部小方块以形成十字形结构 --><view clas…

攻防演练后的一点随记

攻防演练 攻防演练算是告一段落了&#xff0c;各位红队和蓝队的兄弟们都辛苦了&#xff0c;写一点随记&#xff0c;供大家参考。 记得第一次参加攻防演练是在2018年&#xff0c;当时被派到北京&#xff0c;在某个政企单位做攻防演练支撑工作&#xff0c;然后2020年又被紧急派到…

SSE 协议详细教程

Server-Sent Events&#xff08;SSE&#xff09;是一种服务器到客户端的单向通信协议&#xff0c;它基于HTTP协议&#xff0c;允许服务器向客户端推送数据。SSE常用于实现实时更新的功能&#xff0c;例如在新闻网站或股票市场中显示最新消息。本文将详细介绍SSE协议的原理、实现…

Vue首屏优化,12个提速建议

文章目录 代码拆分和懒加载&#xff1a;代码拆分懒加载 图片优化&#xff1a;组件懒渲染&#xff1a;数据预获取和缓存&#xff1a;服务器端渲染&#xff08;SSR&#xff09;&#xff1a;代码压缩和合并&#xff1a;使用 CDN 加速&#xff1a;监控和性能分析&#xff1a;代码优…

AIGC实战——能量模型(Energy-Based Model)

AIGC实战——能量模型 0. 前言1. 能量模型1.1 模型原理1.2 MNIST 数据集1.3 能量函数 2. 使用 Langevin 动力学进行采样2.1 随机梯度 Langevin 动力学2.2 实现 Langevin 采样函数 3. 利用对比散度训练小结系列链接 0. 前言 能量模型 (Energy-based Model, EBM) 是一类常见的生…

c++开发基础之保障多线程编程中的原子操作InterlockedIncrement和InterlockedDecrement用法详解

一、介绍 在多线程编程中&#xff0c;确保对共享变量进行原子操作是至关重要的。当多个线程同时访问和修改同一共享资源时&#xff0c;如果没有合适的同步机制&#xff0c;可能会导致数据竞争、内存一致性问题&#xff0c;甚至造成程序崩溃。为了解决这个问题&#xff0c;C提供…

公众号,h5 链接直接在浏览器打开 拒绝下载视频解决方案

公众号&#xff0c;h5 链接直接在浏览器打开 拒绝下载视频 1.微信打开公众号 2.在微信上打开浏览器 3.F12打开页面 4.播放视频 5.找到video标签代码 6.去掉video标签的属性controlslist“nodownload” 7.全屏播放 8.下载