OpenCV-Python实战(8)——图像变换

news2025/1/3 8:22:29

一、缩放 cv2.resize()

img = cv2.resize(src=*,dsize=*,fx=*,fy=*,interpolation=*)

img:目标图像。

src:原始图像。

dsize:(width,height)图像大小。

fx、fy:可选参数,水平/垂直方向缩放比例。

interpolation:可选参数,进行缩放操作使用哪种方法对图像进行删减或增补,常用方法如下:

方法解释
INTER_NEAREST0最近插值法
INTER_LINEAR1双线性插值法
INTER_CUBIC2双三次插值法
INTER_AREA3
INTER_LENCZOS44Lencz的插值方法
import cv2

lena = cv2.imread('Lena.png')

img1 = cv2.resize(src=lena,dsize=(int(lena.shape[0]/2),int(lena.shape[1]/2)))
img2 = cv2.resize(src=lena,dsize=None,fx=.5,fy=0.5)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)

cv2.waitKey(0)
cv2.destroyAllWindows()

二、翻转 cv2.flip()

img = cv2.flip(src=*,flipCode=*)

img:目标图像。

src:原始图像。

flipCode:翻转方式:

flipCode解释
0垂直翻转
1水平翻转
-1垂直与水平同时翻转
import cv2

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

img1 = cv2.flip(src=lena,flipCode=0)
img2 = cv2.flip(src=lena,flipCode=1)
img3 = cv2.flip(src=lena,flipCode=-1)

cv2.imshow('lena',lena)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

三、仿射 

M=\begin{bmatrix} M11 &M12 &M13 \\ M21 &M22 &M23 \end{bmatrix}

img(x,y)=src(M_{11}x + M_{12}y + M_{13} , M_{21}x + M_{22}y + M_{23})

img = cv2.warpAffine(src=*,M=*,dsize=*,flags=*,borderMode=*,borderValue=*)

img:目标图像。

src:原始图像。

M:3*2 变换矩阵,不同变换矩阵的仿射效果不同。

dsize:(width,height)新图像大小。

flags:进行仿射操作的插值方法。

borderMode:边界像素,默认为:BORDER_CONSTANT。

borderValue:边界填充值,默认为0。

3.1 平移

img(x,y)=src(1*x + 0*y + M_{13} , 0*x + 1*y + M_{23})

M=\begin{bmatrix} 1 &0 &M13 \\ 0 &1 &M23 \end{bmatrix}

表示图像向X轴方向平移 _{}M_{13},向Y轴方向平移 _{}M_{23}

import numpy as np

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

x = 25
y = 25
M = np.float32([[1,0,x],[0,1,y]])
img = cv2.warpAffine(src=lena,M=M,dsize=lena.shape[:2])

cv2.imshow('lena',lena)
cv2.imshow('img',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 旋转 cv2.getRotationMatix2D()

M = cv2.getRotationMatrix2D(center=*,angle=*,scale=*)

center:旋转的中心点坐标(width,height)。

angle:旋转角度,正值(逆时针);负值(顺时针)。

scale:缩放比。

import cv2
import numpy as np

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

w,h = lena.shape[:2]
M = cv2.getRotationMatrix2D(center=(w/2,h/2),angle=30,scale=1)
img = cv2.warpAffine(src=lena,M=M,dsize=lena.shape[:2])

cv2.imshow('lena',lena)
cv2.imshow('img',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

3.3 倾斜 cv2.getAffineTransform()

M = cv2.getAffineTransform(src=*,dst=*)

src:原始图像的三个定位点坐标。(可以是图像的任意三个角坐标)

dst:倾斜图像对应的三个定位点坐标。

import cv2
import numpy as np

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

w,h = lena.shape[:2]
src = np.float32([[0,0],[w-1,0],[w-1,h-1]])
dst = np.float32([[30,0],[w+29,0],[w-1,h-1]])
M = cv2.getAffineTransform(src=src,dst=dst)
dsize = (w+50,h)
img = cv2.warpAffine(src=lena,M=M,dsize=dsize)

cv2.imshow('lena',lena)
cv2.imshow('img',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

 3.4 透视

透视相比于倾斜,定义了四个基准点,可以进行非平行变换。

M = cv2.getPerspectiveTransform(src=*,dst=*)
img = cv2.warpPerspective(src=*,M=*,dsize=*,flags=*,borderMode=*,borderValue=*)

src:原始图像的四个定位点坐标。(可以是图像的任意四个角坐标)

dst:倾斜图像对应的四个定位点坐标。

cv2.warpPerspective:的参数基本与 cv2.warpAffine 相同,只不过这里的 M:4*2 变换矩阵

import cv2
import numpy as np

lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]

w,h = lena.shape[:2]
src = np.float32([[0,0],[w-1,0],[w-1,h-1],[0,h-1]])
dst = np.float32([[10,0],[w-11,0],[w-20,h-1],[20,h-1]])
M = cv2.getPerspectiveTransform(src=src,dst=dst)
img = cv2.warpPerspective(src=lena,M=M,dsize=lena.shape[:2])

cv2.imshow('lena',lena)
cv2.imshow('img',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

四、重映射 cv2.remap()

按照自定义方法执行映射,可以实现图像的翻转、扭曲、变形、或特定区域图片内容的改变。 

img = cv2.remap(src=*,map1=*,map2=*,interpolation=*,borderMode=*,borderValue=*)

img:目标图像。

src:原始图像。

map1、map2:用于存放 src 原始图像的 X 坐标、Y 坐标。

interpolation:标注插值方式,默认为:INRTER_LINEAR。

borderMode:边界像素,默认为:BORDER_CONSTANT。

borderValue:边界填充值,默认为0。

import cv2
import numpy as np

lena = cv2.imread('Lena.png')[::2,::2,:]

w,h = lena.shape[:2]
mapx = np.zeros(lena.shape[:2],np.float32)
mapy = np.zeros(lena.shape[:2],np.float32)

# 复制
for r in range(h):
    for c in range(w):
        mapx[r,c] = c
        mapy[r,c] = r
img1 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)

# 垂直翻转
for r in range(h):
    for c in range(w):
        mapx[r,c] = c
        mapy[r,c] = h-1-r
img2 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)

# 水平翻转
for r in range(h):
    for c in range(w):
        mapx[r,c] = w-1-c
        mapy[r,c] = r
img3 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)

