(笔记五)利用opencv进行图像几何转换

news2025/1/21 10:21:19

参考网站:https://docs.opencv.org/4.1.1/da/d6e/tutorial_py_geometric_transformations.html

(1)读取原始图像和标记图像

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

path = r"D:\data\flower.jpg"
img = cv.imread(path)
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# 拷贝图像
img1 = np.copy(img)
img1[100:105, 100:105, :] = [255, 0, 0]  # main point is (103, 103)
img1[100:105, 150:155, :] = [255, 0, 0]  # main point is (103, 153)
img1[150:155, 100:105, :] = [255, 0, 0]  # main point is (153, 103)
img1[150:155, 150:155, :] = [255, 0, 0]  # main point is (153, 153)
plt.figure(12)
plt.subplot(211), plt.imshow(img), plt.title('ori img'), plt.axis('off')
plt.subplot(212), plt.imshow(img1), plt.title('changed 4-points ori img'), plt.axis('off')
# plt.show()

在这里插入图片描述

(2)改变图像分辨率

# 改变分辨率
img2 = np.copy(img)
# dsize = None,fx是x相对于原来的x要改变的比例,同理y
img3 = cv.resize(img2, None, fx=0.1, fy=0.1, interpolation=cv.INTER_CUBIC)
img4 = cv.resize(img2, None, fx=10, fy=10, interpolation=cv.INTER_CUBIC)
plt.figure(3)
plt.subplot(311), plt.imshow(img), plt.title('ori img resolution:' + str(img.shape[0:2])), plt.axis('off')
plt.subplot(312), plt.imshow(img3), plt.title('0.1 times resolution:' + str(img3.shape[0:2])), plt.axis('off')
plt.subplot(313), plt.imshow(img4), plt.title('10 times resolution:' + str(img4.shape[0:2])), plt.axis('off')
# plt.show()

在这里插入图片描述

(3)平移图像

核心函数:cv.warpAffine(img, M, (col, row))

在这里插入图片描述

# 图像平移
img5 = np.copy(img)
row, col, sp = img5.shape
M1 = np.float32([[1, 0, 100], [0, 1, 50]])  # x平移100,y平移50
print('图像平移:')
print('图像平移所计算的转换矩阵为:', M1)
img6 = cv.warpAffine(img5, M1, (col, row))  # warpAffine函数利用转移矩阵平移
plt.figure(4)
plt.subplot(211), plt.imshow(img), plt.title('ori img'), plt.axis('off')
plt.subplot(212), plt.imshow(img6), plt.title('Translation x for 100 and y for 50'), plt.axis('off')
# plt.show()

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

(4)图像旋转

