《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》

news2024/11/23 5:20:50

在这里插入图片描述

简介:本文详细阐述了 OpenCV 在图像操作中的关键技术,包括缩放(确定尺寸缩放与按比例缩放)、翻转(沿不同轴的翻转方式)以及变换(平移、旋转、三点确定变换和四点确定变换即透视变换)。通过代码示例与直观图示,深入讲解了各操作的实现原理与具体应用,如如何将图片缩放至相同大小后加权、不同翻转方式的视觉效果、利用矩阵进行仿射与透视变换实现图像平移、旋转及特定形状变换等,为读者全面掌握 OpenCV 图像操作技巧提供丰富参考与实用指南。如果您觉得我的文章对您有帮助,希望可以得到您的点赞、收藏、关注和评论

《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》

  • 1 缩放
    • 1.1 确定的缩放尺寸
    • 1.2 按比例缩放
  • 2 翻转
  • 3 变换(难点)
    • 3.1 平移
    • 3.2 旋转
    • 3.3三点确定变换
    • 3.4 四点确定变换(透视)
  • 致谢

1 缩放

1.1 确定的缩放尺寸

这是我的文件结构:
在这里插入图片描述
我希望让两张图片缩放成相同大小,所以可以从一张图片的shape中取出宽高然后传参给 cv2.resize函数,然后相同大小的图片进行加权。

import numpy as np
import cv2
red = cv2.imread("pig.jpg")
blue = cv2.imread("blue_pig.JPG")
height,width,channel = red.shape
blue = cv2.resize(blue,(width,height))
add_Image = cv2.addWeighted(blue,0.7,red,0.4,gamma=1)
cv2.imshow("addWeighted_image",add_Image)
cv2.waitKey()
cv2.destroyAllWindows()

1.2 按比例缩放

import numpy as np
import cv2 
red = cv2.imread("pig.jpg")
print(red.shape)
reshape_red = cv2.resize(red,dsize = None,fx = 3,fy=0.6)
print(reshape_red.shape)

在这里插入图片描述
宽度变为原来的三倍,高度变为原来的0.6倍
这里要强调一个问题,当你决定用fx 或者fy 倍数方式实现缩放的时候,你必须要要给dsize参数赋值:None,不然会报错

2 翻转

cv2.flip(原始图像,翻转方式)
翻转方式分为三种:

  1. 0 代表沿着x轴翻转
  2. 正数代表沿着y轴翻转
  3. 复数代表沿着x,y同时翻转
    下面还是导入pig.jpg,然后在这个案例上进行翻转:
