目录

一.图像拼接案例

1.图像拼接项目介绍

2.核心步骤

①计算图片特征点及描述符

②匹配特征点,使用暴力匹配器

③筛选有效匹配

④计算透视变换矩阵

⑤应用变换和拼接

二.抠图案例

1.缩放旋转处理

2.转化为灰度图并二值化

3.找出所有轮廓,并在img的副本上画出

4.排序轮廓找到最大的扇子轮廓

5.创建掩膜

6.’与‘操作,完成抠图


一.图像拼接案例

1.图像拼接项目介绍

  • 目标:将两张视角不同、角度倾斜的图片(如包含A/B/C物的图片)如下通过算法融合,使其在同一平面视角下呈现。
  • 技术路径:
    • 使用SIFT特征提取两个图片中的关键点和描述符。
    • 采用暴力匹配器(bf_match)进行特征匹配,因其适用于特征点数量较少的场景
    • 基于匹配结果计算并应用透视变换,最终完成两图拼接。

2.核心步骤

读取拼接图片        

def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)
#读取拼接图片
imageA=cv2.imread('1.jpg')
cv_show('imageA',imageA)
imageB=cv2.imread('2.jpg')
cv_show('imageB',imageB)

①计算图片特征点及描述符

使用SIFT算法从两张图片中提取关键点和描述符,利用BFMatcher进行暴力匹配,获得初步的点对匹配结果。

特征提取我们直接定义一个方法来实现

def detectAndDescribe(image):gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)sift=cv2.SIFT_create()(kps,des)=sift.detectAndCompute(gray,None)kps_float=np.float32([kp.pt for kp in kps])return (kps,kps_float,des)

kps_float是特征点的坐标x和y的ndarray类型的数组

#计算图片特征点及描述符
(kpsA,kps_floatA,desA)=detectAndDescribe(imageA)
(kpsB,kps_floatB,desB)=detectAndDescribe(imageB)

②匹配特征点,使用暴力匹配器


#建立暴力匹配器
matcher=cv2.BFMatcher()
rawMatches=matcher.knnMatch(desB,desA,k=2)

③筛选有效匹配

通过设定距离阈值(如近点距离小于远点距离的65%)筛选出可靠的匹配点。

good=[]
matches=[]
for m in rawMatches:if len(m)==2 and m[0].distance<0.65*m[1].distance:good.append(m)matches.append((m[0].queryIdx,m[0].trainIdx))
print(len(good))
print(matches)31
[(14, 76), (36, 105), (39, 105), (63, 118), (65, 121), (66, 122), (74, 130), (83, 128), (87, 136), (93, 140), (105, 147), (118, 172), (138, 176), (154, 191), (155, 192), (158, 198), (164, 213), (165, 206), (176, 217), (185, 227), (201, 242), (202, 243), (204, 246), (207, 250), (209, 255), (212, 257), (217, 7), (228, 275), (229, 276), (231, 275), (233, 276)]

good存放匹配成功的最近点和次近点相关信息

matches用来存放desA特征图片的匹配成功特征点索引和desB特征图片的匹配成功特征点索引的元组

画出两幅图之间的特征点对应联系

