OpenCV-Python小应用(五):基于模板匹配的图像拼接

news2025/1/14 18:02:18

OpenCV-Python小应用(五):基于模板匹配的图像拼接

    • 前言
    • 前提条件
    • 实验环境
    • 基于模板匹配的图像拼接
    • 参考文献

前言

  • 本文是个人使用OpenCV-Python的应用案例,由于水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入
    OpenCV-Python小应用专栏或我的个人主页查看

前提条件

  • 熟悉Python

实验环境

  • Python 3.6.13 (面向对象的高级语言)
  • OpenCV 3.4.10(python第三方库)pip3 install opencv-python==3.4.10.37

基于模板匹配的图像拼接

  • 主要思路:利用模板匹配把两张图片的相似重叠部分找出,拼接成一个新图片。这属于传统算法的范畴,有一定的局限性。
  • 模板匹配相关知识点,可查阅OpenCV-Python快速入门(十四):模板匹配

在这里插入图片描述
在这里插入图片描述

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读取图片
img1 = cv2.imread('/kaggle/input/test-image4/track_1.jpg')
# BGR -> Gray
img1_gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
# BGR -> RGB
img1_RGB = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)

# 模板图片
template = img1_gray[-1:] # h,w
# 模板图片的高和宽
th, tw = template.shape[::]

# 读取图片
img2 = cv2.imread('/kaggle/input/test-image4/track_2.jpg')
# BGR -> Gray
img2_gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
# BGR -> RGB
img2_RGB = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
# 拷贝img2,用于下面绘制矩形
img2_RGB2 = img2_RGB.copy()

# 模板匹配,查找相似重叠部分
rv = cv2.matchTemplate(img2_gray,template,cv2.TM_SQDIFF)
# # 查找最值(极值)与最值所在的位置
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(rv)
topLeft = minLoc # 左上角点
bottomRight = (topLeft[0] + tw, topLeft[1] + th) # 右下角点
# print(topLeft,bottomRight) 
cv2.rectangle(img2_RGB2,topLeft, bottomRight, (255,0,0), 2)

# 图片拼接
# 新图片的高和宽
new_height, new_width = img1.shape[0]+img2.shape[0]-topLeft[1], img1.shape[1]
# 创建一个纯黑的大图
new_image = np.zeros((new_height, new_width, 3), np.uint8) # (h,w,channel)

# 两张图片的相似重叠部分找出,剔除相似重叠部分,拼接成一个新图片
new_image[0:img1.shape[0],0:img1.shape[1]] = img1
new_image[img1.shape[0]:new_height,0:img1.shape[1]] = img2[topLeft[1]:img2.shape[1],0:img1.shape[1]]
# BGR -> RGB
new_image_RGB = cv2.cvtColor(new_image,cv2.COLOR_BGR2RGB)