import numpy as np
import cv2 
red = cv2.imread("pig.jpg")
x_red = cv2.flip(red,0)
y_red = cv2.flip(red,5)
x_y_red = cv2.flip(red,-3)
cv2.imshow("original",red)
cv2.imshow("x_flip",x_red)
cv2.imshow("y_flip",y_red)
cv2.imshow("x_and_y_flip",x_y_red)
cv2.waitKey()
cv2.destroyAllWindows()](https://i-blog.csdnimg.cn/direct/68ac93d04db649e691a47862b189cb7a.png)

在这里插入图片描述

3 变换(难点)

(学前提醒:这里的东西有一点点难,但是没有大碍,基础的理论解释你可能看不懂,看不懂就往后看,后面的案例看懂了,再回来看前面就轻而易举了。)
他是通过一个矩阵进行仿射变换
dst(x,y) = src(M11x+M12y+M13,M21x+M22y+M23)
公式看着很烦,我把这个公式说成人话
变换后的坐标 的 横坐标 = 矩阵的这些位置的元素与xy相乘,相加的结果:M11x+M12y+M13
变换后的坐标 的 纵坐标 = 矩阵的这些位置的元素与xy相乘,相加的结果:M21x+M22y+M23
记不住没关系,你要是记得住走近科学就该观察你了,北京动物园我们就得买门票看你去了,大家不要急稍安勿躁看后面的案例,这玩意也没什么含义,重要的是知道怎么用,我会在3.1讲平移 3.2讲旋转 3.3讲复杂变换

3.1 平移

想要实现平移效果,该这样去设计矩阵
dst(x,y) = src(M11x+M12y+M13,M21x+M22y+M23)
M11 = 1 M12 = 0 M13 = 横坐标平移距离
M12 = 0 M22 = 1 M23 = 纵坐标平移距离
为什么这么设计呢?我们要知其然还得知其所以然,因为横坐标 = 原来的x +平移距离 ,这是平移,所以就得把 y的系数设置为0 x的系数设置为1,剩下一个x轴平移距离
纵坐标 = y +平移距离 ,所以就得把x的系数设置为0 y = 系数设置为1 ,剩下一个y轴平移距离
这下理解了吧?记不住没关系,点赞收藏一下我的文章,啥时候用到啥时候查。
我们下面看一个代码案例,还是用猪猪侠的图片pig.jpg:

import numpy as np
import cv2 
red = cv2.imread("pig.jpg")
height,width,channel = red.shape
x_move = 100
y_move = 100
M = np.float32([[1,0,x_move],[0,1,y_move]])
move = cv2.warpAffine(red,M,(width,height))
cv2.imshow("original",red)
cv2.imshow("move_x_100_y_100",move)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

3.2 旋转

先学一个制作M矩阵的函数
cv2.getRotationMatrix2D(中心点坐标center,旋转角度angle,大小缩放倍数scale)
要先调用它去制作M矩阵才能使用cv2.warpAffine达到旋转的效果
设置中心点为图片的中心,所以center = (height/2,width/2)
请看下面的代码:

import numpy as np
import cv2
red = cv2.imread("pig.jpg")
height,width,channel = red.shape
M = cv2.getRotationMatrix2D((height/2,width/2),45,0.5)
move = cv2.warpAffine(red,M,(width,height))
cv2.imshow("original",red)
cv2.imshow("move_flip",move)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

3.3三点确定变换

矩阵M,是通过三点的变换两对np数组,第一个数组是原来的点的坐标,第二个数组是变换后的对应坐标。通过两个数组和cv2.getAffineTransform()获得矩阵M

import numpy as np
import cv2
red = cv2.imread("pig.jpg")
height,width,channel = red.shape
before = np.float32([[0,0],[width-1,0],[0,height-1]])
after = np.float32([[0,height*0.33],[width*0.85,height*0.25],[width*0.15,height*0.7]])
M = cv2.getAffineTransform(before,after)
move = cv2.warpAffine(red,M,(width,height))

cv2.imshow("original",red)
cv2.imshow("move_flip",move)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

3.4 四点确定变换(透视)

使用cv2.getPerspectiveTransform去接收两个四点的np数组获得变换矩阵M
使用cv2.warpPerspective接受矩阵M去进行变换
因为我的pig.jpg图片的size是 (宽度 = 690,高度 = 920)所以我选择如下图的方式变换
在这里插入图片描述

在这里插入图片描述

import numpy as np
import cv2
red = cv2.imread("pig.jpg")
height,width,channel = red.shape
before = np.float32([[0,0],[width-1,0],[0,height-1],[width-1,height-1]])
after = np.float32([[300,0],[width-1,0],[0,height-1],[300,height-1]])
M = cv2.getPerspectiveTransform(before,after)
move = cv2.warpPerspective(red,M,(width,height))
cv2.imshow("original",red)
cv2.imshow("move_flip",move)
cv2.waitKey()
cv2.destroyAllWindows()

致谢

本文参考了一些博主的文章,博取了他们的长处,也结合了我的一些经验,对他们表达诚挚的感谢,使我对图像变换 的使用有更深入的了解,也推荐大家去阅读一下他们的文章。纸上学来终觉浅,明知此事要躬行:
OpenCV学习笔记15_仿射变换与透视变换
【OpenCV 例程200篇】29. 图像的翻转(cv2.flip)

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

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

相关文章

蓝桥杯每日真题 - 第21天

题目:(空间) 题目描述(12届 C&C B组A题) 解题思路: 转换单位: 内存总大小为 256MB,换算为字节: 25610241024268,435,456字节 计算每个整数占用空间: 每个 32 位整数占用…

24小时自动监控,自动录制直播蓝光视频!支持抖音等热门直播软件

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 工具特点📒📝 使用🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于许多直播爱好者和内容创作者而言,错过心爱的直播或难以搜集视频素材始终是一个难题。今天,给大家分享的这款工具可以轻松解决这个问题,它拥有…

HCIA考试内容多吗?HCIA数通学什么?

HCIA(Huawei Certified ICT Associate)考试的具体内容因华为公司技术发展与考试更新而有所调整。 一般而言,HCIA考试内容涵盖了计算机网络基础知识、设备配置技巧、网络协议理解、安全与管理实践等方面。 HCIA考试内容有什么 具体而言,HCIA考试内容包…

【MySQL实战45讲笔记】基础篇——深入浅出索引(上)

系列文章 基础篇——MySQL 的基础架构 基础篇——redo log 和 binlog 基础篇——事务隔离 目录 系列文章深入浅出索引(上)4.1 索引的常见模型4.2 InnoDB 的索引模型4.3 索引维护4.4 思考:为什么要重建索引以及如何做? 深入浅出索…

技术美术百人计划 | 《2.1 色彩空间介绍》笔记

总览 一、色彩发送器 色彩认知: 光源是出生点,光源发射出光线,光线通过直射反射折射等路径最终进入人眼。 但人眼接收到光线后,人眼的细胞产生了一系列化学反应。 由此把产生的信号传入大脑,最终大脑对颜色产生了认…

无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)

在数字化时代,流媒体播放器技术正经历着前所未有的变革。随着人工智能、大数据、云计算等技术的融合,流媒体播放器的核心技术不断演进,为用户提供了更加丰富和个性化的观看体验。 EasyPlayer.js H5播放器,是一款能够同时支持HTTP、…

Cannal实现MySQL主从同步环境搭建