# 垂直和水平翻转
for r in range(h):
    for c in range(w):
        mapx[r,c] = w-1-c
        mapy[r,c] = h-1-r
img4 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)

cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2
import numpy as np

lena = cv2.imread('Lena.png')[::2,::2,:]

w,h = lena.shape[:2]
mapx = np.zeros(lena.shape[:2],np.float32)
mapy = np.zeros(lena.shape[:2],np.float32)

# 缩小
for r in range(h):
    for c in range(w):
        mapx[r,c] = 2*c
        mapy[r,c] = 2*r
img1 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)[:int(w/2),:int(h/2),:]

cv2.imshow('lena',lena)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

理解(mapx,mapy)这两个二维矩阵重叠所构成的坐标 (width,height),对掌握 cv2.remap() 函数非常重要。

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

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

相关文章

Spring thymeleaf 的快速默认搭建使用

Spring thymeleaf 的快速默认搭建使用 thymeleaf 的搭建Pom 文件 thymeleaf 的使用Controller返回参数String资源文件路径访问端点显示HTML页面 thymeleaf 的搭建 Pom 文件 Pom 文件引入 spring-boot-starter-thymeleaf 依赖 <dependency><groupId>org.springfra…

Linux | 零基础Ubuntu搭建JDK

目录 软件简介 在线文档 压缩包安装 下载地址 补:传输软件 传输等待 目录结构 解压安装 配置环境 更新环境 测试JDK结果 APT安装 软件简介 Java Development Kit (JDK) 是 Sun 公司&#xff08;已被 Oracle 收购&#xff09;针对 Java 开发员的软件开发工具包。自…

揭秘 Fluss 架构组件

这是 Fluss 系列的第四篇文章了&#xff0c;我们先回顾一下前面三篇文章主要说了哪些内容。 Fluss 部署&#xff0c;带领大家部署Fluss 环境&#xff0c;体验一下 Fluss 的功能Fluss 整合数据湖的操作&#xff0c;体验Fluss 与数据湖的结合讲解了 Fluss、Kafka、Paimon 之间的…

PyQt的介绍

举例 解释 一 PyQt是什么 PyQt 是 Python 编程语言的一个库&#xff0c;它是 Qt 库的 Python 绑定。Qt 是一个跨平台的图形用户界面&#xff08;GUI&#xff09;开发框架&#xff0c;广泛应用于开发桌面应用程序。PyQt 使得 Python 开发者能够利用 Qt 框架的强大功能来创建图…

数据库高安全—openGauss安全整体架构安全认证

openGauss作为新一代自治安全数据库&#xff0c;提供了丰富的数据库基础安全能力&#xff0c;并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读&#xff0c;以帮助数据…

计算机网络 (16)数字链路层的几个共同问题

一、封装成帧 封装成帧是数据链路层的一个基本问题。数据链路层把网络层交下来的数据构成帧发送到链路上&#xff0c;以及把接收到的帧中的数据取出并上交给网络层。封装成帧就是在一段数据的前后分别添加首部和尾部&#xff0c;构成了一个帧。接收端在收到物理层上交的比特流后…

SAP SD信贷管理信用管理手册(下)