vis=cv2.drawMatchesKnn(imageB,kpsB,imageA,kpsA,good,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv_show('Keypoint Matches',vis)

④计算透视变换矩阵

利用筛选出的核心特征点,计算出变换矩阵H使得一张图片能精确地“变形”到与另一张图片相同的视角平面上。

#透视变换
if len(matches)>4:#当筛选后的匹配对大于4时,计算视角变换矩阵#获取匹配对的点坐标ptsB=np.float32([kps_floatB[i] for (i,_) in matches])ptsA=np.float32([kps_floatA[i] for (_,i) in matches])(H,mask)=cv2.findHomography(ptsB,ptsA,cv2.RANSAC,10)
else:print('图片未找到四个以上的匹配点')sys.exit()

注意点数范围(至少4个)

mask数组用于标识内点与外点。

⑤应用变换和拼接

变换,这里图片的宽度我们使用土图片A和图片B的宽度和方便后面直接将A图片拼接上来

result=cv2.warpPerspective(imageB,H,(imageB.shape[1]+imageA.shape[1],imageB.shape[0]))
cv_show('resultB',result)

拼接,将图片A传入result图片最左端

#将图片A传入result图片最左端
result[0:imageA.shape[0],0:imageA.shape[1]]=imageA
cv_show('result',result)
cv2.imwrite('pingjie.jpg',result)

二.抠图案例

实现只将图中的扇子抠图出来,核心技术用到掩膜

1.缩放旋转处理

import cv2
import numpy as npimg=cv2.imread('img.jpg')
img=cv2.resize(img,(640,480))
img=np.rot90(img,1)
cv2.imshow('img',img)

2.转化为灰度图并二值化

这里我们没有使用阈值的方法来二值化而是使用Canny()边缘检测实现二值化

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edged=cv2.Canny(gray,75,200)
cv2.imshow('edged',edged)
cv2.waitKey(0)

3.找出所有轮廓,并在img的副本上画出

cnts=cv2.findContours(edged.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]
cv2.drawContours(img_cnts,cnts,-1,(0,0,255),2)
cv2.imshow('img_cnts',img_cnts)
cv2.waitKey(0)

4.排序轮廓找到最大的扇子轮廓

cnt=sorted(cnts,key=cv2.contourArea,reverse=True)[0]

5.创建掩膜

先创建和eddged图片等大的全黑掩膜,再根据扇子的轮廓把掩膜中该部分变成白色

mask = np.zeros(edged.shape, dtype='uint8')
cv2.drawContours(mask, [cnt], -1, 255, -1)  # -1表示填充
cv2.imshow('mask',mask)
cv2.waitKey(0)

6.’与‘操作,完成抠图

img_mask_and=cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('img_mask_and',img_mask_and)
cv2.waitKey(0)

cv2.bitwise_and(img,img,mask=mask)会指将掩膜中白色的部分显示出来

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

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

相关文章

【左程云算法笔记016】双端队列-双链表和固定数组实现

目录 1&#xff09;双端队列的介绍 2&#xff09;双端队列用双链表的实现代码演示 3&#xff09;双端队列用固定数组的实现 代码演示 视频 【算法讲解016【入门】双端队列-双链表和固定数组实现】 Leecode leecode641 设计循环双端队列 1&#xff09;双端队列的介绍 可以…

ffplay视频输出和尺寸变换

视频输出模块 视频输出初始化的主要流程 我们开始分析视频&#xff08;图像&#xff09;的显示。 因为使⽤了SDL&#xff0c;⽽video的显示也依赖SDL的窗⼝显示系统&#xff0c;所以先从main函数的SDL初始化看起&#xff08;节选&#xff09;&#xff1a; int main(int argc, c…

协议_https协议

http http协议是将数据以明文的形式在网络上传输。若是传输的数据中包含一些敏感信息比如银行卡信息等可能会被有心人攻击造成信息泄露或被篡改。 总结&#xff1a;http协议进行数据传输难以保证数据的隐私性以及数据完整性&#xff0c;为了保证数据的准确定引入了https这一协…

阿里云 腾讯云 API 自动化查询指南

文章目录一、核心思路与架构建议二、经验与核心建议三、技术方案选型建议四、API使用详解4.1 阿里云4.2 腾讯云五、进阶&#xff1a;与内部系统联动免费个人运维知识库&#xff0c;欢迎您的订阅&#xff1a;literator_ray.flowus.cn 一、核心思路与架构建议 自动化流程可以概括…

【Unity 性能优化之路——概述(0)】

Unity性能优化概述性能优化不是某个环节的极致压榨&#xff0c;而是所有模块的协同共进。本文将为你建立完整的Unity性能优化知识体系。很多Unity开发者一提到性能优化&#xff0c;首先想到的就是Draw Call、Batches这些渲染指标。这没错&#xff0c;但它们只是性能优化中的一部…

灵码产品演示:软件工程架构分析

作者&#xff1a;了哥 演示目的演示灵码对于整个复杂软件工程项目的架构分析能力&#xff0c;输出项目的软件系统架构图。演示文档接口生成能力。演示准备 克隆工程地址到本地&#xff08;需提前安装好 git 工具&#xff0c; 建议本地配置 brew&#xff09;&#xff1a; git cl…

银河麒麟部署mysql8.0并连接应用

​客户需在国产化银河麒麟系统中部署软件应用&#xff0c;使用mysql8.0数据库。机器放置了两三年&#xff0c;里面命令工具和依赖都不太全。而且客户环境不联网&#xff0c;只能采用离线部署的方式。部署过程中踩了很多坑&#xff0c;也用到很多资源&#xff0c;记录一下。 过…

GitAgent-面壁智能联合清华大学发布的大模型智能体应用框架

本文转载自&#xff1a;https://www.hello123.com/gitagent ** 一、&#x1f50d; GitAgent 框架&#xff1a;大模型智能体的工具箱革命 GitAgent 是由面壁智能与清华大学自然语言处理实验室联合研发的创新型框架&#xff0c;旨在解决大模型智能体在复杂任务中的工具扩展瓶颈…

灵码产品演示:Maven 示例工程生成

作者&#xff1a;轻眉 演示主题&#xff1a;由 AI 自动生成 0 到 1 的电商订单 Java 项目 演示目的 面向 Java 零基础的用户&#xff0c;通过灵码的产品能力&#xff08;如提示词、编码智能体、项目 Rules 和 SQLite MCP 服务、单元测试&#xff09;自动生成 0 到 1 的电商订单…

AI编程从0-1开发一个小程序

小伙伴们&#xff0c;今天我们利用AI实现从0到1开发一个小程序&#xff01;需求交给AI&#xff1a; 我们只要说出自己的开发思路&#xff0c;具体需求交给AI完成&#xff01;输入提示词&#xff1a;个人开发的小程序 能开发哪些好备案&#xff0c;用户喜欢使用的 AI给出…

DDoS高防IP是什么? DDoS攻击会暴露IP吗?

DDoS高防IP是什么&#xff1f;高防IP是指一种网络安全服务&#xff0c;主要用于防御DDoS攻击。随着技术的发展&#xff0c;黑客进行网络攻击的强度也在加大&#xff0c;所以我们要做好网络防护&#xff0c;及时预防DDoS攻击。DDoS高防IP是什么&#xff1f;DDoS高防IP是指基于IP…

k8s事件驱动运维利器 shell operator

Shell-Operator 概述 Shell-Operator 是 Kubernetes 的一个工具&#xff0c;用于通过 shell 脚本扩展集群功能。它允许用户编写简单的脚本&#xff08;Bash、Python 等&#xff09;来响应 Kubernetes 事件&#xff08;如资源变更、定时任务&#xff09;&#xff0c;无需编译复…

(二)文件管理-文件权限-chmod命令的使用

文章目录1. 命令格式2. 基本用法2.1 符号模式2.2 八进制数字模式3. 高级用法3.1 递归操作3.2 参考权限3.3 特殊权限位(Setuid, Setgid, Sticky Bit)3.4 X 特殊执行权限4. 注意事项4.1权限与所有权4.2 Root 权限4.3 安全风险4.4 -R 的风险4.5 目录的执行权限1. 命令格式 chmod …

医院预约挂号脚本

医院预约挂号脚本 功能介绍 本脚本是一个用 Python 编写的医院预约挂号程序&#xff0c;支持以下功能&#xff1a; 自动预约&#xff1a;通过api交互选择医院、科室、医生和时间段。自动监控&#xff1a;持续检查指定医生的号源状态&#xff0c;发现可预约时段时自动尝试预约。…

.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)

