第5章: 图像变换与仿射操作
图像变换和仿射操作是图像处理中常用的技术,通过旋转、缩放、平移、剪裁等操作,可以实现多种视觉效果以及数据增强。
1.1 图像旋转
1.1.1 基础旋转操作
使用 rotate() 方法可以对图像进行旋转操作,指定旋转的角度(以度为单位),图像将以其中心为轴进行旋转。
from PIL import Image# 打开图像
image = Image.open("example.jpg")# 旋转图像90度
rotated_image = image.rotate(90)
rotated_image.show()
参数说明:
angle: 指定旋转角度,正值为顺时针旋转,负值为逆时针旋转。expand: 设置为True时,图像旋转后调整画布大小以适应整个旋转后的图像。
1.1.2 自适应画布的旋转
# 自适应画布大小,防止图像被裁剪
rotated_image = image.rotate(45, expand=True)
rotated_image.show()
案例:制作旋转图像的拼图
通过将多个角度的旋转图像组合在一起,可以创建有趣的拼图效果。
angles = [0, 45, 90, 135]
collage = Image.new("RGB", (image.width * 2, image.height * 2))for i, angle in enumerate(angles):rotated_part = image.rotate(angle, expand=True)x = (i % 2) * image.widthy = (i // 2) * image.heightcollage.paste(rotated_part, (x, y))collage.show()
1.2 图像缩放
缩放图像可以调整图像的分辨率和尺寸,Pillow 提供了 resize() 方法来实现该功能。
1.2.1 等比例缩放
# 等比例缩放至一半尺寸
scaled_image = image.resize((image.width // 2, image.height // 2))
scaled_image.show()
1.2.2 非等比例缩放
如果不保持宽高比,可以指定任意尺寸。
# 非等比例缩放
stretched_image = image.resize((300, 600))
stretched_image.show()
案例:生成缩略图
生成缩略图可以快速预览图像内容,Pillow 提供了 thumbnail() 方法,它会在等比例缩放下,将图像调整为目标尺寸以内。
thumbnail_image = image.copy()
thumbnail_image.thumbnail((100, 100))
thumbnail_image.show()
1.3 图像平移
图像平移可以让图像内容在画布上进行位置移动。Pillow 中可以使用 transform() 方法来实现平移操作。
from PIL import Image, ImageTransform# 平移图像
shifted_image = image.transform(image.size, ImageTransform.AffineTransform((1, 0, 50, 0, 1, 30)))
shifted_image.show()
1.4 图像剪裁
图像剪裁用于提取图像的某个部分,可以使用 crop() 方法指定一个矩形区域,从而裁剪出该部分。
# 裁剪图像的中心部分
left = image.width // 4
top = image.height // 4
right = image.width * 3 // 4
bottom = image.height * 3 // 4cropped_image = image.crop((left, top, right, bottom))
cropped_image.show()
案例:制作九宫格图像
将图像按均匀划分成九个区域,并分别提取。
rows, cols = 3, 3
grid_size = (image.width // cols, image.height // rows)
collage = Image.new("RGB", (image.width, image.height))for i in range(rows):for j in range(cols):left = j * grid_size[0]top = i * grid_size[1]right = left + grid_size[0]bottom = top + grid_size[1]cropped_part = image.crop((left, top, right, bottom))collage.paste(cropped_part, (left, top))collage.show()
1.5 仿射变换
仿射变换可以实现复杂的几何变换,如旋转、缩放、平移等的组合。Pillow 的 transform() 方法支持自定义矩阵,以实现仿射变换。
1.1.1 自定义仿射矩阵
仿射变换矩阵是一种 3x3 的矩阵,通常表示为:
[
a b c
d e f
0 0 1
]
在 Pillow 中,我们将此矩阵简化为六个参数 (a, b, c, d, e, f)。
# 创建自定义仿射变换
matrix = (1, 0.3, 0, 0.3, 1, 0)
transformed_image = image.transform(image.size, Image.AFFINE, matrix)
transformed_image.show()
案例:生成透视效果
通过调整仿射变换矩阵的参数,可以创建透视效果,使图像看起来像从不同角度拍摄。
# 创建透视效果
perspective_matrix = (1, -0.5, 0, 0.5, 1, 0)
perspective_image = image.transform(image.size, Image.AFFINE, perspective_matrix)
perspective_image.show()
1.6 图像翻转
Pillow 提供了简单的图像翻转方法 transpose(),可以进行水平和垂直翻转。
1.6.1 水平翻转
# 水平翻转
flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT)
flipped_image.show()
1.6.2 垂直翻转
# 垂直翻转
flipped_image = image.transpose(Image.FLIP_TOP_BOTTOM)
flipped_image.show()
1.7 图像变换综合案例
将本章学到的变换操作结合起来,可以实现复杂的图像效果。
案例:创建万花筒效果
将图像进行多次旋转和平移,从而生成万花筒的视觉效果。
kaleidoscope_image = Image.new("RGB", (image.width * 2, image.height * 2))for angle in range(0, 360, 45):rotated = image.rotate(angle, expand=True)kaleidoscope_image.paste(rotated, (angle % 2 * image.width, angle // 2 * image.height))kaleidoscope_image.show()
相关文章:
第5章: 图像变换与仿射操作
图像变换和仿射操作是图像处理中常用的技术,通过旋转、缩放、平移、剪裁等操作,可以实现多种视觉效果以及数据增强。 1.1 图像旋转 1.1.1 基础旋转操作 使用 rotate() 方法可以对图像进行旋转操作,指定旋转的角度(以度为单位&am…...
【计算机网络】【网络层】【习题】
计算机网络-传输层-习题 文章目录 13. 图 4-69 给出了距离-向量协议工作过程,表(a)是路由表 R1 初始的路由表,表(b)是相邻路由器 R2 传送来的路由表。请写出 R1 更新后的路由表(c)。…...
Scala的不可变Map常用操作
//类型:不可变,可变 //操作:添加元素,删除元素,查询元素,删除元素,遍历 object map {def main(args: Array[String]): Unit {//不可变Mapval map1 Map("鄂"->"湖北省"…...
nginx配置负载均衡详解
在现代的 web 应用中,负载均衡是确保高可用性、可扩展性和稳定性的关键技术之一。Nginx 是一个非常流行的反向代理服务器和负载均衡器,它支持多种负载均衡策略,能够帮助将客户端的请求分发到多个后端服务器,以提高系统的整体性能和…...
传奇996_19——龙岭总结
功能: 切割 切割属性: 即人物属性,可以设置临时属性或者永久属性,龙岭使用的是临时属性,所谓临时就是存在有效期,龙岭设置的有效期是123456789秒,即1428.89802天。 龙岭写法(倒叙…...
el-table 行列文字悬浮超出屏幕宽度不换行的问题
修改前的效果 修改后的效果 ui框架 element-plus 在网上找了很多例子都没找到合适的 然后这个东西鼠标挪走就不显示 控制台也不好调试 看了一下El-table的源码 他这个悬浮文字用的el-prpper 包着的 所以直接改 .el-table .el-propper 设置为max-width:1000px 就可以了 吐槽一…...
鸿蒙HarmonyOS 网络请求获取数据Http
注意的是;要为接口返回值指定类型 ,以及定义接口数据类型 index.ets import { http } from kit.NetworkKit;interface createAtType {date: number,}interface dataListType {createAt: createAtType;imgUrl: }Component export default struct TabBar {State dat…...
MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中
MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中 基础篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的…...
JavaScript逆向爬虫教程-------基础篇之JavaScript密码学以及CryptoJS各种常用算法的实现
目录 一、密码学介绍 1.1 为什么要学密码学?1.2 密码学里面学哪一些 二、字符编码三、位运算四、Hex 编码与 Base64 编码 4.1 Hex 编码4.2 Base64 编码 五、消息摘要算法 5.1 简介5.2 JS中的MD5、SHA、HMAC、SM3 六、对称加密算法 6.1 介绍6.2 加密模式和填充方式6.3 CryptoJ…...
【分布式】万字图文解析——深入七大分布式事务解决方案
分布式事务 分布式事务是指跨多个独立服务或系统的事务管理,以确保这些服务中的数据变更要么全部成功,要么全部回滚,从而保证数据的一致性。在微服务架构和分布式系统中,由于业务逻辑往往会跨多个服务,传统的单体事务…...
apache2配置多站点
环境 ubuntu 14.04 apache2 Server version: Apache/2.4.7 (Ubuntu) Server built: Apr 3 2019 18:04:25 步骤 修改/etc/apache2/sites-enabled/000-default.conf 增加VirtualHost段,指定不同的ServerName、DocumentRoot等参数 <VirtualHost *:80>…...
基于PyQt Python的深度学习图像处理界面开发(一)
Python标准库更多的适合处理后台任务,唯一的图形库tkinter使用起来很不方便,所以后来出现了针对Python图形界面开发的扩展库,例如PyQt。 在介绍PyQt之前,必须先简单介绍一下Qt。Qt是一个C可视化开发平台,是一个跨平台的…...
【Linux网络】Linux网络编程套接字,UDP与TCP
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀Linux网络编程套接字 📒1. 端口号📜2. 初识TCP协议与UDP协议…...
Vue3 -- 强制统一包管理器工具【企业级项目配置保姆级教程6】
引言: 团队开发项目的时候,需要统一包管理器工具,因为不同包管理器工具下载同一个依赖,可能版本不一样,导致项目出现bug问题,因此包管理器工具需要统一管理!!所以就需要我们强制统一包管理器工具。 创建scripts目录和preinstall.js文件: 在根目录创建scritps/preinstal…...
Winform实现自制浏览器JavaScript注入
让我们一起走向未来 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[1504566…...
【工具插件类教学】在 Unity 中使用 iTextSharp 实现 PDF 文件生成与导出
目录 一、准备工作 1. 安装 iTextSharp 2. 准备资源文件 二、创建 ExportPDFTool 脚本 1、初始化 PDF 文件,设置字体 2、添加标题、内容、表格和图片 三、使用工具类生成 PDF 四、源码地址 在 Unity 项目中,我们有时会需要生成带有文本、表格和图片的 PDF 文件,以便…...
javascript用来干嘛的?赋予网站灵魂的语言
javascript用来干嘛的?赋予网站灵魂的语言 在互联网世界中,你所浏览的每一个网页,背后都有一群默默工作的代码在支撑着。而其中,JavaScript就像是一位技艺精湛的魔术师,它赋予了网页生命力,让原本静态的页…...
Flutter Getx状态管理
在 Flutter 开发中,状态管理是一个非常重要的话题。随着应用变得更加复杂,状态管理的方式也变得越来越多。Flutter 提供了多种状态管理的解决方案,如 Provider、Riverpod、BLoC 等,而在这些选项中,GetX 作为一个轻量级…...
《成法》读书笔记
稻盛和夫的《成法》是一部关于个人和企业成功哲学的作品,结合了他在经营京瓷和KDDI,以及重建日航(JAL)过程中的经验和智慧。 以下是这本书的读书笔记,涵盖其核心思想和重要概念: 1. 以“心”为本 内容概…...
TensorFlow 2.0 环境配置
官方文档:CUDA Installation Guide for Windows 官方文档有坑,windows的安装指南直接复制了linux的指南内容:忽略这些离谱的信息即可。 可以从官方文档知悉,cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