# 显示图片
plt.figure(figsize=(20, 20))
plt.subplot(221),plt.imshow(img1_RGB)
plt.title('First Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(img2_RGB)
plt.title('Second Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(img2_RGB2)
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(new_image_RGB)
plt.title('Stitched Result'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
在这里插入图片描述

参考文献

[1] https://opencv.org/
[2] 李立宗. OpenCV轻松入门:面向Python. 北京: 电子工业出版社,2019

  • 更多精彩内容,可点击进入
    OpenCV-Python小应用专栏或我的个人主页查看

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

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

相关文章

【微服务】分布式组件 Nacos 结合 Feign 的使用

本文主要介绍如何搭建分布式开发基本环境 一、基本概念 1. 注册中心 在分布式系统中,每一个微服务上线,都需要注册到注册中心。(方便服务的远程调用,比如订单想调用商品服务,直接从注册中心获得) 对应 Sp…

SpringBoot整合mybatis

SpringBoot整合mybatis 以tb_book表格为例: 第一步:创建新模块,选择Spring初始化,并配置模块相关基础信息 第二步:选择当前模块需要使用的技术集(MyBatis、MySQL) 或者手工导入对应技术的star…

idea创建纯净的maven项目简单的maven工程

idea创建简单的maven项目一、说在前面二、创建步骤一、说在前面 在学习或者开发中,有时候,我们只想创建一个简单的maven工程,不需要有太多的自带的配置或配置文件,本文结合这一需求,将创建步骤分享给大家,…

Python Selenium unittest+HTMLTestRunner实现 自动化测试及发送测试报告邮件

1、UI测试框架搭建-目录结构 2、 文件介绍 2.1、baseinfo->__init__.py 配置文件定义基础参数 #-*-coding:utf-8-*- #测试用例配置参数base_url "http://xxxxx.com" undirect_username "username" undirect_password "password" direct_…

想知道怎么给图片加贴纸?手把手教你给图片加贴纸

有时候我们在拍摄照片时,会不小心排到一些隐私的东西,这个时候该怎么办呢?可能很多人会先想到使用马赛克涂抹,这个方法确实好,但马赛克在帮我们遮挡的同时,也会影响到图片的整体观感。那我们应该用什么来代…

WebRTC Pacer

目录 一. 前言 二. WebRTC Pacer 1. 数据包传入Pacer模块的队列 2. Pacer模块取出队列的包发送 (1)什么时候取出数据包发送 (2)每次发送多少数据量 (3)避免引入较大延时的处理方法 一. 前言 实时音视…

@MapperScan 和 @Mapper 源码走读

一.从开发中遇到的问题开始 问题描述 : 在一个springbootmybatis的项目中,在dao也就是Mapper接口上配置了Mapper注解,其他同事在启动类还配置了MapperScan注解(包扫描没有配全面),进行批量指定所生成的Mapper接口动态代理接口类&…

TFT-LCD移植LVGL详细过程记录

TFT-LCD移植LVGL LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。 LVGL更多介绍:https://zhuanlan.zhihu.com/p/406294618 本次实验…

第六章 图论 16 AcWing 1558. 加油站

第六章 图论 16 AcWing 1558. 加油站 原题链接 AcWing 1558. 加油站 算法标签 图论 最短路 枚举 思路 枚举加油站位置,对于每个加油站位置进行dijkstra,选择符合要求1的最小距离最大值(要求2)与的距离和最小值(要…

(九)Java算法:快速排序(详细图解)

目录一、前言1.1、概念1.2、算法过程二、maven依赖三、流程解析3.1、全部数据分区3.2、左边数据分区3.3、右边数据分区四、编码实现结语一、前言 1.1、概念 快速排序:用数组的第一个数作为基准数据,然后将所有比它小的数都放到它左边,所有比…

使用 Spring Boot 设置 Hibernate Envers

Hibernate Envers是一个实现持久实体的审核和版本控制的模块。审计和版本控制是构建生产级Spring 启动微服务的关键组件。Hibernate Envers与Spring Boot无缝集成以实现相同的目标。 在这篇文章中,我们将在我们的Spring Boot Starter应用程序中集成Hibernate Envers…

生信工作流框架搭建 | 02-nextflow 实战

目录生信工作流框架搭建 | 02-nextflow前情提要开始使用依赖安装核心概念一个fastqc的示例,加深理解快速搭建你的程序你需要仔细阅读的:可以快速浏览(但需要知道大概有什么,以便后来查览):报错!…

IPD-需求管理流程

一、产品需求管理模型 在确定客户需求时,要考虑影响用户购买标准的八类基本需求($APPEALS),并基于客户视角进行详细分解,形成有针对性的产品。 1.1、需求管理业务流程 二、需求收集流程 2.1、需求收集的来源 路标规划:通过市场管理流程分析,落实到路标规划中的需求…

基于Paddle的手写数字识别模型

百度飞桨(paddlepaddle)是百度的开源深度学习平台,今天就利用paddle来编写入门级的手写数字模型. 一,准备数据 下载数据集,这里我们使用的是MNIST数据集 # 下载原始的 MNIST 数据集并进行解压 wget https://paddle-imagenet-mode…

12.数组的初始化和引用

数组的初始化 定义数组的时候,顺便给数组的元素赋予初值,即开辟空间的同时并且给数组元素赋值 一维数组的初始化 a. 全部初始化 int a[5] {2,4,7,8,5}; 代表的意思:a[0] 2 , a[1] 4 , a[2] 7 , a[3] 8, a[4] 5; b. 部分初始化 int …

Clever Internet Suite for Delphi, C++Builder

为Internet应用程序添加即时SSL/TLS安全性,并实现许多有用的Internet相关功能。 聪明的互联网套件允许您添加下载、上传和提交互联网资源;发送和接收MIME消息;HTTP、FTP、SMTP、POP3、IMAP和NNTP客户端/服务器解决方案;带有数字证书的SSL/TLS通道支持您的VCL应用程序…

电脑分辨率怎么调?电脑分辨率怎么调合适

​无论是笔记本电脑的用户,还是说台式电脑的用户,在使用电脑的时候,如果电脑分辨率调整的不对,很容易造成显示与观感方面的模糊。电脑分辨率怎么调?电脑分辨率怎么调最佳?本篇文章,小编就来教教…

ASEMI肖特基二极管1N5822参数,1N5822特征,1N5822应用

编辑-Z ASEMI肖特基二极管1N5822参数: 型号:1N5822 最大重复峰值反向电压(VRRM):40V 最大RMS电桥输入电压(VRMS):28V 最大直流阻断电压(VDC)&#xff1a…

三、简单了解kafka设计原理

系列文章目录 文章目录系列文章目录一、Kafka核心总控制器Controller二、kafka高性能简单理解一、Kafka核心总控制器Controller 在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责…

[ZJCTF 2019]Login--动态调试--详细版

前言 主要是因为太菜了,看了别人的exp,还是懵懵懂懂的,都是静态分析,不明白为会在改密码的时候会导致最后的getshell。今天给它动态分析整一个,看看到底哪里出错了。 基本原理 网上有很多介绍的,在这里说…