核心函数:M=cv.getRotationMatrix2D(((旋转中心坐标(x,y)), 旋转角度, 相向尺度因子)
cv.warpAffine(img, M, (col, row))

在这里插入图片描述

# 图像旋转
img7 = np.copy(img)
# 图像中心,图像旋转角度,图像同向比例因子
M2 = cv.getRotationMatrix2D(((col - 1) / 2, (row - 1) / 2), 45, 1)
M3 = cv.getRotationMatrix2D(((col - 1) / 2, (row - 1) / 2), 0, 3)
print('图像旋转:')
print('旋转一的转换矩阵:', M2)
print('旋转二的转换矩阵:', M3)
img8 = cv.warpAffine(img7, M2, (col, row))
img9 = cv.warpAffine(img7, M3, (col, row))
plt.figure(5)
plt.subplot(311), plt.imshow(img), plt.title('ori img'), plt.axis('off')
plt.subplot(312), plt.imshow(img8), plt.title('Rotation angle is 45°'), plt.axis('off')
plt.subplot(313), plt.imshow(img9), plt.title('Isotropic scale factor is 3'), plt.axis('off')
# plt.show()

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

(5)图像仿射变换

核心函数:M=cv.getAffineTransform(原图三个点坐标, 转换图三个点坐标)
cv.warpAffine(img, M, (col, row))

在这里插入图片描述

# 仿射变换
img10 = np.copy(img1)
points_one = np.float32([[103, 103], [103, 153], [153, 103]])  # 原始图像三个点坐标
points_two = np.float32([[10, 100], [100, 10], [150, 275]])  # 仿射变换目标图像的三个点坐标
M4 = cv.getAffineTransform(points_one, points_two)
print('仿射变换:')
print('仿射变换的转换矩阵:', M4)
img11 = cv.warpAffine(img10, M4, (col, row))
plt.figure(6)
plt.subplot(211), plt.imshow(img1), plt.title('ori 4-points img'), plt.axis('off')
plt.subplot(212), plt.imshow(img11), plt.title('Affine Transformation img'), plt.axis('off')
# plt.show()

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

(6)图像透射变换

核心函数:M=cv.getPerspectiveTransform(原图四个点坐标,转换图像四个点坐标 )

在这里插入图片描述

cv.warpPerspective(img, M, (转换图长宽))

在这里插入图片描述

# 透射变换
img12 = np.copy(img1)
points_one_one = np.float32([[103, 103], [103, 153], [153, 103], [153, 153]])  # 原始图像四个点坐标
points_two_two = np.float32([[0, 0], [0, 300], [300, 0], [300, 300]])  # 透射变换目标图像的四个点坐标
M5 = cv.getPerspectiveTransform(points_one_one, points_two_two)
print('透射变换:')
print('透射变换的转换矩阵:', M5)
# img12为要转换的图像,M5为透射变换的转换矩阵,dsize为目标图像大小
img13 = cv.warpPerspective(img12, M5, (300, 300))
plt.figure(7)
plt.subplot(211), plt.imshow(img1), plt.title('ori 4-points img'), plt.axis('off')
plt.subplot(212), plt.imshow(img13), plt.title('Perspective Transformation img'), plt.axis('off')
plt.show()

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

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

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

相关文章

电工-照明电路施工图

照明电路施工图 上面介绍的电气照明基本电路用作施工的依据是不够的,这是因为图上并没有注明电气元件的规格、型号、安装要求、线路敷设方式以及其他一些特征。作为实际电路安装的依据,必须是根据国家颁布的有关电器技术标准和统一符号绘制的施工图。照…

2022年下半年系统架构设计师真题(下午带答案)

试题一 (25分) 某电子商务公司拟升级其会员与促销管理系统,向用户提供个性化服务,提高用户的粘性。在项目立项之初,公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性,由于当前用户规模不大,业务也相对…

QT的介绍和优点,以及使用QT初步完成一个登录界面

QT介绍 QT主要用于图形化界面的开发,QT是基于C编写的一套界面相关的类库,进程线程库,网络编程的库,数据库操作的库,文件操作的库…QT是一个跨平台的GUI图形化界面开发工具 QT的优点 跨平台,具有较为完备…

MySQL存储引擎MyISAM和InnoDB特点全解

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

Flutter开发- iOS 问题CocoaPods not installed or not in valid state

解决问题方案: 1、先检查本机CocoaPods是否安装,通过gem list 查看是否安装 打开终端,执行gem list,出现图中的数据即为已安装。未安装看第4 步 2、已经安装了CocoaPods,还出现了图中的提示,你可能已经猜…

快速制作餐厅签到抽奖营销活动,吸引更多顾客

在如今竞争激烈的市场中,吸引用户参与活动是企业获取关注和提升转化率的重要手段。而签到抽奖活动无疑是一种简单而又有效的方式。本文将教你如何利用乔拓云平台后台制作一个快速而有效的签到抽奖活动。 首先,登录乔拓云平台后台,进入【营销活…

【自学开发之旅】基于Flask的web开发(一)

web开发项目设计: 立项-需求分析-设计(原型图、数据库、api设计)-技术选型-写代码-测试-上线 web开发的本质上就是生成超文本。 前端负责展示,后端负责逻辑处理:后逻辑请求(接收请求、响应请求&#xff0…

CSA研讨会|聚焦云原生安全,探讨技术与应用策略

为产业数字化保驾护航, 云原生安全体系如何有效抵御网络威胁? 网络安全的下一个十年, 云原生安全是网络安全创新之路吗? CNAPP部署现状,你了解多少? 9月6日(周三)下午14&#xff1a…

教你实现一个深浅拷贝!

浅拷贝的原理与实现 对于浅拷贝的定义我们可以初步理解为: 自己创建一个新的对象,来接受你要重新复制或引用的对象值。如果对象属性是基本的数据类型,复制的就是基本类型的值给新对象;但如果属性是引用数据类型,复制的…

每日一题(移除链表元素)

每日一题(移除链表元素) 203. 移除链表元素 - 力扣(LeetCode) 思路一: 可以创建一个新的链表头节点newhead,只要是原链表中值不为val的节点、都通过尾插操作插到newhead所指向的链表中,原链表中…

swiper插件使用

swiper插件使用 1.进入官网 官网地址 2.下载文件保存到自己电脑上 3.解压文件夹,找到如图所示的两个文件夹,复制并引入到自己的项目中 4.使用 1.继续打开官网地址,寻找在线演示里面的轮播图案例,挑一个自己需要的,到新窗口打开 2.打开之后,右键,检查网页源代码 3.复制里面…

优秀案例 | 数字人+文化浪漫,开启城市数字文化沉浸式体验

数字人作为城市宣传的新载体、新介质, 可带来多元化、数字化的城市文旅发展模式, 通过打破虚实次元空间, 展现出传统文化与现代生活的相碰撞的魅力。 数字人文化浪漫 赋能城市文化新体验 南京首个以文化元宇宙主题体验中心及高校、文博…

基于JavaWeb和mysql实现网上书城前后端管理系统(源码+数据库+开题报告+论文+答辩技巧+项目功能文档说明+项目运行指导)

一、项目简介 本项目是一套基于JavaWeb和mysql实现网上书城前后端管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都…

【计算机网络】带你一文搞懂Http和Https的关系和区别!(最强详解!!)

目录 首先来讨论一下Http和Https的背景 基本概念 一、HTTP协议: 二、HTTPS协议: 区别 工作原理 HTTP工作原理 Https工作原理 HTTPS优缺点 优点: 缺点: HTTP请求消息和响应消息 响应消息 进行TLS握手时的通俗的解释&a…

智能安全帽~生命体征检测与危险气体检测一体化集成设计还是蓝牙无线外挂式方式好?

生命体征(心率、血氧等)检测&上报平台,危险气体采集&上报平台,是智能安全帽产品中常见的两种选配件,它们的实现有两种典型的模式: 1)将传感器集成到主板上,做成一体化的智能…

RabbitMQ工作模式-工作队列

官网关于工作模式的解释地址:https://www.rabbitmq.com/getstarted.html Work Queue(工作队列) 生产者发消息,启动多个消费者来消费消息,每个消费者仅消费部分消息,可达到负载均衡的效果。 创建生产者 i…

java错误解决方案百科

一、业务开发缺陷 ① 工期紧、逻辑复杂,开发人员会更多地考虑主流程逻辑的正确实现,忽略非主流程逻辑,或保障、补偿、一致性逻辑的实现; ② 往往缺乏详细的设计、监控和容量规划的闭环,结果就是随着业务发展出现各种各…

NSS [羊城杯 2020]easyser

NSS [羊城杯 2020]easyser 开题。很容易让人觉得环境坏了。 不要慌,无从下手时。看源码、扫目录、抓包。一套操作下来,发现几个可以下手的路由。 /index.php /robots.txt 访问 /star1.php,一说到百度,就猜测是否存在SSRF。 源码中…

【LeetCode-面试经典150题-day18】

目录 17.电话号码的字母组合 77.组合 46.全排列 52.N皇后Ⅱ 17.电话号码的字母组合 题意: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同&#xf…