OpenCv图像基本变换

news/2025/3/14 17:49:52/

目录

一、图像翻转

二、图像旋转

三、仿射变换之平移

四、仿射变换之获取变换矩阵

五、仿射变换之透视变换


一、图像翻转

图像翻转不等同于旋转,类似于一些视频的拍摄,拍摄后实际是左右颠倒的,通过图像翻转可进行还原

案例代码如下:

# 图片翻转
filpCode = 0表示上下翻转
flipCode > 0表示左右翻转
flipCOde < 0表示上下+左右翻转
new_first = cv2.flip(first,flipCode=-1)

二、图像旋转

函数原型:

rotate(img,rotateCode)

案例代码如下:

# 图片旋转
ROTATE_90_CLOCKWISE 90度顺时针
ROTATE_180 180度
ROTATE_90_COUNTERCLOCKWISE 90度逆时针new_first = cv2.rotate(first,rotateCode= cv2.ROTATE_90_COUNTERCLOCKWISE)
# 展示图片
cv2.imshow('first',new_first)

三、仿射变换之平移

函数原型:

warpAffine(src,M,dsize,flags,mode,value)

  • M:变换矩阵
  • dsize:输出尺寸大小
  • flags:与size中的插值算法一致
  • mode:边界外推法标志
  • value:填充边界的值

案例代码如下:

# 读取图片
first = cv2.imread('5.jpg')h,w,ch = first.shape# 右移200个单位
# 变换矩阵(最少为float32位)
M = np.float([[1,0,200],[0,1,0]])# 平移操作
# 注意opencv中先宽度,后高度
new_first = cv2.warpAffine(first,M,dsize=(w,h))cv2.imshow('new_first',new_first)

四、仿射变换之获取变换矩阵

获取变换矩阵M的两种方法:

1、getRotationMatrix2D(center,angle,scale)

  • center:中心点
  • angle:旋转角度(逆时针)
  • scale:缩放比例(宽高同时缩放)

案例代码如下: 

h,w,ch = first.shape
# 获取变换矩阵(注意旋转角度为逆时针)
# M = cv2.getRotationMatrix2D((100,100),15,1.0)# 以图像中心点旋转
M = cv2.getRotationMatrix2D((w/2,h/2),15,1.0)new_first = cv2.warpAffine(first,M,(w,h))

2、getAffineTransform(src[],dst[])

定义:通过点对应找到变换矩阵,一般三个点就可以; 

拓展:这里可以联想到TPS算法,也是通过对应点进行变换的一种方法,二者可能有想通之处;

案例代码如下:

h,w,ch = first.shapesrc = np.float32([[200,100],[300,100],[200,300]])
dst = np.float32([[100,150],[360,200],[280,120]])# 通过三个点来确定变换矩阵
M = cv2.getAffineTransform(src,dst)
new_first = cv2.warpAffine(first,M,(w,h))

五、仿射变换之透视变换

这里用一个具体案例来介绍,例如拍照搜题的软件,当拍摄整页时会有一种书本和桌面组合的样子,经过透视变换后能更好的将想要的信息放在图像中;

仿射变换函数原型:

warpPerspective(img,M,dsize,…)

获取变换矩阵函数原型:

getPerspective(src,dst):和getAffineTransform函数比较类似,不同的是需要四个坐标点(图形四个角);
案例代码如下:

# 获取变换矩阵
# src是原图的四个坐标
# dst
src = np.float32([[100,1100],[210,110],[0,4000],[2500,3900]])
dst = np.float32([[0,0],[2300,0],[0,3000],[2500,3000]])M = cv2.getPerspectiveTransform(src,dst)# 透视变换
new_img = cv2.warpPerspective(img,M,(2300,3000))cv2.imshow('new_img',new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下:

 


http://www.ppmy.cn/news/913109.html

相关文章

新品发布:总线视频监控专用VGA显示驱动模组

针对大屏幕的视频监控应用&#xff0c;迪文特推出带FSK总线摄像头接口的VGA显示驱动模组产品&#xff1a;MVGA06-26。该产品采用T5L2单芯片驱动&#xff0c;提供标准VGA接口连接各类显示器&#xff0c;并设有2Pin按压端子座、双孔AV端子座两种总线摄像头接口形式&#xff0c;接…

基于CH374的USB摄像头驱动设计

现有视频监控系统的设计大都采用 USB视频采集和以太网传输&#xff0c;并且需要视频压缩方案&#xff0c;通常需要操作系统支持&#xff1b;因此选取的开发平台价格昂贵&#xff0c;造成视频临控系统的成本居高不下&#xff0c;以致使小型工厂和家庭用户难以接受。 本 课题采用…

计算机控制系统总线,计算机控制系统功能之现场总线控制-电脑自学网

现场总线是连接智能现场设备和自动化系统的数字式、双向传输、多分支结构的通信网络。现场总线控制始于 20 世纪 80 年代末&#xff0c;它将计算机网络通信与管理引入了控制领域&#xff0c;并广泛应用于过程自动化、制造自动化、楼宇自动化等领域。现场总线控制系统(Fieldbus …

Linux SPI总线和设备驱动架构之三:SPI控制器驱动

通过第一篇文章&#xff0c;我们已经知道&#xff0c;整个SPI驱动架构可以分为协议驱动、通用接口层和控制器驱动三大部分。其中&#xff0c;控制器驱动负责最底层的数据收发工作&#xff0c;为了完成数据的收发工作&#xff0c;控制器驱动需要完成以下这些功能&#xff1a; 1.…

windows下编程控制摄像头(一)

使用VFW在windows下编程控制摄像头&#xff08;一&#xff09; Microsoft Video for Windows (VFW) 提供的函数可以让应用程序去处理视频数据。 VFW 在16位Windows的时候就被引入了。它的许多重要功能已经被DirectX取代了。 要获得更多的信息&#xff0c;你可以参考DirectX 的文…

从零开始写CMOS摄像头驱动(一)

先给自己打个广告&#xff0c;本人的微信公众号正式上线了&#xff0c;搜索:张笑生的地盘&#xff0c;主要关注嵌入式软件开发&#xff0c;股票基金定投&#xff0c;足球等等&#xff0c;希望大家多多关注&#xff0c;有问题可以直接留言给我&#xff0c;一定尽心尽力回答大家的…

只需一个提示词解除GPT-4的字符限制!

ChatGPT的内存有限,GPT-3.5-turbo的限制为4897个令牌,而GPT-4的最大限制为8192。如果您在使用GPT-4进行聊天时超过8192个令牌(约6827个单词),它就会开始遗忘。我想出了一种新的技巧,可以轻松将对话扩展10倍。 这种技巧不会将对话中的每个字都保存到内存中。当您去开会时,会有人…

CnosDB x LangChain: 聊着天来查询时序数据库

本篇我们将主要介绍如何使用 LangChain 连接 CnosDB 数据库&#xff0c;实现使用自然语言和数据库的交流。 大模型等的相关话题已经霸榜半年有余&#xff0c;在讨论关注之余&#xff0c;CnosDB技术团队将大模型与人工智能相关技术与数据库开发与实践进行融合。继CnosDB全面整合…