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

ops/2024/11/28 9:11:30/

在这里插入图片描述

简介:本文详细阐述了 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.ppmy.cn/ops/137313.html

相关文章

ubuntu,rocky的安装和使用远程连接工具连接服务器

Ubuntu的安装 下载最小版的ubuntu的iso镜像:https://mirrors.aliyun.com/ubuntu-releases/24.04/ubuntu-24.04.1-live-server-amd64.iso rocky的安装 下载最小版的ubuntu的iso镜像:Rocky Linux 使用学会使用远程连接工具连接服务器 使用xshell连接Ubu…

NLP论文速读(EMNLP2024)|多风格可控生成的动态多奖励权重

论文速读|Dynamic Multi-Reward Weighting for Multi-Style Controllable Generation 论文信息: 简介: 本文探讨了文本风格在沟通中的重要性,指出文本风格传达了除原始语义内容之外的多种信息,如人际关系动态(例如正式…

深入解析下oracle char和varchar2底层存储方式

oracle数据库中,char和varchar2数据类型用来存储字符数据。char类型一旦定义多大,那么它就分配多少字节空间;varchar2类型定义多大,代表它可以扩展的最大大小为多大,一开始空间根据使用来决定。字符数据存储在oracle表…

Hot100 - 除自身以外数组的乘积

Hot100 - 除自身以外数组的乘积 最佳思路: 此问题的关键在于通过两次遍历,分别计算从左侧和右侧开始的累积乘积,以此避免使用额外的除法操作。 时间复杂度: 该算法的时间复杂度为 O(n),因为我们只需要遍历数组两次。…

【风水】-- 如何挑选吉日入住

目录 1. 五行与方位的配合 2. 八卦与方位的搭配 3. 选择吉日的原则 4. 阴阳与天干地支的匹配 5. 选择吉日的具体步骤 6. 个人八字与吉日的结合 总结 挑选入住新房或旧房的吉日是风水学中的一项重要传统,旨在通过选择合适的时机来调整和增强居住者的运势。从风…

【漏洞复现】CVE-2022-24697

漏洞信息 NVD - CVE-2022-24697 Kylin’s cube designer function has a command injection vulnerability when overwriting system parameters in the configuration overwrites menu. RCE can be implemented by closing the single quotation marks around the parameter…

理解并使用Linux内核XArray

理解并使用Linux内核XArray 1. 引言 大家好,今天咱们来聊聊Linux内核中的一个强大工具——XArray。如果你对数据结构感兴趣,或者正在开发内核模块,那么这篇文章绝对适合你。我会尽量用轻松幽默的方式带你走进XArray的世界。 2. XArray简介…

java——spring中事务怎么实现的?原理是什么?

在Spring框架中,事务管理是一个核心功能,它提供了两种主要的事务实现方式:声明式事务和编程式事务。下面分别介绍这两种实现方式及其底层原理。 一、Spring事务的实现方式 声明式事务 声明式事务管理通过注解或XML配置的方式,将事…