OpenCV(图像处理)-基于Python-图像的基本变换-平移-翻转-仿射变换-透视变换

news2024/11/18 7:28:25

在这里插入图片描述

  • 1. 概述
  • 2. 接口介绍
    • resize()
    • flip()
    • rotate()
    • 仿射变换
      • warpAffine()
      • getRotationMatrix2D()-变换矩阵1
      • getAffineTransform()-变换矩阵2
    • 透视变换
      • warpPerspective()
      • getPerspectiveTransform()

1. 概述

为了方便开发人员的操作,OpenCV还提供了一些图像变换的API,本篇文章讲简单介绍各种API的使用,并附上一些样例。

2. 接口介绍

resize()

图像缩放函数,用于把图像按指定的尺寸放大或缩小。
dst = cv2.resize(src, dsize, fx, fy, interpolation)
dst = 生成的目的图像
src:需要变换的原图像
disize:(x, y)需要变换图像的尺寸,直接填
fx,fy:缩放因子,与disize会冲突,通常只需要二选一即可
interpolation:插值算法,用于缩放的算法。默认为双线性插值。

缩放算法参数
在这里插入图片描述
效果越好的算法运算越复杂,效果越好。反之相反。

import cv2
import numpy as np

lina = cv2.imread('./image/lina.jpg')
print(lina.shape)
# 修改图像大小:fx,fy可以省略,默认为双线性插值
lina2 = cv2.resize(lina, (700, 700))
# 使用缩放因子,需要指定参数,并且dsize传空
lina3 = cv2.resize(lina, None, fx=2, fy=2, interpolation=cv2.INTER_AREA)

cv2.imshow('lina', lina)
cv2.imshow('lina3', lina3)

cv2.waitKey(0)

在这里插入图片描述

flip()

图像翻转函数,讲图像上下翻转,左右翻转
img1 = cv2.flip(img,flipCode)
img:需要翻转的图片
flipCode:值为0,上下翻转;值>0,左右翻转;值<0,上下左右一起翻转。

import cv2
import numpy as np

lina = cv2.imread('./image/lina.jpg')
print(lina.shape)
# 上下翻转
lina_0 = cv2.flip(lina, 0)
# 左右翻转
lina_1 = cv2.flip(lina, 1)
# 上下左右翻转
lina_01 = cv2.flip(lina, -1)

cv2.imshow('lina', lina)
cv2.imshow('lina_0', lina_0)
cv2.imshow('lina_1', lina_1)
cv2.imshow('lina_01', lina_01)

cv2.waitKey(0)

在这里插入图片描述

rotate()

将图片按顺时针逆时针旋转一定角度
img2 = cv2.rotate(img, rotateCode)
img:需要旋转的图片
rotateCode:含义分别为:顺时针转90,180度,逆时针转90度。

rotateCode
在这里插入图片描述

import cv2
import numpy as np

lina = cv2.imread('./image/lina.jpg')
print(lina.shape)

# 顺时针转90
lina_90 = cv2.rotate(lina, cv2.ROTATE_90_CLOCKWISE)

# 顺时针转180
lina_180 = cv2.rotate(lina, cv2.ROTATE_180)

