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

在这里插入图片描述

简介:本文详细阐述了 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sql注入报错分享(mssql+mysql)

mysql mysql的报错内容比较多 网上也有比较多的 这里重复的就不多介绍了。一笔带过 溢出类 bigint 当超过mysql的整形的时候,就会导致溢出,mysql可能会将错误信息带出。这里user()是字母默认为0 取反以后1可能就会导致异常。 报错特征 BIGINT UNSIG…

FastAPI重载不生效?解决PyCharm中Uvicorn无法重载/重载缓慢的终极方法!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 重载缓慢 📒📝 问题概述🚨 相关原因📝 解决方案一📝 解决方案二📝 解决方案三📝 解决方案四⚓️ 相关链接 ⚓️📖 介绍 📖 在使用FastAPI开发时,reload=True 本应让你在修改代码后自动重启服务,提升开发效率…

AI智能稿件排版系统订单管理系统

在现代制造业和服务行业中,高效的生产流程和精确的订单管理是企业保持竞争优势的核心要素。AI智能稿件排版系统和订单管理系统作为一体化解决方案,以其强大的自动化能力和智能化技术,帮助企业实现排版效率提升、数据格式兼容性增强和生产流程…

jetson orin系列开发版安装cuda的gpu版本的opencv

opencv安装包下载地址: https://github.com/opencv/opencv/扩展库下载地址: https://github.com/opencv/opencv_contrib1. 删除jetpack包中的opencv版本 原先的opencv库安装在目录/usr/lib/aarch64-linux-gnu/下(一般其他的第三方库也都安…

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

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

dockerfile构建Nginx镜像练习二(5-2)

环境准备: (1)保证拥有centos基础镜像 docker images | grep centos (2)服务器保证可以连接外网 1.创建工作目录 mkdir nginx cd nginx 2.在工作目录中创建并编写Dockerfile文件 vim dockerfile #定义基础镜像 FROM centos:7#维护者信息(可缺省) MAINTAINER d…

Etcd 框架

基本了解 客户端、长连接与租约的关系 客户端对象 etcd的客户端对象是用户与etcd服务进行交互的主要接口,主要功能就是存储、通知和事务等功能访问 键值存储:客户端通过put 和 get操作存储数据;数据存储在etcd的层级化键值数据库中监听器&a…

滑动窗口篇——如行云流水般的高效解法与智能之道(1)

前言: 上篇我们介绍了双指针算法,并结合具体题目进行了详细的运用讲解。本篇我们将会了解滑动窗口。滑动窗口是一种常用的算法技巧,主要用于处理子数组、子串等具有“窗口”特性的题目。柳暗花明,乃巧解复杂问题的高效之道。 一. …

数据结构-树状数组专题(2)

一、前言 接上回树状数组专题&#xff08;1&#xff09;&#xff0c;这次主要介绍差分跟树状数组联动实现区间更新 二、我的模板 重新放了一遍&#xff0c;还是提一嘴&#xff0c;注意下标从0开始&#xff0c;区间左闭右开 template <typename T> struct Fenwick {in…

QA|使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R)

使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R) 纸张、薄膜、塑料、金属箔、新能源电池和卷料生产设备 (converting equipment) 的制造商正在转向建模和仿真&#xff0c;以提升卷料处理的设备性能和产品质量。MapleSim 卷料处理库提供了专业的建模元件以及功能&a…

2024ARM网络验证 支持一键云注入引流弹窗注册机 一键脱壳APP加固搭建程序源码及教程

此套源码功能强大&#xff0c;支持APK脱壳、注入、网络验证、注册机、引流弹窗、更新弹窗和公告等功能&#xff0c;并具有强大的系统应用管理端&#xff0c;可轻松管理用户数量和卡密状态等数据统计。armpro脱壳软件可在线修改手机文件和游戏数据&#xff0c;并可添加会员功能、…

汉诺塔(hanio)--C语言函数递归

文章目录 前言一、汉诺塔的图解二、问题分析总结 前言 什么是汉诺塔&#xff1f; 汉诺塔(Tower of Hanoi)&#xff08;也称河内塔&#xff09;是有法国数学家爱德华卢卡斯于1883年发明的一道智力题。它源于印度的一个古老传说&#xff1a;大梵天创造世界的时候做了三根钻石柱子…

【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析

前言&#xff1a;本节内容讲述mysql里面的函数的概念&#xff0c; 在mysql当中&#xff0c; 内置了很多函数工作。 这些函数丰富了我们的操作。 比如字符串函数、数据函数以及一些其他函数等等。 ps:友友们学习了表的基本操作后就可以观看本节内容啦! 目录 日期函数 current_…

Is:cannat access /data: Input/output error

说明&#xff1a; 1&#xff09;访问应用业务&#xff0c;输入账号密码报如下图所示&#xff1a;invalid login. 2&#xff09;登录服务器查看数据日志&#xff0c;报如下图所示&#xff1a;ls:cannot access /data: Input/output error 3&#xff09;查看日志dmesg |grep erro…

Python MySQL SQLServer操作

Python MySQL SQLServer操作 Python 可以通过 pymysql 连接 MySQL&#xff0c;通过 pymssql 连接 SQL Server。以下是基础操作和代码实战示例&#xff1a; 一、操作 MySQL&#xff1a;使用 pymysql python 操作数据库流程 1. 安装库 pip install pymysql2. 连接 MySQL 示例 …

迅为RK3562开发板直连电脑配置方法(无线上网)

概述 由于环境限制&#xff0c;笔记本电脑和开发板无法通过路由器连接起来&#xff0c;所以本文的目的是要实现笔记本电脑和虚拟机能够通过 WIFI 上网&#xff0c;并且开发板通过网线连接笔记本电脑和虚拟机在同一个网段内&#xff0c;最终实现 TFTP 或 NFS 来进行开发调试。 通…

Mono Repository方案与ReactPress的PNPM实践

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 Mono Repository方案与ReactPress的PNPM实践 在当今软件开发领域&#xff0c;Mono Repository&#xff08;简称Monorepo&#xff09;已成为一种流行的代码管理方式&#xff0c;特…

timedatectl命令修改时间和时区

1.默认情况下&#xff0c;Linux系统通常每64分钟进行一次NTP时间同步。但是&#xff0c;这可以通过编辑/etc/ntp.conf文件来修改。在/etc/ntp.conf中设置minpoll和maxpoll参数。 timedatectl可以用来查询和更改系统时间设定&#xff0c;同时可以设定和修改时区信息。 一、查…

基于Opencv的图像处理软件

目录 一、背景及意义介绍背景意义 二、概述一、背景及意义介绍背景意义 三、论文思路解决问题 四、复现过程&#xff08;一&#xff09;图像处理模块二&#xff09;图形界面模块&#xff08;一&#xff09;图像处理模块实现步骤&#xff08;二&#xff09;图形界面模块实现步骤…

HTML的自动定义倒计时,这个配色存一下

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>自定义倒计时</title><style>* {mar…