在使用MudTools.OfficeInterop.Word库进行Word文档自动化处理时&#xff0c;深入理解Word对象模型的核心组件是至关重要的。Word对象模型提供了一套层次化的结构&#xff0c;使开发者能够通过编程方式控制Word应用程序、文档以及文档内容。本章将详细介绍Word对象模型中最核心的…

Kotlin在医疗大健康域的应用实例探究与编程剖析(上)

一、引言 1.1 研究背景与意义 在当今数字化时代,医疗行业正经历着深刻的变革。随着信息技术的飞速发展,尤其是人工智能、大数据、物联网等新兴技术的广泛应用,医疗行业数字化转型已成为必然趋势。这种转型旨在提升医疗服务的效率和质量,优化医疗资源配置,为患者提供更加…

AI智能体的应用前景

AI智能体的应用前景正从技术探索迈向规模化落地的关键阶段,其发展动力源于大模型能力的突破、行业需求的深化以及商业化模式的创新。以下是基于最新技术动态和行业实践的深度解析: 一、技术突破:从「有脑无手」到「知行合一」 大模型的进化显著提升了智能体的多模态交互与…

高系分四:网络分布式

目录一、我的导图和思考二、大模型对我导图的评价优点可优化之处三、大模型对这章节的建议一、网络知识范畴&#xff08;一&#xff09;网络基础理论&#xff08;二&#xff09;局域网与广域网&#xff08;三&#xff09;网络安全&#xff08;四&#xff09;网络性能优化&#…

Day24_【深度学习(1)—概念】

一、AI、ML、DL基本关系 机器学习是实现人工智能的途径&#xff0c;深度学习是机器学习的一种方法。人工智能 (AI)↓ 机器学习 (ML) —— 让机器从数据中学习规律↓ 深度学习 (DL) —— 使用深层神经网络的机器学习方法二、深度学习与机器学习概念深度学习&#xff08;Deep Lea…

VTK基础(01):VTK中的基本概念

VTK中的基本概念 1.三维场景中的基本要素 三维场景的基本要素包含&#xff1a;灯光、相机、颜色和纹理映射 (1)灯光vtkLight 光的本质是特定频段的电磁波&#xff0c;所以灯光的本质是特定频段&#xff08;可见光频段&#xff09;的电磁波发射器&#xff1b;依据发射可见光频段…