# 顺时针转270,逆时针转90
lina_270 = cv2.rotate(lina, cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imshow('lina', lina)
cv2.imshow('lina_90', lina_90)
cv2.imshow('lina_180', lina_180)
cv2.imshow('lina_270', lina_270)

cv2.waitKey(0)

在这里插入图片描述

仿射变换

仿射变换是图像旋转、缩放、平移的总成。

warpAffine()

img2 = cv2.warp(src, M, dsize, flags, mode, value)
src:需要变换的图像
M:进行变换的矩阵,变换成什么样子由M决定,可以由特定接口来求。
dsize:输出图像的尺寸
flags:与resize函数的缩放算法一致,默认为双线性插值。
mode:边界处标志
value:填充边界的值
后三个参数一般都用默认,主要使用前3个参数

getRotationMatrix2D()-变换矩阵1

求变换矩阵M的函数,主要用于旋转
M = cv2.getRotationMatrix2D(center, angle, scale)
center:中心点,按住哪个点进行旋转
angle:旋转的角度(逆时针旋转)
scale:缩放比例,1.0不缩放

import cv2
import numpy as np

lina = cv2.imread('./image/lina.jpg')
print(lina.shape)

# 变换前要求出变换矩阵

M = cv2.getRotationMatrix2D((200, 200), 30, 1.0)
lina2 = cv2.warpAffine(lina, M, (474, 474))



cv2.imshow('lina', lina)
cv2.imshow('lina2', lina2)


cv2.waitKey(0)

在这里插入图片描述

getAffineTransform()-变换矩阵2

求变换矩阵M,主要是用于平移+旋转,利用三个坐标点前后变化来确定一个平面的变化
M = cv2.getAffineTransform(src[], dst[])
src:源坐标点,以列表的形式传入(数据格式一定为float32
dst:变换后图的坐标,以列表的形式传入(数据格式一定为float32

import cv2
import numpy as np

lina = cv2.imread('./image/lina.jpg')
print(lina.shape)


# 变换前要求出变换矩阵
# 坐标一定要是32位的小数!!否则会报错
src = np.float32([[0, 0], [0, 100], [100, 0]])
dst = np.float32([[50, 50], [50, 150], [200,50]])
M = cv2.getAffineTransform(src, dst)
lina2 = cv2.warpAffine(lina, M, (474, 474))


cv2.imshow('lina', lina)
cv2.imshow('lina2', lina2)


cv2.waitKey(0)

透视变换

完全改变物体的位置和形状,需要四个坐标点。一般用来调整图片的位置。

warpPerspective()

用于透视变换的主函数
img2 = cv2.warpPerspective(img, M, dsize, …)
img:需要进行变换的图像
M:进行透视变换的矩阵
dsize:输出图片的大小

getPerspectiveTransform()

用来求透视变换的矩阵,需要四个点
M = cv2.getPerspectiveTransform(src[], dst[])
src:源坐标点,以列表的形式传入(数据格式一定为float32
dst:变换后图的坐标,以列表的形式传入(数据格式一定为float32

import cv2
import numpy as np

work = cv2.imread('./image/work.jpg')
# 将图片调整到适合大小
work = cv2.resize(work, (700, 700), interpolation=cv2.INTER_AREA)
# 设置适当变换坐标,求出变换矩阵
src = np.float32([[210, 20], [700, 110], [0, 660], [600, 700]])
dst = np.float32([[0, 0], [700, 0], [0, 700], [700, 700]])
M = cv2.getPerspectiveTransform(src, dst)
# 进行透视变换
work2 = cv2.warpPerspective(work, M, (700, 700))
cv2.imshow('work', work)
cv2.imshow('work2', work2)


cv2.waitKey(0)

变换后如图所示,将主要图片变正了
在这里插入图片描述

以上就是图像变换的简单介绍,如果有疑问,欢迎在评论区讨论哦。

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

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

相关文章

Qt 去除标题栏不同方法不同平台差异探究

Qt 版本&#xff1a;Qt 6.5.0 Windows 11 当窗体为QWidget时 setWindowFlags(Qt::FramelessWindowHint);// 窗口不能缩放setWindowFlags(Qt::CustomizeWindowHint);// 窗口支持缩放&#xff0c;且窗体四角为圆角CustomizeWindowHintFramelessWindowHint 当窗体为QMainWindow时…

什么是第三方付费模式?用“尤伯罗斯模式”让你的商品由别人买单

什么是第三方付费模式&#xff1f;用“尤伯罗斯模式”让你的商品由别人买单 微三云营销策划胡总监给大家介绍一下&#xff0c;什么是第三方付费模式&#xff1f; 当同质化产品日趋严重的时候&#xff0c;改变客户接受产品价值及服务的模式创新就是商业模式的创新&#xff0c;以…

计算机硬件(2)

1.4 计算机硬件 电脑硬件是计算机系统中最基本的部分&#xff0c;可理解成看得见、摸得着的实物。一台电脑是由许多的零部件组成&#xff0c;只有这些零部件组合在一起协调工作&#xff0c;才能称之为电脑。一般计算机的硬件可以简单分为以下部件&#xff1a; 主机&#xff08…

Nginx location匹配优先级 与 Rewrite

目录 前言locationlocation 常用的匹配规则location 优先级实例演示 rewrite前言rewrite跳转实现rewrite 执行顺序语法格式rewrite全局变量实例演示 前言 从功能看 rewrite 和 location 似乎有点像&#xff0c;都能实现跳转&#xff0c;主要区别在于 rewrite 是在同一个域名内…

抛弃传统网络?SDN协议、标准、接口对比分析

随着网络规模的不断扩大和复杂性的增加&#xff0c;传统的网络架构已经难以满足日益增长的网络需求。SDN&#xff08;Software Defined Networking&#xff09;技术的出现&#xff0c;为网络的管理和控制带来了革命性的变化。SDN的核心思想是将网络的控制和管理从传统的分散式硬…

STL-string-2

Iterators Capacity resize void resize (size_t n);void resize (size_t n, char c); Resize string 将字符串的大小调整为n个字符的长度。 如果n小于当前字符串长度&#xff0c;则当前值将缩短为其第一个n字符&#xff0c;删除第n个字符之后的字符。 如果n大于当前字符串长…

Python接口自动化之yaml配置文件

Python自动化测试&#xff1a;7天练完这60个实战项目&#xff0c;年薪过35w。 软件测试技术分享总结 在自动化过程中&#xff0c;需要使用配置文件储存数据&#xff0c;比如数据库信息、账号信息、域名等。 其中&#xff0c;yaml文件是一种配置文件类型&#xff0c;相比较in…

职场已是00后的天下了,起薪20k,想都不敢想

2023年很卷吗&#xff1f;不&#xff0c;只能说你还得学&#xff01; 都说00后已经躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷&#xff01; 这不&#xff0c;前段时间我们公司新招来了一个00后小伙&#xff0c;工作都没2年&#xff0c;跳槽到我们公司就起薪20K&…

基于linux安装部署clickhouse+基本操作

基于linux安装部署clickhouse基本操作 1.clickhouse简介 ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用SQL查询实…

一个年薪30w软件测试员的职业规划,献给还在迷茫中的朋友

如果你做了几年的功能测试&#xff0c;如今很迷茫&#xff0c;不知道该往哪里走&#xff0c;那么请看过来&#xff01; 一&#xff1a;技术方向 1. 测试开发工程师&#xff1a; 支撑测试部门&#xff0c;一般来说主要负责设计&编写测试部门所需的测试工具&#xff0c;提…

华为OD机试真题 Java 实现【寻找峰值】【牛客练习题】

一、题目描述 给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于; 2.假设 nums[-1] = nums[n] = -\infty−∞; 3.对于所有有效的…

被迫在小公司熬了2年,现在我终于进了腾讯测试岗...

其实两年前校招的时候就往腾讯投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里&#xff0c;想着总有一天会再次挑战的。 其实这两年除了工作以外&#xff0c;其余时间基本上都在学习&#xff0c;打磨自己…

Ubuntu系统镜像下载,国内镜像站大全(山大/清华/阿里/浙大/中科大...)

装Ubuntu&#xff0c;是很多理工科同学入门的第一个挑战&#xff0c;首先我们就需要找到一个能用的iso镜像&#xff0c;根据你的网络环境的不同&#xff0c;不同的站点下载速度会不一样&#xff0c;下面列举一下几个比较好用的&#xff0c;都是来自Ubuntu官方推荐国内镜像站链接…

一起来学习Vue2吧

虽然Vue3已经出来好一阵子了&#xff0c;但就目前而言&#xff0c;Vue2在市场上还是会占一大部分的&#xff0c;因为一些老项目是用Vue2写的&#xff0c;后期维护也是需要Vue2&#xff0c;而且学会Vue2&#xff0c;Vue3你也会的差不多了&#xff0c;到后面稍微看一下理解一下Vu…

[5]PCB设计实验|卷积神经网络基础|零基础入门深度学习(4) 卷积神经网络|14:00~14:55

资料来源&#xff1a;零基础入门深度学习(4) - 卷积神经网络 - 作业部落 Cmd Markdown 编辑阅读器 目录 1. Relu激活函数 2. 全连接网络VS卷积网络 3. 卷积神经网络 3.1 网络架构 3.2 三维的层结构 4. 卷积神经网络输出值的计算 5. Pooling层输出值的计算 6. 全连…

【自动化测试基础】Appium自动化环境搭建保姆级教程

APP自动化测试运行环境比较复杂&#xff0c;稍微不注意安装就会失败。我见过不少朋友&#xff0c;装了1个星期&#xff0c;Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作&#xff0c;但是 Appium 安装过程中确实存在不少隐藏的比较深的坑&#xff0c;如果…

开源赋能 普惠未来|腾讯寄语2023开放原子全球开源峰会

腾讯长期秉承科技向善的宗旨&#xff0c;通过通信和社交服务连接全球逾 10 亿人&#xff0c;提供云计算、广告、金融科技等一系列企业服务。 作为开放原子开源基金会&#xff08;以下简称“基金会”&#xff09;发起人之一&#xff0c;腾讯坚定拥抱开源&#xff0c;全力支持开…

【最新计算机毕业设计 本科 大专 游戏方向 源码】

2022年 - 2023年 最新计算机毕业设计 本科 大专 游戏方向 源码 下载前必看&#xff1a;纯小白教程&#xff0c;unity两种格式资源的使用方法&#xff0c;1打开现有项目、2导入package 大专毕设源码&#xff1a;数媒专业、计算机专业、电子专业通用50多款大专毕设小游戏【源码】…

转行程序员,自学可以吗?35岁会被裁员吗?

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们聊一些技术以外的分享。 一个非科班出身的人转行程序员难吗&#xff1f; 自学可以吗&#xff1f; 我也不是计算机相关专业毕业的&#xff0c;以下聊的都是我的一些真实经历&#xff0c;希望能给想要进入软件行业的非科班…

Centos7安装下载的mysql8+

1.官网下载 MySQL 安装包 1.1选择版本及下载 1、官网地址 https://dev.mysql.com/downloads/mysql/ 2、选择下载 MySQL 的 Linux 系统版本 Select Operating System: 选择 Red Hat &#xff0c;CentOS 是基于红帽的&#xff0c;Select OS Version: 选择 linux 7 3、选择要下…