1、项目类别的信贷激活 图1-12-1.项目类别的信贷设置路径 图1-12-2.项目类别的信贷参数激活 说明&#xff1a;项目类别是否进行信贷管理设置。 2、定义信贷组 图1-13-1.定义信贷组路径 图1-13-2.信贷组定义 说明&#xff1a;信贷组参与后续信贷控制的组合分配。 3、销售凭证及…

【linux学习指南】可重入函数与volatile

文章目录 &#x1f4dd;可重⼊函数&#x1f320; volatile&#x1f6a9;总结 &#x1f4dd;可重⼊函数 main函数调⽤insert函数向⼀个链表head中插⼊节点node1,插⼊操作分为两步,刚做完第⼀步的时候,因为硬件中断使进程切换到内核,再次回⽤⼾态之前检查到有信号待处理,于是切换…

Web安全 - “Referrer Policy“ Security 头值不安全

文章目录 概述原因分析风险说明Referrer-Policy 头配置选项1. 不安全的策略no-referrer-when-downgradeunsafe-url 2. 安全的策略no-referreroriginorigin-when-cross-originsame-originstrict-originstrict-origin-when-cross-origin 推荐配置Nginx 配置示例 在 Nginx 中配置 …

FFmpeg:详细安装教程与环境配置指南

FFmpeg 部署完整教程 在本篇博客中&#xff0c;我们将详细介绍如何下载并安装 FFmpeg&#xff0c;并将其添加到系统的环境变量中&#xff0c;以便在终端或命令行工具中直接调用。无论你是新手还是有一定基础的用户&#xff0c;这篇教程都能帮助你轻松完成 FFmpeg 的部署。 一、…

AcWing练习题:平均数1

读取两个浮点数 AA 和 BB 的值&#xff0c;对应于两个学生的成绩。 请你计算学生的平均分&#xff0c;其中 AA 的成绩的权重为 3.53.5&#xff0c;BB 的成绩的权重为 7.57.5。 成绩的取值范围在 00 到 1010 之间&#xff0c;且均保留一位小数。 输入格式 输入占两行&#x…

Unity学习笔记(四)如何实现角色攻击、组合攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 实现动画 首先实现角色移动的动画&#xff0c;动画的实现过程在第二篇&#xff0c;这里仅展示效果 attack1 触发攻击动画 实现脚本 接下来我们通过 Animator 编辑动画之间的过渡&#…

如何使用MySQL的group_concat函数快速做关联查询?

当我们需要做一对多的关联查询时&#xff0c;会很容易想到用left join来实现。例如&#xff0c;现有country表和city表之间建立了一对多的关联关系。如果要展示各国家以及城市列表&#xff0c;会很容易想到以下SQL&#xff1a; SELECT country, city FROM country LEFT JOI…

Go快速开发框架2.6.0版本更新内容快速了解

GoFly企业版框架2.6.0版本更新内容较多&#xff0c;为了大家能够快速了解&#xff0c;本文将把更新内容列出详细讲解。本次更新一段时间以来大伙反馈的问题&#xff0c;并且升级后台安全认证机制&#xff0c;增加了RBAC权限管理及系统操作日志等提升后台数据安全性。 更新明细…

行业分析---造车新势力之零跑汽车

1 背景 在之前的博客中&#xff0c;笔者撰写了多篇行业分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析---…

大数据与机器学习(它们有何关系?)

想了解大数据和机器学习吗&#xff1f;我们将为你解释它们是什么、彼此之间有何关联&#xff0c;以及它们为何在数据密集型应用中如此重要。 大数据和机器学习是如何相互关联的&#xff1f; 大数据指的是传统存储方法无法处理的海量数据。机器学习则是计算机系统从观察结果和…

有趣的python绘图介绍

以下介绍了几个有趣的Python绘图&#xff0c;感兴趣可以动手实践下&#xff01; 一、正方形螺旋线 from turtle import *speed("fastest") pensize(2) color["purple","blue","red","black"] for i in range(200):pencolo…

【Mysql】Mysql/Mariadb开启binlog日志

前言 MySQL 的二进制日志&#xff08;Binary Log&#xff0c;简称 binlog&#xff09;用于记录数据库的所有更改操作&#xff0c;包括数据更改&#xff08;如 INSERT, UPDATE, DELETE&#xff09;和结构更改&#xff08;如 CREATE TABLE, ALTER TABLE&#xff09;。二进制日志的…

python检测同心圆

python检测同心圆 原图如下&#xff1a; import cv2 import numpy as np# 读取图像 image_path r"E:\pycharm3\pythonProject\image\image.png" img cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # 灰度图像 img_color cv2.imread(image_path, cv2.IMREAD_C…

萌萌哒的八戒

萌萌哒的八戒 下载压缩包后&#xff0c;打开发现有一张照片 既然是关于猪的&#xff0c;那就用猪圈密码解码 flag{whenthepigwanttoeat}