大家好,我是袁庭新。 在多数情况下,客户端往往会优先获取缓存中的数据。然而,当缓存数据与数据库中的实际数据存在显著不一致时,可能会导致严重的后果。因此,确保数据库与缓存数据之间的一致性变得至关重要&#xff0c…

机器学习基础06

目录 1.梯度下降 1.1梯度下降概念 1.2梯度下降公式 1.3学习率 1.4实现梯度下降 1.5API 1.5.1随机梯度下降SGD 1.5.2小批量梯度下降MBGD 1.6梯度下降优化 2.欠拟合过拟合 2.1欠拟合 2.2过拟合 2.3正则化 2.3.1L1正则项(曼哈顿距离) 2.3.2…

探索ASP.NET Core 6 MVC与SqlServer的完美结合:一个开源示例项目

探索ASP.NET Core 6 MVC与SqlServer的完美结合:一个开源示例项目 【下载地址】ASP.NETCore6MVCSqlServer示例项目 ASP.NET Core 6 MVC SqlServer 示例项目本仓库提供了一个基于 ASP.NET Core 6 的 MVC 应用程序示例,使用 SqlServer 数据库 项目地址: …

LLM | 论文精读 | CVPR | Alpha-CLIP —— 一个聚焦目标区域的CLIP模型

论文标题:Alpha-CLIP: A CLIP Model Focusing on Wherever You Want 作者:Zeyi Sun, Ye Fang, Tong Wu, Pan Zhang, Yuhang Zang等 期刊:CVPR 2024 DOI:http://arxiv.org/pdf/2312.03818v2 email:yuhan.huangwhu.ed…

MySQL 的 Change Buffer 是什么?它有什么作用?

MySQL 的 Change Buffer 是什么?它有什么作用? MySQL 是目前广泛使用的开源数据库管理系统,其中的 InnoDB 存储引擎凭借其高性能、高可靠性以及强大的事务支持,成为了默认的存储引擎。在 InnoDB 的众多优化机制中,Cha…

axios 请求跨域问题

文章目录 1. 使用场景2. 解决办法 1. 使用场景 ① 编写后端测试接口&#xff0c;Vue-CLI 的默认端口为 8080&#xff0c;所以为避免端口冲突&#xff0c;我们后端的端口号换成 8081。 ② 前端通过 axios 向后端服务发起请求。 <script> import axios from axios export…

VConsole——(H5调试工具)前端开发使用于手机端查看控制台和请求发送

因为开发钉钉H5微应用在手机上一直查看不到日志等&#xff0c;出现安卓和苹果上传图片一边是成功的&#xff0c;一边是失败的&#xff0c;所以找了这个&#xff0c;之前在开发微信小程序进行调试的时候能看到&#xff0c;之前没想到过&#xff0c;这次被人提点发现可以单独使用…

集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

集合卡尔曼滤波&#xff08;Ensemble Kalman Filter&#xff09; 文章目录 引言理论基础卡尔曼滤波集合卡尔曼滤波初始化预测步骤更新步骤卡尔曼增益更新集合 MATLAB 实现运行结果3. 应用领域结论 引言 集合卡尔曼滤波&#xff08;Ensemble Kalman Filter, EnKF&#xff09;是…

写给Vue2使用者的Vue3学习笔记

&#x1f64b;‍请注意&#xff0c;由于本人项目中引入了unplugin-auto-import的依赖&#xff0c;所以所有的代码示例中均未手动引入各种依赖库&#xff08;ref、reactive、useRouter等等&#xff09; 初始环境搭建 npm init vuelatest模板语法 插值 同 Vue2 <span>…

golang调用webview,webview2,go-webview2

go version go1.20 windows/amd64 先要了解一些第三方库 1、webview/webview 它是一个跨平台的轻量级的webview库&#xff0c;面向的是C/C&#xff0c;使用它可以构建跨平台的GUI。webview就是浏览器内核&#xff0c;在不同操作系统上是不同的库&#xff0c;比如在windows上…

【初阶数据结构篇】双向链表的实现(赋源码)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

结合第三方模块requests,文件IO、正则表达式,通过函数封装爬虫应用采集数据

#引用BeautifulSoup更方便提取html信息&#xff1b;requests模块&#xff0c;发生http请求&#xff1b;os模块&#xff0c;文件写入import requests from bs4 import BeautifulSoup import os#当使用requests库发送请求时&#xff0c;如果不设置User - Agent&#xff0c;默认的…

开源许可协议

何同学推动了开源协议的认识&#xff0c;功不可没&#xff0c;第一次对开源有了清晰的认识&#xff0c;最宽松的MIT开源协议 源自OSC开源社区&#xff1a;何同学使用开源软件“翻车”&#xff0c;都别吵了&#xff01;扯什么违反MIT

【达梦数据库】主备集群改造成读写分离

目录 背景步骤1、确认授权2、参数修改3、确认驱动版本和数据库版本匹配 背景 客户在双机主备集群手动切换的环境下&#xff0c;发现主库压力较大&#xff0c;需要改成读写分离的模式&#xff0c;将主库的压力分担到备库。 步骤 1、确认授权 select * from v$license;授权使…